diff --git a/lib/components/c_facets/Drag.js b/lib/components/c_facets/Drag.js index 76e97d9..ba4331f 100644 --- a/lib/components/c_facets/Drag.js +++ b/lib/components/c_facets/Drag.js @@ -22,6 +22,11 @@ var ComponentFacet = require('../c_facet') * - params: object of key-value pairs that will be passed in metadata data type (can also be function or method name that returns this object). See config.dragDrop.dataTypes.componentMetaTemplate * - data: data that will be stored in the above meta data type (or function) * - allowedEffects: string (or function) as specified here: https://developer.mozilla.org/en-US/docs/DragDrop/Drag_Operations#dragstart + * - dragImage: + * - url: path to image to display when dragging, instead of the owner element + * - x: x offset for the image + * - y: y offset for the image + * - dragCls: CSS class to apply to the component being dragged * - dataTypes: map of additional data types the component will supply to data transfer object, key is data type, value is a function that returns it, component will be passed as the context to this function * * If function is specified in any parameter it will be called with the component as the context @@ -132,6 +137,7 @@ function onMouseMovement(eventType, event) { function onDragStart(eventType, event) { event.stopPropagation(); + if (this.config.off || ! targetInDragHandle.call(this)) { event.preventDefault(); return; @@ -149,6 +155,9 @@ function onDragStart(eventType, event) { setAdditionalDataTypes.call(this); _setAllowedEffects.call(this, dt); + if (this.config.dragCls) + this.owner.el.classList.toggle(this.config.dragCls, true); + DragDrop.service.postMessageSync('dragdropstarted', { eventType: 'dragstart', dragDrop: dt, @@ -200,8 +209,11 @@ function onDragging(eventType, event) { function onDragEnd(eventType, event) { if (_dragIsDisabled.call(this, event)) return; - event.stopPropagation(); + + if (this.config.dragCls) + this.owner.el.classList.toggle(this.config.dragCls, false); + var dt = new DragDrop(event); DragDrop.service.postMessageSync('completedragdrop', { eventType: 'dragend', diff --git a/milo.bundle.js b/milo.bundle.js index 90c0f71..b490596 100644 --- a/milo.bundle.js +++ b/milo.bundle.js @@ -3896,6 +3896,11 @@ var ComponentFacet = require('../c_facet') * - params: object of key-value pairs that will be passed in metadata data type (can also be function or method name that returns this object). See config.dragDrop.dataTypes.componentMetaTemplate * - data: data that will be stored in the above meta data type (or function) * - allowedEffects: string (or function) as specified here: https://developer.mozilla.org/en-US/docs/DragDrop/Drag_Operations#dragstart + * - dragImage: + * - url: path to image to display when dragging, instead of the owner element + * - x: x offset for the image + * - y: y offset for the image + * - dragCls: CSS class to apply to the component being dragged * - dataTypes: map of additional data types the component will supply to data transfer object, key is data type, value is a function that returns it, component will be passed as the context to this function * * If function is specified in any parameter it will be called with the component as the context @@ -4006,6 +4011,7 @@ function onMouseMovement(eventType, event) { function onDragStart(eventType, event) { event.stopPropagation(); + if (this.config.off || ! targetInDragHandle.call(this)) { event.preventDefault(); return; @@ -4023,6 +4029,9 @@ function onDragStart(eventType, event) { setAdditionalDataTypes.call(this); _setAllowedEffects.call(this, dt); + if (this.config.dragCls) + this.owner.el.classList.toggle(this.config.dragCls, true); + DragDrop.service.postMessageSync('dragdropstarted', { eventType: 'dragstart', dragDrop: dt, @@ -4074,8 +4083,11 @@ function onDragging(eventType, event) { function onDragEnd(eventType, event) { if (_dragIsDisabled.call(this, event)) return; - event.stopPropagation(); + + if (this.config.dragCls) + this.owner.el.classList.toggle(this.config.dragCls, false); + var dt = new DragDrop(event); DragDrop.service.postMessageSync('completedragdrop', { eventType: 'dragend', @@ -12984,10 +12996,7 @@ function _wrapMixinMethod(method) { function _getMixinInstance(methodName) { if (this instanceof Mixin) return this; var instanceKeys = this.constructor[config.mixin.instancePropertiesMap] - , mixinProp = instanceKeys[methodName] - , mixin = this[mixinProp]; - if (!mixin) throw new Error('Mixin ' + mixinProp + ' does not exist'); - return mixin; + return this[instanceKeys[methodName]]; } @@ -19053,5 +19062,5 @@ function makeFindMethod(eachMethod, findWhat) { } },{}]},{},[66]) -//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvYWJzdHJhY3QvZmFjZXQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9hYnN0cmFjdC9yZWdpc3RyeS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2JpbmQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvYV9jbGFzcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2xvYWQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2JpbmRlci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY2xhc3Nlcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tbWFuZC9hY3Rpb25zX2hpc3RvcnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbW1hbmQvY21kX3JlZ2lzdHJ5LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21tYW5kL2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19jbGFzcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0NvbnRhaW5lci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0RvbS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EcmFnLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0Ryb3AuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvRXZlbnRzLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0ZyYW1lLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0l0ZW0uanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvTGlzdC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9Nb2RlbEZhY2V0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL09wdGlvbnMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVGVtcGxhdGUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVHJhbnNmZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvY2ZfcmVnaXN0cnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19pbmZvLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfcmVnaXN0cnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY191dGlscy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jbGFzc2VzL1ZpZXcuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX2FwaS9kYXRhLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19hcGkvZGVfZGF0YS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9tc2dfYXBpL2Ryb3AuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19zcmMvZnJhbWUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvc2NvcGUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvQnV0dG9uLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvTGlzdC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9EYXRlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0Ryb3BUYXJnZXQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvRm9sZFRyZWUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvR3JvdXAuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvSHlwZXJsaW5rLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0ltYWdlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0TGlzdC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9MaXN0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0xpc3RJdGVtLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1JhZGlvR3JvdXAuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvU2VsZWN0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1N1cGVyQ29tYm8uanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvVGV4dC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UZXh0YXJlYS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UaW1lLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1dyYXBwZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0FsZXJ0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0Ryb3Bkb3duLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb25maWcuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2xvYWRlci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvbWlsby5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvcmVnaXN0cnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RlX2NvbnN0cnMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RvbV9zb3VyY2UuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9hcGkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9zb3VyY2UuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL3dpbmRvdy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXNlX2NvbXBvbmVudHMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3VzZV9mYWNldHMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvY29tcG9uZW50X25hbWUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvY3JlYXRlX2NvbXBvbmVudF9jbGFzcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9kZXByZWNhdGUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvZG9tLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL2RvbV9saXN0ZW5lcnMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvZG9tcmVhZHkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvZHJhZ2Ryb3AuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvZXJyb3IuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvZnJhZ21lbnQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvanNvbl9wYXJzZS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9yZXF1ZXN0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL3NlbGVjdGlvbi9pbmRleC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9zdG9yYWdlL2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL3N0b3JhZ2UvbW9kZWwuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvc3RvcmFnZS9tc2dfc3JjLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL3VuaXF1ZV9pZC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC93ZWJzb2NrZXQvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvd2Vic29ja2V0L21zZ19hcGkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvd2Vic29ja2V0L21zZ19zcmMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL2Jhc2UzMi9saWIvYmFzZTMyLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLWJ1aWx0aW5zL2J1aWx0aW4vZnMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvYWJzdHJhY3QvbWl4aW4uanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvY2xhc3Nlcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9jb25maWcuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWVzc2VuZ2VyL2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9tX2FwaS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tZXNzZW5nZXIvbV9hcGlfcnguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWVzc2VuZ2VyL21fc291cmNlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9tc25ncl9zb3VyY2UuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWlsby1jb3JlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21pbmRlci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9jaGFuZ2VfZGF0YS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9jb25uZWN0b3IuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvbV9tc2dfYXBpLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21vZGVsL21fcGF0aC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9tb2RlbF91dGlscy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9wYXRoX21zZ19hcGkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvcGF0aF91dGlscy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9zeW50aGVzaXplL2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL3V0aWwvY2hlY2suanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvdXRpbC9pbmRleC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi91dGlsL2xvZ2dlci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi91dGlsL2xvZ2dlcl9jbGFzcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9kb3QvZG9ULmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL2RvdC9pbmRleC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL21vbC1wcm90by9saWIvcHJvdG9fYXJyYXkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19mdW5jdGlvbi5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX251bWJlci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX29iamVjdC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3Byb3RvdHlwZS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3N0cmluZy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3V0aWwuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi91dGlscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3g1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdHFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdk9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9tQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6cUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4YkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDck5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdnBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdllBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3puQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0O1xuXG5cbi8qKlxuICogYG1pbG8uY2xhc3Nlcy5GYWNldGBcbiAqIEJhc2UgRmFjZXQgY2xhc3MgaXMgYW4gYW5jZXN0b3Igb2YgW0NvbXBvbmVudEZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgY2xhc3MsIHRoZSBtYWluIGJ1aWxkaW5nIGJsb2NrIGluIG1pbG8uXG4gKiBcbiAqIEBwYXJhbSB7RmFjZXRlZE9iamVjdH0gb3duZXIgYW4gaW5zdGFuY2Ugb2YgRmFjZXRlZE9iamVjdCBzdWJjbGFzcyB0aGF0IHN0b3JlcyB0aGUgZmFjZXQgb24gaXRzIHByb3BlcnR5ICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYG5hbWVgIHByb3BlcnR5IG9mIGZhY2V0XG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb24sIHVzZWQgaW4gc3ViY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBGYWNldChvd25lciwgY29uZmlnKSB7XG4gICAgdGhpcy5uYW1lID0gXy5maXJzdExvd2VyQ2FzZSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMub3duZXIgPSBvd25lcjtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG4vKipcbiAqIGBpbml0YCBtZXRob2Qgb2Ygc3ViY2xhc3Mgd2lsbCBiZSBjYWxsZWQgYnkgRmFjZXQgY29uc3RydWN0b3IuXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXQsIHtcbiAgICBpbml0OiBmdW5jdGlvbigpIHt9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXQgPSByZXF1aXJlKCcuL2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0ZWRPYmplY3Q7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkZhY2V0ZWRPYmplY3RgXG4gKiBDb21wb25lbnQgY2xhc3MgaXMgYmFzZWQgb24gYW4gYWJzdHJhY3QgYGBgRmFjZXRlZE9iamVjdGBgYCBjbGFzcy4gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBhbnkgc2l0dWF0aW9uIHdoZXJlIG9iamVjdHMgY2FuIGJlIHJlcHJlc2VudGVkIHZpYSBjb2xsZWN0aW9uIG9mIGZhY2V0cyAoYSBmYWNldCBpcyBhbiBvYmplY3Qgb2YgYSBjZXJ0YWluIGNsYXNzLCBpdCBob2xkcyBpdHMgb3duIGNvbmZpZ3VyYXRpb24sIGRhdGEgYW5kIG1ldGhvZHMpLlxuICogSW4gYSB3YXksIFwiZmFjZXRzIHBhdHRlcm5cIiBpcyBhbiBpbnZlcnNpb24gb2YgXCJhZGFwdGVyIHBhdHRlcm5cIiAtIHdoaWxlIHRoZSBsYXR0ZXIgYWxsb3dzIGZpbmRpbmcgYSBjbGFzcy9tZXRob2RzIHRoYXQgaGFzIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHksIGZhY2V0ZWQgb2JqZWN0IGlzIHNpbXBseSBjb25zdHJ1Y3RlZCB0byBoYXZlIHRoZXNlIGZ1bmN0aW9uYWxpdGllcy5cbiAqIFdpdGggdGhpcyBhcmNoaXRlY3R1cmUgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEgdmlydHVhbGx5IHVubGltaXRlZCBudW1iZXIgb2YgY29tcG9uZW50IGNsYXNzZXMgd2l0aCBhIHZlcnkgbGltaXRlZCBudW1iZXIgb2YgYnVpbGRpbmcgYmxvY2tzIHdpdGhvdXQgaGF2aW5nIGFueSBoaWVyYXJjaHkgb2YgY2xhc3NlcyAtIGFsbCBjb21wb25lbnRzIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBDb21wb25lbnQgY2xhc3MuXG4gKlxuICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgY2FsbGVkIGJ5IGFsbCBzdWJjbGFzc2VzIGNvbnN0cnVjdG9yIChpdCB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5IGlmIGEgc3ViY2xhc3MgaXMgY3JlYXRlZCB3aXRoIGBfLmNyZWF0ZVN1YmNsYXNzYCkuXG4gKlxuICogQHJldHVybiB7RmFjZXRlZE9iamVjdH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCgpIHtcbiAgICAvLyB0aGlzLmZhY2V0c0NvbmZpZyBhbmQgdGhpcy5mYWNldHNDbGFzc2VzIHdlcmUgc3RvcmVkIG9uIGEgc3BlY2lmaWMgY2xhc3MgcHJvdG90eXBlXG4gICAgLy8gd2hlbiB0aGUgY2xhc3Mgd2FzIGNyZWF0ZWQgYnkgRmFjZXRlZE9iamVjdC5jcmVhdGVGYWNldGVkQ2xhc3NcbiAgICB2YXIgZmFjZXRzQ29uZmlnID0gdGhpcy5mYWNldHNDb25maWcgfHwge307XG5cbiAgICB2YXIgZmFjZXRzRGVzY3JpcHRvcnMgPSB7fVxuICAgICAgICAsIGZhY2V0cyA9IHt9O1xuXG4gICAgLy8gRmFjZXRlZE9iamVjdCBjbGFzcyBpdHNlbGYgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCAtIGl0IGhhcyBubyBmYWNldHNcbiAgICAvLyBJdCBtYXkgY2hhbmdlLCBhcyBhZGRpbmcgZmFjZXRzIGlzIHBvc3NpYmxlIHRvIGluc3RhbmNlc1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09IEZhY2V0ZWRPYmplY3QpICAgICAgXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFjZXRlZE9iamVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcywgY2FuXFwndCBiZSBpbnN0YW50aWF0ZWQnKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGNsYXNzIGZhY2V0c1xuICAgIGlmICh0aGlzLmZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleSh0aGlzLmZhY2V0c0NsYXNzZXMsIGluc3RhbnRpYXRlRmFjZXQsIHRoaXMsIHRydWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0cyB0byB0aGUgY2xhc3MgYXMgcHJvcGVydGllcyB1bmRlciB0aGVpciBvd24gbmFtZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGZhY2V0c0Rlc2NyaXB0b3JzKTtcblxuICAgIC8vIHN0b3JlIGFsbCBmYWNldHMgb24gYGZhY2V0c2AgcHJvcGVydHkgc28gdGhhdCB0aGV5IGNhbiBiZSBlbnVtZXJhdGVkXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmFjZXRzJywgZmFjZXRzKTsgICBcblxuICAgIC8vIGNhbGwgYGluaXRgbWV0aG9kIGlmIGl0IGlzIGRlZmluZWQgaW4gc3ViY2xhc3NcbiAgICBpZiAodGhpcy5pbml0KVxuICAgICAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGZhY2V0IHdpdGggYSBnaXZlbiBjbGFzcyAoRmFjZXRDbGFzcykgYW5kIG5hbWUgKGZhY2V0TmFtZSlcbiAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUZhY2V0KEZhY2V0Q2xhc3MsIGZhY2V0TmFtZSkge1xuICAgICAgICAvLyBnZXQgZmFjZXQgY29uZmlndXJhdGlvblxuICAgICAgICB2YXIgZmN0Q29uZmlnID0gZmFjZXRzQ29uZmlnW2ZhY2V0TmFtZV07XG5cbiAgICAgICAgLy8gaW5zdGF0aWF0ZSBmYWNldHNcbiAgICAgICAgZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmY3RDb25maWcpO1xuXG4gICAgICAgIC8vIGFkZCBmYWNldCB0byBwcm9wZXJ0eSBkZXNjcmlwdG9yc1xuICAgICAgICBmYWNldHNEZXNjcmlwdG9yc1tmYWNldE5hbWVdID0ge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBmYWNldHNbZmFjZXROYW1lXVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG4vKipcbiAqICMjIyNGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbY3JlYXRlRmFjZXRlZENsYXNzXSgjRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKVxuICogLSBbaGFzRmFjZXRdKCNGYWNldGVkT2JqZWN0JCRoYXNGYWNldClcbiAqL1xuXy5leHRlbmQoRmFjZXRlZE9iamVjdCwge1xuICAgIGNyZWF0ZUZhY2V0ZWRDbGFzczogRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzLFxuICAgIGhhc0ZhY2V0OiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldCxcbiAgICBnZXRGYWNldENvbmZpZzogRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWdcbn0pO1xuXG5cbi8qKlxuICogIyMjI0ZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFthZGRGYWNldF0oI0ZhY2V0ZWRPYmplY3QkYWRkRmFjZXQpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXRlZE9iamVjdCwge1xuICAgIGFkZEZhY2V0OiBGYWNldGVkT2JqZWN0JGFkZEZhY2V0XG59KTtcblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBhIGZhY2V0IHRvIHRoZSBpbnN0YW5jZSBvZiBGYWNldGVkT2JqZWN0IHN1YmNsYXNzLlxuICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjZXQgdGhhdCB3YXMgY3JlYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGYWNldENsYXNzIGZhY2V0IGNsYXNzIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gZmFjZXRDb25maWcgb3B0aW9uYWwgZmFjZXQgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSBvcHRpb25hbCBmYWNldCBuYW1lLCBGYWNldENsYXNzLm5hbWUgd2lsbCBiZSB1c2VkIGlmIGZhY2V0TmFtZSBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSB0aHJvd09uRXJyb3JzIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtGYWNldH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCRhZGRGYWNldChGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgY2hlY2soRmFjZXRDbGFzcywgRnVuY3Rpb24pO1xuICAgIGNoZWNrKGZhY2V0TmFtZSwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG5cbiAgICAvLyBmaXJzdCBsZXR0ZXIgb2YgZmFjZXQgbmFtZSBzaG91bGQgYmUgbG93ZXJjYXNlXG4gICAgZmFjZXROYW1lID0gXy5maXJzdExvd2VyQ2FzZShmYWNldE5hbWUgfHwgRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIC8vIGdldCBmYWNldHMgZGVmaW5lZCBpbiBjbGFzc1xuICAgIHZhciBwcm90b0ZhY2V0cyA9IHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmZhY2V0c0NsYXNzZXM7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZXROYW1lIHdhcyBub3QgYWxyZWFkeSB1c2VkIGluIHRoZSBjbGFzc1xuICAgIGlmIChwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgY2xhc3MgJyArIHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZU5hbWUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgZmFjZXRlZCBvYmplY3RcbiAgICBpZiAodGhpc1tmYWNldE5hbWVdKSB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcHJlc2VudCBpbiBvYmplY3QnO1xuICAgICAgICBpZiAodGhyb3dPbkVycm9ycyA9PT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdGYWNldGVkT2JqZWN0IGFkZEZhY2V0OiAnLCBtZXNzYWdlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIGluc3RhbnRpYXRlIHRoZSBmYWNldFxuICAgIHZhciBuZXdGYWNldCA9IHRoaXMuZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmYWNldENvbmZpZyk7XG5cbiAgICAvLyBhZGQgZmFjZXQgdG8gZmFjZXRlZCBvYmplY3RcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsIGZhY2V0TmFtZSwgbmV3RmFjZXQsIF8uRU5VTSk7XG5cbiAgICByZXR1cm4gbmV3RmFjZXQ7XG59XG5cblxuLyoqXG4gKiBGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZFxuICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIGZhY2V0IGNsYXNzIGlmIHRoZSBmYWNldCB3aXRoIGBmYWNldE5hbWVgIGlzIHBhcnQgb2YgdGhlIGNsYXNzLCBgdW5kZWZpbmVkYCBvdGhlcndpc2UuIElmIHN1YmNsYXNzIGlzIGNyZWF0ZWQgdXNpbmcgXy5jcmVhdGVTdWJjbGFzcyAoYXMgaXQgc2hvdWxkIGJlKSBpdCB3aWxsIGFsc28gaGF2ZSB0aGlzIG1ldGhvZC5cbiAqIFxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWVcbiAqIEByZXR1cm4ge1N1YmNsYXNzKEZhY2V0KXx1bmRlZmluZWR9IFxuICovXG5mdW5jdGlvbiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldChmYWNldE5hbWUpIHtcbiAgICAvLyB0aGlzIHJlZmVycyB0byB0aGUgRmFjZXRlZE9iamVjdCBjbGFzcyAob3Igc3ViY2xhc3MpLCBub3QgaW5zdGFuY2VcbiAgICB2YXIgcHJvdG9GYWNldHMgPSB0aGlzLnByb3RvdHlwZS5mYWNldHNDbGFzc2VzO1xuICAgIHJldHVybiBwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdO1xufVxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBmYWNldFxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSB0aGUgZmFjZXQgd2hpY2ggY29uZmlnIHNob3VsZCBiZSByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgZmFjZXRcbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWcoZmFjZXROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRmFjZXQoZmFjZXROYW1lKSA/IHRoaXMucHJvdG90eXBlLmZhY2V0c0NvbmZpZ1tmYWNldE5hbWVdIDogbnVsbDtcbn1cblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBDbGFzcyBmYWN0b3J5IHRoYXQgY3JlYXRlcyBjbGFzc2VzIChjb25zdHJ1Y3RvciBmdW5jdGlvbnMpIGZyb20gdGhlIG1hcHMgb2YgZmFjZXRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9ucy5cbiAqIENyZWF0ZWQgY2xhc3Mgd2lsbCBiZSBzdWJjbGFzcyBvZiBgRmFjZXRlZE9iamVjdGAuXG4gKlxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNsYXNzIG5hbWUgKHdpbGwgYmUgZnVuY3Rpb24gbmFtZSBvZiBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvbilcbiAqIEBwYXJhbSB7T2JqZWN0W1N1YmNsYXNzKEZhY2V0KV19IGZhY2V0c0NsYXNzZXMgbWFwIG9mIGNsYXNzZXMgb2YgZmFjZXRzIHRoYXQgd2lsbCBjb25zdGl0dXRlIHRoZSBjcmVhdGVkIGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdfSBmYWNldHNDb25maWcgbWFwIG9mIGZhY2V0cyBjb25maWd1cmF0aW9uLCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBrZXlzIGFzIHRoZSBtYXAgb2YgY2xhc3Nlcy4gU29tZSBmYWNldHMgbWF5IG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24sIGJ1dCB0aGUgY29uZmlndXJhdGlvbiBmb3IgYSBmYWNldCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiBmYWNldHNDbGFzc2VzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uXG4gKiBAcmV0dXJuIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZykge1xuICAgIGNoZWNrKG5hbWUsIFN0cmluZyk7XG4gICAgY2hlY2soZmFjZXRzQ2xhc3NlcywgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT2JqZWN0SGFzaChNYXRjaC5TdWJjbGFzcyhGYWNldCwgdHJ1ZSkpKSk7XG4gICAgY2hlY2soZmFjZXRzQ29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcblxuICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiBjb25maWcgcGFzc2VkIGZvciBmYWNldCBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gY2xhc3NcbiAgICBpZiAoZmFjZXRzQ29uZmlnKVxuICAgICAgICBfLmVhY2hLZXkoZmFjZXRzQ29uZmlnLCBmdW5jdGlvbihmY3RDb25maWcsIGZjdE5hbWUpIHtcbiAgICAgICAgICAgIGlmICghIGZhY2V0c0NsYXNzZXMuaGFzT3duUHJvcGVydHkoZmN0TmFtZSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25maWd1cmF0aW9uIGZvciBmYWNldCAoJyArIGZjdE5hbWUgKyAnKSBwYXNzZWQgdGhhdCBpcyBub3QgaW4gY2xhc3MnKTtcbiAgICAgICAgfSk7XG5cbiAgICAvLyBjcmVhdGUgc3ViY2xhc3Mgb2YgdGhlIGN1cnJlbnQgY2xhc3MgKHRoaXMgcmVmZXJzIHRvIHRoZSBjbGFzcyB0aGF0IGNhbGxzIHRoaXMgbWV0aG9kKVxuICAgIHZhciBGYWNldGVkQ2xhc3MgPSBfLmNyZWF0ZVN1YmNsYXNzKHRoaXMsIG5hbWUsIHRydWUpO1xuXG4gICAgLy8gZ2V0IGZhY2V0cyBjbGFzc2VzIGFuZCBjb25maWd1cmF0aW9ucyBmcm9tIHBhcmVudCBjbGFzc1xuICAgIGZhY2V0c0NsYXNzZXMgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ2xhc3NlcywgJ2ZhY2V0c0NsYXNzZXMnKTtcbiAgICBmYWNldHNDb25maWcgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ29uZmlnLCAnZmFjZXRzQ29uZmlnJyk7XG5cbiAgICAvLyBzdG9yZSBmYWNldHMgY2xhc3NlcyBhbmQgY29uZmlndXJhdGlvbnMgb2YgY2xhc3MgcHJvdG90eXBlXG4gICAgXy5leHRlbmRQcm90byhGYWNldGVkQ2xhc3MsIHtcbiAgICAgICAgZmFjZXRzQ2xhc3NlczogZmFjZXRzQ2xhc3NlcyxcbiAgICAgICAgZmFjZXRzQ29uZmlnOiBmYWNldHNDb25maWdcbiAgICB9KTtcblxuICAgIHJldHVybiBGYWNldGVkQ2xhc3M7XG5cblxuICAgIGZ1bmN0aW9uIGFkZEluaGVyaXRlZEZhY2V0cyhzdXBlckNsYXNzLCBmYWNldHNJbmZvLCBmYWNldHNJbmZvTmFtZSkge1xuICAgICAgICB2YXIgaW5oZXJpdGVkRmFjZXRzSW5mbyA9IHN1cGVyQ2xhc3MucHJvdG90eXBlW2ZhY2V0c0luZm9OYW1lXTtcbiAgICAgICAgaWYgKGluaGVyaXRlZEZhY2V0c0luZm8pXG4gICAgICAgICAgICByZXR1cm4gXyhpbmhlcml0ZWRGYWNldHNJbmZvKVxuICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kKGZhY2V0c0luZm8gfHwge30pLl8oKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGZhY2V0c0luZm87XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENsYXNzUmVnaXN0cnk7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkNsYXNzUmVnaXN0cnlgIC0gdGhlIHJlZ2lzdHJ5IG9mIGNsYXNzZXMgY2xhc3MuXG4gKiBDb21wb25lbnRzIGFuZCBGYWNldHMgcmVnaXN0ZXIgdGhlbXNlbHZlcyBpbiByZWdpc3RyaWVzLiBJdCBhbGxvd3MgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZW0gZnJvbSBvbmUgbW9kdWxlIGFuZCBwcmV2ZW50cyBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmV0d2VlbiBtb2R1bGVzLlxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQWxsIGNsYXNzZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgdGhlIEZvdW5kYXRpb25DbGFzc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDbGFzc1JlZ2lzdHJ5IChGb3VuZGF0aW9uQ2xhc3MpIHtcbiAgICBpZiAoRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICB0aGlzLnNldENsYXNzKEZvdW5kYXRpb25DbGFzcyk7XG5cbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn1cblxuXG4vKipcbiAqICMjIyNDbGFzc1JlZ2lzdHJ5IGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbYWRkXSgjYWRkKVxuICogLSBbZ2V0XSgjZ2V0KVxuICogLSBbcmVtb3ZlXSgjcmVtb3ZlKVxuICogLSBbY2xlYW5dKCNjbGVhbilcbiAqIC0gW3NldENsYXNzXSgjc2V0Q2xhc3MpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oQ2xhc3NSZWdpc3RyeSwge1xuICAgIGFkZDogYWRkLFxuICAgIGdldDogZ2V0LFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGNsZWFuOiBjbGVhbixcbiAgICBzZXRDbGFzczogc2V0Q2xhc3Ncbn0pO1xuXG5cbi8qKlxuICogQ2xhc3NSZWdpc3RyeSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZWdpc3RlcnMgYSBjbGFzcyBpbiB0aGUgcmVnaXN0cnkuXG4gKiBUaGUgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGEgY2xhc3MgaXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc2FtZSBuYW1lIGFzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjbGFzcy5cbiAqIFRoZSBtZXRob2QgYWxsb3dzIHJlZ2lzdGVyaW5nIHRoZSBzYW1lIGNsYXNzIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUsIHNvIGNsYXNzIGFsaWFzZXMgY2FuIGJlIGNyZWF0ZWQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYUNsYXNzIGNsYXNzIHRvIHJlZ2lzdGVyIGluIHRoZSByZWdpc3RyeS4gU2hvdWxkIGJlIHN1YmNsYXNzIG9mIGB0aGlzLkZvdW5kYXRpb25DbGFzc2AuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBjbGFzcyBuYW1lLiBJZiBjbGFzcyBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdGFrZW4gZnJvbSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBuYW1lLiBDbGFzcyBuYW1lIHNob3VsZCBiZSBhIHZhbGlkIGlkZW50aWZpZXIgYW5kIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGFkZChhQ2xhc3MsIG5hbWUpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBhQ2xhc3MubmFtZTtcblxuICAgIGNoZWNrKG5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcsICdjbGFzcyBuYW1lIG11c3QgYmUgaWRlbnRpZmllciBzdHJpbmcnKTtcblxuICAgIGlmICh0aGlzLkZvdW5kYXRpb25DbGFzcykge1xuICAgICAgICBpZiAoYUNsYXNzICE9IHRoaXMuRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICAgICAgY2hlY2soYUNsYXNzLCBNYXRjaC5TdWJjbGFzcyh0aGlzLkZvdW5kYXRpb25DbGFzcyksICdjbGFzcyBtdXN0IGJlIGEgc3ViKGNsYXNzKSBvZiBhIGZvdW5kYXRpb24gY2xhc3MnKTtcbiAgICB9IGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3VuZGF0aW9uIGNsYXNzIG11c3QgYmUgc2V0IGJlZm9yZSBhZGRpbmcgY2xhc3NlcyB0byByZWdpc3RyeScpO1xuXG4gICAgaWYgKHRoaXMuX19yZWdpc3RlcmVkQ2xhc3Nlc1tuYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGFzcyBcIicgKyBuYW1lICsgJ1wiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCcpO1xuXG4gICAgdGhpcy5fX3JlZ2lzdGVyZWRDbGFzc2VzW25hbWVdID0gYUNsYXNzO1xufTtcblxuXG4vKipcbiAqIEdldHMgY2xhc3MgZnJvbSByZWdpc3RyeSBieSBuYW1lXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgQ2xhc3MgbmFtZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgY2hlY2sobmFtZSwgU3RyaW5nLCAnY2xhc3MgbmFtZSBtdXN0IGJlIHN0cmluZycpO1xuICAgIHJldHVybiB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIGZyb20gcmVnaXN0cnkgYnkgaXRzIG5hbWUuXG4gKiBJZiBjbGFzcyBpcyBub3QgcmVnaXN0ZXJlZCwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBuYW1lT3JDbGFzcyBDbGFzcyBuYW1lLiBJZiBjbGFzcyBjb25zdHJ1Y3RvciBpcyBzdXBwbGllZCwgaXRzIG5hbWUgd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiByZW1vdmUobmFtZU9yQ2xhc3MpIHtcbiAgICBjaGVjayhuYW1lT3JDbGFzcywgTWF0Y2guT25lT2YoU3RyaW5nLCBGdW5jdGlvbiksICdjbGFzcyBvciBuYW1lIG11c3QgYmUgc3VwcGxpZWQnKTtcblxuICAgIHZhciBuYW1lID0gdHlwZW9mIG5hbWVPckNsYXNzID09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5hbWVPckNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5hbWVPckNsYXNzLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICBpZiAoISB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2xhc3MgaXMgbm90IHJlZ2lzdGVyZWQnKTtcblxuICAgIGRlbGV0ZSB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgY2xhc3NlcyBmcm9tIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiBjbGVhbigpIHtcbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn07XG5cblxuLyoqXG4gKiBTZXRzIGBGb3VuZGF0aW9uQ2xhc3NgIG9mIHRoZSByZWdpc3RyeS4gSXQgc2hvdWxkIGJlIHNldCBiZWZvcmUgYW55IGNsYXNzIGNhbiBiZSBhZGRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQW55IGNsYXNzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcy4gRm91bmRhdGlvbkNsYXNzIGl0c2VsZiBjYW4gYmUgYWRkZWQgdG8gdGhlIHJlZ2lzdHJ5IHRvby5cbiAqL1xuZnVuY3Rpb24gc2V0Q2xhc3MoRm91bmRhdGlvbkNsYXNzKSB7XG4gICAgY2hlY2soRm91bmRhdGlvbkNsYXNzLCBGdW5jdGlvbik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRm91bmRhdGlvbkNsYXNzJywgRm91bmRhdGlvbkNsYXNzLCBfLkVOVU0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hX2NsYXNzJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgQVRUUklCVVRFX1JFR0VYUD0gL14oW15cXDpcXFtcXF1dKikoPzpcXFsoW15cXDpcXFtcXF1dKilcXF0pP1xcOj8oW146XSopJC9cbiAgICAsIEZBQ0VUU19TUExJVF9SRUdFWFAgPSAvXFxzKig/OlxcLHxcXHMpXFxzKi9cbiAgICAsIEFUVFJJQlVURV9URU1QTEFURSA9ICclY29tcENsYXNzJWNvbXBGYWNldHM6JWNvbXBOYW1lJztcblxuXG4vKipcbiAqIGBtaWxvLmF0dHJpYnV0ZXMuYmluZGBcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgcGFyc2VzL3ZhbGlkYXRlcy9ldGMuIGFuIGF0dHJpYnV0ZSB0aGF0IGJpbmRzIERPTSBlbGVtZW50cyB0byBtaWxvIGNvbXBvbmVudHMuXG4gKiBQb3NzaWJsZSBhdHRyaWJ1dGUgdmFsdWVzIGFyZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXc6bXlWaWV3YCAtIGNsYXNzIGFuZCBjb21wb25lbnQgbmFtZVxuICogLSBgW0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGZhY2V0cyBhbmQgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXdbRXZlbnRzXTpteVZpZXdgIC0gY2xhc3MsIGZhY2V0KHMpIGFuZCBjb21wb25lbnQgbmFtZVxuICpcbiAqIFNlZSBbYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBCaW5kQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdCaW5kQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhCaW5kQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBjbGFzcyBtZXRob2RzXG4gKlxuICogLSBbc2V0SW5mb10oI0JpbmRBdHRyaWJ1dGUkJHNldEluZm8pXG4gKi9cbl8uZXh0ZW5kKEJpbmRBdHRyaWJ1dGUsIHtcbiAgICBzZXRJbmZvOiBCaW5kQXR0cmlidXRlJCRzZXRJbmZvXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEJpbmRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWJpbmQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBiaW5kIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBiaW5kOiAnY2MtYmluZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWJpbmQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMuYmluZDtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGJpbmQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnRpZXMgYGNvbXBDbGFzc2AsIGBjb21wRmFjZXRzYCBhbmQgYGNvbXBOYW1lYCBvbiBCaW5kQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtCaW5kQXR0cmlidXRlfVxuICovXG4gZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgaWYgKCEgdGhpcy5ub2RlKSByZXR1cm47XG5cbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpO1xuXG4gICAgaWYgKHZhbHVlKVxuICAgICAgICB2YXIgYmluZFRvID0gdmFsdWUubWF0Y2goQVRUUklCVVRFX1JFR0VYUCk7XG5cbiAgICBpZiAoISBiaW5kVG8pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiaW5kIGF0dHJpYnV0ZSAnICsgdmFsdWUpO1xuXG4gICAgdGhpcy5jb21wQ2xhc3MgPSBiaW5kVG9bMV0gfHwgJ0NvbXBvbmVudCc7XG4gICAgdGhpcy5jb21wRmFjZXRzID0gKGJpbmRUb1syXSAmJiBiaW5kVG9bMl0uc3BsaXQoRkFDRVRTX1NQTElUX1JFR0VYUCkpIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbXBOYW1lID0gYmluZFRvWzNdIHx8IHVuZGVmaW5lZDsgLy8gdW5kZWZpbmVkIGlzIG5vdCBzYW1lIGFzICcnXG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgdmFsaWRhdGVzIGJpbmQgYXR0cmlidXRlLCB0aHJvd3MgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICpcbiAqIEByZXR1cm4ge0JpbmRBdHRyaWJ1dGV9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICAgIGNoZWNrKHRoaXMuY29tcE5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcpO1xuXG4gICAgaWYgKCEgdGhpcy5jb21wQ2xhc3MpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgY29tcG9uZW50IGNsYXNzIG5hbWUgJyArIHRoaXMuY29tcENsYXNzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIGdpdmVuIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIGBjb21wQ2xhc3NgLCBgY29tcE5hbWVgIGFuZCBgY29tcEZhY2V0c2AuXG4gKiBJZiBgdGhpcy5jb21wTmFtZWAgaXMgbm90IHNldCBpdCB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHRoaXMuY29tcE5hbWUgPSB0aGlzLmNvbXBOYW1lIHx8IG1pbG8udXRpbC5jb21wb25lbnROYW1lKCk7XG4gICAgcmV0dXJuIEFUVFJJQlVURV9URU1QTEFURVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcENsYXNzJywgdGhpcy5jb21wQ2xhc3MgfHwgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyVjb21wRmFjZXRzJywgdGhpcy5jb21wRmFjZXRzICYmIHRoaXMuY29tcEZhY2V0cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnWycgKyB0aGlzLmNvbXBGYWNldHMuam9pbignLCAnKSArICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcE5hbWUnLCB0aGlzLmNvbXBOYW1lKTtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgbWV0aG9kXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1N0cmluZ30gY29tcG9uZW50Q2xhc3Mgb3B0aW9uYWwgY2xhc3MgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGNvbXBvbmVudE5hbWUgb3B0aW9uYWxcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gY29tcG9uZW50RmFjZXRzIG9wdGlvbmFsIGV4dHJhIGZhY2V0IHRvIGFkZCB0byB0aGUgY2xhc3NcbiAqL1xuZnVuY3Rpb24gQmluZEF0dHJpYnV0ZSQkc2V0SW5mbyhlbCwgY29tcG9uZW50Q2xhc3MsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudEZhY2V0cykge1xuICAgIHZhciBhdHRyID0gbmV3IEJpbmRBdHRyaWJ1dGUoZWwpO1xuICAgIF8uZXh0ZW5kKGF0dHIsIHtcbiAgICAgICAgY29tcENsYXNzOiBjb21wb25lbnRDbGFzcyxcbiAgICAgICAgY29tcE5hbWU6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgIGNvbXBGYWNldHM6IGNvbXBvbmVudEZhY2V0c1xuICAgIH0pO1xuICAgIGF0dHIuZGVjb3JhdGUoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQXR0cmlidXRlO1xuXG5cbi8qKlxuICogQW4gYWJzY3RyYWN0IGNsYXNzIGZvciBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uIG9mIGVsZW1lbnQgYXR0cmlidXRlcy5cbiAqIFN1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBtZXRob2RzIGBhdHRyTmFtZWAsIGBwYXJzZWAsIGB2YWxpZGF0ZWAgYW5kIGByZW5kZXJgLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnQgd2hlcmUgYXR0cmlidXRlIGlzIGF0dGFjaGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHVzdWFsbHkgc3VwcGxpZWQgYnkgc3ViY2xhc3MgdmlhIGBhdHRyTmFtZWAgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIEF0dHJpYnV0ZShlbCwgbmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgdGhpcy5hdHRyTmFtZSgpO1xuICAgIHRoaXMuZWwgPSBlbDtcblxuICAgIC8vIGF0dHJpYnV0ZSBub2RlXG4gICAgdGhpcy5ub2RlID0gZWwuYXR0cmlidXRlc1t0aGlzLm5hbWVdO1xufVxuXG5cbl8uZXh0ZW5kKEF0dHJpYnV0ZSwge1xuICAgIHJlbW92ZTogQXR0cmlidXRlJCRyZW1vdmVcbn0pO1xuXG5cbi8qKlxuICogIyMjI0F0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2dldF0oI0F0dHJpYnV0ZSRnZXQpXG4gKiAtIFtzZXRdKCNBdHRyaWJ1dGUkc2V0KVxuICogLSBbZGVjb3JhdGVdKCNBdHRyaWJ1dGUkZGVjb3JhdGUpXG4gKlxuICogVGhlIGZvbGxvd2luZyBpbnN0YW5jZSBtZXRob2RzIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHN1YmNsYXNzXG4gKlxuICogLSBhdHRyTmFtZSAtIHNob3VsZCByZXR1cm4gYXR0cmlidXRlIG5hbWVcbiAqIC0gcGFyc2UgLSBzaG91bGQgcGFyc2UgYXR0cmlidXRlIHZhbHVlXG4gKiAtIHZhbGlkYXRlIC0gc2hvdWxkIHZhbGlkYXRlIGF0dHJpYnV0ZSB2YWx1ZSwgdGhyb3dpbmcgZXhjZXB0aW9uIGlmIGl0IGlzIGluY29ycmVjdCBcbiAqIC0gcmVuZGVyIC0gc2hvdWxkIHJldHVybiBhdHRyaWJ1dGUgdmFsdWUgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlIHN0YXRlIChvdGhlciBwcm9wZXJ0aWVzLCBhcyBkZWZpbmVkIGluIHN1YmNsYXNzKVxuICovXG5fLmV4dGVuZFByb3RvKEF0dHJpYnV0ZSwge1xuICAgIGdldDogQXR0cmlidXRlJGdldCxcbiAgICBzZXQ6IEF0dHJpYnV0ZSRzZXQsXG4gICAgcmVtb3ZlOiBBdHRyaWJ1dGUkcmVtb3ZlLFxuICAgIGRlY29yYXRlOiBBdHRyaWJ1dGUkZGVjb3JhdGUsXG5cbiAgICBkZXN0cm95OiBBdHRyaWJ1dGUkZGVzdHJveSxcblxuICAgIC8vIHNob3VsZCBiZSBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgYXR0ck5hbWU6IHRvQmVJbXBsZW1lbnRlZCxcbiAgICBwYXJzZTogdG9CZUltcGxlbWVudGVkLFxuICAgIHZhbGlkYXRlOiB0b0JlSW1wbGVtZW50ZWQsXG4gICAgcmVuZGVyOiB0b0JlSW1wbGVtZW50ZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIEF0dHJpYnV0ZSQkcmVtb3ZlKGVsLCBkZWVwKSB7XG4gICAgdmFyIG5hbWUgPSB0aGlzLnByb3RvdHlwZS5hdHRyTmFtZSgpO1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblxuICAgIGlmIChkZWVwKSB7XG4gICAgICAgIHZhciBzZWxlY3RvciA9ICdbJyArIG5hbWUgKyAnXSc7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkRWwpIHtcbiAgICAgICAgICAgIGNoaWxkRWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBBdHRyaWJ1dGUkcmVtb3ZlKCkge1xuICAgIGRlbGV0ZSB0aGlzLm5vZGU7XG59XG5cblxuZnVuY3Rpb24gQXR0cmlidXRlJGRlc3Ryb3koKSB7XG4gICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgZGVsZXRlIHRoaXMubm9kZTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcmV0dXJucyBhdHRyaWJ1dGUgdmFsdWUgYXMgc3RyaW5nLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5nZXRBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbn1cblxuXG4vKipcbiAqIEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCBzZXRzIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJHNldCh2YWx1ZSkge1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKHRoaXMubmFtZSwgdmFsdWUpO1xufVxuXG5cbi8qKlxuICogQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IGRlY29yYXRlcyBlbGVtZW50IHdpdGggaXRzIHJlbmRlcmVkIHZhbHVlLlxuICogVXNlcyBgcmVuZGVyYCBtZXRob2QgdGhhdCBzaG91bGQgYmUgZGVmaWVuZCBpbiBzdWJjbGFzcy5cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGRlY29yYXRlKCkge1xuICAgIHRoaXMuc2V0KHRoaXMucmVuZGVyKCkpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQmVJbXBsZW1lbnRlZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIG1ldGhvZCBvZiBhbiBhYnNjdHJhY3QgY2xhc3MnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEF0dHJpYnV0ZSA9IHJlcXVpcmUoJy4vYV9jbGFzcycpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8uYXR0cmlidXRlcy5sb2FkYFxuICogTG9hZEF0dHJpYnV0ZSBjbGFzcyBwYXJzZXMvdmFsaWRhdGVzL2V0Yy4gYW4gYXR0cmlidXRlIHRoYXQgbG9hZHMgc3ViLXZpZXdzIGludG8gdGhlIHBhZ2UuXG4gKiBBdHRyaWJ1dGUgdmFsdWUgc2hvdWxkIGJlIFVSTCBvZiB0aGUgZmlsZSB0byBsb2FkIHN1YnZpZXcgZnJvbS5cbiAqIFNlZSBbbG9hZGVyXSguLi9sb2FkZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBMb2FkQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdMb2FkQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjTG9hZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhMb2FkQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExvYWRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWxvYWQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBsb2FkIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBsb2FkOiAnY2MtbG9hZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWxvYWQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMubG9hZDtcbn1cblxuXG4vKipcbiAqIExvYWRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGxvYWQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnR5IGBsb2FkVXJsYCBvbiBMb2FkQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiBwYXJzZSgpIHtcbiAgICBpZiAoISB0aGlzLm5vZGUpIHJldHVybjtcblxuICAgIHRoaXMubG9hZFVybCA9IHRoaXMuZ2V0KCk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHNob3VsZCB2YWxpZGF0ZSBsb2FkIGF0dHJpYnV0ZSBhbmQgdGhyb3cgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBUT0RPIC0gaW1wbGVtZW50IHVybCB2YWxpZGF0aW9uLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgICAvLyBUT0RPIHVybCB2YWxpZGF0aW9uXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCAtIHJldHVybnMgVVJMXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZFVybDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTdWJjbGFzc2VzIG9mIFtBdHRyaWJ1dGVdKC4vYV9jbGFzcy5qcy5odG1sKSBjbGFzc1xuICpcbiAqIC0gW0JpbmRBdHRyaWJ1dGVdKC4vYV9iaW5kLmpzLmh0bWwpXG4gKiAtIFtMb2FkQXR0cmlidXRlXSguL2FfbG9hZC5qcy5odG1sKVxuICovXG52YXIgYXR0cmlidXRlcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGJpbmQ6IHJlcXVpcmUoJy4vYV9iaW5kJyksXG4gICAgbG9hZDogcmVxdWlyZSgnLi9hX2xvYWQnKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9NYWlsID0gcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX3JlZ2lzdHJ5JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudCA9IGNvbXBvbmVudHNSZWdpc3RyeS5nZXQoJ0NvbXBvbmVudCcpXG4gICAgLCBDb21wb25lbnRJbmZvID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfaW5mbycpXG4gICAgLCBTY29wZSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9zY29wZScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgdXRpbERvbSA9IHJlcXVpcmUoJy4vdXRpbC9kb20nKVxuICAgICwgTWF0Y2ggPSAgY2hlY2suTWF0Y2g7XG5cblxuYmluZGVyLnNjYW4gPSBzY2FuO1xuYmluZGVyLmNyZWF0ZSA9IGNyZWF0ZTtcbmJpbmRlci50d29QYXNzID0gdHdvUGFzcztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmRlcjtcblxuXG4vKipcbiAqIGBtaWxvLmJpbmRlcmBcbiAqXG4gKiBSZWN1cnNpdmVseSBzY2FucyB0aGUgZG9jdW1lbnQgdHJlZSBpbnNpZGUgYHNjb3BlRWxgIChkb2N1bWVudC5ib2R5IGJ5IGRlZmF1bHQpIGxvb2tpbmcgZm9yIF9fbWwtYmluZF9fIGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBjb250YWluIHRoZSBjbGFzcywgYWRkaXRpb25hbCBmYWNldHMgYW5kIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBhbmQgYm91bmQgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogUG9zc2libGUgdmFsdWVzIG9mIF9fbWwtYmluZF9fIGF0dHJpYnV0ZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIENvbXBvbmVudCBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dCBhbnkgZmFjZXRzLlxuICogLSBgVmlldzpteVZpZXdgIC0gY2xhc3MgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBWaWV3IGNsYXNzIHdpbGwgYmUgY3JlYXRlZC5cbiAqIC0gYFtFdmVudHMsIERhdGFdOm15Vmlld2AgLSBmYWNldHMgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBDb21wb25lbnQgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKiAtIGBWaWV3W0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGNsYXNzLCBmYWNldChzKSBhbmQgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIFZpZXcgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKlxuICogRnVuY3Rpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBbYFNjb3BlYF0oLi9jb21wb25lbnRzL3Njb3BlLmpzLmh0bWwpIGNsYXNzIGNvbnRhaW5pbmcgYWxsIGNvbXBvbmVudHMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBzY2FubmluZyBET00uXG4gKlxuICogSWYgdGhlIGNvbXBvbmVudCBoYXMgW2BDb250YWluZXJgXSguL2NvbXBvbmVudHMvY19mYWNldHMvQ29udGFpbmVyLmpzKSBmYWNldCwgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBgc2NvcGVgIG9iamVjdCwgYXZhaWxhYmxlIGFzIHNjb3BlIHByb3BlcnR5IG9uIHRoZSBDb250YWluZXIgZmFjZXQgb2YgdGhpcyBjb21wb25lbnQuIE5hbWVzIG9mIGNvbXBvbmVudHMgd2l0aGluIHRoZSBzY29wZSBzaG91bGQgYmUgdW5pcXVlLCBidXQgdGhleSBjYW4gYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWVzIG9mIGNvbXBvbmVudHMgaW4gb3V0ZXIgc2NvcGUgKG9yIHNvbWUgb3RoZXIgc2NvcGUpLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gc2NvcGVFbCByb290IGVsZW1lbnQgaW5zaWRlIHdoaWNoIERPTSB3aWxsIGJlIHNjYW5uZWQgYW5kIGJvdW5kXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgT3B0aW9uYWwgUm9vdCBzY29wZSBvYmplY3Qgd2hlcmUgdG9wIGxldmVsIGNvbXBvbmVudHMgd2lsbCBiZSBzYXZlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYmluZFJvb3RFbGVtZW50IElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqIEByZXR1cm4ge1Njb3BlfVxuICovXG5mdW5jdGlvbiBiaW5kZXIoc2NvcGVFbCwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpIHtcbiAgICByZXR1cm4gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgICAgIHZhciBpbmZvID0gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGUoaW5mbywgdGhyb3dPbkVycm9ycyk7XG4gICAgfSwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIGJpbmQgaW4gdHdvIHBhc3Nlc1xuZnVuY3Rpb24gdHdvUGFzcyhzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY2FuU2NvcGUgPSBiaW5kZXIuc2NhbihzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG4gICAgcmV0dXJuIGJpbmRlci5jcmVhdGUoc2NhblNjb3BlLCB1bmRlZmluZWQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIHNjYW4gRE9NIGZvciBCaW5kQXR0cmlidXRlXG5mdW5jdGlvbiBzY2FuKHNjb3BlRWwsIHJvb3RTY29wZSwgYmluZFJvb3RFbGVtZW50LCB0aHJvd09uRXJyb3JzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJpbmRlclNjb3BlKHNjb3BlRWwsIGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0ciwgdGhyb3dPbkVycm9ycykge1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICB9LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG59XG5cblxuLy8gY3JlYXRlIGJvdW5kIGNvbXBvbmVudHNcbmZ1bmN0aW9uIGNyZWF0ZShzY2FuU2NvcGUsIGhvc3RPYmplY3QsIHRocm93T25FcnJvcnMpIHtcbiAgICB2YXIgc2NvcGUgPSBuZXcgU2NvcGUoc2NhblNjb3BlLl9yb290RWwsIGhvc3RPYmplY3QpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgc2NhblNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBJbmZvKSB7XG4gICAgICAgIC8vIHNldCBjb3JyZWN0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgICAgIHZhciBpbmZvID0gXy5jbG9uZShjb21wSW5mbylcbiAgICAgICAgaW5mby5zY29wZSA9IHNjb3BlO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBjb21wb25lbnRcbiAgICAgICAgdmFyIGFDb21wb25lbnQgPSBDb21wb25lbnQuY3JlYXRlKGluZm8sIHRocm93T25FcnJvcnMpO1xuXG4gICAgICAgIHNjb3BlW2FkZE1ldGhvZF0oYUNvbXBvbmVudCwgYUNvbXBvbmVudC5uYW1lKTtcbiAgICAgICAgaWYgKGFDb21wb25lbnQuY29udGFpbmVyKVxuICAgICAgICAgICAgYUNvbXBvbmVudC5jb250YWluZXIuc2NvcGUgPSBjcmVhdGUoY29tcEluZm8uY29udGFpbmVyLnNjb3BlLCBhQ29tcG9uZW50LmNvbnRhaW5lciwgdGhyb3dPbkVycm9ycyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2NvcGU7XG59XG5cbi8qKlxuICogYGNyZWF0ZUJpbmRlclNjb3BlYFxuICogQHBhcmFtICB7RWxlbWVudH0gc2NvcGVFbCAgICAgICAgICAgICBzY29wZUVsIHJvb3QgZWxlbWVudCBpbnNpZGUgd2hpY2ggRE9NIHdpbGwgYmUgc2Nhbm5lZCBhbmQgYm91bmQgKGRvY3VtZW50LmJvZHkgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gc2NvcGVPYmplY3RGYWN0b3J5IFNlZSBbYmluZGVyXSgjbWlsby5iaW5kZXIpXG4gKiBAcGFyYW0gIHtTY29wZX0gcm9vdFNjb3BlICAgICAgICAgICAgIE9wdGlvbmFsIFJvb3Qgc2NvcGUgb2JqZWN0IHdoZXJlIHRvcCBsZXZlbCBjb21wb25lbnRzIHdpbGwgYmUgc2F2ZWQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBiaW5kUm9vdEVsZW1lbnQgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSB0aHJvd09uRXJyb3JzICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtTY29wZX0gICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgc2NvcGVPYmplY3RGYWN0b3J5LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY29wZUVsID0gc2NvcGVFbCB8fCBkb2N1bWVudC5ib2R5XG4gICAgICAgICwgc2NvcGUgPSByb290U2NvcGUgfHwgbmV3IFNjb3BlKHNjb3BlRWwpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgY3JlYXRlU2NvcGVGb3JFbGVtZW50KHNjb3BlLCBzY29wZUVsLCBiaW5kUm9vdEVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIHNjb3BlO1xuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckVsZW1lbnQoc2NvcGUsIGVsLCBiaW5kUm9vdEVsZW1lbnQpIHtcbiAgICAgICAgLy8gZ2V0IGVsZW1lbnQncyBiaW5kaW5nIGF0dHJpYnV0ZSAobWwtYmluZCBieSBkZWZhdWx0KVxuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcblxuICAgICAgICAvLyBpZiBlbGVtZW50IGhhcyBiaW5kIGF0dHJpYnV0ZSBjcmF0ZSBzY29wZSBvYmplY3QgKENvbXBvbmVudCBvciBDb21wb25lbnRJbmZvKVxuICAgICAgICBpZiAoYXR0ci5ub2RlICYmIGJpbmRSb290RWxlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHZhciBzY29wZWRPYmplY3QgPSBzY29wZU9iamVjdEZhY3Rvcnkoc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKVxuICAgICAgICAgICAgICAgICwgaXNDb250YWluZXIgPSB0eXBlb2Ygc2NvcGVkT2JqZWN0ICE9ICd1bmRlZmluZWQnICYmIHNjb3BlZE9iamVjdC5jb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgY2hpbGROb2RlcyBhZGQgY2hpbGRyZW4gdG8gbmV3IHNjb3BlIGlmIHRoaXMgZWxlbWVudCBoYXMgY29tcG9uZW50IHdpdGggQ29udGFpbmVyIGZhY2V0XG4gICAgICAgIC8vIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgc2NvcGVcbiAgICAgICAgaWYgKGVsLmNoaWxkTm9kZXMgJiYgZWwuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHZhciBpbm5lclNjb3BlID0gbmV3IFNjb3BlKGVsKTtcbiAgICAgICAgICAgICAgICBzY29wZWRPYmplY3QuY29udGFpbmVyLnNjb3BlID0gaW5uZXJTY29wZTtcbiAgICAgICAgICAgICAgICBpbm5lclNjb3BlLl9ob3N0T2JqZWN0ID0gc2NvcGVkT2JqZWN0LmNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3JlYXRlU2NvcGVGb3JDaGlsZHJlbihlbCwgaXNDb250YWluZXIgPyBpbm5lclNjb3BlIDogc2NvcGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2NvcGUgd2Fzbid0IHByZXZpb3VzbHkgY3JlYXRlZCBvbiBjb250YWluZXIgZmFjZXQsIGNyZWF0ZSBlbXB0eSBzY29wZSBhbnl3YXlcbiAgICAgICAgaWYgKGlzQ29udGFpbmVyICYmICEgc2NvcGVkT2JqZWN0LmNvbnRhaW5lci5zY29wZSlcbiAgICAgICAgICAgIHNjb3BlZE9iamVjdC5jb250YWluZXIuc2NvcGUgPSBuZXcgU2NvcGUoZWwpO1xuXG5cbiAgICAgICAgLy8gVE9ETyBjb25kaXRpb24gYWZ0ZXIgJiYgaXMgYSBoYWNrLCBzaG91bGQgbm90IGJlIHVzZWQhXG4gICAgICAgIGlmIChzY29wZWRPYmplY3QpIC8vICYmICEgc2NvcGVbYXR0ci5jb21wTmFtZV0pXG4gICAgICAgICAgICBzY29wZVthZGRNZXRob2RdKHNjb3BlZE9iamVjdCwgYXR0ci5jb21wTmFtZSk7XG5cbiAgICAgICAgLy8gXy5kZWZlcihwb3N0Q2hpbGRyZW5Cb3VuZE1lc3NhZ2UsIGVsKTtcbiAgICAgICAgcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKTtcblxuICAgICAgICByZXR1cm4gc2NvcGVkT2JqZWN0O1xuXG5cbiAgICAgICAgZnVuY3Rpb24gcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKSB7XG4gICAgICAgICAgICB2YXIgZWxDb21wID0gQ29tcG9uZW50LmdldENvbXBvbmVudChlbCk7XG5cbiAgICAgICAgICAgIGlmIChlbENvbXApXG4gICAgICAgICAgICAgICAgZWxDb21wLnBvc3RNZXNzYWdlU3luYygnY2hpbGRyZW5ib3VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckNoaWxkcmVuKGNvbnRhaW5lckVsLCBzY29wZSkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB1dGlsRG9tLmNoaWxkcmVuKGNvbnRhaW5lckVsKTtcblxuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGNyZWF0ZVNjb3BlRm9yRWxlbWVudChzY29wZSwgbm9kZSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29yZUNsYXNzZXMgPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5jbGFzc2VzO1xuXG4vLyA8YSBuYW1lPVwiY2xhc3Nlc1wiPjwvYT5cbi8vIG1pbG8uY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gVGhpcyBtb2R1bGUgY29udGFpbnMgZm91bmRhdGlvbiBjbGFzc2VzIGFuZCBjbGFzcyByZWdpc3RyaWVzLlxuXG52YXIgY2xhc3NlcyA9IHtcbiAgICBGYWNldDogcmVxdWlyZSgnLi9hYnN0cmFjdC9mYWNldCcpLFxuICAgIEZhY2V0ZWRPYmplY3Q6IHJlcXVpcmUoJy4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QnKSxcbiAgICBTY29wZTogcmVxdWlyZSgnLi9jb21wb25lbnRzL3Njb3BlJyksXG4gICAgQ2xhc3NSZWdpc3RyeTogcmVxdWlyZSgnLi9hYnN0cmFjdC9yZWdpc3RyeScpLFxuICAgIE1peGluOiBjb3JlQ2xhc3Nlcy5NaXhpbixcbiAgICBNZXNzYWdlU291cmNlOiBjb3JlQ2xhc3Nlcy5NZXNzYWdlU291cmNlLFxuICAgIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2U6IGNvcmVDbGFzc2VzLk1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UsXG4gICAgTWVzc2VuZ2VyQVBJOiBjb3JlQ2xhc3Nlcy5NZXNzZW5nZXJBUEksXG4gICAgRE9NRXZlbnRzU291cmNlOiByZXF1aXJlKCcuL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzJyksXG4gICAgVHJhbnNhY3Rpb246IHJlcXVpcmUoJy4vY29tbWFuZC90cmFuc2FjdGlvbicpLFxuICAgIFRyYW5zYWN0aW9uSGlzdG9yeTogcmVxdWlyZSgnLi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnknKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc2VzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQWN0aW9uc0hpc3Rvcnk7XG5cblxuLyoqXG4gKiBTdG9yZXMgbGlzdCBvZiBjb21tYW5kcyBvciB0cmFuc2FjdGlvbnNcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhMZW5ndGhcbiAqL1xuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gbWF4TGVuZ3RoIHx8IEluZmluaXR5O1xuICAgIHRoaXMuYWN0aW9ucyA9IFtdO1xuICAgIHRoaXMucG9zaXRpb24gPSAwO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oQWN0aW9uc0hpc3RvcnksIHtcbiAgICBzdG9yZTogQWN0aW9uc0hpc3Rvcnkkc3RvcmUsXG4gICAgZGVsZXRlTGFzdDogQWN0aW9uc0hpc3RvcnkkZGVsZXRlTGFzdCxcbiAgICB1bmRvOiBBY3Rpb25zSGlzdG9yeSR1bmRvLFxuICAgIHJlZG86IEFjdGlvbnNIaXN0b3J5JHJlZG8sXG4gICAgdW5kb0FsbDogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbCxcbiAgICByZWRvQWxsOiBBY3Rpb25zSGlzdG9yeSRyZWRvQWxsLFxuICAgIHVuZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbEFzeW5jLFxuICAgIHJlZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkcmVkb0FsbEFzeW5jLFxuICAgIGVhY2g6IEFjdGlvbnNIaXN0b3J5JGVhY2gsXG4gICAgZWFjaFJldmVyc2U6IEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlLFxuICAgIGdldExhc3RBY3Rpb246IEFjdGlvbnNIaXN0b3J5JGdldExhc3RBY3Rpb24sXG5cbiAgICBnZXREZXNjcmlwdGlvbjogQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb25cbn0pO1xuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHN0b3JlKGNvbW1hbmQpIHtcbiAgICBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbi5jYWxsKHRoaXMpO1xuICAgIHRoaXMuYWN0aW9ucy5wdXNoKGNvbW1hbmQpO1xuXG4gICAgaWYgKHRoaXMuYWN0aW9ucy5sZW5ndGggPiB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICBhY3QuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSB0aGlzLmFjdGlvbnMubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uIC0gMVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGRlbGV0ZUxhc3QoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGlvbnMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5wb3NpdGlvbi0tO1xuICAgIHRoaXMuYWN0aW9ucy5sZW5ndGgtLTtcbn1cblxuXG5mdW5jdGlvbiBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbigpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5wb3NpdGlvbjsgaSA8IHRoaXMuYWN0aW9ucy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGhpcy5hY3Rpb25zW2ldLmRlc3Ryb3koKTtcbiAgICB0aGlzLmFjdGlvbnMubGVuZ3RoID0gdGhpcy5wb3NpdGlvbjtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvKGNiKSB7XG4gICAgaWYgKHRoaXMucG9zaXRpb24gPT0gMCkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIHVuZG9cbiAgICB2YXIgYWN0ID0gdGhpcy5hY3Rpb25zWy0tdGhpcy5wb3NpdGlvbl07XG4gICAgYWN0LnVuZG8oY2IpO1xuICAgIHJldHVybiBhY3Q7XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkcmVkbyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uID09IHRoaXMuYWN0aW9ucy5sZW5ndGgpIHJldHVybjsgLy8gbm90aGluZyB0byByZWRvXG4gICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uKytdO1xuICAgIGFjdC5yZWRvKGNiKTtcbiAgICByZXR1cm4gYWN0O1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHVuZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24pIHRoaXMudW5kbygpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSB0aGlzLnJlZG8oKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvQWxsQXN5bmMoY2IpIHtcbiAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuICAgICAgICB0aGlzLnVuZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24pXG4gICAgICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICd1bmRvQWxsQXN5bmMnLCBjYik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGxBc3luYyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIDwgdGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSBcbiAgICAgICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgJ3JlZG9BbGxBc3luYycsIGNiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZWFjaChmdW5jT3JNZXRob2QsIHRoaXNBcmcpIHtcbiAgICB2YXIgZnVuYyA9IHR5cGVvZiBmdW5jT3JNZXRob2QgPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKGFjdCkgeyBhY3RbZnVuY09yTWV0aG9kXSgpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jT3JNZXRob2Q7XG5cbiAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaChmdW5jLCB0aGlzQXJnIHx8IHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlKGZ1bmNPck1ldGhvZCwgdGhpc0FyZykge1xuICAgIHRoaXMuYWN0aW9ucy5yZXZlcnNlKCk7XG4gICAgdGhpcy5lYWNoKGZ1bmNPck1ldGhvZCwgdGhpc0FyZyk7XG4gICAgdGhpcy5hY3Rpb25zLnJldmVyc2UoKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSRnZXRMYXN0QWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uICYmIHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uIC0gMV07XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnMubWFwKGZ1bmN0aW9uKGFjdCkge1xuICAgICAgICByZXR1cm4gYWN0LmdldERlc2NyaXB0aW9uKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uczogYWN0aW9ucyxcbiAgICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXG4gICAgICAgIGxlbmd0aDogYWN0aW9ucy5sZW5ndGhcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2xhc3NSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L3JlZ2lzdHJ5JylcbiAgICAsIENvbW1hbmQgPSByZXF1aXJlKCcuL2luZGV4Jyk7XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuY29tcG9uZW50c2BcbiAqIEFuIGluc3RhbmNlIG9mIFtDbGFzc1JlZ2lzdHJ5XSguLi9hYnN0cmFjdC9yZWdpc3RyeS5qcy5odG1sKSBjbGFzcyB0aGF0IGlzIHVzZWQgYnkgbWlsbyB0byByZWdpc3RlciBhbmQgZmluZCBjb21wb25lbnRzLlxuICovXG52YXIgY29tbWFuZHNSZWdpc3RyeSA9IG5ldyBDbGFzc1JlZ2lzdHJ5KENvbW1hbmQpO1xuXG4vLyBhZGQgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBjb21wb25lbnRzIHRvIHRoZSByZWdpc3RyeS5cbmNvbW1hbmRzUmVnaXN0cnkuYWRkKENvbW1hbmQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbW1hbmRzUmVnaXN0cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG52YXIgVU5ET19DT01NQU5EID0gJ191bmRvQ29tbWFuZCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb21tYW5kO1xuXG5cbi8qKlxuICogQ29tbWFuZCBjbGFzcyB0byBpbXBsZW1lbnQgXCJjb21tYW5kIHBhdHRlcm5cIiAtIHBhY2thZ2luZyBsbCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGRlbGF5ZWQgbWV0aG9kIGV4ZWN1dGlvblxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBDb21tYW5kKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb21tYW5kIGluc3RhbmNlIG1ldGhvZHNcbiAqIFxuICogLSBbaW5pdF0oI0NvbW1hbmQkZXhlY3V0ZSkgLSBpbml0aWFsaXplIGNvbW1hbmQsIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBzdWJjbGFzc2VzXG4gKiAtIFtleGVjdXRlXSgjQ29tbWFuZCRleGVjdXRlKSAtIGV4ZWN1dGUgY29tbWFuZFxuICogLSBbc2V0VW5kb10oI0NvbW1hbmQkc2V0VW5kbykgLSBzZXQgdW5kbyBjb21tYW5kIGZvciB0aGlzIGNvbW1hbmRcbiAqIC0gW2dldFVuZG9dKCNDb21tYW5kJGdldFVuZG8pIC0gZ2V0IHVuZG8gY29tbWFuZCBvZiB0aGlzIGNvbW1hbmRcbiAqIC0gW3NldEFyZ3VtZW50c10oI0NvbW1hbmQkc2V0QXJndW1lbnRzKSAtIHNldCBjb21tYW5kcyBhcmd1bWVudHNcbiAqIC0gW2FkZEFyZ3VtZW50c10oI0NvbW1hbmQkYWRkQXJndW1lbnRzKSAtIGFkZCBhcmd1bWVudHMgdG8gY29tbWFuZFxuICogLSBbZGVzdHJveV0oI0NvbW1hbmQkZGVzdHJveSlcbiAqL1xuXy5leHRlbmRQcm90byhDb21tYW5kLCB7XG4gICAgaW5pdDogQ29tbWFuZCRpbml0LFxuICAgIGV4ZWN1dGU6IENvbW1hbmQkZXhlY3V0ZSxcbiAgICBzZXRVbmRvOiBDb21tYW5kJHNldFVuZG8sXG4gICAgZ2V0VW5kbzogQ29tbWFuZCRnZXRVbmRvLFxuICAgIHVuZG86IENvbW1hbmQkdW5kbyxcbiAgICByZWRvOiBDb21tYW5kJGV4ZWN1dGUsIC8vIHNhbWUgZm9yIGNvbW1hbmQsIGRpZmZlcmVudCBmb3IgdHJhbnNhY3Rpb25cbiAgICBzZXRBcmd1bWVudHM6IENvbW1hbmQkc2V0QXJndW1lbnRzLFxuICAgIGFkZEFyZ3VtZW50czogQ29tbWFuZCRhZGRBcmd1bWVudHMsXG4gICAgZ2V0QXJndW1lbnRzOiBDb21tYW5kJGdldEFyZ3VtZW50cyxcbiAgICBjaGFuZ2VBcmd1bWVudHM6IENvbW1hbmQkY2hhbmdlQXJndW1lbnRzLFxuICAgIGRlc3Ryb3k6IENvbW1hbmQkZGVzdHJveSxcblxuICAgIHNldENvbW1lbnQ6IENvbW1hbmQkc2V0Q29tbWVudCxcbiAgICBnZXREZXNjcmlwdGlvbjogQ29tbWFuZCRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuLyoqXG4gKiBDb21tYW5kIGNsYXNzIG1ldGhvZHNcbiAqXG4gKiAtIFtjcmVhdGVdKCNDb21tYW5kJCRjcmVhdGUpIC0gY29tbWFuZHMgZmFjdG9yeVxuICovXG5fLmV4dGVuZChDb21tYW5kLCB7XG4gICAgY3JlYXRlOiBDb21tYW5kJCRjcmVhdGUsXG4gICAgY3JlYXRlV2l0aFVuZG86IENvbW1hbmQkJGNyZWF0ZVdpdGhVbmRvXG59KTtcblxuXG5mdW5jdGlvbiBDb21tYW5kJGluaXQoZnVuYykgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICBjaGVjayhmdW5jLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuICAgIHRoaXMuZnVuYyA9IGZ1bmMgfHwgZnVuY3Rpb24oKXt9O1xuICAgIHRoaXMuYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTsgICAgXG59XG5cblxuLyoqXG4gKiBFeGVjdXRlIGNvbW1hbmQgbWFraW5nIGNvbW1hbmQgb2JqZWN0IGF2YWlsYWJsZSB2aWEgZnVuY3Rpb24gcHJvcGVydHkuIFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGV4ZWN1dGUoY2IpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5mdW5jLmFwcGx5KHRoaXMsIHRoaXMuYXJncyk7XG4gICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8qKlxuICogU2V0IHVuZG8gY29tbWFuZCBmb3IgdGhpcyBjb21tYW5kLiBUaGlzIGNvbW1hbmQgYmVjb21lcyB1bmRvIGNvbW1hbmQgZm9yIHVuZG8gY29tbWFuZCAoc28gdW5kbyBjb21tYW5kIGNhbiBjaGFuZ2UgdGhpcyBjb21tYW5kIGR1cmluZyBpdHMgZXhlY3V0aW9uKS5cbiAqIFxuICogQHBhcmFtIHtDb21tYW5kfSB1bmRvQ29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJHNldFVuZG8odW5kb0NvbW1hbmQpIHtcbiAgICBpZiAodGhpc1tVTkRPX0NPTU1BTkRdKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRVbmRvOiB1bmRvIGNvbW1hbmQgaXMgYWxyZWFkeSBzZXQnKTtcblxuICAgIHRoaXNbVU5ET19DT01NQU5EXSA9IHVuZG9Db21tYW5kO1xuICAgIHVuZG9Db21tYW5kW1VORE9fQ09NTUFORF0gPSB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB1bmRvIGNvbW1hbmQgb2YgYSBnaXZlbiBjb21tYW5kXG4gKlxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRnZXRVbmRvKCkge1xuICAgIHJldHVybiB0aGlzW1VORE9fQ09NTUFORF07XG59XG5cblxuLyoqXG4gKiBFeGVjdXRlcyB1bmRvIGNvbW1hbmQgb2YgY3VycmVudCBjb21tYW5kXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkdW5kbyhjYikge1xuICAgIHZhciB1bmRvQ21kID0gdGhpcy5nZXRVbmRvKCk7XG4gICAgaWYgKCEgdW5kb0NtZCkgcmV0dXJuIGxvZ2dlci5lcnJvcignQ29tbWFuZCB1bmRvIGNhbGxlZCB3aXRob3V0IHVuZG8gY29tbWFuZCBwcmVzZW50Jyk7XG4gICAgdmFyIHJlc3VsdCA9IHVuZG9DbWQuZXhlY3V0ZSgpO1xuICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vKipcbiAqIFNldCBjb21tYW5kJ3MgYXJndW1lbnRzLiBJZiBhcmd1bWVudHMgd2VyZSBzZXQgZHVyaW5nIGNvbW1hbmQncyBjcmVhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBvdmVyd3JpdGUgYXJndW1lbnRzIGFuZCBsb2cgd2FybmluZy5cbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHNcbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRzZXRBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgaWYgKHRoaXMuYXJncyAmJiB0aGlzLmFyZ3MubGVuZ3RoKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRBcmd1bWVudHM6IGNvbW1hbmQgYXJndW1lbnRzIGFyZSBhbHJlYWR5IHNldCcpO1xuICAgIHRoaXMuYXJncyA9IF8udG9BcnJheShhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0QXJndW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmFyZ3M7XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRjaGFuZ2VBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5hcmdzID0gXy50b0FycmF5KGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBBZGQgKGFwcGVuZCkgYXJndW1lbnRzIHRvIGNvbW1hbmRcbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHMgYXJndW1lbnRzIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gY29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGFkZEFyZ3VtZW50cygpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICBpZiAoISB0aGlzLmFyZ3MpIHRoaXMuYXJncyA9IFtdO1xuICAgIF8uYXBwZW5kQXJyYXkodGhpcy5hcmdzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogQ29tbWFuZHMgZmFjdG9yeS4gTGlrZWx5IG90IGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgY3VzdG9tIGxvZ2ljIG9mIGNvbW1hbmQgY29uc3RydWN0aW9uXG4gKiBcbiAqIEB0aGlzIHtGdW5jdGlvbn0gQ2xhc3Mgb2YgY29tbWFuZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCQkY3JlYXRlKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgcmV0dXJuIF8ubmV3QXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21tYW5kJCRjcmVhdGVXaXRoVW5kbygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVdpdGhVbmRvIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBzdWJzY2xhc3MnKTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY3VycmVudCBjb21tYW5kICh0byBwcmV2ZW50IHBvdGVudGlhbCBtZW1vcnkgbGVha3Mgd2hlbiBjb21tYW5kcyBwb2ludCB0byBET00gZWxlbWVudHMpXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkZGVzdHJveSgpIHtcbiAgICBkZWxldGUgdGhpcy5mdW5jO1xuICAgIGRlbGV0ZSB0aGlzLmFyZ3M7XG4gICAgdmFyIHVuZG9DbWQgPSB0aGlzW1VORE9fQ09NTUFORF07XG4gICAgaWYgKHVuZG9DbWQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbVU5ET19DT01NQU5EXVtVTkRPX0NPTU1BTkRdO1xuICAgICAgICBkZWxldGUgdGhpc1tVTkRPX0NPTU1BTkRdO1xuICAgICAgICB1bmRvQ21kLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRzZXRDb21tZW50KGNvbW1lbnQpIHtcbiAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50O1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnVuYzogdGhpcy5mdW5jLm5hbWUsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuY29tbWVudFxuICAgIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIEFjdGlvbnNIaXN0b3J5ID0gcmVxdWlyZSgnLi9hY3Rpb25zX2hpc3RvcnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNhY3Rpb247XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24oKSB7XG4gICAgdGhpcy5jb21tYW5kcyA9IG5ldyBBY3Rpb25zSGlzdG9yeTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uLCB7XG4gICAgZXhlY3V0ZTogVHJhbnNhY3Rpb24kZXhlY3V0ZSxcbiAgICB1bmRvOiBUcmFuc2FjdGlvbiR1bmRvLFxuICAgIHJlZG86IFRyYW5zYWN0aW9uJHJlZG8sXG4gICAgZGVzdHJveTogVHJhbnNhY3Rpb24kZGVzdHJveSxcbiAgICBzdG9yZUNvbW1hbmQ6IFRyYW5zYWN0aW9uJHN0b3JlQ29tbWFuZCxcbiAgICBtZXJnZTogVHJhbnNhY3Rpb24kbWVyZ2UsXG5cbiAgICBzZXRDb21tZW50OiBUcmFuc2FjdGlvbiRzZXRDb21tZW50LFxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbiRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZXhlY3V0ZSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2V4ZWN1dGUnKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiR1bmRvKGNiKSB7XG4gICAgdGhpcy5jb21tYW5kcy51bmRvQWxsQXN5bmMoY2IpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJHJlZG8oY2IpIHtcbiAgICB0aGlzLmNvbW1hbmRzLnJlZG9BbGxBc3luYyhjYik7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2Rlc3Ryb3knKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiRzdG9yZUNvbW1hbmQoY29tbWFuZCkge1xuICAgIHRoaXMuY29tbWFuZHMuc3RvcmUoY29tbWFuZCk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kbWVyZ2UodHJhbnNhY3Rpb24pIHtcbiAgICB0cmFuc2FjdGlvbi5jb21tYW5kcy5lYWNoKGZ1bmN0aW9uKGNtZCkge1xuICAgICAgICB0aGlzLmNvbW1hbmRzLnN0b3JlKGNtZCk7XG4gICAgfSwgdGhpcyk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kc2V0Q29tbWVudChjb21tZW50KSB7XG4gICAgdGhpcy5jb21tZW50ID0gY29tbWVudFxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJGdldERlc2NyaXB0aW9uKCkge1xuICAgIHZhciBjb21tYW5kcyA9IHRoaXMuY29tbWFuZHMuZ2V0RGVzY3JpcHRpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogY29tbWFuZHMuYWN0aW9ucyxcbiAgICAgICAgY29tbWVudDogdGhpcy5jb21tZW50XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBBY3Rpb25zSGlzdG9yeSA9IHJlcXVpcmUoJy4vYWN0aW9uc19oaXN0b3J5JylcbiAgICAsIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi90cmFuc2FjdGlvbicpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2FjdGlvbkhpc3Rvcnk7XG5cblxudmFyIFNDSEVEVUxFRCA9ICdfc2NoZWR1bGVkJztcblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy50cmFuc2FjdGlvbnMgPSBuZXcgQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKTtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzW1NDSEVEVUxFRF0gPSBmYWxzZTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uSGlzdG9yeSwge1xuICAgIHN0b3JlQ29tbWFuZDogVHJhbnNhY3Rpb25IaXN0b3J5JHN0b3JlQ29tbWFuZCxcbiAgICBlbmRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGVuZFRyYW5zYWN0aW9uLFxuICAgIHN0b3JlVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uLFxuICAgIGRlbGV0ZUxhc3RUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGRlbGV0ZUxhc3RUcmFuc2FjdGlvbixcbiAgICB1bmRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkdW5kbyxcbiAgICByZWRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyxcbiAgICBpblRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkaW5UcmFuc2FjdGlvbixcblxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkZ2V0RGVzY3JpcHRpb24sXG4gICAgdXNlTWVzc2VuZ2VyOiBUcmFuc2FjdGlvbkhpc3RvcnkkdXNlTWVzc2VuZ2VyLFxuICAgIGRlc3Ryb3k6IFRyYW5zYWN0aW9uSGlzdG9yeSRkZXN0cm95XG59KTtcblxuXG4vKipcbiAqIFN0b3JlcyBjb21tYW5kIGluIHRoZSBoaXN0b3J5LiBcbiAqIEBwYXJhbSB7Q29tbWFuZH0gY29tbWFuZCAgICAgICAgICAgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGVuZFRyYW5zYWN0aW9uIElmIGB0cnVlYCwgYXBwZW5kcyB0byB0aGUgY3VycmVudCBvciBwcmV2aW91cyB0cmFuc2FjdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHRyYW5zYWN0aW9uLlxuICovXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3Rvcnkkc3RvcmVDb21tYW5kKGNvbW1hbmQsIGFwcGVuZFRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKGFwcGVuZFRyYW5zYWN0aW9uICYmICEodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gfHwgdGhpcy5jdXJyZW50QmF0Y2gpKSB7XG4gICAgICAgIHZhciB0cmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb25zLmdldExhc3RBY3Rpb24oKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc3RvcmVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICdhcHBlbmRlZCcsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghIHRoaXMuY3VycmVudEJhdGNoKSB0aGlzLmN1cnJlbnRCYXRjaCA9IG5ldyBUcmFuc2FjdGlvbjtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaC5zdG9yZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgaWYgKCEgdGhpc1tTQ0hFRFVMRURdKSB7XG4gICAgICAgIHRoaXNbU0NIRURVTEVEXSA9IHRydWU7XG4gICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgX3N0b3JlVHJhbnNhY3Rpb24pO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVsZXRlTGFzdFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRCYXRjaCB8fCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMuZGVsZXRlTGFzdCgpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfc3RvcmVUcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgX2FkZEJhdGNoVG9UcmFuc2FjdGlvbi5jYWxsKHRoaXMpO1xuICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsIF9zdG9yZVRyYW5zYWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfc3RvcmVDdXJyZW50VHJhbnNhY3Rpb24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpc1tTQ0hFRFVMRURdID0gZmFsc2U7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRlbmRUcmFuc2FjdGlvbigpIHtcbiAgICBfYWRkQmF0Y2hUb1RyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG4gICAgX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG59XG5cblxuZnVuY3Rpb24gX2FkZEJhdGNoVG9UcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgaWYgKCEgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24pIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi5tZXJnZSh0aGlzLmN1cnJlbnRCYXRjaCk7XG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gdW5kZWZpbmVkO1xuICAgIH0gXG59XG5cblxuZnVuY3Rpb24gX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB2YXIgdCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5zdG9yZSh0KTtcbiAgICAgICAgX3Bvc3RUcmFuc2FjdGlvbk1lc3NhZ2UuY2FsbCh0aGlzLCAnc3RvcmVkJywgdCk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5lbmRUcmFuc2FjdGlvbigpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbnMuc3RvcmUodHJhbnNhY3Rpb24pO1xuICAgIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3N0b3JlZCcsIHRyYW5zYWN0aW9uKTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZShtc2csIHRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKHRoaXMuX21lc3NlbmdlcilcbiAgICAgICAgdGhpcy5fbWVzc2VuZ2VyLnBvc3RNZXNzYWdlKG1zZywgeyB0cmFuc2FjdGlvbjogdHJhbnNhY3Rpb24gfSk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JHVuZG8oY2IpIHtcbiAgICB2YXIgdCA9IHRoaXMudHJhbnNhY3Rpb25zLnVuZG8oY2IpO1xuICAgIGlmICh0KSBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICd1bmRvbmUnLCB0KTtcbiAgICByZXR1cm4gdDtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyhjYikge1xuICAgIHZhciB0ID0gdGhpcy50cmFuc2FjdGlvbnMucmVkbyhjYik7XG4gICAgaWYgKHQpIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3JlZG9uZScsIHQpO1xuICAgIHJldHVybiB0O1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRpblRyYW5zYWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzW1NDSEVEVUxFRF07XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JGdldERlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5nZXREZXNjcmlwdGlvbigpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSR1c2VNZXNzZW5nZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2VuZ2VyKSB0aGlzLl9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLnRyYW5zYWN0aW9ucztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXRlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jX2ZhY2V0cy9jZl9yZWdpc3RyeScpXG4gICAgLCBDb21wb25lbnRGYWNldCA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnQ29tcG9uZW50RmFjZXQnKVxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIG1pbG9Db21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZG9tVXRpbHMgPSByZXF1aXJlKCcuLi91dGlsL2RvbScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi4vYXR0cmlidXRlcy9hX2JpbmQnKVxuICAgICwgU2NvcGUgPSByZXF1aXJlKCcuL3Njb3BlJylcbiAgICAsIERPTVN0b3JhZ2UgPSByZXF1aXJlKCcuLi91dGlsL3N0b3JhZ2UnKTtcblxudmFyIF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYyA9IGNvbXBvbmVudFV0aWxzLl9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYztcblxuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudGBcbiAqIEJhc2UgQ29tcG9uZW50IGNsYXNzLiBTdWJjbGFzcyBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCksIGJ1dCBub25lIG9mIHRoaXMgY2xhc3MgbWV0aG9kcyBzaG91bGQgYmUgZGlyZWN0bHkgdXNlZCB3aXRoIGNvbXBvbmVudC5cbiAqIEl0cyBjb25zdHJ1Y3RvciBwYXNzZXMgaXRzIHBhcmFtZXRlcnMsIGluY2x1ZGluZyBpdHMgW3Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLCBET00gZWxlbWVudCBhbmQgbmFtZSB0byBbYGluaXRgXSgjaW5pdCkgbWV0aG9kLlxuICogVGhlIGNvbnN0cnVjdG9yIG9mIENvbXBvbmVudCBjbGFzcyByYXJlbHkgbmVlZHMgdG8gYmUgdXNlZCBkaXJlY3RseSwgYXMgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgY3JlYXRlcyBjb21wb25lbnRzIHdoZW4gaXQgc2NhbnMgRE9NIHRyZWUuXG4gKiBbYENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzc2BdKCNjcmVhdGVDb21wb25lbnRDbGFzcykgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGEgc3ViY2xhc3Mgb2YgQ29tcG9uZW50IGNsYXNzIHdpdGggY29uZmlndXJlZCBmYWNldHMuXG4gKlxuICpcbiAqICMjIyNDb21wb25lbnQgaW5zdGFuY2UgcHJvcGVydGllcyMjIyNcbiAqXG4gKiAtIGVsIC0gRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG8uIElmIHRoZSBzZWNvbmQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvIHRoZSBzYW1lIERPTSBlbGVtZW50LCB0aGUgd2FybmluZyB3aWxsIGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUbyBnZXQgY29tcG9uZW50IHJlZmVyZW5jZSBmcm9tIERPTSBlbGVtZW50IHVzZSBbQ29tcG9uZW50LmdldENvbXBvbmVudF0oLi9jX3V0aWxzLmpzLmh0bWwjZ2V0Q29tcG9uZW50KSBjbGFzcyBtZXRob2QuIFRvIGluc3BlY3QgY29tcG9uZW50IHZpYSBlbGVtZW50IGluIGJyb3dzZXIgY2hlY2sgYF9fX21pbG9fY29tcG9uZW50YCBwcm9wZXJ0eSBvZiBlbGVtZW50IChwcm9wZXJ0eSBuYW1lIGJlIGNoYW5nZWQgdXNpbmcgYG1pbG8uY29uZmlnYCkuXG4gKiAtIHNjb3BlIC0gcGFyZW50IHNjb3BlIG9iamVjdCwgYW4gaW5zdGFuY2Ugb2YgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpIGNsYXNzLiBUbyBnZXQgcGFyZW50IGNvbXBvbmVudCB1c2UgW2dldFNjb3BlUGFyZW50XSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KSBpbnN0YW5jZSBtZXRob2Qgb2YgY29tcG9uZW50LiBUaGUgYWN0dWFsIHBhdGggdG8gZ2V0IHBhcmVudCBvZiBjb25wb25lbnQgaXMgYGNvbXBvbmVudC5zY29wZS5faG9zdE9iamVjdC5vd25lcmAsIHdoZXJlIGBfaG9zdE9iamVjdGAgcmVmZXJzIHRvIFtDb250YWluZXJdKGNfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldCBvZiBwYXJlbnQgY29tcG9uZW50IGFuZCBgb3duZXJgIHRvIHRoZSBwYXJlbnQgaXRzZWxmLiBUaGUgY2hpbGRyZW4gb2YgY29tcG9uZW50IGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgc2NvcGUgb2YgaXRzIGNvbnRhaW5lciBmYWNldDogYGNvbXBvbmVudC5jb250YWluZXIuc2NvcGVgLiBUaGUgc2NvcGUgaGllcmFyY2h5IGNhbiBiZSB0aGUgc2FtZSBvciBkaWZmZXJlbnQgYXMgdGhlIERPTSBoaWVyYXJjaHkgLSBET00gY2hpbGRyZW4gb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIG9uIHRoZSBzYW1lIHNjb3BlIGFzIGNvbXBvbmVudCBpZiBpdCBkb2VzIG5vdCBoYXZlIGBDb250YWluZXJgIGZhY2V0IGFuZCBpbiB0aGUgc2NvcGUgb2YgaXRzIENvbnRhaW5lciBmYWNldCBpZiBpdCBoYXMgaXQuIFNlZSBbU2NvcGVdKC4vc2NvcGUuanMuaHRtbCkuXG4gKiAtIG5hbWUgLSB0aGUgbmFtZSBvZiBjb21wb25lbnQsIHNob3VsZCBiZSB1bmlxdWUgZm9yIHRoZSBzY29wZSB3aGVyZSBjb21wb25lbnQgYmVsb25ncy4gVG8gZmluZCBjb21wb25lbnQgaW4gc2NvcGUgdGhlIGNvbXBvbmVudCdzIG5hbWUgc2hvdWxkIGJlIHVzZWQgYXMgcHJvcGVydHkgb2Ygc2NvcGUgb2JqZWN0LiBTZWUgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLlxuICogLSBmYWNldHMgLSBtYXAgb2YgcmVmZXJlbmNlcyBvZiBhbGwgY29tcG9uZW50J3MgZmFjZXRzIChmYWNldCBuYW1lcyBhcmUgbG93ZXJjYXNlIGluIHRoaXMgbWFwKS4gQWxsIGZhY2V0cyBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgYXMgcHJvcGVydGllcyBvZiBjb21wb25lbnQsIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBmYWNldHMgKGl0IGlzIHVzZWQgaW4gdGhpcyB3YXkgaW4gW2FsbEZhY2V0c10oI0NvbXBvbmVudCRhbGxGYWNldHMpIGNvbXBvbmVudCdzIGluc3RhbmNlIG1ldGhvZCB0aGF0IGFsbG93cyB0byBjYWxsIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgb24gYWxsIGZhY2V0cykuXG4gKiAtIGV4dHJhRmFjZXRzIC0gYW4gYXJyYXkgb2YgbmFtZXMgb2YgZmFjZXRzIHRoYXQgYXJlIGFkZGVkIHRvIGNvbXBvbmVudCBhbmQgZG8gbm90IGZvcm0gdGhlIHBhcnQgb2YgY29tcG9uZW50J3MgY2xhc3MuXG4gKiAtIF9tZXNzZW5nZXIgLSB0aGUgcmVmZXJlbmNlIHRvIGNvbXBvbmVudCdzIFttZXNzZW5nZXJdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKS4gUmFyZWx5IG5lZWRzIHRvIGJlIHVzZWQgZGlyZWN0bHkgYXMgYWxsIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBvZiBtZXNlbmdlciBhcmUgYXZhaWxhYmxlIGRpcmVjdGx5IG9uIGNvbXBvbmVudC5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBldmVudHMjIyMjXG4gKlxuICogLSAnY2hpbGRyZW5ib3VuZCcgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjaGlsZHJlbiBvZiBET00gZWxlbWVudCB3aGljaCBjb21wbmVudCBpcyBjb25uZWN0ZWQgdG8gYXJlIGNvbm5lY3RlZCB0byBjb21wb25lbnRzLiBUaGUgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGVkIHdpdGggYG1pbG8uYmluZGVyYCAoYXMgaXMgYWxtb3N0IGFsd2F5cyB0aGUgY2FzZSwgYXMgYWxsIENvbXBvbmVudCBjbGFzcyBtZXRob2RzIHRoYXQgY3JlYXRlL2NvcHkgY29tcG9uZW50cyB1c2UgYG1pbG8uYmluZGVyYCBpbnRlcm5hbGx5IC0gY29tcG9uZW50IGNvbnN0cnVjdG9yIGFuZCBDb21wb25lbnQuY3JlYXRlIG1ldGhvZHMgYXJlIG5vdCB1c2VkIGluIGZyYW1ld29yayBvdXRzaWRlIG9mIGBtaWxvLmJpbmRlcmAgYW5kIHJhcmVseSBpZiBldmVyIG5lZWQgdG8gYmUgdXNlZCBpbiBhcGxpY2F0aW9uKS5cbiAqIC0gJ2FkZGVkdG9zY29wZScgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gc2NvcGUuXG4gKiAtICdzdGF0ZXJlYWR5JyAtIGF5bmNocm9ub3VzbHkgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCAodG9nZXRoZXIgd2l0aCBpdHMgc2NvcGUgY2hpbGRyZW4pIGlzIGNyZWF0ZWQgd2l0aCBbQ29tcG9uZW50LmNyZWF0ZUZyb21TdGF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlRnJvbVN0YXRlKSAob3IgYGNyZWF0ZUZyb21EYXRhVHJhbnNmZXJgKSBtZXRob2QuIENhbiBiZSBkaXNwYXRjaGVkIGJ5IGFwcGxpY2F0aW9uIGlmIHRoZSBjb21wb25lbnQncyBzdGF0ZSBpcyBzZXQgd2l0aCBzb21lIG90aGVyIG1lY2hhbmlzbS4gVGhpcyBldmVudCBpcyBub3QgdXNlZCBpbiBgbWlsb2AsIGl0IGNhbiBiZSB1c2VkIGluIGFwcGxpY2F0aW9uIGluIHBhcnRpY3VsYXIgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQuXG4gKiAtICdnZXRzdGF0ZXN0YXJ0ZWQnIC0gZW1pdHRlZCBzeW5jaHJvbm91c2x5IGp1c3QgYmVmb3JlIGdldFN0YXRlIGV4ZWN1dGVzIHNvIGNvbXBvbmVudHMgYW5kIGZhY2V0cyBjYW4gY2xlYW4gdXAgdGhlaXIgc3RhdGUgZm9yIHNlcmlhbGl6YXRpb24uIFxuICogLSAnZ2V0c3RhdGVjb21wbGV0ZWQnIC0gZW1pdHRlZCBhc3luY2hyb25vdXNseSBhZnRlciBnZXRTdGF0ZSBleGVjdXRlcyBzbyBjb21wb25lbnRzIGFuZCBmYWNldHMgY2FuIHJlc3RvcmUgdGhlaXIgc3RhdGUgYWZ0ZXIgc2VyaWFsaXphdGlvbi5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBcImxpZmVjeWNsZVwiIyMjI1xuICpcbiAqIDEuIENvbXBvbmVudCBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuIENvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHNpbXBseSBjYWxscyBjb25zdHJ1Y3RvciBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCkgdGhhdCBpcyBhIHN1cGVyY2xhc3Mgb2YgQ29tcG9uZW50LiBTdWJjbGFzc2VzIG9mIENvbXBvbmVudCBzaG91bGQgbm90IGltcGxlbWVudCB0aGVpciBvd24gY29uc3RydWN0b3IsIHRoZXkgY2FuIG9wdGlvbmFsbHkgaW1wbGVtZW50IGBpbml0YCBtZXRob2QsIGJ1dCBtb3N0IGNvbXBvbmVudHMgZG8gbm90IG5lZWQgdG8gZG8gaXQuXG4gKiAyLiBjb25zdHJ1Y3RvcnMgYW5kIGBpbml0YCBtZXRob2RzIG9mIGFsbCBmYWNldHMgYXJlIGNhbGxlZCBpbiBzZXF1ZW5jZS4gU2FtZSBhcyBjb21wb25lbnRzLCBmYWNldCBkbyBub3QgaW1wbGVtZW50IHRoZWlyIGNvbnN0cnVjdG9ycywgdGhleSBjYW4gb3B0aW9uYWxseSBpbXBsZW1lbnQgYGluaXRgIGFuZCBgc3RhcnRgIG1ldGhvZHMgKHNlZSBiZWxvdykuIEluc2lkZSBgaW5pdGAgbWV0aG9kIHRoZXJlIHNob3VsZCBiZSBvbmx5IGdlbmVyYWwgaW5pdGlhbGl6YXRpb24gY29kZSB3aXRob3V0IGFueSBkZXBlbmRlbmN5IG9uIGNvbXBvbmVudCBpdHNlbGYgKGl0IGlzIG5vdCByZWFkeSB5ZXQpIGFuZCBvdGhlciBmYWNldHMgKGFzIHRoZXJlIGlzIG5vIHNwZWNpZmljIGZhY2V0cyBjcmVhdGlvbiBvcmRlcikuIElmIGZhY2V0IGltcGxlbWVudHMgYGluaXRgIG1ldGhvZCBpdCBNVVNUIGNhbGwgaW5oZXJpdGVkIGluaXQgd2l0aCBgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKWAuXG4gKiAzLiBgaW5pdGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIEF0IHRoaXMgcG9pbnQgYWxsIGZhY2V0cyBhcmUgY3JlYXRlZCBidXQgZmFjZXRzIHN0aWxsIGNhbiBiZSBub3QgcmVhZHkgYXMgdGhleSBjYW4gaGF2ZSBpbml0aWFsaXphdGlvbiBjb2RlIGluIGBzdGFydGAgbWV0aG9kLiBJZiBjb21wb25lbnQgc3ViY2xhc3MgaW1wbGVtZW50cyBgaW5pdGAgbWV0aG9kIGl0IE1VU1QgY2FsbCBpbmhlcml0ZWQgbWV0aG9kIHdpdGggYDxTdXBlcmNsYXNzPi5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpYCwgd2hlcmUgPFN1cGVyY2xhc3M+IGlzIENvbXBvbmVudCBvciBhbm90aGVyIHN1cGVyY2xhc3MgdGhlIGNvbXBvbmVudCBpcyBhIHN1YmNsYXNzIG9mLlxuICogNC4gYGNoZWNrYCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGFkZHMgZmFjZXRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjb21wb25lbnQgZGVjbGFyYXRpb24gKGJlaW5nIHBhcnQgb2YgdGhlIGNsYXNzIG9yIGV4cGxpY2l0ZWx5IGxpc3RlZCBpbiBiaW5kIGF0dHJpYnV0ZSkgYnV0IGFyZSByZXF1aXJlZCBieSBmYWNldHMgdGhhdCB0aGUgY29tcG5lbnQgYWxyZWFkeSBoYXMuIFN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbCkgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLlxuICogNS4gYHN0YXJ0YCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgaW1wbGVtZW50ZWQgYnkgQ29tcG9uZW50RmFjZXQgc3ViY2xhc3NlcyBhbmQgaXQgY2FuIGhhdmUgYW55IGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIGNvbXBvbmVudCBvciBvbiBvdGhlciBmYWNldHMgdGhhdCBhcmUgdGhlIGRlcGVuZGVuY2llcyBvZiBhIGZhY2V0LiBJbmhlcml0ZWQgYHN0YXJ0YCBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnQgaGUgc2FtZSB3YXkgYXMgd3JpdHRlbiBhYm92ZS5cbiAqIDYuIGBzdGFydGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIFRoaXMgY29tcG9uZW50IG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBpZiB0aGV5IG5lZWQgdG8gaGF2ZSBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHNvbWUgZmFjZXRzIGFuZCByZXF1aXJlcyB0aGF0IHRoZXNlIGZhY2V0cyBhcmUgZnVsbHkgaW5pYWxpemVkLiBPZnRlbiBzdWNoIGNvZGUgYWxzbyBkZXBlbmRzIG9uIGNvbXBvbmVudCdzIHNjb3BlIGNoaWxkcmVuIGFzIHdlbGwgc28gdGhpcyBjb2RlIHNob3VsZCBiZSBpbnNpZGUgYCdjaGlsZHJlbmJvdW5kJ2AgZXZlbnQgc3Vic2NyaWJlci5cbiAqIDcuICdhZGRlZHRvc2NvcGUnIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gaXRzIHBhcmVudCdzIHNjb3BlIG9yIHRvIHRvcCBsZXZlbCBzY29wZSBjcmVhdGVkIGJ5IGBtaWxvLmJpbmRlcmAuXG4gKiA4LiBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCAoc3RlcHMgMS02IGFib3ZlIGFyZSBmb2xsb3dlZCBmb3IgZWFjaCBjaGlsZCkuXG4gKiA5LiAnY2hpbGRyZW5ib3VuZCcgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGFsbCBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlaXIgc2NvcGUgKHNlZSBldmVudCBkZXNjcmlwdGlvbiBiZWxvdykuXG4gKiAxMC4gJ3N0YXRlcmVhZHknIGV2ZW50IGlzIGRpc3BhdGNoZWQgZm9yIGNvbXBvbmVudCBhbmQgYWxsIGl0cyBjaGlsZHJlbiB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGUgZnJvbSBzdGF0ZSAoc2VlIGV2ZW50IGRlc2NyaXB0aW9uIGJlbG93KS5cbiAqIDExLiBhdCB0aGlzIHBvaW50IGNvbXBvbmVudCBpcyBpbiB0aGUgXCJpbnRlcmFjdGl2ZVwiIHN0YXRlIHdoZW4gaXQgYW5kIGl0cyBmYWNldHMgd2lsbCBvbmx5IHJlc3BvbmQgdG8gbWVzc2FnZXMvZXZlbnRzIHRoYXQgdGhleSBzdWJzY3JpYmVkIHRvIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAqXG4gKlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmVsb25nLiBJdCBpcyB1c3VhbGx5IGEgdG9wIGxldmVsIHNjb3BlIG9iamVjdCByZXR1cm5lZCBieSBgbWlsby5iaW5kZXJgIG9yIGBzY29wZWAgcHJvcGVydHkgb2YgQ29udGFpbmVyIGZhY2V0LlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IERPTSBlbGVtZW50IHRoYXQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjb21wb25lbnQgbmFtZSwgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgc2NvcGUgb2YgY29tcG9uZW50XG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGNvbXBvbmVudEluZm8gaW5zdGFuY2Ugb2YgQ29tcG9uZW50SW5mbyBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50XG4gKiAgVE9ETyB0cnkgcmVtb3ZpbmcgaXRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIENvbXBvbmVudCA9IF8uY3JlYXRlU3ViY2xhc3MoRmFjZXRlZE9iamVjdCwgJ0NvbXBvbmVudCcsIHRydWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvbmVudDtcblxuX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoJ0NvbXBvbmVudCcpO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBjbGFzcyBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2NyZWF0ZUNvbXBvbmVudENsYXNzXSgjQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcylcbiAqIC0gW2NyZWF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlKVxuICogLSBbY29weV0oI0NvbXBvbmVudCQkY29weSlcbiAqIC0gW2NyZWF0ZU9uRWxlbWVudF0oI0NvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50KVxuICogLSBbaXNDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNpc0NvbXBvbmVudClcbiAqIC0gW2dldENvbXBvbmVudF0oY191dGlscy5qcy5odG1sI2dldENvbXBvbmVudClcbiAqIC0gW2dldENvbnRhaW5pbmdDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNnZXRDb250YWluaW5nQ29tcG9uZW50KVxuICogLSBbY3JlYXRlRnJvbVN0YXRlXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUpXG4gKiAtIFtjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyKVxuICovXG5fLmV4dGVuZChDb21wb25lbnQsIHtcbiAgICBjcmVhdGVDb21wb25lbnRDbGFzczogQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcyxcbiAgICBjcmVhdGU6IENvbXBvbmVudCQkY3JlYXRlLFxuICAgIGNvcHk6IENvbXBvbmVudCQkY29weSxcbiAgICBjcmVhdGVPbkVsZW1lbnQ6IENvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50LFxuICAgIGlzQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5pc0NvbXBvbmVudCxcbiAgICBnZXRDb21wb25lbnQ6IGNvbXBvbmVudFV0aWxzLmdldENvbXBvbmVudCxcbiAgICBnZXRDb250YWluaW5nQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5nZXRDb250YWluaW5nQ29tcG9uZW50LFxuICAgIGNyZWF0ZUZyb21TdGF0ZTogQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUsXG4gICAgY3JlYXRlRnJvbURhdGFUcmFuc2ZlcjogQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXG59KTtcbmRlbGV0ZSBDb21wb25lbnQuY3JlYXRlRmFjZXRlZENsYXNzO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNDb21wb25lbnQkaW5pdClcbiAqIC0gW2NyZWF0ZUVsZW1lbnRdKCNDb21wb25lbnQkY3JlYXRlRWxlbWVudClcbiAqIC0gW2hhc0ZhY2V0XSgjQ29tcG9uZW50JGhhc0ZhY2V0KVxuICogLSBbYWRkRmFjZXRdKCNDb21wb25lbnQkYWRkRmFjZXQpXG4gKiAtIFthbGxGYWNldHNdKCNDb21wb25lbnQkYWxsRmFjZXRzKVxuICogLSBbcmVuYW1lXSgjQ29tcG9uZW50JHJlbmFtZSlcbiAqIC0gW3JlbW92ZV0oI0NvbXBvbmVudCRyZW1vdmUpXG4gKiAtIFtnZXRTdGF0ZV0oI0NvbXBvbmVudCRnZXRTdGF0ZSlcbiAqIC0gW2dldFRyYW5zZmVyU3RhdGVdKCNDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSlcbiAqIC0gW3NldFN0YXRlXSgjQ29tcG9uZW50JHNldFN0YXRlKVxuICogLSBbZ2V0U2NvcGVQYXJlbnRdKCNDb21wb25lbnQkZ2V0U2NvcGVQYXJlbnQpXG4gKiAtIFtnZXRUb3BTY29wZVBhcmVudF0oI0NvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudClcbiAqIC0gW2dldFNjb3BlUGFyZW50V2l0aENsYXNzXSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKVxuICogLSBbZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3NdKCNDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MpXG4gKiAtIFt3YWxrU2NvcGVUcmVlXSgjQ29tcG9uZW50JHdhbGtTY29wZVRyZWUpXG4gKiAtIFticm9hZGNhc3RdKCNDb21wb25lbnQkYnJvYWRjYXN0KVxuICogLSBbZGVzdHJveV0oI0NvbXBvbmVudCRkZXN0cm95KVxuICogLSBbaXNEZXN0cm95ZWRdKCNDb21wb25lbnQkaXNEZXN0cm95ZWQpXG4gKlxuICpcbiAqICMjIyMjW01lc3Nlbmdlcl0oLi4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIG1ldGhvZHMgYXZhaWxhYmxlIG9uIGNvbXBvbmVudCMjIyMjXG4gKlxuICogLSBbb25dKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvbikgLSBzaW5nbGUgc3Vic2NyaWJlXG4gKiAtIFtvZmZdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvZmYpIC0gc2luZ2xlIHVuc3Vic2NyaWJlXG4gKiAtIFtvbk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb25NZXNzYWdlcykgLSBtdWx0aXBsZSBzdWJzY3JpYmVcbiAqIC0gW29mZk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb2ZmTWVzc2FnZXMpIC0gbXVsdGlwbGUgdW5zdWJzY3JpYmVcbiAqIC0gW3Bvc3RNZXNzYWdlXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkcG9zdE1lc3NhZ2UpIC0gcG9zdCBtZXNzYWdlIG9uIGNvbXBvbmVudFxuICogLSBbZ2V0U3Vic2NyaWJlcnNdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRnZXRTdWJzY3JpYmVycykgLSBnZXQgc3Vic2NyaWJlcnMgZm9yIGEgZ2l2ZW4gbWVzc2FnZVxuICovXG5fLmV4dGVuZFByb3RvKENvbXBvbmVudCwge1xuICAgIGluaXQ6IENvbXBvbmVudCRpbml0LFxuICAgIHN0YXJ0OiBDb21wb25lbnQkc3RhcnQsXG4gICAgY3JlYXRlRWxlbWVudDogQ29tcG9uZW50JGNyZWF0ZUVsZW1lbnQsXG4gICAgaGFzRmFjZXQ6IENvbXBvbmVudCRoYXNGYWNldCxcbiAgICBhZGRGYWNldDogQ29tcG9uZW50JGFkZEZhY2V0LFxuICAgIGFsbEZhY2V0czogQ29tcG9uZW50JGFsbEZhY2V0cyxcbiAgICByZW5hbWU6IENvbXBvbmVudCRyZW5hbWUsXG4gICAgcmVtb3ZlOiBDb21wb25lbnQkcmVtb3ZlLFxuICAgIGluc2VydEludG86IENvbXBvbmVudCRpbnNlcnRJbnRvLFxuXG4gICAgZ2V0U3RhdGU6IENvbXBvbmVudCRnZXRTdGF0ZSxcbiAgICBnZXRUcmFuc2ZlclN0YXRlOiBDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSxcbiAgICBfZ2V0U3RhdGU6IENvbXBvbmVudCRfZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IENvbXBvbmVudCRzZXRTdGF0ZSxcbiAgICBcbiAgICBnZXRTY29wZVBhcmVudDogQ29tcG9uZW50JGdldFNjb3BlUGFyZW50LFxuICAgIGdldFRvcFNjb3BlUGFyZW50OiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnQsXG4gICAgZ2V0U2NvcGVQYXJlbnRXaXRoQ2xhc3M6IENvbXBvbmVudCRnZXRTY29wZVBhcmVudFdpdGhDbGFzcyxcbiAgICBnZXRUb3BTY29wZVBhcmVudFdpdGhDbGFzczogQ29tcG9uZW50JGdldFRvcFNjb3BlUGFyZW50V2l0aENsYXNzLFxuXG4gICAgc2V0U2NvcGVQYXJlbnRGcm9tRE9NOiBDb21wb25lbnQkc2V0U2NvcGVQYXJlbnRGcm9tRE9NLFxuXG4gICAgd2Fsa1Njb3BlVHJlZTogQ29tcG9uZW50JHdhbGtTY29wZVRyZWUsXG5cbiAgICB0cmVlUGF0aE9mOiBDb21wb25lbnQkdHJlZVBhdGhPZixcbiAgICBnZXRDb21wb25lbnRBdFRyZWVQYXRoOiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCxcbiAgICBpbnNlcnRBdFRyZWVQYXRoOiBDb21wb25lbnQkaW5zZXJ0QXRUcmVlUGF0aCxcblxuICAgIGJyb2FkY2FzdDogQ29tcG9uZW50JGJyb2FkY2FzdCxcbiAgICBkZXN0cm95OiBDb21wb25lbnQkZGVzdHJveSxcbiAgICBpc0Rlc3Ryb3llZDogQ29tcG9uZW50JGlzRGVzdHJveWVkXG59KTtcblxuXG4vKipcbiAqIEV4cG9zZSBNZXNzZW5nZXIgbWV0aG9kcyBvbiBDb21wb25lbnQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChDb21wb25lbnQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9QUkVGSVggPSAneC1hcHBsaWNhdGlvbi9taWxvLWNvbXBvbmVudCc7XG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9SRUdFWCA9IC94LWFwcGxpY2F0aW9uXFwvbWlsby1jb21wb25lbnRcXC8oW2Etel8kXVswLTlhLXpfJF0qKSg/OlxcLygpKS9pO1xuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZXMgYSBzdWJjbGFzcyBvZiBjb21wb25lbnQgZnJvbSB0aGUgbWFwIG9mIGNvbmZpZ3VyZWQgZmFjZXRzLlxuICogVGhpcyBtZXRob2Qgd3JhcHMgYW5kIHJlcGxhY2VzIFtgY3JlYXRlRmFjZXRlZENsYXNzYF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCNjcmVhdGVGYWNldGVkQ2xhc3MpIGNsYXNzIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0LlxuICogVW5saWtlIGNyZWF0ZUZhY2V0ZWRDbGFzcywgdGhpcyBtZXRob2QgdGFrZSBmYWNldCBjbGFzc2VzIGZyb20gcmVnaXN0cnkgYnkgdGhlaXIgbmFtZSwgc28gb25seSBtYXAgb2YgZmFjZXRzIGNvbmZpZ3VyYXRpb24gbmVlZHMgdG8gYmUgcGFzc2VkLiBBbGwgZmFjZXRzIGNsYXNzZXMgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjbGFzcyBuYW1lXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdIHwgQXJyYXlbU3RyaW5nXX0gZmFjZXRzQ29uZmlnIG1hcCBvZiBmYWNldHMgY29uZmlndXJhdGlvbi5cbiAqICBJZiBzb21lIGZhY2V0IGRvZXMgbm90IHJlcXVpcmUgY29uZmlndXJhdGlvbiwgYHVuZGVmaW5lZGAgc2hvdWxkIGJlIHBhc3NlZCBhcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZhY2V0LlxuICogIElmIG5vIGZhY2V0IHJlcXVpcmVzIGNvbmZpZ3VyYXRpb24sIHRoZSBhcnJheSBvZiBmYWNldHMgbmFtZXMgY2FuIGJlIHBhc3NlZC5cbiAqIEByZXR1cm4ge1N1YmNsYXNzKENvbXBvbmVudCl9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCQkY3JlYXRlQ29tcG9uZW50Q2xhc3MobmFtZSwgZmFjZXRzQ29uZmlnKSB7XG4gICAgLy8gY29udmVydCBhcnJheSBvZiBmYWNldCBuYW1lcyB0byBtYXAgb2YgZW1wdHkgZmFjZXRzIGNvbmZpZ3VyYXRpb25zXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFjZXRzQ29uZmlnKSkge1xuICAgICAgICB2YXIgY29uZmlnTWFwID0ge307XG4gICAgICAgIGZhY2V0c0NvbmZpZy5mb3JFYWNoKGZ1bmN0aW9uKGZjdCkge1xuICAgICAgICAgICAgdmFyIGZjdE5hbWUgPSBfLmZpcnN0TG93ZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBjb25maWdNYXBbZmN0TmFtZV0gPSB7fTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZhY2V0c0NvbmZpZyA9IGNvbmZpZ01hcDtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgbWFwIG9mIGZhY2V0cyBjbGFzc2VzIGZyb20gZmFjZXRSZWdpc3RyeVxuICAgIHZhciBmYWNldHNDbGFzc2VzO1xuICAgIGlmICh0eXBlb2YgZmFjZXRzQ29uZmlnID09ICdvYmplY3QnICYmIF8ua2V5cyhmYWNldHNDb25maWcpLmxlbmd0aCkge1xuICAgICAgICBmYWNldHNDbGFzc2VzID0ge307XG4gICAgICAgIF8uZWFjaEtleShmYWNldHNDb25maWcsIGZ1bmN0aW9uKGZjdENvbmZpZywgZmN0KSB7XG4gICAgICAgICAgICB2YXIgZmN0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoZmN0KTtcbiAgICAgICAgICAgIHZhciBmY3RDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBmYWNldHNDbGFzc2VzW2ZjdE5hbWVdID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZjdENsYXNzTmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBzdWJjbGFzcyBvZiBDb21wb25lbnQgdXNpbmcgbWV0aG9kIG9mIEZhY2V0ZWRPYmplY3RcbiAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBGYWNldGVkT2JqZWN0LmNyZWF0ZUZhY2V0ZWRDbGFzcy5jYWxsKHRoaXMsIG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZyk7XG4gICAgXG4gICAgX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UobmFtZSk7XG5cbiAgICByZXR1cm4gQ29tcG9uZW50Q2xhc3M7XG59XG5cblxuZnVuY3Rpb24gX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoY2xhc3NOYW1lKSB7XG4gICAgRE9NU3RvcmFnZS5yZWdpc3RlckRhdGFUeXBlKGNsYXNzTmFtZSwgQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyLCBDb21wb25lbnRfZG9tU3RvcmFnZVBhcnNlcik7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyKGNvbXBvbmVudCkge1xuICAgIHZhciBzdGF0ZSA9IGNvbXBvbmVudC5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0ZSk7ICAgXG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VQYXJzZXIoY29tcFN0ciwgY29tcENsYXNzTmFtZSkge1xuICAgIHZhciBzdGF0ZSA9IF8uanNvblBhcnNlKGNvbXBTdHIpO1xuICAgIGlmIChzdGF0ZSlcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGUoc3RhdGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBjb21wb25lbnQgZnJvbSBbQ29tcG9uZW50SW5mb10oLi9jX2luZm8uanMuaHRtbCkgKHVzZWQgYnkgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgYW5kIHRvIGNvcHkgY29tcG9uZW50KVxuICogQ29tcG9uZW50IG9mIGFueSByZWdpc3RlcmVkIGNsYXNzIChzZWUgW2NvbXBvbmVudHNSZWdpc3RyeV0oLi9jX3JlZ2lzdHJ5LmpzLmh0bWwpKSB3aXRoIGFueSBhZGRpdGlvbmFsIHJlZ2lzdGVyZWQgZmFjZXRzIChzZWUgW2ZhY2V0c1JlZ2lzdHJ5XSguL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5LmpzLmh0bWwpKSBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGluZm9cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuIEAgQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZShpbmZvLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gaW5mby5Db21wb25lbnRDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50Q2xhc3MgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbWVzc2FnZSA9ICdjcmVhdGU6IGNvbXBvbmVudCBjbGFzcyBzaG91bGQgYmUgZnVuY3Rpb24sIFwiJyArIHR5cGVvZiBDb21wb25lbnRDbGFzcyArICdcIiBwYXNzZWQnOyBcbiAgICAgICAgaWYgKHRocm93T25FcnJvcnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbXBvbmVudCcsIG1lc3NhZ2UsICc7dXNpbmcgYmFzZSBDb21wb25lbnQgY2xhc3MgaW5zdGVhZCcpO1xuICAgICAgICAgICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHZhciBhQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudENsYXNzKGluZm8uc2NvcGUsIGluZm8uZWwsIGluZm8ubmFtZSwgaW5mbyk7XG5cbiAgICBpZiAoaW5mby5leHRyYUZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleShpbmZvLmV4dHJhRmFjZXRzQ2xhc3NlcywgZnVuY3Rpb24oRmFjZXRDbGFzcykge1xuICAgICAgICAgICAgaWYgKCEgYUNvbXBvbmVudC5oYXNGYWNldChGYWNldENsYXNzKSlcbiAgICAgICAgICAgICAgICBhQ29tcG9uZW50LmFkZEZhY2V0KEZhY2V0Q2xhc3MsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gYUNvbXBvbmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50LCBpbmNsdWRpbmcgYSBjb3B5IG9mIERPTSBlbGVtZW50LiBSZXR1cm5zIGEgY29weSBvZiBgY29tcG9uZW50YCAob2YgdGhlIHNhbWUgY2xhc3MpIHdpdGggbmV3IERPTSBlbGVtZW50IChub3QgaW5zZXJ0ZWQgaW50byBwYWdlKS5cbiAqIENvbXBvbmVudCBpcyBhZGRlZCB0byB0aGUgc2FtZSBzY29wZSBhcyB0aGUgb3JpZ2luYWwgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgYW4gaW5zdGFuY2Ugb2YgQ29tcG9uZW50IGNsYXNzIG9yIHN1YmNsYXNzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBDb3B5IG9wdGlvbmFsIGB0cnVlYCB0byBtYWtlIGRlZXAgY29weSBvZiBET00gZWxlbWVudCwgb3RoZXJ3aXNlIG9ubHkgZWxlbWVudCB3aXRob3V0IGNoaWxkcmVuIGlzIGNvcGllZFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNvcHkoY29tcG9uZW50LCBkZWVwQ29weSkge1xuICAgIGNoZWNrKGNvbXBvbmVudCwgQ29tcG9uZW50KTtcbiAgICBjaGVjayhkZWVwQ29weSwgTWF0Y2guT3B0aW9uYWwoQm9vbGVhbikpO1xuXG4gICAgaWYgKGRlZXBDb3B5ICYmICFjb21wb25lbnQuY29udGFpbmVyKSBcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGVlcCBjb3B5IGNvbXBvbmVudCB3aXRob3V0IGNvbnRhaW5lciBmYWNldCcpO1xuXG4gICAgLy8gY29weSBET00gZWxlbWVudCwgdXNpbmcgRG9tIGZhY2V0IGlmIGl0IGlzIGF2YWlsYWJsZVxuICAgIHZhciBuZXdFbCA9IGNvbXBvbmVudC5kb20gXG4gICAgICAgICAgICAgICAgICAgID8gY29tcG9uZW50LmRvbS5jb3B5KGRlZXBDb3B5KVxuICAgICAgICAgICAgICAgICAgICA6IGNvbXBvbmVudC5lbC5jbG9uZU5vZGUoZGVlcENvcHkpO1xuXG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gY3JlYXRlIGNvbXBvbmVudCBvZiB0aGUgc2FtZSBjbGFzcyBvbiB0aGUgZWxlbWVudFxuICAgIHZhciBhQ29tcG9uZW50ID0gQ29tcG9uZW50Q2xhc3MuY3JlYXRlT25FbGVtZW50KG5ld0VsLCB1bmRlZmluZWQsIGNvbXBvbmVudC5zY29wZSwgY29tcG9uZW50LmV4dHJhRmFjZXRzKTtcbiAgICB2YXIgc3RhdGUgPSBjb21wb25lbnQuX2dldFN0YXRlKGRlZXBDb3B5IHx8IGZhbHNlKTtcbiAgICBhQ29tcG9uZW50LnNldFN0YXRlKHN0YXRlKTtcbiAgICBfLmRlZmVyTWV0aG9kKGFDb21wb25lbnQsICdicm9hZGNhc3QnLCAnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBjb21wb25lbnQgYXRhY2hlZCB0byBlbGVtZW50LiBBbGwgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQgaW5oZXJpdCB0aGlzIG1ldGhvZC5cbiAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBvZiB0aGUgY2xhc3MgdGhpcyBtZXRob2QgaXMgdXNlZCB3aXRoICh0aGVjb250ZXh0IG9mIHRoZSBtZXRob2QgY2FsbCkuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBvcHRpb25hbCBlbGVtZW50IHRvIGF0dGFjaCBjb21wb25lbnQgdG8uIElmIGVsZW1lbnQgaXMgbm90IHBhc3NlZCwgaXQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5uZXJIVE1MIG9wdGlvbmFsIGlubmVyIGh0bWwgdG8gaW5zZXJ0IGluIGVsZW1lbnQgYmVmb3JlIGJpbmRpbmcuXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgb3B0aW9uYWwgc2NvcGUgdG8gcHV0IGNvbXBvbmVudCBpbi4gSWYgbm90IHBhc3NlZCwgY29tcG9uZW50IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQuIElmIHN1Y2ggc2NvcGUgZG9lcyBub3QgZXhpc3QsIG5ldyBzY29wZSB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IGV4dHJhRmFjZXRzIGxpc3Qgb2YgZXh0cmEgZmFjZXQgdG8gYWRkIHRvIGNvbXBvbmVudFxuICogQHJldHVybiB7U3ViY2xhc3MoQ29tcG9uZW50KX1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVPbkVsZW1lbnQoZWwsIGlubmVySFRNTCwgcm9vdFNjb3BlLCBleHRyYUZhY2V0cykge1xuICAgIGNoZWNrKGlubmVySFRNTCwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG4gICAgY2hlY2socm9vdFNjb3BlLCBNYXRjaC5PcHRpb25hbChTY29wZSkpO1xuICAgIGNoZWNrKGV4dHJhRmFjZXRzLCBNYXRjaC5PcHRpb25hbChbU3RyaW5nXSkpO1xuXG4gICAgLy8gXCJ0aGlzXCIgcmVmZXJzIHRvIHRoZSBjbGFzcyBvZiBjb21wb25lbnQgaGVyZSwgYXMgdGhpcyBpcyBhIGNsYXNzIG1ldGhvZFxuICAgIGlmIChlbCAmJiBpbm5lckhUTUwpIGVsLmlubmVySFRNTCA9IGlubmVySFRNTDtcbiAgICBlbCA9IGVsIHx8IF9jcmVhdGVDb21wb25lbnRFbGVtZW50LmNhbGwodGhpcywgaW5uZXJIVE1MKTtcbiAgICByb290U2NvcGUgPSByb290U2NvcGUgfHwgX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCk7XG4gICAgdmFyIGFDb21wb25lbnQgPSBfYWRkQXR0cmlidXRlQW5kQmluZENvbXBvbmVudC5jYWxsKHRoaXMsIGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKTtcbiAgICBhQ29tcG9uZW50LmJyb2FkY2FzdCgnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ29tcG9uZW50RWxlbWVudChpbm5lckhUTUwpIHtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgdmFyIERvbSA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnRG9tJylcbiAgICAgICAgLCBkb21GYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ2RvbScpXG4gICAgICAgICwgdGVtcGxhdGVGYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ3RlbXBsYXRlJylcbiAgICAgICAgLCB0ZW1wbGF0ZSA9IHRlbXBsYXRlRmFjZXRDb25maWcgJiYgdGVtcGxhdGVGYWNldENvbmZpZy50ZW1wbGF0ZTtcblxuICAgIHZhciBlbENvbmZpZyA9IHtcbiAgICAgICAgZG9tQ29uZmlnOiBkb21GYWNldENvbmZpZyxcbiAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuICAgICAgICBjb250ZW50OiBpbm5lckhUTUxcbiAgICB9O1xuXG4gICAgcmV0dXJuIERvbS5jcmVhdGVFbGVtZW50KGVsQ29uZmlnKTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCkge1xuICAgIHZhciBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbCwgZmFsc2UsICdDb250YWluZXInKTtcbiAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50LmNvbnRhaW5lci5zY29wZSA6IG5ldyBTY29wZShlbCk7XG59XG5cbmZ1bmN0aW9uIF9hZGRBdHRyaWJ1dGVBbmRCaW5kQ29tcG9uZW50KGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKSB7XG4gICAgLy8gYWRkIGJpbmQgYXR0cmlidXRlIHRvIGVsZW1lbnRcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgYXR0ci5jb21wQ2xhc3MgPSB0aGlzLm5hbWU7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgLy8gc2hvdWxkIGJlIHJlcXVpcmVkIGhlcmUgdG8gcmVzb2x2ZSBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcbiAgICBtaWxvQmluZGVyKGVsLCByb290U2NvcGUpO1xuXG4gICAgcmV0dXJuIHJvb3RTY29wZVthdHRyLmNvbXBOYW1lXTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGNvbXBvbmVudCBmcm9tIGNvbXBvbmVudCBzdGF0ZSwgdGhhdCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgY2xhc3MsIGV4dHJhIGZhY2V0cywgZmFjZXRzIGRhdGEgYW5kIGFsbCBzY29wZSBjaGlsZHJlbi5cbiAqIFRoaXMgaXMgdXNlZCB0byBzYXZlL2xvYWQsIGNvcHkvcGFzdGUgYW5kIGRyYWcvZHJvcCBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgc3RhdGUgZnJvbSB3aGljaCBjb21wb25lbnQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYWRkZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbmV3VW5pcXVlTmFtZSBvcHRpb25hbCBgdHJ1ZWAgdG8gY3JlYXRlIGNvbXBvbmVudCB3aXRoIHRoZSBuYW1lIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvbmUuIGBGYWxzZWAgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICogQHJldHVybiB7Q29tcG9uZW50fSBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUoc3RhdGUsIHJvb3RTY29wZSwgbmV3VW5pcXVlTmFtZSwgdGhyb3dPbkVycm9ycykge1xuICAgIGNoZWNrKHN0YXRlLCBNYXRjaC5PYmplY3RJbmNsdWRpbmcoe1xuICAgICAgICBjb21wTmFtZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY29tcENsYXNzOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBleHRyYUZhY2V0czogTWF0Y2guT3B0aW9uYWwoW1N0cmluZ10pLFxuICAgICAgICBmYWNldHNTdGF0ZXM6IE1hdGNoLk9wdGlvbmFsKE9iamVjdCksXG4gICAgICAgIG91dGVySFRNTDogU3RyaW5nXG4gICAgfSkpO1xuXG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcblxuICAgIC8vIGNyZWF0ZSB3cmFwcGVyIGVsZW1lbnQgb3B0aW9uYWxseSByZW5hbWluZyBjb21wb25lbnRcbiAgICB2YXIgd3JhcEVsID0gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGFsbCBjb21wb25lbnRzIGZyb20gSFRNTFxuICAgIHZhciBzY29wZSA9IG1pbG9CaW5kZXIod3JhcEVsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhyb3dPbkVycm9ycyk7XG5cbiAgICAvLyBhcyB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgY29tcG9uZW50LCBjYWxsIHRvIF9hbnkgd2lsbCByZXR1cm4gaXRcbiAgICB2YXIgY29tcG9uZW50ID0gc2NvcGUuX2FueSgpO1xuXG4gICAgLy8gc2V0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgaWYgKHJvb3RTY29wZSkge1xuICAgICAgICBjb21wb25lbnQuc2NvcGUgPSByb290U2NvcGU7XG4gICAgICAgIHJvb3RTY29wZS5fYWRkKGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yZSBjb21wb25lbnQgc3RhdGVcbiAgICBjb21wb25lbnQuc2V0U3RhdGUoc3RhdGUpO1xuICAgIF8uZGVmZXJNZXRob2QoY29tcG9uZW50LCAnYnJvYWRjYXN0JywgJ3N0YXRlcmVhZHknKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7ICAgXG59XG5cblxuLy8gdXNlZCBieSBDb21wb25lbnQkJGNyZWF0ZUZyb21TdGF0ZVxuZnVuY3Rpb24gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKSB7XG4gICAgdmFyIHdyYXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdyYXBFbC5pbm5lckhUTUwgPSBzdGF0ZS5vdXRlckhUTUw7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSBkb21VdGlscy5jaGlsZHJlbih3cmFwRWwpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggIT0gMSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgY3JlYXRlIGNvbXBvbmVudDogaW5jb3JyZWN0IEhUTUwsIGVsZW1lbnRzIG51bWJlcjogJyArIGNoaWxkcmVuLmxlbmd0aCArICcgKHNob3VsZCBiZSAxKScpO1xuICAgIHZhciBjb21wRWwgPSBjaGlsZHJlblswXTtcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGNvbXBFbCk7XG4gICAgYXR0ci5jb21wTmFtZSA9IG5ld1VuaXF1ZU5hbWUgPyBtaWxvQ29tcG9uZW50TmFtZSgpIDogc3RhdGUuY29tcE5hbWU7XG4gICAgYXR0ci5jb21wQ2xhc3MgPSBzdGF0ZS5jb21wQ2xhc3M7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gc3RhdGUuZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgcmV0dXJuIHdyYXBFbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcG9uZW50IGZyb20gYSBEYXRhVHJhbnNmZXIgb2JqZWN0IChpZiBwb3NzaWJsZSlcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9EYXRhVHJhbnNmZXJcbiAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBkYXRhVHJhbnNmZXIgRGF0YSB0cmFuc2ZlclxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZUZyb21EYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyKSB7XG4gICAgdmFyIGRhdGFUeXBlID0gXy5maW5kKGRhdGFUcmFuc2Zlci50eXBlcywgZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIENPTVBPTkVOVF9EQVRBX1RZUEVfUkVHRVgudGVzdCh0eXBlKTtcbiAgICB9KTtcbiAgICBpZiAoIWRhdGFUeXBlKSByZXR1cm47XG5cbiAgICB2YXIgc3RhdGUgPSBfLmpzb25QYXJzZShkYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSkpO1xuICAgIGlmICghc3RhdGUpIHJldHVybjtcblxuICAgIHJldHVybiBDb21wb25lbnQuY3JlYXRlRnJvbVN0YXRlKHN0YXRlLCB1bmRlZmluZWQsIHRydWUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluaXRpYWxpemVzIGNvbXBvbmVudC4gQXV0b21hdGljYWxseSBjYWxsZWQgYnkgaW5oZXJpdGVkIGNvbnN0cnVjdG9yIG9mIEZhY2V0ZWRPYmplY3QuXG4gKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIGluaGVyaXRlZCBpbml0IG1ldGhvZHM6XG4gKiBgYGBcbiAqIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSBzY29wZSB0byB3aGljaCBjb21wb25lbnQgd2lsbCBiZWxvbmcuIEl0IGlzIHVzdWFsbHkgYSB0b3AgbGV2ZWwgc2NvcGUgb2JqZWN0IHJldHVybmVkIGJ5IGBtaWxvLmJpbmRlcmAgb3IgYHNjb3BlYCBwcm9wZXJ0eSBvZiBDb250YWluZXIgZmFjZXQuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG9cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNvbXBvbmVudCBuYW1lLCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzY29wZSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50SW5mb30gY29tcG9uZW50SW5mbyBpbnN0YW5jZSBvZiBDb21wb25lbnRJbmZvIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgY29weSBvZiBjb21wb25lbnRcbiAqICBUT0RPIHRyeSByZW1vdmluZyBpdFxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5pdChzY29wZSwgZWxlbWVudCwgbmFtZSwgY29tcG9uZW50SW5mbykge1xuICAgIC8vIGNyZWF0ZSBET00gZWxlbWVudCBpZiBpdCB3YXNuJ3QgcGFzc2VkIHRvIENvbnN0cnVjdG9yXG4gICAgdGhpcy5lbCA9IGVsZW1lbnQgfHwgdGhpcy5jcmVhdGVFbGVtZW50KCk7XG5cbiAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gY29tcG9uZW50IG9uIERPTSBlbGVtZW50XG4gICAgaWYgKHRoaXMuZWwpIHtcbiAgICAgICAgLy8gY2hlY2sgdGhhdCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBjb21wb25lbnQgYWxyZWFkeSBhdGFjaGVkXG4gICAgICAgIHZhciBlbENvbXAgPSB0aGlzLmVsW2NvbmZpZy5jb21wb25lbnRSZWZdO1xuICAgICAgICBpZiAoZWxDb21wKVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2NvbXBvbmVudCAnICsgbmFtZSArICcgYXR0YWNoZWQgdG8gZWxlbWVudCB0aGF0IGFscmVhZHkgaGFzIGNvbXBvbmVudCAnICsgZWxDb21wLm5hbWUpO1xuXG4gICAgICAgIHRoaXMuZWxbY29uZmlnLmNvbXBvbmVudFJlZl0gPSB0aGlzO1xuICAgIH1cblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIGNvbXBvbmVudEluZm86IGNvbXBvbmVudEluZm8sXG4gICAgICAgIGV4dHJhRmFjZXRzOiBbXVxuICAgIH0sIF8uRU5VTSk7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcblxuICAgIC8vIGNyZWF0ZSBjb21wb25lbnQgbWVzc2VuZ2VyXG4gICAgdmFyIG1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG1lc3Nlbmdlcik7XG5cbiAgICAvLyBjaGVjayBhbGwgZmFjZXRzIGRlcGVuZGVuY2llcyAocmVxdWlyZWQgZmFjZXRzKVxuICAgIHRoaXMuYWxsRmFjZXRzKCdjaGVjaycpO1xuXG4gICAgLy8gc3RhcnQgYWxsIGZhY2V0c1xuICAgIHRoaXMuYWxsRmFjZXRzKCdzdGFydCcpO1xuXG4gICAgLy8gY2FsbCBzdGFydCBtZXRob2QgaWYgaXQncyBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgaWYgKHRoaXMuc3RhcnQpIHRoaXMuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIFRoaXMgaXMgYSBzdHViIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aGV0aGVyIHRoZSBtZXRob2Qgb2Ygc3VwZXJjbGFzcyBzaG91bGQgYmUgY2FsbGVkIGluIHN1YmNsYXNzZXNcbiAqIFRoZSBzdGFydCBtZXRob2Qgb2Ygc3ViY2xhc3MgaW5zdGFuY2UgaXMgY2FsbGVkIG9uY2UgYWxsIHRoZSBmYWNldHMgYXJlIGNyZWF0ZWQsIGluaXRpYWxpemVkIGFuZCBzdGFydGVkIChzZWUgYWJvdmUpXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzdGFydCgpIHt9XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogSW5pdGlhbGl6ZXMgdGhlIGVsZW1lbnQgd2hpY2ggdGhpcyBjb21wb25lbnQgaXMgYm91bmQgdG9cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgb3V0c2lkZSB0aGUgRE9NIGFuZFxuICogd2lsbCBnZW5lcmF0ZSBhIG5ldyBlbGVtZW50IGZvciB0aGUgY29tcG9uZW50LlxuICogXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkY3JlYXRlRWxlbWVudCgpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm47XG5cbiAgICB0aGlzLmVsID0gdGhpcy5kb21cbiAgICAgICAgICAgICAgICA/IHRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoKVxuICAgICAgICAgICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICByZXR1cm4gdGhpcy5lbDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgaGFzIGZhY2V0XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGZhY2V0TmFtZU9yQ2xhc3NcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRoYXNGYWNldChmYWNldE5hbWVPckNsYXNzKSB7XG4gICAgdmFyIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UodHlwZW9mIGZhY2V0TmFtZU9yQ2xhc3MgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFjZXROYW1lT3JDbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWNldE5hbWVPckNsYXNzKTtcblxuICAgIHZhciBmYWNldCA9IHRoaXNbZmFjZXROYW1lXTtcbiAgICBpZiAoISBmYWNldCBpbnN0YW5jZW9mIENvbXBvbmVudEZhY2V0KVxuICAgICAgICBsb2dnZXIud2FybignZXhwZWN0ZWQgZmFjZXQnLCBmYWNldE5hbWUsICdidXQgdGhpcyBwcm9wZXJ0eSBuYW1lIGlzIHVzZWQgZm9yIHNvbWV0aGluZyBlbHNlJyk7XG5cbiAgICByZXR1cm4gISEgZmFjZXQ7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBmYWNldCB3aXRoIGdpdmVuIG5hbWUgb3IgY2xhc3MgdG8gdGhlIGluc3RhbmNlIG9mIENvbXBvbmVudCAob3IgaXRzIHN1YmNsYXNzKS5cbiAqIFxuICogQHBhcmFtIHtTdHJpbmd8U3ViY2xhc3MoQ29tcG9uZW50KX0gZmFjZXROYW1lT3JDbGFzcyBuYW1lIG9mIGZhY2V0IGNsYXNzIG9yIHRoZSBjbGFzcyBpdHNlbGYuIElmIG5hbWUgaXMgcGFzc2VkLCB0aGUgY2xhc3Mgd2lsbCBiZSByZXRpcmV2ZWQgZnJvbSBmYWNldHNSZWdpc3RyeVxuICogQHBhcmFtIHtPYmplY3R9IGZhY2V0Q29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWUgb3B0aW9uYWwgZmFjZXQgbmFtZS4gQWxsb3dzIHRvIGFkZCBmYWNldCB1bmRlciBhIG5hbWUgZGlmZmVyZW50IGZyb20gdGhlIGNsYXNzIG5hbWUgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGFkZEZhY2V0KGZhY2V0TmFtZU9yQ2xhc3MsIGZhY2V0Q29uZmlnLCBmYWNldE5hbWUsIHRocm93T25FcnJvcnMpIHtcbiAgICBjaGVjayhmYWNldE5hbWVPckNsYXNzLCBNYXRjaC5PbmVPZihTdHJpbmcsIE1hdGNoLlN1YmNsYXNzKENvbXBvbmVudEZhY2V0KSkpO1xuICAgIGNoZWNrKGZhY2V0Q29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgICBjaGVjayhmYWNldE5hbWUsIE1hdGNoLk9wdGlvbmFsKFN0cmluZykpO1xuXG4gICAgdmFyIEZhY2V0Q2xhc3M7XG4gICAgLy8gaWYgb25seSBuYW1lIHBhc3NlZCwgcmV0cmlldmUgZmFjZXQgY2xhc3MgZnJvbSByZWdpc3RyeVxuICAgIGlmICh0eXBlb2YgZmFjZXROYW1lT3JDbGFzcyA9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgZmFjZXRDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZU9yQ2xhc3MpO1xuICAgICAgICBGYWNldENsYXNzID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZhY2V0Q2xhc3NOYW1lKTtcbiAgICB9IGVsc2UgXG4gICAgICAgIEZhY2V0Q2xhc3MgPSBmYWNldE5hbWVPckNsYXNzO1xuXG4gICAgaWYgKCFmYWNldE5hbWUpXG4gICAgICAgIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIHRoaXMuZXh0cmFGYWNldHMucHVzaChmYWNldE5hbWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0IHVzaW5nIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0XG4gICAgdmFyIG5ld0ZhY2V0ID0gRmFjZXRlZE9iamVjdC5wcm90b3R5cGUuYWRkRmFjZXQuY2FsbCh0aGlzLCBGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKTtcblxuICAgIC8vIGNoZWNrIGRlcGVuZWRlbmNpZXMgYW5kIHN0YXJ0IGZhY2V0XG4gICAgaWYgKG5ld0ZhY2V0LmNoZWNrKSBuZXdGYWNldC5jaGVjaygpO1xuICAgIGlmIChuZXdGYWNldC5zdGFydCkgbmV3RmFjZXQuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2QuXG4gKiBFbnZva2UgZ2l2ZW4gbWV0aG9kIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBvbiBhbGwgZmFjZXRzLlxuICogUmV0dXJucyB0aGUgbWFwIG9mIHZhbHVlcyByZXR1cm5lZCBieSBhbGwgZmFjZXRzLiBJZiB0aGUgZmFjZXQgZG9lc24ndCBoYXZlIHRoZSBtZXRob2QgaXQgaXMgc2ltcGx5IG5vdCBjYWxsZWQgYW5kIHRoZSB2YWx1ZSBpbiB0aGUgbWFwIHdpbGwgYmUgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2QgbWV0aG9kIG5hbWUgdG8gZW52b2tlIG9uIHRoZSBmYWNldFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkYWxsRmFjZXRzKG1ldGhvZCkgeyAvLyAsLi4uIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuXG4gICAgcmV0dXJuIF8ubWFwS2V5cyh0aGlzLmZhY2V0cywgZnVuY3Rpb24oZmFjZXQsIGZjdE5hbWUpIHtcbiAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldFttZXRob2RdID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICByZXR1cm4gZmFjZXRbbWV0aG9kXS5hcHBseShmYWNldCwgYXJncyk7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogXG4gKiBAcGFyYW0ge1tTdHJpbmddfSBuYW1lIG9wdGlvbmFsIG5ldyBuYW1lIG9mIGNvbXBvbmVudCwgXG4gKiBAcGFyYW0ge1tCb29sZWFuXX0gcmVuYW1lSW5TY29wZSBvcHRpb25hbCBmYWxzZSB0byBub3QgcmVuYW1lIENvbXBvbmVudEluZm8gb2JqZWN0IGluIGl0cyBzY29wZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW5hbWUobmFtZSwgcmVuYW1lSW5TY29wZSkge1xuICAgIG5hbWUgPSBuYW1lIHx8IG1pbG9Db21wb25lbnROYW1lKCk7XG4gICAgdGhpcy5jb21wb25lbnRJbmZvLnJlbmFtZShuYW1lLCBmYWxzZSk7XG4gICAgU2NvcGUucmVuYW1lKHRoaXMsIG5hbWUsIHJlbmFtZUluU2NvcGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIFJlbW92ZXMgY29tcG9uZW50IGZyb20gaXRzIHNjb3BlLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJlc2VydmVTY29wZVByb3BlcnR5IHRydWUgbm90IHRvIGRlbGV0ZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVpZXQgb3B0aW9uYWwgdHJ1ZSB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGluIHNjb3BlXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW1vdmUocHJlc2VydmVTY29wZVByb3BlcnR5LCBxdWlldCkge1xuICAgIGlmICh0aGlzLnNjb3BlKSB7XG4gICAgICAgIHRoaXMuc2NvcGUuX3JlbW92ZSh0aGlzLm5hbWUsIHF1aWV0KTtcbiAgICAgICAgaWYgKCEgcHJlc2VydmVTY29wZVByb3BlcnR5KVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NvcGU7XG4gICAgfVxufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluc2VydHMgdGhlIGNvbXBvbmVudCBpbnRvIHRoZSBET00gYW5kIGF0dGVtcHRzIHRvIGFkanVzdCB0aGUgc2NvcGUgdHJlZSBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudEVsICAgIFRoZSBlbGVtZW50IGludG8gd2hpY2ggdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2VFbCAob3B0aW9uYWwpIFRoZSByZWZlcmVuY2UgZWxlbWVudCBpdCBzaG91bGQgYmUgaW5zZXJ0ZWQgYmVmb3JlLlxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5zZXJ0SW50byhwYXJlbnRFbCwgcmVmZXJlbmNlRWwpIHtcbiAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUodGhpcy5lbCwgcmVmZXJlbmNlRWwpO1xuICAgIHRoaXMuc2V0U2NvcGVQYXJlbnRGcm9tRE9NKCk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIFJldHVybnMgY29tcG9uZW50IHN0YXRlXG4gKlxuICogQHRoaXMge0NvbXBvbmVudH0gY29tcG9uZW50IHdoaWNoIHN0YXRlIHdpbGwgYmUgc2F2ZWRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFN0YXRlKCkge1xuICAgIHRoaXMuYnJvYWRjYXN0KCdnZXRzdGF0ZXN0YXJ0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9nZXRTdGF0ZSh0cnVlKTtcbiAgICBzdGF0ZS5vdXRlckhUTUwgPSB0aGlzLmVsLm91dGVySFRNTDtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICdicm9hZGNhc3QnLCAnZ2V0c3RhdGVjb21wbGV0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm4gc3RhdGU7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIElmIGNvbXBvbmVudCBoYXMgW1RyYW5zZmVyXSguL2NfZmFjZXRzL1RyYW5zZmVyLmpzLmh0bWwpIGZhY2V0IG9uIGl0LCB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgc3RhdGUgZnJvbSB0aGlzIGZhY2V0XG4gKiBSZXR1cm5zIGNvbXBvbmVudCBzdGF0ZVxuICpcbiAqIEB0aGlzIHtDb21wb25lbnR9IGNvbXBvbmVudCB3aGljaCBzdGF0ZSB3aWxsIGJlIHNhdmVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzLiBcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFRyYW5zZmVyU3RhdGUob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZmVyXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNmZXIuZ2V0U3RhdGUob3B0aW9ucylcbiAgICAgICAgICAgIDogdGhpcy5nZXRTdGF0ZShvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudFxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5nZXRTdGF0ZWAgYW5kIGJ5IFtDb250YWluZXJdKC4vY19mYWNldHMvQ29udGFpbmVyLmpzLmh0bWwpIGZhY2V0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSBmYWxzZSB0byBnZXQgc2hhbGxvdyBzdGF0ZSBmcm9tIGFsbCBmYWNldHMgKHRydWUgYnkgZGVmYXVsdClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JF9nZXRTdGF0ZShkZWVwU3RhdGUpe1xuXG4gICAgdmFyIGZhY2V0c1N0YXRlcyA9IHRoaXMuYWxsRmFjZXRzKCdnZXRTdGF0ZScsIGRlZXBTdGF0ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUpO1xuICAgIGZhY2V0c1N0YXRlcyA9IF8uZmlsdGVyS2V5cyhmYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlKSB7XG4gICAgICAgIHJldHVybiAhISBmY3RTdGF0ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBOYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGNvbXBDbGFzczogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICBleHRyYUZhY2V0czogdGhpcy5leHRyYUZhY2V0cyxcbiAgICAgICAgZmFjZXRzU3RhdGVzOiBmYWNldHNTdGF0ZXNcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgc3RhdGUgb2YgY29tcG9uZW50LlxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGVgIGFuZCBieSBbQ29udGFpbmVyXSguL2NfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIHN0YXRlIHRvIHNldCB0aGUgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5mYWNldHNTdGF0ZXMpXG4gICAgICAgIF8uZWFjaEtleShzdGF0ZS5mYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlLCBmY3ROYW1lKSB7XG4gICAgICAgICAgICB2YXIgZmFjZXQgPSB0aGlzW2ZjdE5hbWVdO1xuICAgICAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldC5zZXRTdGF0ZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIGZhY2V0LnNldFN0YXRlKGZjdFN0YXRlKTtcbiAgICAgICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgc2NvcGUgcGFyZW50IG9mIGEgY29tcG9uZW50LlxuICogSWYgYGNvbmRpdGlvbk9yRmFjZXRgIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCBhbiBpbW1lZGlhdGUgcGFyZW50IHdpbGwgYmUgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgY2xvc2VzdCBhbmNlc3RvciB3aXRoIGEgc3BlY2lmaWVkIGZhY2V0IG9yIHBhc3NpbmcgY29uZGl0aW9uIHRlc3QuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGNvbmRpdGlvbk9yRmFjZXQgb3B0aW9uYWwgY29uZGl0aW9uIHRoYXQgY29tcG9uZW50IHNob3VsZCBwYXNzIChvciBmYWNldCBuYW1lIGl0IHNob3VsZCBjb250YWluKVxuICogQHJldHVybiB7Q29tcG9uZW50fHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KGNvbmRpdGlvbk9yRmFjZXQpIHtcbiAgICByZXR1cm4gX2NhbGxHZXRTY29wZVBhcmVudC5jYWxsKHRoaXMsIF9nZXRTY29wZVBhcmVudCwgY29uZGl0aW9uT3JGYWNldCk7XG59XG5cbmZ1bmN0aW9uIF9jYWxsR2V0U2NvcGVQYXJlbnQoX2dldFNjb3BlUGFyZW50RnVuYywgY29uZGl0aW9uT3JGYWNldCkge1xuICAgIGNoZWNrKGNvbmRpdGlvbk9yRmFjZXQsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKSk7XG4gICAgdmFyIGNvbmRpdGlvbkZ1bmMgPSBjb21wb25lbnRVdGlscy5fbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmMoY29uZGl0aW9uT3JGYWNldCk7XG4gICAgcmV0dXJuIF9nZXRTY29wZVBhcmVudEZ1bmMuY2FsbCh0aGlzLCBjb25kaXRpb25GdW5jKTsgICBcbn1cblxuZnVuY3Rpb24gX2dldFNjb3BlUGFyZW50KGNvbmRpdGlvbkZ1bmMpIHtcbiAgICB2YXIgcGFyZW50O1xuICAgIHRyeSB7IHBhcmVudCA9IHRoaXMuc2NvcGUuX2hvc3RPYmplY3Qub3duZXI7IH0gY2F0Y2goZSkge31cblxuICAgIC8vIFdoZXJlIHRoZXJlIGlzIG5vIHBhcmVudCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICAvLyBUaGUgcGFyZW50IGNvbXBvbmVudCBpcyBjaGVja2VkIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBpZiAoISBjb25kaXRpb25GdW5jIHx8IGNvbmRpdGlvbkZ1bmMocGFyZW50KSApXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNjb3BlIHBhcmVudCB3aXRoIGEgZ2l2ZW4gY2xhc3MsIHdpdGggc2FtZSBjbGFzcyBpZiBub3Qgc3BlY2lmaWVkXG4gKlxuICogQHBhcmFtIHtbRnVuY3Rpb25dfSBDb21wb25lbnRDbGFzcyBjb21wb25lbnQgY2xhc3MgdGhhdCB0aGUgcGFyZW50IHNob3VsZCBoYXZlLCBzYW1lIGNsYXNzIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKENvbXBvbmVudENsYXNzKSB7XG4gICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnRDbGFzcyB8fCB0aGlzLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBfZ2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBmdW5jdGlvbihjb21wKSB7XG4gICAgICAgIHJldHVybiBjb21wIGluc3RhbmNlb2YgQ29tcG9uZW50Q2xhc3M7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgdG9wbW9zdCBzY29wZSBwYXJlbnQgb2YgYSBjb21wb25lbnQuXG4gKiBJZiBgY29uZGl0aW9uT3JGYWNldGAgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0b3Btb3N0IHNjb3BlIHBhcmVudCB3aWxsIGJlIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHRvcG1vc3QgYW5jZXN0b3Igd2l0aCBhIHNwZWNpZmllZCBmYWNldCBvciBwYXNzaW5nIGNvbmRpdGlvbiB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBjb25kaXRpb25PckZhY2V0IG9wdGlvbmFsIGNvbmRpdGlvbiB0aGF0IGNvbXBvbmVudCBzaG91bGQgcGFzcyAob3IgZmFjZXQgbmFtZSBpdCBzaG91bGQgY29udGFpbilcbiAqIEByZXR1cm4ge0NvbXBvbmVudHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudChjb25kaXRpb25PckZhY2V0KSB7XG4gICAgcmV0dXJuIF9jYWxsR2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBfZ2V0VG9wU2NvcGVQYXJlbnQsIGNvbmRpdGlvbk9yRmFjZXQpO1xufVxuXG5mdW5jdGlvbiBfZ2V0VG9wU2NvcGVQYXJlbnQoY29uZGl0aW9uRnVuYykge1xuICAgIHZhciB0b3BQYXJlbnRcbiAgICAgICAgLCBwYXJlbnQgPSB0aGlzO1xuICAgIGRvIHtcbiAgICAgICAgcGFyZW50ID0gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIHRvcFBhcmVudCA9IHBhcmVudDtcbiAgICB9IHdoaWxlIChwYXJlbnQpO1xuXG4gICAgcmV0dXJuIHRvcFBhcmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgc2NvcGUgcGFyZW50IHdpdGggYSBnaXZlbiBjbGFzcywgd2l0aCBzYW1lIGNsYXNzIGlmIG5vdCBzcGVjaWZpZWRcbiAqXG4gKiBAcGFyYW0ge1tGdW5jdGlvbl19IENvbXBvbmVudENsYXNzIGNvbXBvbmVudCBjbGFzcyB0aGF0IHRoZSBwYXJlbnQgc2hvdWxkIGhhdmUsIHNhbWUgY2xhc3MgYnkgZGVmYXVsdFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MoQ29tcG9uZW50Q2xhc3MpIHtcbiAgICBDb21wb25lbnRDbGFzcyA9IENvbXBvbmVudENsYXNzIHx8IHRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIF9nZXRUb3BTY29wZVBhcmVudC5jYWxsKHRoaXMsIGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgcmV0dXJuIGNvbXAgaW5zdGFuY2VvZiBDb21wb25lbnRDbGFzcztcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEZpbmRzIHNjb3BlIHBhcmVudCBvZiBjb21wb25lbnQgdXNpbmcgRE9NIHRyZWUgKHVubGlrZSBnZXRTY29wZVBhcmVudCB0aGF0IHNpbXBseSBnb2VzIHVwIHRoZSBzY29wZSB0cmVlKS5cbiAqIFdoaWxlIGdldFNjb3BlUGFyZW50IGlzIGZhc3RlciBpdCBtYXkgZmFpbCBpZiBzY29wZSBjaGFpbiBpcyBub3Qgc2V0dXAgeWV0IChlLmcuLCB3aGVuIGNvbXBvbmVudCBoYXMgYmVlbiBqdXN0IGluc2VydGVkKS5cbiAqIFRoZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnQgd2lsbCBiZSBjaGFuZ2VkIHRvIHBvaW50IHRvIHNjb3BlIG9iamVjdCBvZiBjb250YWluZXIgZmFjZXQgb2YgdGhhdCBwYXJlbnQuXG4gKiBSZXR1cm5lZCBzY29wZSBwYXJlbnQgb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIHVuZGVmaW5lZCAoYXMgd2VsbCBhcyBjb21wb25lbnQncyBzY29wZSBwcm9wZXJ0eSkgaWYgbm8gcGFyZW50IGluIHRoZSBET00gdHJlZSBoYXMgY29udGFpbmVyIGZhY2V0LlxuICogVE9ETyBNZXRob2Qgd2lsbCBub3QgYmluZCBET00gY2hpbGRyZW4gY29ycmVjdGx5IGlmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIGZhY2V0LlxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JHNldFNjb3BlUGFyZW50RnJvbURPTSgpIHtcbiAgICB2YXIgcGFyZW50RWwgPSB0aGlzLmVsLnBhcmVudE5vZGU7XG5cbiAgICB2YXIgcGFyZW50LCBmb3VuZFBhcmVudDtcbiAgICB3aGlsZSAocGFyZW50RWwgJiYgISBmb3VuZFBhcmVudCkge1xuICAgICAgICBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KHBhcmVudEVsKTtcbiAgICAgICAgZm91bmRQYXJlbnQgPSBwYXJlbnQgJiYgcGFyZW50LmNvbnRhaW5lcjtcbiAgICAgICAgcGFyZW50RWwgPSBwYXJlbnRFbC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlKCk7IC8vIHJlbW92ZSBjb21wb25lbnQgZnJvbSBpdHMgY3VycmVudCBzY29wZSAoaWYgaXQgaXMgZGVmaW5lZClcbiAgICBpZiAoZm91bmRQYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yZW5hbWUodW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgIHBhcmVudC5jb250YWluZXIuc2NvcGUuX2FkZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9ICAgICAgICBcbn1cblxuXG4vKipcbiAqIFdhbGtzIGNvbXBvbmVudCB0cmVlLCBjYWxsaW5nIHByb3ZpZGVkIGNhbGxiYWNrIG9uIGVhY2ggY29tcG9uZW50XG4gKlxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcGFyYW0gdGhpc0FyZ1xuICovXG5mdW5jdGlvbiBDb21wb25lbnQkd2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcyk7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuICAgIHRoaXMuY29udGFpbmVyLnNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBvbmVudCkge1xuICAgICAgICBjb21wb25lbnQud2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50JHRyZWVQYXRoT2YoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGRvbVV0aWxzLnRyZWVQYXRoT2YodGhpcy5lbCwgY29tcG9uZW50LmVsKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCh0cmVlUGF0aCwgbmVhcmVzdCkge1xuICAgIHZhciBub2RlID0gZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgodGhpcy5lbCwgdHJlZVBhdGgsIG5lYXJlc3QpO1xuICAgIHJldHVybiBDb21wb25lbnQuZ2V0Q29tcG9uZW50KG5vZGUpO1xufVxuXG5cbmZ1bmN0aW9uIENvbXBvbmVudCRpbnNlcnRBdFRyZWVQYXRoKHRyZWVQYXRoLCBjb21wb25lbnQsIG5lYXJlc3QpIHtcbiAgICB2YXIgd2FzSW5zZXJ0ZWQgPSBkb21VdGlscy5pbnNlcnRBdFRyZWVQYXRoKHRoaXMuZWwsIHRyZWVQYXRoLCBjb21wb25lbnQuZWwpO1xuICAgIGlmICh3YXNJbnNlcnRlZCkgY29tcG9uZW50LnNldFNjb3BlUGFyZW50RnJvbURPTSgpO1xuICAgIHJldHVybiB3YXNJbnNlcnRlZDtcbn1cblxuXG4vKipcbiAqIEJyb2FkY2FzdCBtZXNzYWdlIHRvIGNvbXBvbmVudCBhbmQgdG8gYWxsIGl0cyBzY29wZSBjaGlsZHJlblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbXNnIG1lc3NhZ2UgdG8gYmUgc2VudFxuICogQHBhcmFtIHtbQW55XX0gZGF0YSBvcHRpb25hbCBtZXNzYWdlIGRhdGFcbiAqIEBwYXJhbSB7W0Z1bmN0aW9uXX0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7W0Jvb2xlYW5dfSBzeW5jaHJvbm91c2x5IGlmIGl0IHNob3VsZCB1c2UgcG9zdE1lc3NhZ2VTeW5jXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRicm9hZGNhc3QobXNnLCBkYXRhLCBjYWxsYmFjaywgc3luY2hyb25vdXNseSkge1xuICAgIHZhciBwb3N0TWV0aG9kID0gc3luY2hyb25vdXNseSA/ICdwb3N0TWVzc2FnZVN5bmMnIDogJ3Bvc3RNZXNzYWdlJztcbiAgICB0aGlzLndhbGtTY29wZVRyZWUoZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudFtwb3N0TWV0aG9kXShtc2csIGRhdGEsIGNhbGxiYWNrKTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY29tcG9uZW50OiByZW1vdmVzIGNvbXBvbmVudCBmcm9tIERPTSwgcmVtb3ZlcyBpdCBmcm9tIHNjb3BlLCBkZWxldGVzIGFsbCByZWZlcmVuY2VzIHRvIERPTSBub2RlcyBhbmQgdW5zdWJzY3JpYmVzIGZyb20gYWxsIG1lc3NhZ2VzIGJvdGggY29tcG9uZW50IGFuZCBhbGwgZmFjZXRzXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRkZXN0cm95KHF1aWV0KSB7XG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICBpZiAoIXF1aWV0KSBsb2dnZXIud2FybignQ29tcG9uZW50IGRlc3Ryb3k6IGNvbXBvbmVudCBpcyBhbHJlYWR5IGRlc3Ryb3llZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlKGZhbHNlLCBxdWlldCk7XG4gICAgdGhpcy5hbGxGYWNldHMoJ2Rlc3Ryb3knKTtcbiAgICB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLmVsKSB7XG4gICAgICAgIGRvbVV0aWxzLmRldGFjaENvbXBvbmVudCh0aGlzLmVsKTtcbiAgICAgICAgZG9tVXRpbHMucmVtb3ZlRWxlbWVudCh0aGlzLmVsKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50SW5mby5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgd2FzIGRlc3Ryb3llZFxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudC5GYWNldGBcbiAqXG4gKiBUaGUgY2xhc3MgZm90IHRoZSBmYWNldCBvZiBjb21wb25lbnQuIFdoZW4gYSBjb21wb25lbnQgaXMgY3JlYXRlZCwgaXRcbiAqIGNyZWF0ZXMgYWxsIGl0cyBmYWNldHMuXG4gKlxuICogU2VlIEZhY2V0cyBzZWN0aW9uIG9uIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBmYWNldHMgYW5kIG9uXG4gKiBob3cgdG8gY3JlYXRlIG5ldyBmYWNldHMgY2xhc3Nlcy5cbiAqXG4gKiAtIENvbXBvbmVudCAtIGJhc2ljIGNvbXBwb25lbnQgY2xhc3NcbiAqIC0gQ29tcG9uZW50RmFjZXQgLSBiYXNpY1xuICovXG5cbnZhciBGYWNldCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSBfLmNyZWF0ZVN1YmNsYXNzKEZhY2V0LCAnQ29tcG9uZW50RmFjZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb21wb25lbnRGYWNldDtcblxuXG4vKipcbiAqIHBvc3REb21QYXJlbnRcbiAqXG4gKiBJZiBmYWNldCBoYXMgRE9NIHBhcmVudCBmYWNldCAoc2VlIGBkb21QYXJlbnRgIG1ldGhvZCksIHBvc3RzIHRoZSBtZXNzYWdlIHRvIHRoaXMgZmFjZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZURhdGFcbiAqL1xudmFyIHBvc3REb21QYXJlbnQgPSBfLnBhcnRpYWwoX3Bvc3RQYXJlbnQsIGRvbVBhcmVudCk7XG5cbi8qKlxuICogcG9zdFNjb3BlUGFyZW50XG4gKlxuICogSWYgZmFjZXQgaGFzIHNjb3BlIHBhcmVudCBmYWNldCAoc2VlIGBzY29wZVBhcmVudGAgbWV0aG9kKSwgcG9zdHMgdGhlIG1lc3NhZ2UgdG8gdGhpcyBmYWNldC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlRGF0YVxuICovXG52YXIgcG9zdFNjb3BlUGFyZW50ID0gXy5wYXJ0aWFsKF9wb3N0UGFyZW50LCBzY29wZVBhcmVudCk7XG5cblxuXy5leHRlbmRQcm90byhDb21wb25lbnRGYWNldCwge1xuICAgIGluaXQ6IENvbXBvbmVudEZhY2V0JGluaXQsXG4gICAgc3RhcnQ6IENvbXBvbmVudEZhY2V0JHN0YXJ0LFxuICAgIGNoZWNrOiBDb21wb25lbnRGYWNldCRjaGVjayxcbiAgICBkZXN0cm95OiBDb21wb25lbnRGYWNldCRkZXN0cm95LFxuICAgIG9uQ29uZmlnTWVzc2FnZXM6IENvbXBvbmVudEZhY2V0JG9uQ29uZmlnTWVzc2FnZXMsXG4gICAgZG9tUGFyZW50OiBkb21QYXJlbnQsXG4gICAgcG9zdERvbVBhcmVudDogcG9zdERvbVBhcmVudCxcbiAgICBzY29wZVBhcmVudDogc2NvcGVQYXJlbnQsXG4gICAgcG9zdFNjb3BlUGFyZW50OiBwb3N0U2NvcGVQYXJlbnQsXG4gICAgZ2V0TWVzc2FnZVNvdXJjZTogZ2V0TWVzc2FnZVNvdXJjZSxcbiAgICBkaXNwYXRjaFNvdXJjZU1lc3NhZ2U6IGRpc3BhdGNoU291cmNlTWVzc2FnZSxcbiAgICBfY3JlYXRlTWVzc2VuZ2VyOiBfY3JlYXRlTWVzc2VuZ2VyLFxuICAgIF9zZXRNZXNzYWdlU291cmNlOiBfc2V0TWVzc2FnZVNvdXJjZSxcbiAgICBfY3JlYXRlTWVzc2FnZVNvdXJjZTogX2NyZWF0ZU1lc3NhZ2VTb3VyY2UsXG4gICAgX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJOiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUElcbn0pO1xuXG5fLmV4dGVuZChDb21wb25lbnRGYWNldCwge1xuICAgIHJlcXVpcmVzRmFjZXQ6IHJlcXVpcmVzRmFjZXRcbn0pO1xuXG5cbi8qKlxuICogRXhwb3NlIE1lc3NlbmdlciBtZXRob2RzIG9uIEZhY2V0IHByb3RvdHlwZVxuICovXG52YXIgTUVTU0VOR0VSX1BST1BFUlRZID0gJ19tZXNzZW5nZXInO1xuTWVzc2VuZ2VyLnVzZVdpdGgoQ29tcG9uZW50RmFjZXQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG4vLyBpbml0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JGluaXQoKSB7XG4gICAgdGhpcy5fY3JlYXRlTWVzc2VuZ2VyKCk7XG59XG5cblxuLy8gc29tZSBzdWJjbGFzc2VzIChlLmcuIE1vZGVsRmFjZXQpIG92ZXJycmlkZSB0aGlzIG1ldGhvZCBhbmQgZG8gbm90IGNyZWF0ZSB0aGVpciBvd24gbWVzc2VuZ2VyXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2VuZ2VyKCl7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG5ldyBNZXNzZW5nZXIodGhpcykpO1xufVxuXG5cbi8vIHN0YXJ0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tZXNzYWdlcylcbiAgICAgICAgdGhpcy5vbkNvbmZpZ01lc3NhZ2VzKHRoaXMuY29uZmlnLm1lc3NhZ2VzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnRGYWNldCRvbkNvbmZpZ01lc3NhZ2VzKG1lc3NhZ2VTdWJzY3JpYmVycykge1xuICAgIHZhciBub3RZZXRSZWdpc3RlcmVkTWFwID0gXy5tYXBLZXlzKG1lc3NhZ2VTdWJzY3JpYmVycywgZnVuY3Rpb24oc3Vic2NyaWJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgdmFyIHN1YnNjcmliZXJUeXBlID0gdHlwZW9mIHN1YnNjcmliZXI7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub24obWVzc2FnZXMsIHN1YnNjcmliZXIpO1xuXG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdmFyIGNvbnRleHRUeXBlID0gdHlwZW9mIHN1YnNjcmliZXIuY29udGV4dDtcbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vbihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNvbnRleHQgPT0gdGhpcy5uYW1lIHx8IHN1YnNjcmliZXIuY29udGV4dCA9PSAnZmFjZXQnKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1YnNjcmliZXIuY29udGV4dCA9PSAnb3duZXInKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5vd25lclxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCBpbiBjb25maWd1cmF0aW9uOiAnICsgc3Vic2NyaWJlci5jb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBjb250ZXh0VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gc3Vic2NyaWJlciB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBzdWJzY3JpYmVyVHlwZSk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbm90WWV0UmVnaXN0ZXJlZE1hcDtcbn1cblxuXG4vLyBjaGVja0RlcGVuZGVuY2llc1xuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkY2hlY2soKSB7XG4gICAgaWYgKHRoaXMucmVxdWlyZSkge1xuICAgICAgICB0aGlzLnJlcXVpcmUuZm9yRWFjaChmdW5jdGlvbihyZXFGYWNldCkge1xuICAgICAgICAgICAgaWYgKCEgdGhpcy5vd25lci5oYXNGYWNldChyZXFGYWNldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5vd25lci5hZGRGYWNldChyZXFGYWNldCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbn1cblxuXG4vLyBkZXN0cm95cyBmYWNldFxuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldKSB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBkb21QYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBvZiB0aGUgY2xvc2VzdCBwYXJlbnQgRE9NIGVsZW1lbnQsIHRoYXQgaGFzIGEgY29tcG9uZW50IHdpdGggdGhlIHNhbWUgZmFjZXQgY2xhc3MgYXR0YWNoZWQgdG8gaXQuIElmIHN1Y2ggZWxlbWVudCBkb2Vzbid0IGV4aXN0IG1ldGhvZCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGRvbVBhcmVudCgpIHtcbiAgICB2YXIgcGFyZW50Q29tcG9uZW50ID0gY29tcG9uZW50VXRpbHMuZ2V0Q29udGFpbmluZ0NvbXBvbmVudCh0aGlzLm93bmVyLmVsLCBmYWxzZSwgdGhpcy5uYW1lKTtcbiAgICByZXR1cm4gcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudFt0aGlzLm5hbWVdO1xufVxuXG5cbi8qKlxuICogc2NvcGVQYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBhcyBgdGhpc2AgZmFjZXQgb2YgdGhlIGNsb3Nlc3Qgc2NvcGUgcGFyZW50IChpLmUuLCB0aGUgY29tcG9uZW50IHRoYXQgaGFzIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCBjb21wb25lbnQgaW4gaXRzIGNvbnRhaW5lciBmYWNldCkuXG4gKi9cbmZ1bmN0aW9uIHNjb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KHRoaXMubmFtZSk7XG4gICAgcmV0dXJuIHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnRbdGhpcy5uYW1lXTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFBhcmVudChnZXRQYXJlbnRNZXRob2QsIG1lc3NhZ2VUeXBlLCBtZXNzYWdlRGF0YSkge1xuICAgIHZhciBwYXJlbnRGYWNldCA9IGdldFBhcmVudE1ldGhvZC5jYWxsKHRoaXMpO1xuICAgIGlmIChwYXJlbnRGYWNldClcbiAgICAgICAgcGFyZW50RmFjZXQucG9zdE1lc3NhZ2UobWVzc2FnZVR5cGUsIG1lc3NhZ2VEYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBfc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLl9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpO1xufVxuXG5cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXS5nZXRNZXNzYWdlU291cmNlKCk7XG59XG5cblxuZnVuY3Rpb24gZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlU291cmNlKCkuZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVNZXNzYWdlU291cmNlKE1lc3NhZ2VTb3VyY2VDbGFzcywgb3B0aW9ucykge1xuICAgIHZhciBtZXNzYWdlU291cmNlID0gbmV3IE1lc3NhZ2VTb3VyY2VDbGFzcyh0aGlzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUEkoTWVzc2FnZVNvdXJjZUNsYXNzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBvcHRpb25zKSB7XG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSBuZXcgTWVzc2FnZVNvdXJjZUNsYXNzKHRoaXMsIHVuZGVmaW5lZCwgbWVzc2VuZ2VyQVBJT3JDbGFzcywgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1aXJlc0ZhY2V0KGZhY2V0TmFtZSkge1xuICAgIC8vICd0aGlzJyByZWZlcnMgdG8gdGhlIEZhY2V0IENsYXNzXG4gICAgdmFyIGZhY2V0UmVxdWlyZSA9IHRoaXMucHJvdG90eXBlLnJlcXVpcmU7XG5cbiAgICByZXR1cm4gZmFjZXRSZXF1aXJlICYmIChmYWNldFJlcXVpcmUuaW5kZXhPZihfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZSkpID49IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZhY2V0UmVxdWlyZS5pbmRleE9mKF8uZmlyc3RMb3dlckNhc2UoZmFjZXROYW1lKSkgPj0gMCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBtaWxvQmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIFNjb3BlID0gcmVxdWlyZSgnLi4vc2NvcGUnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcblxuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmZhY2V0cy5nZXQoJ0NvbnRhaW5lcicpYFxuICogQSBzcGVjaWFsIGNvbXBvbmVudCBmYWNldCB0aGF0IG1ha2VzIGNvbXBvbmVudCBjcmVhdGUgaXRzIG93biBpbm5lciBzY29wZS5cbiAqIFdoZW4gW21pbG8uYmluZGVyXSguLi8uLi9iaW5kZXIuanMuaHRtbCkgYmluZHMgRE9NIHRyZWUgYW5kIGNyZWF0ZXMgY29tcG9uZW50cywgaWYgY29tcG9uZW50cyBhcmUgaW5zaWRlIGNvbXBvbmVudCBXSVRIIENvbnRhaW5lciBmYWNldCwgdGhleSBhcmUgcHV0IG9uIHRoZSBgc2NvcGVgIG9mIGl0IChjb21wb25lbnQuY29udGFpbmVyLnNjb3BlIC0gc2VlIFtTY29wZV0oLi4vc2NvcGUuanMuaHRtbCkpLCBvdGhlcndpc2UgdGhleSBhcmUgcHV0IG9uIHRoZSBzYW1lIHNjb3BlIGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGJlIGRlZXBlciBpbiBET00gdHJlZS5cbiAqIEl0IGFsbG93cyBjcmVhdGluZyBuYW1lc3BhY2VzIGF2b2lkaW5nIGNvbXBvbmVudHMgbmFtZXMgY29uZmxpY3RzLCBhdCB0aGUgc2FtZSB0aW1lIGNyZWF0aW5nIG1vcmUgc2hhbGxvdyBjb21wb25lbnRzIHRyZWUgdGhhbiB0aGUgRE9NIHRyZWUuXG4gKiBUbyBjcmVhdGUgY29tcG9uZW50cyBmb3IgZWxlbWVudHMgaW5zaWRlIHRoZSBjdXJyZW50IGNvbXBvbmVudCB1c2U6XG4gKiBgYGBcbiAqIGNvbXBvbmVudC5jb250YWluZXIuYmluZGVyKCk7XG4gKiBgYGBcbiAqIFNlZSBbbWlsby5iaW5kZXJdKC4uLy4uL2JpbmRlci5qcy5odG1sKVxuICovXG52YXIgQ29udGFpbmVyID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0NvbnRhaW5lcicpO1xuXG5cbi8qKlxuICogIyMjI0NvbnRhaW5lciBmYWNldCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2JpbmRlcl0oI0NvbnRhaW5lciRiaW5kZXIpIC0gY3JlYXRlIGNvbXBvbmVudHMgZnJvbSBET00gaW5zaWRlIHRoZSBjdXJyZW50IG9uZVxuICovXG5fLmV4dGVuZFByb3RvKENvbnRhaW5lciwge1xuICAgIHN0YXJ0OiBDb250YWluZXIkc3RhcnQsXG4gICAgcGF0aDogQ29udGFpbmVyJHBhdGgsXG4gICAgZ2V0U3RhdGU6IENvbnRhaW5lciRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogQ29udGFpbmVyJHNldFN0YXRlLFxuICAgIGJpbmRlcjogQ29udGFpbmVyJGJpbmRlcixcbiAgICBkZXN0cm95OiBDb250YWluZXIkZGVzdHJveSxcbiAgICB1bndyYXA6IENvbnRhaW5lciR1bndyYXAsXG5cbiAgICBhcHBlbmQ6IENvbnRhaW5lciRhcHBlbmQsXG4gICAgaW5zZXJ0QmVmb3JlOiBDb250YWluZXIkaW5zZXJ0QmVmb3JlLFxuICAgIHJlbW92ZTogQ29udGFpbmVyJHJlbW92ZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChDb250YWluZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRhaW5lcjtcblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTY2FucyBET00sIGNyZWF0ZXMgY29tcG9uZW50cyBhbmQgYWRkcyB0byBzY29wZSBjaGlsZHJlbiBvZiBjb21wb25lbnQgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGJpbmRlcigpIHtcbiAgICByZXR1cm4gbWlsb0JpbmRlcih0aGlzLm93bmVyLmVsLCB0aGlzLnNjb3BlLCBmYWxzZSk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogU2V0dXAgZW1wdHkgc2NvcGUgb2JqZWN0IG9uIHN0YXJ0XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnNjb3BlID0gbmV3IFNjb3BlKHRoaXMub3duZXIuZWwsIHRoaXMpO1xufVxuXG5cbnZhciBhbGxvd2VkTmFtZVBhdHRlcm4gPSAvXltBLVphLXpdW0EtWmEtejAtOVxcX1xcJF0qJC87XG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTYWZlbHkgdHJhdmVyc2VzIGNvbXBvbmVudCBzY29wZVxuICogUmV0dXJucyBjb21wb25lbnQgaW4gc2NvcGUgZm9yIGEgZ2l2ZW4gcGF0aFxuICogSWYgcGF0aCBpcyBpbnZhbGlkIHRoZSBtZXRob2Qgd2lsbCB0aHJvdywgaWYgdGhlcmUgaXMgbm8gY29tcG9uZW50IGF0IGEgZ2l2ZW4gcGF0aCBvciBzb21lIG9mIHRoZSBjb21wb25lbnRzIGFsb25nIHRoZSBwYXRoIGRvZXMgbm90IGhhdmUgQ29udGFpbmVyIGZhY2V0IHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gdW5kZWZpbmVkLCBcbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggcGF0aCBvZiBjaGlsZCBjb21wb25lbnQgaW4gc2NvcGUsIGVhY2ggbmFtZSBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnLicsIGUuZy46ICcuY2hpbGQuc3ViY2hpbGQnXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRwYXRoKHBhdGgpIHtcbiAgICBwYXRoID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIHZhciBsZW4gPSBwYXRoLmxlbmd0aDtcbiAgICBpZiAocGF0aFswXSB8fCBsZW4gPCAyKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgdmFyIGNvbXAgPSB0aGlzLm93bmVyO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIG5hbWUgPSBwYXRoW2ldO1xuICAgICAgICBpZiAoIWFsbG93ZWROYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgICAgIGlmICghY29tcC5jb250YWluZXIpIHJldHVybjtcbiAgICAgICAgY29tcCA9IGNvbXAuY29udGFpbmVyLnNjb3BlW25hbWVdO1xuICAgICAgICBpZiAoIWNvbXApIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXA7XG5cbiAgICBmdW5jdGlvbiB0aHJvd0ludmFsaWRQYXRoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhdGggJyArIHBhdGggKyAnIGlzIGludmFsaWQnKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuZ2V0U3RhdGVgIHRvIGdldCBmYWNldCdzIHN0YXRlXG4gKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBjb21wb25lbnRzIGluIHRoZSBzY29wZVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVlcENvcHkgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRnZXRTdGF0ZShkZWVwQ29weSkge1xuICAgIHZhciBzdGF0ZSA9IHsgc2NvcGU6IHt9IH07XG4gICAgaWYgKGRlZXBDb3B5ICE9PSBmYWxzZSlcbiAgICAgICAgdGhpcy5zY29wZS5fZWFjaChmdW5jdGlvbihjb21wb25lbnQsIGNvbXBOYW1lKSB7XG4gICAgICAgICAgICBzdGF0ZS5zY29wZVtjb21wTmFtZV0gPSBjb21wb25lbnQuX2dldFN0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZWAgdG8gc2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFNldHMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudHMgaW4gdGhlIHNjb3BlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgZGF0YSB0byBzZXQgb24gZmFjZXQncyBtb2RlbFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkc2V0U3RhdGUoc3RhdGUpIHtcbiAgICBfLmVhY2hLZXkoc3RhdGUuc2NvcGUsIGZ1bmN0aW9uKGNvbXBEYXRhLCBjb21wTmFtZSkge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5zY29wZVtjb21wTmFtZV07XG4gICAgICAgIGlmIChjb21wb25lbnQpXG4gICAgICAgICAgICBjb21wb25lbnQuc2V0U3RhdGUoY29tcERhdGEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignY29tcG9uZW50IFwiJyArIGNvbXBOYW1lICsgJ1wiIGRvZXMgbm90IGV4aXN0IG9uIHNjb3BlJyk7XG4gICAgfSwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRkZXN0cm95KCkge1xuICAgIHRoaXMuc2NvcGUuX2VhY2goZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5zY29wZS5fZGV0YWNoRWxlbWVudCgpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBNb3ZlcyBhbGwgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBvd25lciBpbnRvIHRoZSBwYXJlbnQgc2NvcGVcbiAqIFxuICogQHBhcmFtIHtCb29sZWFufSByZW5hbWVDaGlsZHJlbiBwYXNzIGZhbHNlIHRvIG5vdCByZW5hbWUgc2NvcGUgY2hpbGRyZW4gKGRlZmF1bHQgaXMgdHJ1ZSlcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVzdHJveSBJZiBub3QgZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBiZSBkZXN0cm95ZWQgYXQgdGhlIGVuZCAoZGVmYXVsdCBpcyB0cnVlKS5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJHVud3JhcChyZW5hbWVDaGlsZHJlbiwgZGVzdHJveSkge1xuICAgIGRvbVV0aWxzLnVud3JhcEVsZW1lbnQodGhpcy5vd25lci5lbCk7XG4gICAgdGhpcy5zY29wZSAmJiB0aGlzLnNjb3BlLl9lYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBjaGlsZC5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHJlbmFtZUNoaWxkcmVuICE9PSBmYWxzZSkgY2hpbGQucmVuYW1lKHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICB0aGlzLm93bmVyLnNjb3BlICYmIHRoaXMub3duZXIuc2NvcGUuX2FkZChjaGlsZCk7XG4gICAgfSwgdGhpcyk7XG4gICAgaWYgKGRlc3Ryb3kgIT09IGZhbHNlKSB0aGlzLm93bmVyLmRlc3Ryb3koKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEFwcGVuZCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZVxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXAgY29tcG9uZW50IHRoYXQgd2lsbCBiZSBhcHBlbmRlZFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkYXBwZW5kKGNvbXApIHtcbiAgICB0aGlzLnNjb3BlLl9hZGQoY29tcCk7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChjb21wLmVsKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEluc2VydCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZSBiZWZvcmUgYW5vdGhlciBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wIGNvbXBvbmVudCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBzaWJsaW5nIGNvbXBvbmVudCBiZWZvcmUgd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYXBwZW5kZWRcbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGluc2VydEJlZm9yZShjb21wLCBzaWJsaW5nKSB7XG4gICAgdGhpcy5zY29wZS5fYWRkKGNvbXApO1xuICAgIHRoaXMuZWwuaW5zZXJ0QmVmb3JlKGNvbXAuZWwsIHNpYmxpbmcgJiYgc2libGluZy5lbCk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRyZW1vdmUoY29tcCkge1xuICAgIHRoaXMuc2NvcGUuX3JlbW92ZShjb21wKTtcbiAgICB0aGlzLm93bmVyLmVsLnJlbW92ZUNoaWxkKGNvbXAuZWwpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWl4aW4gPSBtaWxvQ29yZS5jbGFzc2VzLk1peGluXG4gICAgLCBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcblxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBET01FdmVudHNTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2RvbV9ldmVudHMnKVxuICAgICwgRGF0YU1zZ0FQSSA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGF0YScpXG4gICAgLCBnZXRFbGVtZW50RGF0YUFjY2VzcyA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGVfZGF0YScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBwYXRoVXRpbHMgPSBNb2RlbC5fdXRpbHMucGF0aFxuICAgICwgbW9kZWxVdGlscyA9IE1vZGVsLl91dGlscy5tb2RlbFxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSBNb2RlbC5fdXRpbHMuY2hhbmdlRGF0YUhhbmRsZXJcbiAgICAsIGdldFRyYW5zYWN0aW9uRmxhZyA9IGNoYW5nZURhdGFIYW5kbGVyLmdldFRyYW5zYWN0aW9uRmxhZ1xuICAgICwgc2V0VHJhbnNhY3Rpb25GbGFnID0gY2hhbmdlRGF0YUhhbmRsZXIuc2V0VHJhbnNhY3Rpb25GbGFnXG4gICAgLCBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZCA9IGNoYW5nZURhdGFIYW5kbGVyLnBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkXG5cbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdEYXRhJylgXG4gKiBGYWNldCB0byBnaXZlIGFjY2VzcyB0byBET00gZGF0YVxuICovXG52YXIgRGF0YSA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdEYXRhJyk7XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZHNcbiAqXG4gKiAtIFtzdGFydF0oI0RhdGEkc3RhcnQpIC0gc3RhcnQgRGF0YSBmYWNldFxuICogLSBbZ2V0XSgjRGF0YSRnZXQpIC0gZ2V0IERPTSBkYXRhIGZyb20gRE9NIHRyZWVcbiAqIC0gW3NldF0oI0RhdGEkc2V0KSAtIHNldCBET00gZGF0YSB0byBET00gdHJlZVxuICogLSBbcGF0aF0oI0RhdGEkcGF0aCkgLSBnZXQgcmVmZXJlbmNlIHRvIERhdGEgZmFjZXQgYnkgcGF0aFxuICovXG5fLmV4dGVuZFByb3RvKERhdGEsIHtcbiAgICBzdGFydDogRGF0YSRzdGFydCxcbiAgICBnZXRTdGF0ZTogRGF0YSRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogRGF0YSRzZXRTdGF0ZSxcblxuICAgIGdldDogRGF0YSRnZXQsXG4gICAgc2V0OiBEYXRhJHNldCxcbiAgICBkZWw6IERhdGEkZGVsLFxuICAgIHNwbGljZTogRGF0YSRzcGxpY2UsXG4gICAgbGVuOiBEYXRhJGxlbixcbiAgICBwYXRoOiBEYXRhJHBhdGgsXG4gICAgZ2V0UGF0aDogRGF0YSRnZXRQYXRoLFxuICAgIGdldEtleTogRGF0YSRnZXRLZXksXG5cbiAgICBfZ2V0OiBEYXRhJF9nZXQsXG4gICAgX3NldDogRGF0YSRfc2V0LFxuICAgIF9kZWw6IERhdGEkX2RlbCxcbiAgICBfc3BsaWNlOiBEYXRhJF9zcGxpY2UsXG4gICAgX2xlbjogRGF0YSRfbGVuLFxuXG4gICAgX3NldFNjYWxhclZhbHVlOiBEYXRhJF9zZXRTY2FsYXJWYWx1ZSxcbiAgICBfZ2V0U2NhbGFyVmFsdWU6IERhdGEkX2dldFNjYWxhclZhbHVlLFxuICAgIF9idWJibGVVcERhdGFDaGFuZ2U6IERhdGEkX2J1YmJsZVVwRGF0YUNoYW5nZSxcbiAgICBfcXVldWVEYXRhQ2hhbmdlOiBEYXRhJF9xdWV1ZURhdGFDaGFuZ2UsXG4gICAgX3Bvc3REYXRhQ2hhbmdlczogRGF0YSRfcG9zdERhdGFDaGFuZ2VzLFxuICAgIF9wcmVwYXJlTWVzc2FnZVNvdXJjZTogX3ByZXBhcmVNZXNzYWdlU291cmNlXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKERhdGEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGE7XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggbWV0aG9kcyBhZGRlZCB0byBEYXRhIHByb3RvdHlwZVxuICovXG5bJ3B1c2gnLCAncG9wJywgJ3Vuc2hpZnQnLCAnc2hpZnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gTW9kZWwuUGF0aC5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG4gICAgXy5kZWZpbmVQcm9wZXJ0eShEYXRhLnByb3RvdHlwZSwgbWV0aG9kTmFtZSwgbWV0aG9kKTtcbn0pO1xuXG5cblxuLy8gdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHdyYXBwZWQgdG8gc3VwcG9ydCBcIipcIiBwYXR0ZXJuIHN1YnNjcmlwdGlvbnNcbnZhciBwcm94eURhdGFTb3VyY2VNZXRob2RzID0ge1xuICAgICAgICAvLyB2YWx1ZTogJ3ZhbHVlJyxcbiAgICAgICAgdHJpZ2dlcjogJ3RyaWdnZXInXG4gICAgfTtcblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdGFydHMgRGF0YSBmYWNldFxuICogQ2FsbGVkIGJ5IGNvbXBvbmVudCBhZnRlciBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIERhdGEkc3RhcnQoKSB7XG4gICAgLy8gY2hhbmdlIG1lc3NlbmdlciBtZXRob2RzIHRvIHdvcmsgd2l0aCBcIipcIiBzdWJzY3JpcHRpb25zIChsaWtlIE1vZGVsIGNsYXNzKVxuICAgIHBhdGhVdGlscy53cmFwTWVzc2VuZ2VyTWV0aG9kcy5jYWxsKHRoaXMpO1xuXG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBnZXQvc2V0IG1ldGhvZHMgdG8gc2V0IGRhdGEgb2YgZWxlbWVudFxuICAgIHRoaXMuZWxEYXRhID0gZ2V0RWxlbWVudERhdGFBY2Nlc3ModGhpcy5vd25lci5lbCk7XG5cbiAgICB0aGlzLl9kYXRhQ2hhbmdlc1F1ZXVlID0gW107XG5cbiAgICB0aGlzLl9wcmVwYXJlTWVzc2FnZVNvdXJjZSgpO1xuXG4gICAgLy8gc3RvcmUgZmFjZXQgZGF0YSBwYXRoXG4gICAgdGhpcy5fcGF0aCA9ICcuJyArIHRoaXMub3duZXIubmFtZTtcblxuICAgIC8vIGN1cnJlbnQgdmFsdWVcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuZ2V0KCk7XG5cbiAgICAvLyBwcmVwYXJlIGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzXG4gICAgLy8gdGhpcy5fcHJlcGFyZU1lc3NlbmdlcnMoKTtcblxuICAgIC8vIHN1YnNjcmliZSB0byBET00gZXZlbnQgYW5kIGFjY2Vzc29ycycgbWVzc2FnZXNcbiAgICB0aGlzLm9uU3luYygnJywgb25Pd25EYXRhQ2hhbmdlKTtcblxuICAgIC8vIG1lc3NhZ2UgdG8gbWFyayB0aGUgZW5kIG9mIGJhdGNoIG9uIHRoZSBjdXJyZW50IGxldmVsXG4gICAgdGhpcy5vblN5bmMoJ2RhdGFjaGFuZ2VzZmluaXNoZWQnLCBvbkRhdGFDaGFuZ2VzRmluaXNoZWQpO1xuXG4gICAgLy8gY2hhbmdlcyBpbiBzY29wZSBjaGlsZHJlbiB3aXRoIERhdGEgZmFjZXRcbiAgICB0aGlzLm9uU3luYygnY2hpbGRkYXRhJywgb25DaGlsZERhdGEpO1xuXG4gICAgLy8gdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgdGhpcy5vblN5bmMoJ2NoYW5nZWRhdGEnLCBjaGFuZ2VEYXRhSGFuZGxlcik7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQ3JlYXRlIGFuZCBjb25uZWN0IGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzIG9mIERhdGEgZmFjZXQuXG4gKiBFeHRlcm5hbCBtZXNzZW5nZXIncyBtZXRob2RzIGFyZSBwcm94aWVkIG9uIHRoZSBEYXRhIGZhY2V0IGFuZCB0aGV5IGFsbG93cyBcIipcIiBzdWJzY3JpcHRpb25zLlxuICovXG4vLyBmdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcnMoKSB7XG4gICAgLy8gRGF0YSBmYWNldCB3aWxsIHBvc3QgYWxsIGl0cyBjaGFuZ2VzIG9uIGludGVybmFsIG1lc3NlbmdlclxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG5cbiAgICAvLyBtZXNzYWdlIHNvdXJjZSB0byBjb25uZWN0IGludGVybmFsIG1lc3NlbmdlciB0byBleHRlcm5hbFxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSA9IG5ldyBNZXNzZW5nZXJNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgbmV3IE1vZGVsTXNnQVBJLCBpbnRlcm5hbE1lc3Nlbmdlcik7XG5cbiAgICAvLyBleHRlcm5hbCBtZXNzZW5nZXIgdG8gd2hpY2ggYWxsIG1vZGVsIHVzZXJzIHdpbGwgc3Vic2NyaWJlLFxuICAgIC8vIHRoYXQgd2lsbCBhbGxvdyBcIipcIiBzdWJzY3JpcHRpb25zIGFuZCBzdXBwb3J0IFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgYXBpLlxuICAgIC8vIHZhciBleHRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzLCBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSk7XG5cbi8vICAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuLy8gICAgICAgICBfbWVzc2VuZ2VyOiBleHRlcm5hbE1lc3Nlbmdlcixcbi8vICAgICAgICAgX2ludGVybmFsTWVzc2VuZ2VyOiBpbnRlcm5hbE1lc3NlbmdlclxuLy8gICAgIH0pO1xuLy8gfVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpemVzIERPTUV2ZW50c1NvdXJjZSBhbmQgY29ubmVjdHMgaXQgdG8gRGF0YSBmYWNldCBtZXNzZW5nZXJcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgdmFyIGRhdGFBUEkgPSBuZXcgRGF0YU1zZ0FQSSh0aGlzLm93bmVyKVxuICAgICAgICAsIGRhdGFFdmVudHNTb3VyY2UgPSBuZXcgRE9NRXZlbnRzU291cmNlKHRoaXMsIHByb3h5RGF0YVNvdXJjZU1ldGhvZHMsIGRhdGFBUEksIHRoaXMub3duZXIpO1xuICAgIHRoaXMuX3NldE1lc3NhZ2VTb3VyY2UoZGF0YUV2ZW50c1NvdXJjZSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfZGF0YUV2ZW50c1NvdXJjZScsIGRhdGFFdmVudHNTb3VyY2UpO1xuXG4gICAgLy8gbWFrZSB2YWx1ZSBtZXRob2Qgb2YgRGF0YU1zZ0FQSSBhdmFpbGFibGUgb24gRGF0YSBmYWNldFxuICAgIC8vIHRoaXMgaXMgYSBwcml2YXRlIG1ldGhvZCwgZ2V0KCkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGRhdGEuXG4gICAgTWl4aW4ucHJvdG90eXBlLl9jcmVhdGVQcm94eU1ldGhvZC5jYWxsKGRhdGFBUEksICd2YWx1ZScsICd2YWx1ZScsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnVHlwZSBpbiB0aGlzIGluc3RhbmNlIHdpbGwgYmUgJydcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIGRhdGEgY2hhbmdlIGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIG9uT3duRGF0YUNoYW5nZShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5fYnViYmxlVXBEYXRhQ2hhbmdlKGRhdGEpO1xuICAgIHRoaXMuX3F1ZXVlRGF0YUNoYW5nZShkYXRhKTtcbiAgICBpZiAoZGF0YS5wYXRoID09PSAnJykge1xuICAgICAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhkYXRhKTtcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSgnZGF0YWNoYW5nZXNmaW5pc2hlZCcsIHsgdHJhbnNhY3Rpb246IGluVHJhbnNhY3Rpb24gfSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNlbmRzIGRhdGEgYG1lc3NhZ2VgIHRvIERPTSBwYXJlbnRcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1zZ0RhdGEgZGF0YSBjaGFuZ2UgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBEYXRhJF9idWJibGVVcERhdGFDaGFuZ2UobXNnRGF0YSkge1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuXG4gICAgaWYgKHBhcmVudERhdGEpIHtcbiAgICAgICAgdmFyIHBhcmVudE1zZyA9IF8uY2xvbmUobXNnRGF0YSk7XG4gICAgICAgIHBhcmVudE1zZy5wYXRoID0gKHRoaXMuX3BhdGggfHwgKCcuJyArIHRoaXMub3duZXIubmFtZSkpICArIHBhcmVudE1zZy5wYXRoO1xuICAgICAgICBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdjaGlsZGRhdGEnLCBwYXJlbnRNc2cgfHwgbXNnRGF0YSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFF1ZXVlcyBkYXRhIG1lc3NhZ2VzIHRvIGJlIGRpc3BhdGNoZWQgdG8gY29ubmVjdG9yXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaGFuZ2UgZGF0YSBjaGFuZ2UgZGVzY3JpcHRpb25cbiAqL1xuZnVuY3Rpb24gRGF0YSRfcXVldWVEYXRhQ2hhbmdlKGNoYW5nZSkge1xuICAgIHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucHVzaChjaGFuZ2UpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhY2hhbmdlc2ZpbmlzaGVkIGV2ZW50LlxuICogQ2FsbHMgdGhlIG1ldGhvZCB0byBwb3N0IGNoYW5nZXMgYmF0Y2ggYW5kIGJ1YmJsZXMgdXAgdGhlIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0gIHtbdHlwZV19IG1zZyAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7W3R5cGVdfSBkYXRhIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gb25EYXRhQ2hhbmdlc0ZpbmlzaGVkKG1zZywgZGF0YSkge1xuICAgIHRoaXMuX3Bvc3REYXRhQ2hhbmdlcyhkYXRhLmluVHJhbnNhY3Rpb24pO1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuICAgIGlmIChwYXJlbnREYXRhKSBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdkYXRhY2hhbmdlc2ZpbmlzaGVkJywgZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEaXNwYXRjaGVzIGFsbCBjaGFuZ2VzIGNvbGxlY3RlZCBpbiB0aGUgYmF0Y2hcbiAqIFVzZWQgZm9yIGRhdGEgcHJvcGFnYXRpb24gLSBjb25uZWN0b3Igc3Vic2NyaWJlcyB0byB0aGlzIG1lc3NhZ2VcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBEYXRhJF9wb3N0RGF0YUNoYW5nZXMoaW5UcmFuc2FjdGlvbikge1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucmV2ZXJzZSgpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2VTeW5jKCdkYXRhY2hhbmdlcycsIHtcbiAgICAgICAgY2hhbmdlczogcXVldWUsXG4gICAgICAgIHRyYW5zYWN0aW9uOiBpblRyYW5zYWN0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5fZGF0YUNoYW5nZXNRdWV1ZSA9IFtdOyAvLyBpdCBjYW4ndCBiZSAubGVuZ3RoID0gMCwgYXMgdGhlIGFjdHVhbCBhcnJheSBtYXkgc3RpbGwgYmUgdXNlZFxufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudCBpbiBjaGlsZCBEYXRhIGZhY2V0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2dUeXBlXG4gKiBAcGFyYW0ge09iZWpjdH0gZGF0YSBkYXRhIGNoYW5nZSBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBvbkNoaWxkRGF0YShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShkYXRhLnBhdGgsIGRhdGEpO1xuICAgIHRoaXMuX2J1YmJsZVVwRGF0YUNoYW5nZShkYXRhKTtcbiAgICB0aGlzLl9xdWV1ZURhdGFDaGFuZ2UoZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyBkYXRhIGluIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHkuXG4gKiBSZXR1cm5zIHRoZSBvYmplY3Qgd2l0aCB0aGUgZGF0YSBhY3R1YWxseSBzZXQgKGNhbiBiZSBkaWZmZXJlbnQsIGlmIGNvbXBvbmVudHMgbWF0Y2hpbmcgc29tZSBwcm9wZXJ0aWVzIGFyZSBtaXNzaW5nKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd8TnVtYmVyfSB2YWx1ZSB2YWx1ZSB0byBiZSBzZXQuIElmIHRoZSB2YWx1ZSBpZiBzY2FsYXIsIGl0IHdpbGwgYmUgc2V0IG9uIGNvbXBvbmVudCdzIGVsZW1lbnQsIGlmIHRoZSB2YWx1ZSBpcyBvYmplY3QgLSBvbiBET00gdHJlZSBpbnNpZGUgY29tcG9uZW50XG4gKiBAcmV0dXJuIHtPYmplY3R8U3RyaW5nfE51bWJlcn1cbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJHNldCk7XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUhvb2suY2FsbCh0aGlzLCAnc2V0JywgYXJndW1lbnRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcodGhpcy5fc2V0LCBpblRyYW5zYWN0aW9uKTtcblxuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlXG4gICAgICAgICwgbmV3VmFsdWUgPSB0aGlzLl9zZXQodmFsdWUpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2NoYW5nZWQnLFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiBuZXdWYWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zZXQpO1xuXG4gICAgdmFyIHZhbHVlU2V0O1xuICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlU2V0ID0gW107XG5cbiAgICAgICAgICAgIHZhciBsaXN0RmFjZXQgPSB0aGlzLm93bmVyLmxpc3Q7XG4gICAgICAgICAgICBpZiAobGlzdEZhY2V0KXtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdExlbmd0aCA9IGxpc3RGYWNldC5jb3VudCgpXG4gICAgICAgICAgICAgICAgICAgICwgbmV3SXRlbXNDb3VudCA9IHZhbHVlLmxlbmd0aCAtIGxpc3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW1zQ291bnQgPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX2FkZEl0ZW1zKG5ld0l0ZW1zQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhsaXN0TGVuZ3RoLCBsaXN0RmFjZXQuY291bnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihjaGlsZFZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDaGlsZERhdGEuY2FsbCh0aGlzLCB2YWx1ZVNldCwgY2hpbGRWYWx1ZSwgaW5kZXgsICdbJCRdJyk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGlzdENvdW50ID0gbGlzdEZhY2V0LmNvdW50KClcbiAgICAgICAgICAgICAgICAgICAgLCByZW1vdmVDb3VudCA9IGxpc3RDb3VudCAtIHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChyZW1vdmVDb3VudC0tID4gMClcbiAgICAgICAgICAgICAgICAgICAgbGlzdEZhY2V0Ll9yZW1vdmVJdGVtKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRGF0YTogc2V0dGluZyBhcnJheSBkYXRhIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVTZXQgPSB7fTtcbiAgICAgICAgICAgIF8uZWFjaEtleSh2YWx1ZSwgZnVuY3Rpb24oY2hpbGRWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgc2V0Q2hpbGREYXRhLmNhbGwodGhpcywgdmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgJy4kJCcpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2VcbiAgICAgICAgdmFsdWVTZXQgPSB0aGlzLl9zZXRTY2FsYXJWYWx1ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlU2V0O1xuXG4gICAgcmV0dXJuIHZhbHVlU2V0O1xuXG5cbiAgICBmdW5jdGlvbiBzZXRDaGlsZERhdGEodmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgcGF0aFN5bnRheCkge1xuICAgICAgICB2YXIgY2hpbGRQYXRoID0gcGF0aFN5bnRheC5yZXBsYWNlKCckJCcsIGtleSk7XG4gICAgICAgIHZhciBjaGlsZERhdGFGYWNldCA9IHRoaXMucGF0aChjaGlsZFBhdGgsIHR5cGVvZiBjaGlsZFZhbHVlICE9ICd1bmRlZmluZWQnKTtcbiAgICAgICAgaWYgKGNoaWxkRGF0YUZhY2V0KSB7XG4gICAgICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWcoY2hpbGREYXRhRmFjZXQuc2V0LCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgIHZhbHVlU2V0W2tleV0gPSBjaGlsZERhdGFGYWNldC5zZXQoY2hpbGRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogRGVsZXRlcyBjb21wb25lbnQgZnJvbSB2aWV3IGFuZCBzY29wZSwgb25seSBpbiBjYXNlIGl0IGhhcyBJdGVtIGZhY2V0IG9uIGl0XG4gKi9cbmZ1bmN0aW9uIERhdGEkZGVsKCkge1xuICAgIHZhciBpblRyYW5zYWN0aW9uID0gZ2V0VHJhbnNhY3Rpb25GbGFnKERhdGEkZGVsKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBleGVjdXRlSG9vay5jYWxsKHRoaXMsICdkZWwnKTtcbiAgICAgICAgcG9zdFRyYW5zYWN0aW9uRmluaXNoZWQuY2FsbCh0aGlzLCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcblxuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9kZWwsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX2RlbCgpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2RlbGV0ZWQnLCBvbGRWYWx1ZTogb2xkVmFsdWUgfTtcbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcobXNnLCBpblRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCcnLCBtc2cpO1xufVxuXG5cbmZ1bmN0aW9uIERhdGEkX2RlbCgpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9kZWwpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX3NldCgpO1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgc2NhbGFyIHZhbHVlIHRvIERPTSBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsdWUgdmFsdWUgdG8gc2V0IHRvIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIERhdGEkX3NldFNjYWxhclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxEYXRhLnNldCh0aGlzLm93bmVyLmVsLCB2YWx1ZSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogR2V0IHN0cnVjdHVyZWQgZGF0YSBmcm9tIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHlcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBHZXQgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0KGRlZXBHZXQpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUhvb2suY2FsbCh0aGlzLCAnZ2V0JywgYXJndW1lbnRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2V0KGRlZXBHZXQpO1xufVxuXG5mdW5jdGlvbiBEYXRhJF9nZXQoZGVlcEdldCkge1xuICAgIGlmIChkZWVwR2V0ID09PSBmYWxzZSkgLy8gYSBoYWNrIHRvIGVuYWJsZSBnZXR0aW5nIHNoYWxsb3cgc3RhdGVcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIGNvbXAgPSB0aGlzLm93bmVyXG4gICAgICAgICwgc2NvcGVEYXRhO1xuXG4gICAgaWYgKGNvbXAubGlzdCkge1xuICAgICAgICBzY29wZURhdGEgPSBbXTtcbiAgICAgICAgY29tcC5saXN0LmVhY2goZnVuY3Rpb24obGlzdEl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICBzY29wZURhdGFbaW5kZXhdID0gbGlzdEl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbXAuY29udGFpbmVyKVxuICAgICAgICAgICAgY29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24oc2NvcGVJdGVtLCBuYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEgY29tcC5saXN0LmNvbnRhaW5zKHNjb3BlSXRlbSkgJiYgc2NvcGVJdGVtLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlRGF0YVtuYW1lXSA9IHNjb3BlSXRlbS5kYXRhLmdldCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjb21wLmNvbnRhaW5lcikge1xuICAgICAgICBzY29wZURhdGEgPSB7fTtcbiAgICAgICAgY29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24oc2NvcGVJdGVtLCBuYW1lKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGVJdGVtLmRhdGEpXG4gICAgICAgICAgICAgICAgc2NvcGVEYXRhW25hbWVdID0gc2NvcGVJdGVtLmRhdGEuZ2V0KCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZVxuICAgICAgICBzY29wZURhdGEgPSB0aGlzLl9nZXRTY2FsYXJWYWx1ZSgpO1xuXG4gICAgdGhpcy5fdmFsdWUgPSBzY29wZURhdGE7XG5cbiAgICByZXR1cm4gc2NvcGVEYXRhO1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEdldHMgc2NhbGFyIGRhdGEgZnJvbSBET00gZWxlbWVudFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIERhdGEkX2dldFNjYWxhclZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmVsRGF0YS5nZXQodGhpcy5vd25lci5lbCk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU3BsaWNlcyBMaXN0IGl0ZW1zLiBSZXF1aXJlcyBMaXN0IGZhY2V0IHRvIGJlIHByZXNlbnQgb24gY29tcG9uZW50LiBXb3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgYXJyYXkgc3BsaWNlLlxuICogUmV0dXJucyBkYXRhIHJldHJpZXZlZCBmcm9tIHJlbW92ZWQgaXRlbXNcbiAqXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHNwbGljZUluZGV4IGluZGV4IHRvIGRlbGV0ZS9pbnNlcnQgYXRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc3BsaWNlSG93TWFueSBudW1iZXIgb2YgaXRlbXMgdG8gZGVsZXRlXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBpdGVtcyB0byBpbnNlcnRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBEYXRhJHNwbGljZShzcGxpY2VJbmRleCwgc3BsaWNlSG93TWFueSkgeyAvLywgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBpblRyYW5zYWN0aW9uID0gZ2V0VHJhbnNhY3Rpb25GbGFnKERhdGEkc3BsaWNlKTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGV4ZWN1dGVIb29rLmNhbGwodGhpcywgJ3NwbGljZScsIGFyZ3VtZW50cyk7XG4gICAgICAgIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkLmNhbGwodGhpcywgaW5UcmFuc2FjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSAhPSBub0hvb2spIHRocm93IGU7XG4gICAgfVxuXG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKHRoaXMuX3NwbGljZSwgaW5UcmFuc2FjdGlvbik7XG4gICAgcmVzdWx0ID0gdGhpcy5fc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgdmFyIG1zZyA9IHsgcGF0aDogJycsIHR5cGU6ICdzcGxpY2UnLFxuICAgICAgICAgICAgICAgIGluZGV4OiByZXN1bHQuc3BsaWNlSW5kZXgsXG4gICAgICAgICAgICAgICAgcmVtb3ZlZDogcmVzdWx0LnJlbW92ZWQsXG4gICAgICAgICAgICAgICAgYWRkZWRDb3VudDogcmVzdWx0LmFkZGVkQ291bnQsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHRoaXMuX3ZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiByZXN1bHQucmVtb3ZlZDtcbn1cblxuXG52YXIgbm9Ib29rID0ge307XG5mdW5jdGlvbiBleGVjdXRlSG9vayhtZXRob2ROYW1lLCBhcmdzKSB7XG4gICAgdmFyIGhvb2sgPSB0aGlzLmNvbmZpZ1ttZXRob2ROYW1lXTtcbiAgICBzd2l0Y2ggKHR5cGVvZiBob29rKSB7XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiBob29rLmFwcGx5KHRoaXMub3duZXIsIGFyZ3MpO1xuXG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vd25lcltob29rXS5hcHBseSh0aGlzLm93bmVyLCBhcmdzKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbm9Ib29rO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zcGxpY2Uoc3BsaWNlSW5kZXgsIHNwbGljZUhvd01hbnkpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zcGxpY2UpO1xuXG4gICAgdmFyIGxpc3RGYWNldCA9IHRoaXMub3duZXIubGlzdDtcbiAgICBpZiAoISBsaXN0RmFjZXQpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignRGF0YTogY2Fubm90IHVzZSBzcGxpY2UgbWV0aG9kIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuXG4gICAgdmFyIHJlbW92ZWQgPSBbXTtcblxuICAgIHZhciBsaXN0TGVuZ3RoID0gbGlzdEZhY2V0LmNvdW50KCk7XG4gICAgYXJndW1lbnRzWzBdID0gc3BsaWNlSW5kZXggPVxuICAgICAgICBtb2RlbFV0aWxzLm5vcm1hbGl6ZVNwbGljZUluZGV4KHNwbGljZUluZGV4LCBsaXN0TGVuZ3RoKTtcblxuICAgIGlmIChzcGxpY2VIb3dNYW55ID4gMCAmJiBsaXN0TGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gc3BsaWNlSW5kZXg7IGkgPCBzcGxpY2VJbmRleCArIHNwbGljZUhvd01hbnk7IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShzcGxpY2VJbmRleCk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3JlbW92ZUl0ZW0oc3BsaWNlSW5kZXgpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0RhdGE6IG5vIGl0ZW0gZm9yIGluZGV4JywgaSk7XG5cbiAgICAgICAgICAgIHJlbW92ZWQucHVzaChpdGVtRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhzcGxpY2VJbmRleCwgbGlzdEZhY2V0LmNvdW50KCkpO1xuICAgIH1cblxuICAgIHZhciBhZGRlZCA9IFtdO1xuXG4gICAgdmFyIGFyZ3NMZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAgICwgYWRkSXRlbXMgPSBhcmdzTGVuID4gMlxuICAgICAgICAsIGFkZGVkQ291bnQgPSBhcmdzTGVuIC0gMjtcbiAgICBpZiAoYWRkSXRlbXMpIHtcbiAgICAgICAgbGlzdEZhY2V0Ll9hZGRJdGVtcyhhZGRlZENvdW50LCBzcGxpY2VJbmRleCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAyLCBqID0gc3BsaWNlSW5kZXg7IGkgPCBhcmdzTGVuOyBpKyssIGorKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShqKTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25GbGFnKGl0ZW0uZGF0YS5zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5zZXQoYXJndW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdEYXRhOiBubyBpdGVtIGZvciBpbmRleCcsIGopO1xuXG4gICAgICAgICAgICBhZGRlZC5wdXNoKGl0ZW1EYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoYW5nZSBwYXRocyBvZiBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgYW5kIGl0ZW1zIGFmdGVyIHRoZW1cbiAgICAgICAgbGlzdEZhY2V0Ll91cGRhdGVEYXRhUGF0aHMoc3BsaWNlSW5kZXgsIGxpc3RGYWNldC5jb3VudCgpKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAvLyAgICAgXy5wcmVwZW5kQXJyYXkoYWRkZWQsIFtzcGxpY2VJbmRleCwgc3BsaWNlSG93TWFueV0pO1xuICAgIC8vICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KHRoaXMuX3ZhbHVlLCBhZGRlZCk7XG4gICAgLy8gfSBlbHNlXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5nZXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHNwbGljZUluZGV4OiBzcGxpY2VJbmRleCxcbiAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZCxcbiAgICAgICAgYWRkZWRDb3VudDogYWRkSXRlbXMgPyBhZGRlZENvdW50IDogMFxuICAgIH07XG59XG5cblxuZnVuY3Rpb24gRGF0YSRsZW4oKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVIb29rLmNhbGwodGhpcywgJ2xlbicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgIT0gbm9Ib29rKSB0aHJvdyBlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5fbGVuKCk7XG59XG5cblxuZnVuY3Rpb24gRGF0YSRfbGVuKCkge1xuICAgIGlmICh0aGlzLm93bmVyLmxpc3QpIHJldHVybiB0aGlzLm93bmVyLmxpc3QuY291bnQoKTtcbiAgICBlbHNlIGxvZ2dlci5lcnJvcignRGF0YTogbGVuIGNhbGxlZCB3aXRob3V0IGxpc3QgZmFjZXQnKTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGRhdGEgZmFjZXQgb2YgYSBjaGlsZCBjb21wb25lbnQgKGJ5IHNjb3BlcykgY29ycmVzcG9uZGluZyB0byB0aGUgcGF0aFxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc1BhdGggZGF0YSBhY2Nlc3MgcGF0aFxuICovXG5mdW5jdGlvbiBEYXRhJHBhdGgoYWNjZXNzUGF0aCwgY3JlYXRlSXRlbSkge1xuICAgIC8vIGNyZWF0ZUl0ZW0gPSB0cnVlOyAvLyB0aGlzIGhhY2sgc2VlbXMgdG8gYmUgbm8gbG9uZ2VyIG5lZWRlZC4uLlxuXG4gICAgaWYgKCEgYWNjZXNzUGF0aClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoYWNjZXNzUGF0aCk7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcnNlZFBhdGgubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHBhdGhOb2RlID0gcGFyc2VkUGF0aFtpXVxuICAgICAgICAgICAgLCBub2RlS2V5ID0gcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5KHBhdGhOb2RlKTtcbiAgICAgICAgaWYgKHBhdGhOb2RlLnN5bnRheCA9PSAnYXJyYXknICYmIGN1cnJlbnRDb21wb25lbnQubGlzdCkge1xuICAgICAgICAgICAgdmFyIGl0ZW1Db21wb25lbnQgPSBjdXJyZW50Q29tcG9uZW50Lmxpc3QuaXRlbShub2RlS2V5KTtcbiAgICAgICAgICAgIGlmICghIGl0ZW1Db21wb25lbnQgJiYgY3JlYXRlSXRlbSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpdGVtQ29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5saXN0Ll9hZGRJdGVtKG5vZGVLZXkpO1xuICAgICAgICAgICAgICAgIGl0ZW1Db21wb25lbnQuZGF0YS5fcGF0aCA9IHBhdGhOb2RlLnByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudCA9IGl0ZW1Db21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbXBvbmVudC5jb250YWluZXIpXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5jb250YWluZXIuc2NvcGVbbm9kZUtleV07XG5cbiAgICAgICAgdmFyIGN1cnJlbnREYXRhRmFjZXQgPSBjdXJyZW50Q29tcG9uZW50ICYmIGN1cnJlbnRDb21wb25lbnQuZGF0YTtcbiAgICAgICAgaWYgKCEgY3VycmVudERhdGFGYWNldClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RGF0YUZhY2V0O1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgcGF0aCB0byBhY2Nlc3MgdGhpcyBkYXRhIGZhY2V0IGZyb20gcGFyZW50ICh1c2luZyBwYXRoIG1ldGhvZClcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGF0aDtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGtleSB0byBhY2Nlc3MgdGhlIHZhbHVlIHJlbGF0ZWQgdG8gdGhpcyBkYXRhIGZhY2V0IG9uIHRoZSB2YWx1ZSByZWxhdGVkIHRvIHBhcmVudCBkYXRhIGZhY2V0LlxuICogSWYgY29tcG9uZW50IGhhcyBMaXN0IGZhY2V0LCByZXR1cm5zIGluZGV4XG4gKlxuICogQHJldHVybiB7U3RyaW5nfEludGVnZXJ9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0S2V5KCkge1xuICAgIHZhciBwYXRoID0gdGhpcy5fcGF0aDtcbiAgICByZXR1cm4gcGF0aFswXSA9PSAnWydcbiAgICAgICAgICAgID8gK3BhdGguc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBcIltcIiBhbmQgXCJdXCJcbiAgICAgICAgICAgIDogcGF0aC5zbGljZSgxKSAvLyByZW1vdmUgbGVhZGluZyBcIi5cIlxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5nZXRTdGF0ZWAgdG8gZ2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0U3RhdGUoZGVlcFN0YXRlKSB7XG4gICAgcmV0dXJuIHsgc3RhdGU6IHRoaXMuZ2V0KGRlZXBTdGF0ZSkgfTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGVgIHRvIHNldCBmYWNldCdzIHN0YXRlXG4gKiBTaW1wbHkgc2V0cyBtb2RlbCBkYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGRhdGEgdG8gc2V0IG9uIGZhY2V0J3MgbW9kZWxcbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiB0aGlzLnNldChzdGF0ZS5zdGF0ZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKSBcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBkb1QgPSBtaWxvQ29yZS51dGlsLmRvVFxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIEJpbmRBdHRyaWJ1dGUgPSByZXF1aXJlKCcuLi8uLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBkb21VdGlscyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRG9tJylgXG4gKiBGYWNldCB3aXRoIGNvbXBvbmVudCByZWxhdGVkIGRvbSB1dGlsc1xuICovXG52YXIgRG9tID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0RvbScpO1xuXG5fLmV4dGVuZChEb20sIHtcbiAgICBjcmVhdGVFbGVtZW50OiBEb20kJGNyZWF0ZUVsZW1lbnRcbn0pO1xuXG5cbi8qKlxuICogRmFjZXQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgZnJvbSBhIHBhc3NlZCBjb25maWd1YXRpb24gb2JqZWN0XG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgd2l0aCB0aGUgcHJvcGVydGllcyBgZG9tQ29uZmlnYCwgYGNvbnRlbnRgLCBgdGVtcGxhdGVgXG4gKiBAcmV0dXJuIHtFbGVtZW50fSBhbiBodG1sIGVsZW1lbnQgXG4gKi9cbmZ1bmN0aW9uIERvbSQkY3JlYXRlRWxlbWVudChjb25maWcpIHtcbiAgICB2YXIgZG9tQ29uZmlnID0gY29uZmlnLmRvbUNvbmZpZyB8fCB7fVxuICAgICAgICAsIHRhZ05hbWUgPSBkb21Db25maWcudGFnTmFtZSB8fCAnZGl2J1xuICAgICAgICAsIG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKVxuICAgICAgICAsIGNvbnRlbnQgPSBjb25maWcuY29udGVudFxuICAgICAgICAsIHRlbXBsYXRlID0gY29uZmlnLnRlbXBsYXRlO1xuXG4gICAgLy8gVE9ETyBpdCB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aGVuL2lmIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWRcbiAgICAvLyBTaG91bGQgYmUgc29tZXByb3BlcnR5IG9uIGVsZW1lbnQgdG8gaW5kaWNhdGUgaXQncyBiZWVuIGNhbGxlZD9cbiAgICBfYXBwbHlDb25maWdUb0VsZW1lbnQobmV3RWwsIGRvbUNvbmZpZyk7XG5cbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHRlbXBsYXRlKVxuICAgICAgICAgICAgbmV3RWwuaW5uZXJIVE1MID0gZG9ULnRlbXBsYXRlKHRlbXBsYXRlKSh7Y29udGVudDogY29udGVudH0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdFbC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gbmV3RWw7XG59XG5cblxuZnVuY3Rpb24gX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCBjb25maWcpIHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IGNvbmZpZyAmJiBjb25maWcuY2xzXG4gICAgICAgICwgY29uZmlnQXR0cmlidXRlcyA9IGNvbmZpZyAmJiBjb25maWcuYXR0cmlidXRlcztcblxuICAgIGlmIChjb25maWdBdHRyaWJ1dGVzKVxuICAgICAgICBfLmVhY2hLZXkoY29uZmlnQXR0cmlidXRlcywgZnVuY3Rpb24oYXR0clZhbHVlLCBhdHRyTmFtZSkge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgIGlmIChjc3NDbGFzc2VzKVxuICAgICAgICBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgJ2FkZCcsIGNzc0NsYXNzZXMpO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oRG9tLCB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuXG4gICAgc2hvdzogc2hvdyxcbiAgICBoaWRlOiBoaWRlLFxuICAgIHRvZ2dsZTogdG9nZ2xlLFxuICAgIGRldGFjaDogZGV0YWNoLFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGFwcGVuZDogYXBwZW5kLFxuICAgIHByZXBlbmQ6IHByZXBlbmQsXG4gICAgYXBwZW5kQ2hpbGRyZW46IGFwcGVuZENoaWxkcmVuLFxuICAgIHByZXBlbmRDaGlsZHJlbjogcHJlcGVuZENoaWxkcmVuLFxuICAgIGluc2VydEFmdGVyOiBpbnNlcnRBZnRlcixcbiAgICBpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZSxcbiAgICBhcHBlbmRUb1Njb3BlUGFyZW50OiBhcHBlbmRUb1Njb3BlUGFyZW50LFxuICAgIGNoaWxkcmVuOiBEb20kY2hpbGRyZW4sXG4gICAgc2V0U3R5bGU6IHNldFN0eWxlLFxuICAgIHNldFN0eWxlczogc2V0U3R5bGVzLFxuICAgIGNvcHk6IGNvcHksXG4gICAgY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCxcblxuICAgIGFkZENzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ2FkZCcpLFxuICAgIHJlbW92ZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3JlbW92ZScpLFxuICAgIHRvZ2dsZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3RvZ2dsZScpLFxuXG4gICAgZmluZDogZmluZCxcbiAgICBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uOiBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uLFxuICAgIGhhc1RleHRBZnRlclNlbGVjdGlvbjogaGFzVGV4dEFmdGVyU2VsZWN0aW9uLFxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChEb20pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvbTtcblxuXG4vLyBzdGFydCBEb20gZmFjZXRcbmZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWw7XG4gICAgX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCB0aGlzLmNvbmZpZyk7XG4gICAgdmFyIGN1cnJlbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKVxuICAgIHRoaXMuX3Zpc2libGUgPSBjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnO1xufVxuXG4vLyBzaG93IEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHNob3coKSB7XG4gICAgdGhpcy50b2dnbGUodHJ1ZSk7XG59XG5cbi8vIGhpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gaGlkZSgpIHtcbiAgICB0aGlzLnRvZ2dsZShmYWxzZSk7XG59XG5cbi8vIHNob3cvaGlkZVxuZnVuY3Rpb24gdG9nZ2xlKGRvU2hvdykge1xuICAgIGRvU2hvdyA9IHR5cGVvZiBkb1Nob3cgPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/ICEgdGhpcy5fdmlzaWJsZVxuICAgICAgICAgICAgICAgIDogISEgZG9TaG93O1xuXG4gICAgdGhpcy5fdmlzaWJsZSA9IGRvU2hvdztcbiAgICB2YXIgZWwgPSB0aGlzLm93bmVyLmVsO1xuXG4gICAgZWwuc3R5bGUuZGlzcGxheSA9IGRvU2hvdyA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICByZXR1cm4gZG9TaG93O1xufVxuXG5cbmZ1bmN0aW9uIF9tYW5hZ2VDc3NDbGFzc2VzKG1ldGhvZE5hbWUsIGNzc0NsYXNzZXMsIGVuZm9yY2UpIHtcbiAgICBfYXR0YWNoQ3NzQ2xhc3Nlcyh0aGlzLm93bmVyLmVsLCBtZXRob2ROYW1lLCBjc3NDbGFzc2VzLCBlbmZvcmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgbWV0aG9kTmFtZSwgY3NzQ2xhc3NlcywgZW5mb3JjZSkge1xuICAgIHZhciBjbGFzc0xpc3QgPSBlbC5jbGFzc0xpc3RcbiAgICAgICAgLCBkb1RvZ2dsZSA9IG1ldGhvZE5hbWUgPT0gJ3RvZ2dsZSc7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjc3NDbGFzc2VzKSlcbiAgICAgICAgY3NzQ2xhc3Nlcy5mb3JFYWNoKGNhbGxNZXRob2QpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjc3NDbGFzc2VzID09ICdzdHJpbmcnKVxuICAgICAgICBjYWxsTWV0aG9kKGNzc0NsYXNzZXMpO1xuICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHR5cGUgb2YgQ1NTIGNsYXNzZXMgcGFyYW1ldGVyJyk7XG5cbiAgICBmdW5jdGlvbiBjYWxsTWV0aG9kKGNzc0Nscykge1xuICAgICAgICBkb1RvZ2dsZVxuICAgICAgICAgICAgLy8gT25seSBwYXNzICdlbmZvcmNlJyBpZiBhIHZhbHVlIGhhcyBiZWVuIHByb3ZpZGVkIChUaGUgJ3RvZ2dsZScgZnVuY3Rpb24gb2YgdGhlIGNsYXNzTGlzdCB3aWxsIHRyZWF0IHVuZGVmaW5lZCA9PT0gZmFsc2UgcmVzdWx0aW5nIGluIG9ubHkgYWxsb3dpbmcgY2xhc3NlcyB0byBiZSByZW1vdmVkKVxuICAgICAgICAgICAgPyBlbmZvcmNlID09PSB1bmRlZmluZWQgPyBjbGFzc0xpc3RbbWV0aG9kTmFtZV0oY3NzQ2xzKSA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMsIGVuZm9yY2UpXG4gICAgICAgICAgICA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpICBcbiAgICAgICAgZG9tVXRpbHMuZGV0YWNoQ29tcG9uZW50KHRoaXMub3duZXIuZWwpO1xufVxuXG5cbmZ1bmN0aW9uIHNldFN0eWxlKHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy5vd25lci5lbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2FsbCBzZXRTdHlsZSBvbiBvd25lciB3aXRoIG5vIGVsZW1lbnQ6IFwiICsgdGhpcy5vd25lci5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5vd25lci5lbC5zdHlsZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gc2V0U3R5bGVzKHByb3BlcnRpZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKVxuICAgICAgICB0aGlzLm93bmVyLmVsLnN0eWxlW3Byb3BlcnR5XSA9IHByb3BlcnRpZXNbcHJvcGVydHldO1xufVxuXG5cbi8vIGNyZWF0ZSBhIGNvcHkgb2YgRE9NIGVsZW1lbnQgdXNpbmcgZmFjZXQgY29uZmlnIGlmIHNldFxuZnVuY3Rpb24gY29weShpc0RlZXApIHtcbiAgICByZXR1cm4gdGhpcy5vd25lci5lbCAmJiB0aGlzLm93bmVyLmVsLmNsb25lTm9kZShpc0RlZXApO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG4gICAgdmFyIG5ld0VsID0gRG9tLmNyZWF0ZUVsZW1lbnQodGhpcy5jb25maWcpO1xuICAgIHJldHVybiBuZXdFbDtcbn1cblxuXG4vLyByZW1vdmUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIGRvbVV0aWxzLnJlbW92ZUVsZW1lbnQodGhpcy5vd25lci5lbCk7XG59XG5cbi8vIGFwcGVuZCBpbnNpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gYXBwZW5kKGVsKSB7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChlbCk7XG59XG5cbi8vIHByZXBlbmQgaW5zaWRlIEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHByZXBlbmQoZWwpIHtcbiAgICB2YXIgdGhpc0VsID0gdGhpcy5vd25lci5lbFxuICAgICAgICAsIGZpcnN0Q2hpbGQgPSB0aGlzRWwuZmlyc3RDaGlsZDtcbiAgICBpZiAoZmlyc3RDaGlsZClcbiAgICAgICAgdGhpc0VsLmluc2VydEJlZm9yZShlbCwgZmlyc3RDaGlsZCk7XG4gICAgZWxzZVxuICAgICAgICB0aGlzRWwuYXBwZW5kQ2hpbGQoZWwpO1xufVxuXG4vLyBhcHBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4oZWwpIHtcbiAgICB3aGlsZShlbC5jaGlsZE5vZGVzLmxlbmd0aClcbiAgICAgICAgdGhpcy5hcHBlbmQoZWwuY2hpbGROb2Rlc1swXSk7XG59XG5cbi8vIHByZXBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gcHJlcGVuZENoaWxkcmVuKGVsKSB7XG4gICAgd2hpbGUoZWwuY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgIHRoaXMucHJlcGVuZChlbC5jaGlsZE5vZGVzW2VsLmNoaWxkTm9kZXMubGVuZ3RoIC0gMV0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRBZnRlcihlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7ICAgIFxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZWwsIHRoaXNFbC5uZXh0U2libGluZyk7XG59XG5cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShlbCwgdGhpc0VsKTtcbn1cblxuXG4vLyBhcHBlbmRzIGNvbXBvbmVudCdzIGVsZW1lbnQgdG8gc2NvcGUgcGFyZW50LiBJZiBpdCB3YXMgYWxyZWR5IGluIERPTSBpdCB3aWxsIGJlIG1vdmVkXG5mdW5jdGlvbiBhcHBlbmRUb1Njb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KCk7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVsLmFwcGVuZENoaWxkKHRoaXMub3duZXIuZWwpO1xufVxuXG5cbi8qKlxuICogRG9tIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29tcG9uZW50IGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtBcnJheVtFbGVtZW50XX1cbiAqL1xuZnVuY3Rpb24gRG9tJGNoaWxkcmVuKCkge1xuICAgIHJldHVybiBkb21VdGlscy5jaGlsZHJlbih0aGlzLm93bmVyLmVsKTtcbn1cblxuXG52YXIgZmluZERpcmVjdGlvbnMgPSB7XG4gICAgJ3VwJzogJ3ByZXZpb3VzTm9kZScsXG4gICAgJ2Rvd24nOiAnbmV4dE5vZGUnXG59O1xuXG4vLyBGaW5kcyBjb21wb25lbnQgcGFzc2luZyBvcHRpb25hbCBpdGVyYXRvcidzIHRlc3Rcbi8vIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSBjdXJyZW50IGNvbXBvbmVudCAodGhpcylcbi8vIGJ5IHRyYXZlcnNpbmcgRE9NIHRyZWUgdXB3YXJkcyAoZGlyZWN0aW9uID0gXCJ1cFwiKVxuLy8gb3IgZG93bndhcmRzIChkaXJlY3Rpb24gPSBcImRvd25cIilcbmZ1bmN0aW9uIGZpbmQoZGlyZWN0aW9uLCBpdGVyYXRvcikge1xuICAgIGlmICghIGZpbmREaXJlY3Rpb25zLmhhc093blByb3BlcnR5KGRpcmVjdGlvbikpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW5jb3JyZWN0IGZpbmQgZGlyZWN0aW9uOiAnICsgZGlyZWN0aW9uKTtcblxuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWxcbiAgICAgICAgLCBzY29wZSA9IHRoaXMub3duZXIuc2NvcGVcbiAgICAgICAgLCB0cmVlV2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihzY29wZS5fcm9vdEVsLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG5cbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gZWw7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpXG4gICAgICAgICwgY29tcG9uZW50c05hbWVzID0gT2JqZWN0LmtleXMoc2NvcGUpXG4gICAgICAgICwgZm91bmQgPSBmYWxzZTtcblxuICAgIHdoaWxlIChuZXh0Tm9kZSkge1xuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKG5leHROb2RlKTtcbiAgICAgICAgaWYgKGF0dHIubm9kZSkge1xuICAgICAgICAgICAgYXR0ci5wYXJzZSgpLnZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUuaGFzT3duUHJvcGVydHkoYXR0ci5jb21wTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gc2NvcGVbYXR0ci5jb21wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKCEgaXRlcmF0b3IgfHwgaXRlcmF0b3IoY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gbmV4dE5vZGU7XG4gICAgICAgIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpO1xuICAgIH1cblxuICAgIGlmIChmb3VuZCkgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuXG4vLyByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIHRleHQgYmVmb3JlIHNlbGVjdGlvblxuZnVuY3Rpb24gaGFzVGV4dEJlZm9yZVNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG4gICAgXG4gICAgdmFyIHRleHQgPSBzZWxlY3Rpb24uZm9jdXNOb2RlICYmIHNlbGVjdGlvbi5mb2N1c05vZGUudGV4dENvbnRlbnQ7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGV4dCAmJiB0ZXh0LmNoYXJBdCgwKSA9PSAnICcgPyAxIDogMDtcbiAgICBpZiAoc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPSBzdGFydFBvcykgcmV0dXJuIHRydWU7XG5cbiAgICAvLyB3YWxrIHVwIHRoZSBET00gdHJlZSB0byBjaGVjayBpZiB0aGVyZSBhcmUgdGV4dCBub2RlcyBiZWZvcmUgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIHByZXZOb2RlID0gdHJlZVdhbGtlci5wcmV2aW91c05vZGUoKTtcblxuICAgIHZhciBpc1RleHQgPSBwcmV2Tm9kZSA/ICFwcmV2Tm9kZS5ub2RlVmFsdWUudHJpbSgpID09ICcnIDogZmFsc2U7XG5cbiAgICByZXR1cm4gaXNUZXh0O1xufVxuXG5cbmZ1bmN0aW9uIGhhc1RleHRBZnRlclNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG5cbiAgICB2YXIgdGV4dCA9IHNlbGVjdGlvbi5mb2N1c05vZGUgJiYgc2VsZWN0aW9uLmZvY3VzTm9kZS50ZXh0Q29udGVudDtcbiAgICB2YXIgc3RhcnRQb3MgPSB0ZXh0ICYmIHRleHQuY2hhckF0KHRleHQubGVuZ3RoLTEpID09ICcgJyA/IHNlbGVjdGlvbi5hbmNob3JOb2RlLmxlbmd0aC0xIDogc2VsZWN0aW9uLmFuY2hvck5vZGUubGVuZ3RoO1xuICAgIGlmIChzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0IDwgc3RhcnRQb3MpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gd2FsayB1cCB0aGUgRE9NIHRyZWUgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIHRleHQgbm9kZXMgYWZ0ZXIgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xuICAgIFxuICAgIC8vVG8gY2FwdHVyZSB3aGVuIHRyZWV3YWxrZXIgZ2l2ZXMgdXMgYW4gZW1wdHkgdGV4dCBub2RlICh1bmtub3duIHJlYXNvbilcbiAgICB2YXIgaXNUZXh0ID0gbmV4dE5vZGUgPyAhbmV4dE5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PSAnJyA6IGZhbHNlO1xuXG4gICAgcmV0dXJuIGlzVGV4dDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZmFjZXRzLWRyYWdcIj48L2E+XG4vLyAjIyNkcmFnIGZhY2V0XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIERPTUV2ZW50c1NvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZG9tX2V2ZW50cycpXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIERyYWdEcm9wID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kcmFnZHJvcCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRHJhZycpYFxuICogRmFjZXQgZm9yIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgZHJhZ2dlZFxuICogRHJhZyBmYWNldCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczpcbiAqXG4gKiAgLSBtZXRhOiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzXG4gKiAgICAgIC0gcGFyYW1zOiBvYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRoYXQgd2lsbCBiZSBwYXNzZWQgaW4gbWV0YWRhdGEgZGF0YSB0eXBlIChjYW4gYWxzbyBiZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0aGF0IHJldHVybnMgdGhpcyBvYmplY3QpLiBTZWUgY29uZmlnLmRyYWdEcm9wLmRhdGFUeXBlcy5jb21wb25lbnRNZXRhVGVtcGxhdGVcbiAqICAgICAgLSBkYXRhOiBkYXRhIHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGFib3ZlIG1ldGEgZGF0YSB0eXBlIChvciBmdW5jdGlvbilcbiAqICAtIGFsbG93ZWRFZmZlY3RzOiBzdHJpbmcgKG9yIGZ1bmN0aW9uKSBhcyBzcGVjaWZpZWQgaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9EcmFnRHJvcC9EcmFnX09wZXJhdGlvbnMjZHJhZ3N0YXJ0XG4gKiAgLSBkYXRhVHlwZXM6IG1hcCBvZiBhZGRpdGlvbmFsIGRhdGEgdHlwZXMgdGhlIGNvbXBvbmVudCB3aWxsIHN1cHBseSB0byBkYXRhIHRyYW5zZmVyIG9iamVjdCwga2V5IGlzIGRhdGEgdHlwZSwgdmFsdWUgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgaXQsIGNvbXBvbmVudCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgY29udGV4dCB0byB0aGlzIGZ1bmN0aW9uXG4gKlxuICogSWYgZnVuY3Rpb24gaXMgc3BlY2lmaWVkIGluIGFueSBwYXJhbWV0ZXIgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgY29tcG9uZW50IGFzIHRoZSBjb250ZXh0XG4gKi9cbnZhciBEcmFnID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0RyYWcnKTtcblxuXy5leHRlbmRQcm90byhEcmFnLCB7XG4gICAgaW5pdDogRHJhZyRpbml0LFxuICAgIHN0YXJ0OiBEcmFnJHN0YXJ0LFxuICAgIHNldEhhbmRsZTogRHJhZyRzZXRIYW5kbGVcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoRHJhZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRHJhZztcblxuXG5mdW5jdGlvbiBEcmFnJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgICBcblxuICAgIHRoaXMuX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJKERPTUV2ZW50c1NvdXJjZSk7XG4gICAgdGhpcy5fZHJhZ0RhdGEgPSB7fTtcblxuICAgIHZhciBkYXRhVHlwZUluZm8gPSB0aGlzLmNvbmZpZy5fZGF0YVR5cGVJbmZvIHx8ICcnO1xuICAgIHRoaXMuX2RhdGFUeXBlSW5mbyA9IHR5cGVvZiBkYXRhVHlwZUluZm8gPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGF0YVR5cGVJbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsgcmV0dXJuIGRhdGFUeXBlSW5mbzsgfTtcbn1cblxuXG4vKipcbiAqIERyYWcgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBkcmFnIGhhbmRsZSBlbGVtZW50IG9mIGNvbXBvbmVudC4gVGhpcyBlbGVtZW50IGhhcyB0byBiZSBkcmFnZ2VkIGZvciB0aGUgY29tcG9uZW50IHRvIGJlIGRyYWdnZWQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBoYW5kbGVFbFxuICovXG5mdW5jdGlvbiBEcmFnJHNldEhhbmRsZShoYW5kbGVFbCkge1xuICAgIGlmICghIHRoaXMub3duZXIuZWwuY29udGFpbnMoaGFuZGxlRWwpKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ2RyYWcgaGFuZGxlIHNob3VsZCBiZSBpbnNpZGUgZWxlbWVudCB0byBiZSBkcmFnZ2VkJylcbiAgICB0aGlzLl9kcmFnSGFuZGxlID0gaGFuZGxlRWw7XG59XG5cblxuZnVuY3Rpb24gRHJhZyRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfYWRkRHJhZ0F0dHJpYnV0ZS5jYWxsKHRoaXMpO1xuICAgIF9jcmVhdGVEcmFnSW1hZ2UuY2FsbCh0aGlzKTtcblxuICAgIHRoaXMub25NZXNzYWdlcyh7XG4gICAgICAgICdtb3VzZWRvd24nOiBvbk1vdXNlRG93bixcbiAgICAgICAgJ21vdXNlZW50ZXIgbW91c2VsZWF2ZSBtb3VzZW1vdmUnOiBvbk1vdXNlTW92ZW1lbnQsXG4gICAgICAgICdkcmFnc3RhcnQnOiBvbkRyYWdTdGFydCxcbiAgICAgICAgJ2RyYWcnOiBvbkRyYWdnaW5nLFxuICAgICAgICAnZHJhZ2VuZCc6IG9uRHJhZ0VuZFxuICAgIH0pO1xuXG4gICAgdGhpcy5vd25lci5vbk1lc3NhZ2VzKHtcbiAgICAgICAgJ2dldHN0YXRlc3RhcnRlZCc6XG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9yZW1vdmVEcmFnQXR0cmlidXRlLCBjb250ZXh0OiB0aGlzIH0sXG4gICAgICAgICdnZXRzdGF0ZWNvbXBsZXRlZCc6XG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9hZGREcmFnQXR0cmlidXRlLCBjb250ZXh0OiB0aGlzIH1cbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZHMgZHJhZ2dhYmxlIGF0dHJpYnV0ZSB0byBjb21wb25lbnQncyBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX2FkZERyYWdBdHRyaWJ1dGUoKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpXG4gICAgICAgIHRoaXMub3duZXIuZWwuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCB0cnVlKTtcbn1cblxuXG5mdW5jdGlvbiBfcmVtb3ZlRHJhZ0F0dHJpYnV0ZSgpIHtcbiAgICBpZiAodGhpcy5vd25lci5lbClcbiAgICAgICAgdGhpcy5vd25lci5lbC5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVEcmFnSW1hZ2UoKSB7XG4gICAgdmFyIGRyYWdJbWFnZSA9IHRoaXMuY29uZmlnLmRyYWdJbWFnZTtcbiAgICBpZiAoZHJhZ0ltYWdlKSB7XG4gICAgICAgIHRoaXMuX2RyYWdFbGVtZW50ID0gbmV3IEltYWdlKCk7XG4gICAgICAgIHRoaXMuX2RyYWdFbGVtZW50LnNyYyA9IGRyYWdJbWFnZS51cmw7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLl9fbW91c2VEb3duVGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGlmICh0YXJnZXRJbkRyYWdIYW5kbGUuY2FsbCh0aGlzKSkge1xuICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuZW1wdHkoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uTW91c2VNb3ZlbWVudChldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIHNob3VsZEJlRHJhZ2dhYmxlID0gdGFyZ2V0SW5EcmFnSGFuZGxlLmNhbGwodGhpcyk7XG4gICAgdGhpcy5vd25lci5lbC5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsIHNob3VsZEJlRHJhZ2dhYmxlKTtcbiAgICBpZiAoZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZHJhZ0VuYWJsZUV2ZW50JykgIT0gJ2ZhbHNlJylcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnU3RhcnQoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vZmYgfHwgISB0YXJnZXRJbkRyYWdIYW5kbGUuY2FsbCh0aGlzKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRyYWdJbWFnZSA9IHRoaXMuY29uZmlnLmRyYWdJbWFnZTtcbiAgICBpZiAoZHJhZ0ltYWdlKVxuICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKHRoaXMuX2RyYWdFbGVtZW50LCBkcmFnSW1hZ2UueCB8fCAwLCBkcmFnSW1hZ2UueSB8fCAwKTtcblxuICAgIHZhciBvd25lciA9IHRoaXMub3duZXI7XG4gICAgdmFyIGR0ID0gbmV3IERyYWdEcm9wKGV2ZW50KTtcblxuICAgIHRoaXMuX2RyYWdEYXRhID0gZHQuc2V0Q29tcG9uZW50U3RhdGUob3duZXIpO1xuICAgIHNldE1ldGEuY2FsbCh0aGlzKTtcbiAgICBzZXRBZGRpdGlvbmFsRGF0YVR5cGVzLmNhbGwodGhpcyk7XG4gICAgX3NldEFsbG93ZWRFZmZlY3RzLmNhbGwodGhpcywgZHQpO1xuXG4gICAgRHJhZ0Ryb3Auc2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wc3RhcnRlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnZHJhZ3N0YXJ0JyxcbiAgICAgICAgZHJhZ0Ryb3A6IGR0LFxuICAgICAgICBkcmFnRmFjZXQ6IHRoaXNcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNldE1ldGEoKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBnZXRNZXRhRGF0YS5jYWxsKHRoaXMsICdwYXJhbXMnKVxuICAgICAgICAgICAgLCBkYXRhID0gZ2V0TWV0YURhdGEuY2FsbCh0aGlzLCAnZGF0YScpO1xuXG4gICAgICAgIHRoaXMuX2RyYWdNZXRhRGF0YVR5cGUgPSBkdC5zZXRDb21wb25lbnRNZXRhKG93bmVyLCBwYXJhbXMsIGRhdGEpO1xuICAgICAgICB0aGlzLl9kcmFnTWV0YURhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE1ldGFEYXRhKHByb3BlcnR5KSB7XG4gICAgICAgIHRyeSB7IHZhciBmdW5jID0gdGhpcy5jb25maWcubWV0YVtwcm9wZXJ0eV07IH0gY2F0Y2goZSkge31cbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09ICdzdHJpbmcnKSBmdW5jID0gb3duZXJbZnVuY107XG4gICAgICAgIHJldHVybiBfLnJlc3VsdChmdW5jLCBvd25lcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0QWRkaXRpb25hbERhdGFUeXBlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmRhdGFUeXBlcykge1xuICAgICAgICAgICAgdGhpcy5fZGF0YVR5cGVzRGF0YSA9IF8ubWFwS2V5cyh0aGlzLmNvbmZpZy5kYXRhVHlwZXMsIGZ1bmN0aW9uIChnZXREYXRhRnVuYywgZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldERhdGFGdW5jLmNhbGwodGhpcy5vd25lciwgZGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSBkdC5zZXREYXRhKGRhdGFUeXBlLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ2dpbmcoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGlmIChfZHJhZ0lzRGlzYWJsZWQuY2FsbCh0aGlzLCBldmVudCkpIHJldHVybjtcblxuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgZHQuc2V0Q29tcG9uZW50U3RhdGUodGhpcy5vd25lciwgdGhpcy5fZHJhZ0RhdGEpO1xuICAgIGR0LnNldERhdGEodGhpcy5fZHJhZ01ldGFEYXRhVHlwZSwgdGhpcy5fZHJhZ01ldGFEYXRhKTtcbiAgICBpZiAodGhpcy5fZGF0YVR5cGVzRGF0YSkge1xuICAgICAgICBfLmVhY2hLZXkodGhpcy5fZGF0YVR5cGVzRGF0YSwgZnVuY3Rpb24oZGF0YSwgZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIGlmIChkYXRhKSBkdC5zZXREYXRhKGRhdGFUeXBlLCBkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3NldEFsbG93ZWRFZmZlY3RzLmNhbGwodGhpcywgZHQpO1xufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ0VuZChldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgaWYgKF9kcmFnSXNEaXNhYmxlZC5jYWxsKHRoaXMsIGV2ZW50KSkgcmV0dXJuO1xuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdmFyIGR0ID0gbmV3IERyYWdEcm9wKGV2ZW50KTtcbiAgICBEcmFnRHJvcC5zZXJ2aWNlLnBvc3RNZXNzYWdlU3luYygnY29tcGxldGVkcmFnZHJvcCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnZHJhZ2VuZCcsXG4gICAgICAgIGRyYWdEcm9wOiBkdCxcbiAgICAgICAgZHJhZ0ZhY2V0OiB0aGlzXG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX3NldEFsbG93ZWRFZmZlY3RzKERyYWdEcm9wKSB7XG4gICAgdmFyIGVmZmVjdHMgPSBfLnJlc3VsdCh0aGlzLmNvbmZpZy5hbGxvd2VkRWZmZWN0cywgdGhpcy5vd25lcik7XG4gICAgRHJhZ0Ryb3Auc2V0QWxsb3dlZEVmZmVjdHMoZWZmZWN0cyk7XG59XG5cblxuZnVuY3Rpb24gdGFyZ2V0SW5EcmFnSGFuZGxlKCkge1xuICAgIHJldHVybiAhIHRoaXMuX2RyYWdIYW5kbGUgfHwgdGhpcy5fZHJhZ0hhbmRsZS5jb250YWlucyh0aGlzLl9fbW91c2VEb3duVGFyZ2V0KTtcbn1cblxuXG5mdW5jdGlvbiBfZHJhZ0lzRGlzYWJsZWQoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5jb25maWcub2ZmKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIDxhIG5hbWU9XCJjb21wb25lbnRzLWZhY2V0cy1kcm9wXCI+PC9hPlxuLy8gIyMjZHJvcCBmYWNldFxuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBET01FdmVudHNTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2RvbV9ldmVudHMnKVxuICAgICwgRHJvcE1zZ0FQSSA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZHJvcCcpXG4gICAgLCBEcmFnRHJvcCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZHJhZ2Ryb3AnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmZhY2V0cy5nZXQoJ0Ryb3AnKWBcbiAqIEZhY2V0IGZvciBjb21wb25lbnRzIHRoYXQgY2FuIGFjY2VwdCBkcm9wc1xuICogRHJvcCBmYWNldCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczpcbiAqXG4gKiAgLSBhbGxvdyAtIGFuIG9iamVjdCB0aGF0IHdpbGwgZGVmaW5lIGFsbG93ZWQgZGF0YSB0eXBlcyBkdXJpbmcgZHJhZyAoYGRyYWdlbnRlcmAgYW5kIGBkcmFnb3ZlcmAgZXZlbnRzKSB3aXRoIHRoZXNlIHByb3BlcnRpZXM6XG4gKiAgICAgIC0gY29tcG9uZW50czogYHRydWVgIGJ5IGRlZmF1bHQgKGFsbCBjb21wb25lbnRzIHdpbGwgYmUgYWNjZXB0ZWQpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIHN0cmluZyB3aXRoIGFsbG93ZWQgY29tcG9uZW50IGNsYXNzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIGxpc3Qgb2YgYWxsb3dlZCBjb21wb25lbnRzIGNsYXNzZXMgKHN0cmluZ3MpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIG1hcCB3aXRoIGFsbG93ZWQgY2xhc3NlcyBpbiBrZXlzIGFuZCBgdHJ1ZWAvdGVzdCBmdW5jdGlvbnMgaW4gdmFsdWVzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIHRlc3QgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHBhc3NlZCBvYmplY3QgZGVmaW5lZCBiZWxvd1xuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBgZmFsc2VgIHRvIE5PVCBhY2NlcHQgY29tcG9uZW50c1xuICogICAgICAtIGRhdGFUeXBlczogIGBmYWxzZWAgYnkgZGVmYXVsdCAobm8gb3RoZXIgZGF0YSB0eXBlcyB3aWxsIGJlIGFjY2VwdGVkKVxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBzdHJpbmcgd2l0aCBhbGxvd2VkIGRhdGEgdHlwZVxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBsaXN0IG9mIGFkZGl0aW9uYWwgZGF0YSB0eXBlcyB0aGF0IGEgZHJvcCB0YXJnZXQgd291bGQgYWNjZXB0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIHRlc3QgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHBhc3NlZCBEcmFnRHJvcCBvYmplY3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgYHRydWVgIHRvIGFjY2VwdCBhbGwgZGF0YSB0eXBlc1xuICogICAgICAtIGNoZWNrUGFyZW50OiBgZmFsc2VgIGJ5IGRlZmF1bHRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgYHRydWVgIHdpbGwgY2FsbCBwYXJlbnQgY29tcG9uZW50IGRyb3AgYWxsb3cgdG8gY2hlY2sgaWYgcGFyZW50IGNvbXBvbmVudCB3aWxsIGFjY2VwdCB0aGUgY29tcG9uZW50XG4gKiAgICAgIElmIHRlc3QgZnVuY3Rpb25zIGFyZSB1c2VkLCB0aGV5IHNob3VsZCByZXR1cm4gYm9vbGVhbi4gRWFjaCB0ZXN0IGZ1bmN0aW9uIGNhbiBhbHNvIHNldCBkcm9wIGVmZmVjdCBhcyBkZWZpbmVkIGhlcmU6XG4gKiAgICAgIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9EYXRhVHJhbnNmZXIjZHJvcEVmZmVjdC4yOC4yOVxuICogICAgICBTZXR0aW5nIGRyb3AgZWZmZWN0IHRoYXQgaXMgbm90IGFsbG93ZWQgYnkgZHJhZ2dlZCBvYmplY3Qgd2lsbCBwcmV2ZW50IGRyb3AuXG4gKiAgICAgIFRlc3QgZnVuY3Rpb25zIGZvciBjb21wb25lbnRzIHdpbGwgYmUgcGFzc2VkIHRoZSBvd25lciBvZiBEcm9wIGZhY2V0IGFzIGNvbnRleHQsIHRoZSBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIHByb3BlcnRpZXMgYXMgdGhlIGZpcnN0IHBhcmFtZXRlcjpcbiAqICAgICAgICAgIGNvbXBDbGFzcyAtIG5hbWUgb2YgY29tcG9uZW50IGNsYXNzIGFzIHN0b3JlZCBpbiByZWdpc3RyeVxuICogICAgICAgICAgY29tcE5hbWUgLSBuYW1lIG9mIGNvbXBvbmVudCAoYWxsIGxvd2VyY2FzZSlcbiAqICAgICAgICAgIHBhcmFtcyAtIHBhcmFtZXRlcnMgYXMgZW5jb2RlZCBpbiBkYXRhVHlwZSwgcGFzc2VkIHRvIGBtaWxvLnV0aWwuZHJhZ0Ryb3Auc2V0Q29tcG9uZW50TWV0YWAgYnkgRHJhZyBmYWNldFxuICogICAgICAgICAgbWV0YURhdGFUeXBlIC0gZGF0YSB0eXBlIG9mIHRoZSBkYXRhIHRoYXQgaGFzIGNvbXBDbGFzcywgY29tcE5hbWUgYW5kIHBhcmFtcyBlbmNvZGVkXG4gKlxuICogICAgICAuLi4gYW5kIERyYWdEcm9wIGluc3RhbmNlIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gKlxuICogICAgICBUZXN0IGZ1bmN0aW9uIGZvciBvdGhlciBkYXRhIHR5cGVzIHdpbGwgYmUgcGFzc2VkIHRoZSBvd25lciBvZiBEcm9wIGZhY2V0IGFzIGNvbnRleHQgYW5kIERyYWdEcm9wIGluc3RhbmNlIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXJcbiAqXG4gKiAjIyMjRXZlbnRzIyMjI1xuICpcbiAqIEluIGFkZGl0aW9uIHRvIGNvbmZpZ3VyaW5nIGFsbG93ZWQgY29tcG9uZW50cyBhbmQgZGF0YSB0eXBlcywgY29tcG9uZW50cyBjbGFzc2VzIHNob3VsZCBzdWJzY3JpYmUgdG8gZXZlbnRzLlxuICogQXQgdGhlIHZlcnkgbGVhc3QsIHRoZXkgc2hvdWxkIHN1YnNjcmliZSB0byBgZHJvcGAgZXZlbnQuXG4gKlxuICogRHJvcCBmYWNldCBlbWl0cyBkcmFnaW4vZHJhZ291dCBtZXNzYWdlcyB0aGF0IGFyZSBlbWl0dGVkIHdoZW5ldmVyIGFjdHVhbCBjb21wb25lbnQgZWxlbWVudCBpcyBlbnRlcmVkIG9yIGxlZnRcbiAqICh3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSBkcmFnZW50ZXIgYW5kIGRyYWdsZWF2ZSBtZXNzYWdlcyB0aGF0IGFyZSBlbWl0dGVkIHdoZW5ldmVyIGFueSBjaGlsZCBlbGVtZW50IGlzIGVudGVyZWQgb3IgbGVmdCwgYXMgbG9uZyBhcyBldmVudCBidWJibGVzIHVwKVxuICogSWYgY2hpbGQgY29tcG9uZW50IGhhcyBkcm9wIGZhY2V0IGF0dGFjaGVkLCBkcmFnb3V0IHdpbGwgYmUgZW1pdHRlZCBvbiB0aGUgY3VycmVudCBjb21wb25lbnQgd2hlbiB0aGUgY2hpbGQgaXMgZW50ZXJlZC5cbiAqXG4gKiBZb3UgY2FuIHNlZSB0aGUgZGVtb25zdHJhdGlvbiBvZiB3aGVuIG1lc3NhZ2VzIGFyZSBlbWl0dGVkIFtoZXJlXShodHRwOi8vanNiaW4uY29tL2J1cW92LzYpXG4gKiBcbiAqL1xudmFyIERyb3AgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnRHJvcCcpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRHJvcCwge1xuICAgIGluaXQ6IERyb3AkaW5pdCxcbiAgICBzdGFydDogRHJvcCRzdGFydFxuICAgIC8vIF9yZWF0dGFjaDogX3JlYXR0YWNoRXZlbnRzT25FbGVtZW50Q2hhbmdlXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKERyb3ApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERyb3A7XG5cblxuZnVuY3Rpb24gRHJvcCRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5fY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUEkoRE9NRXZlbnRzU291cmNlLCBuZXcgRHJvcE1zZ0FQSSk7XG59XG5cblxuZnVuY3Rpb24gRHJvcCRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLm93bmVyLmVsLmNsYXNzTGlzdC5hZGQoJ2NjLW1vZHVsZS1yZWxhdGl2ZScpO1xuICAgIHRoaXMub25NZXNzYWdlcyh7XG4gICAgICAgICdkcmFnZW50ZXIgZHJhZ292ZXInOiBvbkRyYWdnaW5nLFxuICAgICAgICAnZHJvcCc6IG9uRHJvcCxcbiAgICAgICAgJ2RyYWdlbnRlciBkcmFnb3ZlciBkcmFnbGVhdmUgZHJvcCBkcmFnaW4gZHJhZ291dCc6IHBvc3RUb1NlcnZpY2VcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdnaW5nKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICghIF9oYW5kbGVEcm9wRGVwZW5kZW5jeS5jYWxsKHRoaXMsIGR0KSlcbiAgICAgICAgZHQuc2V0RHJvcEVmZmVjdCgnbm9uZScpO1xufVxuXG5cbmZ1bmN0aW9uIG9uRHJvcChldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdmFyIGR0ID0gbmV3IERyYWdEcm9wKGV2ZW50KTtcbiAgICBEcmFnRHJvcC5zZXJ2aWNlLnBvc3RNZXNzYWdlU3luYygnZHJhZ2Ryb3Bjb21wbGV0ZWQnLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ2Ryb3AnLFxuICAgICAgICBkcmFnRHJvcDogZHQsXG4gICAgICAgIGRyb3BGYWNldDogdGhpcyxcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLm93bmVyXG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gcG9zdFRvU2VydmljZShldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgRHJhZ0Ryb3Auc2VydmljZS5wb3N0TWVzc2FnZVN5bmMoZXZlbnRUeXBlLCB7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgZHJvcEZhY2V0OiB0aGlzLFxuICAgICAgICBjb21wb25lbnQ6IHRoaXMub3duZXJcbiAgICB9KTtcbn1cblxuXG52YXIgX2hhbmRsZURyb3BEZXBlbmRlbmN5ID0gXy50aHJvdHRsZShfaGFuZGxlRHJvcERlcGVuZGVuY3lOb3Rocm90dGxlLCA1MCk7XG5mdW5jdGlvbiBfaGFuZGxlRHJvcERlcGVuZGVuY3lOb3Rocm90dGxlKGR0LCBvcmlnaW5hbERyb3BDb21wb25lbnQpIHtcbiAgICB2YXIgYWxsb3cgPSB0aGlzLmNvbmZpZy5hbGxvd1xuICAgICAgICAsIHBhcmVudEFsbG93ZWQgPSB0cnVlO1xuXG4gICAgb3JpZ2luYWxEcm9wQ29tcG9uZW50ID0gb3JpZ2luYWxEcm9wQ29tcG9uZW50IHx8IHRoaXMub3duZXI7XG5cbiAgICBpZiAoYWxsb3cgJiYgYWxsb3cuY2hlY2tQYXJlbnQpIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMub3duZXIuZ2V0U2NvcGVQYXJlbnQoJ0Ryb3AnKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIHBhcmVudEFsbG93ZWQgPSBfaGFuZGxlRHJvcERlcGVuZGVuY3lOb3Rocm90dGxlLmNhbGwocGFyZW50LmRyb3AsIGR0LCBvcmlnaW5hbERyb3BDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnRBbGxvd2VkICYmIF9pc0Ryb3BBbGxvd2VkLmNhbGwodGhpcywgZHQsIG9yaWdpbmFsRHJvcENvbXBvbmVudCk7XG59XG5cblxuLyoqXG4gKiBDaGVja3MgaWYgZHJvcCBpcyBhbGxvd2VkIGJhc2VkIG9uIGZhY2V0IGNvbmZpZ3VyYXRpb24gKHNlZSBhYm92ZSlcbiAqIFxuICogQHBhcmFtIHtEcmFnRHJvcH0gZHRcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIF9pc0Ryb3BBbGxvd2VkKGR0LCBvcmlnaW5hbERyb3BDb21wb25lbnQpIHtcbiAgICB2YXIgYWxsb3cgPSB0aGlzLmNvbmZpZy5hbGxvdztcblxuICAgIGlmIChkdC5pc0NvbXBvbmVudCgpKSB7XG4gICAgICAgIHZhciBhbGxvd0NvbXBzID0gYWxsb3cgJiYgYWxsb3cuY29tcG9uZW50c1xuICAgICAgICAgICAgLCBtZXRhID0gZHQuZ2V0Q29tcG9uZW50TWV0YSgpO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGFsbG93Q29tcHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dDb21wcztcbiAgICAgICAgICAgIC8vIGNvbXBvbmVudCBjbGFzc1xuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YSAmJiBtZXRhLmNvbXBDbGFzcyA9PSBhbGxvd0NvbXBzO1xuICAgICAgICAgICAgLy8gdGVzdCBmdW5jdGlvblxuICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd0NvbXBzLmNhbGwodGhpcy5vd25lciwgbWV0YSwgZHQsIG9yaWdpbmFsRHJvcENvbXBvbmVudCk7XG4gICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFsbG93Q29tcHMpKVxuICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IG9mIGFsbG93ZWQgY2xhc3Nlc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dDb21wcy5pbmRleE9mKG1ldGEgJiYgbWV0YS5jb21wQ2xhc3MpID49IDA7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1hcCBvZiBjbGFzczogYm9vbGVhbnx0ZXN0IGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0ID0gYWxsb3dDb21wc1ttZXRhICYmIG1ldGEuY29tcENsYXNzXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhIF8ucmVzdWx0KHRlc3QsIHRoaXMub3duZXIsIG1ldGEsIGR0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IGFsbG93ZWQgY29tcG9uZW50cyBpbiBjb25maWcnKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBkYXRhVHlwZXMgPSBhbGxvdyAmJiBhbGxvdy5kYXRhVHlwZXNcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgZGF0YVR5cGVzKSB7XG4gICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGR0LnR5cGVzLmluZGV4T2YoZGF0YVR5cGVzKSA+PSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETyB0ZXN0IGZvciBvdGhlciBkYXRhIHR5cGVzXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgRE9NRXZlbnRzU291cmNlID0gcmVxdWlyZSgnLi4vbXNnX3NyYy9kb21fZXZlbnRzJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmZhY2V0cy5nZXQoJ0V2ZW50cycpYFxuICogQ29tcG9uZW50IGZhY2V0IHRoYXQgbWFuYWdlcyBzdWJzY3JpcHRpb25zIHRvIERPTSBldmVudHMgdXNpbmcgW01lc3Nlbmdlcl0oLi4vLi4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIHdpdGggW0RPTUV2ZW50c1NvdXJjZV0oLi4vbXNnX3NyYy9kb21fZXZlbnRzLmpzLmh0bWwpLlxuICogQWxsIHB1YmxpYyBtZXRob2RzIG9mIE1lc3NlbmdlciBhbmQgYHRyaWdnZXJgIG1ldGhvZCBvZiBbRE9NRXZlbnRzU291cmNlXSguLi9tc2dfc3JjL2RvbV9ldmVudHMuanMuaHRtbCkgYXJlIHByb3hpZWQgZGlyZWN0bHkgdG8gdGhpcyBmYWNldC5cbiAqIEZvciBleGFtcGxlLCB0byBzdWJzY3JpYmUgdG8gYGNsaWNrYCBldmVudCB1c2U6XG4gKiBgYGBcbiAqIGNvbXBvbmVudC5mcmFtZS5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAqICAgICAvLyAuLi5cbiAqIH0pO1xuICogYGBgXG4gKiBTZWUgW01lc3Nlbmdlcl0oLi4vLi4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpXG4gKi9cbnZhciBFdmVudHMgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnRXZlbnRzJyk7XG5cblxuLyoqXG4gKiAjIyMjRXZlbnRzIGZhY2V0IGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI0V2ZW50cyRpbml0KSAtIGNhbGxlZCBieSBjb25zdHJ1Y3RvciBhdXRvbWF0aWNhbGx5XG4gKi9cbl8uZXh0ZW5kUHJvdG8oRXZlbnRzLCB7XG4gICAgaW5pdDogRXZlbnRzJGluaXRcbiAgICAvLyBfcmVhdHRhY2g6IF9yZWF0dGFjaEV2ZW50c09uRWxlbWVudENoYW5nZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChFdmVudHMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50cztcblxuXG4vKipcbiAqIEV4cG9zZSBET01FdmVudHNTb3VyY2UgdHJpZ2dlciBtZXRob2Qgb24gRXZlbnRzIHByb3RvdHlwZVxuICovXG52YXIgTVNHX1NPVVJDRV9LRVkgPSAnX2RvbUV2ZW50c1NvdXJjZSdcbkRPTUV2ZW50c1NvdXJjZS51c2VXaXRoKEV2ZW50cywgTVNHX1NPVVJDRV9LRVksIFsndHJpZ2dlciddKTtcblxuXG4vKipcbiAqIEV2ZW50cyBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWx6ZXMgZmFjZXQsIGNvbm5lY3RzIERPTUV2ZW50c1NvdXJjZSB0byBmYWNldCdzIG1lc3NlbmdlclxuICovXG5mdW5jdGlvbiBFdmVudHMkaW5pdCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdmFyIGRvbUV2ZW50c1NvdXJjZSA9IG5ldyBET01FdmVudHNTb3VyY2UodGhpcywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRoaXMub3duZXIpO1xuICAgIHRoaXMuX3NldE1lc3NhZ2VTb3VyY2UoZG9tRXZlbnRzU291cmNlKTtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsIE1TR19TT1VSQ0VfS0VZLCBkb21FdmVudHNTb3VyY2UpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgRnJhbWVNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi4vbXNnX3NyYy9mcmFtZScpXG4gICAgLCBkb21FdmVudHNDb25zdHJ1Y3RvcnMgPSByZXF1aXJlKCcuLi8uLi9zZXJ2aWNlcy9kZV9jb25zdHJzJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmZhY2V0cy5nZXQoJ0ZyYW1lJylgXG4gKiBDb21wb25lbnQgZmFjZXQgdGhhdCBzaW1wbGlmaWVzIHNlbmRpbmcgd2luZG93IG1lc3NhZ2VzIHRvIGlmcmFtZSBhbmQgc3Vic2NyaWJpbmcgdG8gbWVzc2FnZXMgb24gaW5uZXIgd2luZG93IG9mIGlmcmFtZS5cbiAqIEFsbCBwdWJsaWMgbWV0aG9kcyBvZiBNZXNzZW5nZXIgYW5kIGB0cmlnZ2VyYCBtZXRob2Qgb2YgW0ZyYW1lTWVzc2FnZVNvdXJjZV0oLi4vbXNnX3NyYy9mcmFtZS5qcy5odG1sKSBhcmUgcHJveGllZCBkaXJlY3RseSB0byB0aGlzIGZhY2V0LlxuICogRm9yIGV4YW1wbGUsIHRvIHNlbmQgY3VzdG9tIG1lc3NhZ2UgdG8gaWZyYW1lIHdpbmRvdyB1c2U6XG4gKiBgYGBcbiAqIGlmcmFtZUNvbXBvbmVudC5mcmFtZS50cmlnZ2VyKCdteW1lc3NhZ2UnLCBteURhdGEpO1xuICogYGBgXG4gKiBUbyBzdWJzY3JpYmUgdG8gdGhpcyBtZXNzYWdlcyBpbnNpZGUgZnJhbWUgdXNlICh3aXRoIG1pbG8gLSBzZWUgW21pbG8ubWFpbF0oLi4vLi4vbWFpbC9pbmRleC5qcy5odG1sKSk6XG4gKiBgYGBcbiAqIG1pbG8ubWFpbC5vbignbWVzc2FnZTpteW1lc3NhZ2UnLCBmdW5jdGlvbihtc2dUeXBlLCBtc2dEYXRhKSB7XG4gKiAgICAgLy8gZGF0YSBpcyBpbnNpZGUgb2Ygd2luZG93IG1lc3NhZ2UgZGF0YVxuICogICAgIC8vIG1zZ1R5cGUgPT0gJ21lc3NhZ2U6bXltZXNzYWdlJ1xuICogICAgIHZhciBteURhdGEgPSBtc2dEYXRhLmRhdGE7XG4gKiAgICAgLy8gLi4uIGFwcCBsb2dpYyBoZXJlXG4gKiB9KTtcbiAqIGBgYFxuICogb3Igd2l0aG91dCBtaWxvOlxuICogYGBgXG4gKiB3aW5kb3cuYXR0YWNoRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAqICAgICB2YXIgbXNnVHlwZSA9IG1lc3NhZ2UudHlwZTsgLy8gZS5nLiwgJ215bWVzc2FnZSdcbiAqICAgICB2YXIgbXlEYXRhID0gbWVzc2FnZS5kYXRhO1xuICogICAgIC8vIC4uLiBtZXNzYWdlIHJvdXRpbmcgYW5kIGNvZGUgaGVyZVxuICogfSk7XG4gKiBgYGBcbiAqIE1pbG8gZG9lcyByb3V0aW5nIGJhc2VkIG9uIHNlbnQgbWVzc2FnZSB0eXBlIGF1dG9tYXRpY2FsbHkuXG4gKiBTZWUgW01lc3Nlbmdlcl0oLi4vLi4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIGFuZCBbbWlsby5tYWlsXSguLi8uLi9tYWlsL2luZGV4LmpzLmh0bWwpLlxuICovXG4gdmFyIEZyYW1lID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0ZyYW1lJyk7XG5cblxuLyoqXG4gKiBDYWxscyBwYXNzZWQgZnVuY3Rpb24gd2hlbiBmcmFtZSBET00gYmVjb21lcyByZWFkeS4gSWYgYWxyZWFkeSByZWFkeSBjYWxscyBpbW1lZGlhdGVseVxuICovXG52YXIgRnJhbWUkd2hlblJlYWR5ID0gX21ha2VXaGVuUmVhZHlGdW5jKEZyYW1lJGlzUmVhZHksICdkb21yZWFkeScpO1xuXG4vKipcbiAqIENhbGxzIHBhc3NlZCBmdW5jdGlvbiB3aGVuIGZyYW1lIG1pbG8gYmVjb21lcyByZWFkeS4gSWYgYWxyZWFkeSByZWFkeSBjYWxscyBpbW1lZGlhdGVseVxuICovXG52YXIgRnJhbWUkd2hlbk1pbG9SZWFkeSA9IF9tYWtlV2hlblJlYWR5RnVuYyhGcmFtZSRpc01pbG9SZWFkeSwgJ21lc3NhZ2U6bWlsb3JlYWR5Jyk7XG5cblxuLyoqXG4gKiAjIyMjRXZlbnRzIGZhY2V0IGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI0ZyYW1lJGluaXQpIC0gY2FsbGVkIGJ5IGNvbnN0cnVjdG9yIGF1dG9tYXRpY2FsbHlcbiAqL1xuXy5leHRlbmRQcm90byhGcmFtZSwge1xuICAgIGluaXQ6IEZyYW1lJGluaXQsXG4gICAgc3RhcnQ6IEZyYW1lJHN0YXJ0LFxuICAgIGRlc3Ryb3k6IEZyYW1lJGRlc3Ryb3ksXG4gICAgZ2V0V2luZG93OiBGcmFtZSRnZXRXaW5kb3csXG4gICAgaXNSZWFkeTogRnJhbWUkaXNSZWFkeSxcbiAgICB3aGVuUmVhZHk6IEZyYW1lJHdoZW5SZWFkeSxcbiAgICBpc01pbG9SZWFkeTogRnJhbWUkaXNNaWxvUmVhZHksXG4gICAgd2hlbk1pbG9SZWFkeTogRnJhbWUkd2hlbk1pbG9SZWFkeSxcbiAgICBtaWxvOiBGcmFtZSRtaWxvXG4gICAgLy8gX3JlYXR0YWNoOiBfcmVhdHRhY2hFdmVudHNPbkVsZW1lbnRDaGFuZ2Vcbn0pO1xuXG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChGcmFtZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnJhbWU7XG5cblxuLyoqXG4gKiBFeHBvc2UgRnJhbWVNZXNzYWdlU291cmNlIHRyaWdnZXIgbWV0aG9kIG9uIEV2ZW50cyBwcm90b3R5cGVcbiAqL1xudmFyIE1TR19TT1VSQ0VfS0VZID0gJ19tZXNzYWdlU291cmNlJztcbkZyYW1lTWVzc2FnZVNvdXJjZS51c2VXaXRoKEZyYW1lLCBNU0dfU09VUkNFX0tFWSwgWyd0cmlnZ2VyJ10pO1xuXG5cbi8qKlxuICogRnJhbWUgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsemVzIGZhY2V0LCBjb25uZWN0cyBGcmFtZU1lc3NhZ2VTb3VyY2UgdG8gZmFjZXQncyBtZXNzZW5nZXJcbiAqL1xuZnVuY3Rpb24gRnJhbWUkaW5pdCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIFxuICAgIHZhciBtZXNzYWdlU291cmNlID0gbmV3IEZyYW1lTWVzc2FnZVNvdXJjZSh0aGlzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhpcy5vd25lcik7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTVNHX1NPVVJDRV9LRVksIG1lc3NhZ2VTb3VyY2UpO1xufVxuXG5cbi8qKlxuICogRnJhbWUgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBFbWl0cyBmcmFtZWxvYWRlZCBldmVudCB3aGVuIHJlYWR5LlxuICovXG5mdW5jdGlvbiBGcmFtZSRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgbWlsbyhwb3N0RG9tUmVhZHkpO1xuXG4gICAgZnVuY3Rpb24gcG9zdERvbVJlYWR5KGV2ZW50KSB7XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoJ2RvbXJlYWR5JywgZXZlbnQpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBGcmFtZSRkZXN0cm95KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBGcmFtZSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHJpZXZlcyB0aGUgaW50ZXJuYWwgd2luZG93IG9mIHRoZSBmcmFtZSBcbiAqXG4gKiBAcGFyYW0ge1dpbmRvd31cbiAqL1xuZnVuY3Rpb24gRnJhbWUkZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyLmVsLmNvbnRlbnRXaW5kb3c7XG59XG5cblxuLyoqXG4gKiBGcmFtZSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgZG9jdW1lbnQucmVhZHlTdGF0ZSBpZiBmcmFtZSBkb3VtZW50IHN0YXRlIGlzICdpbnRlcmFjdGl2ZScgb3IgJ2NvbXBsZXRlJywgZmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICogQHJldHVybiB7U3RyaW5nfEJvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIEZyYW1lJGlzUmVhZHkoKSB7XG4gICAgdmFyIHJlYWR5U3RhdGUgPSB0aGlzLmdldFdpbmRvdygpLmRvY3VtZW50LnJlYWR5U3RhdGU7XG4gICAgcmV0dXJuICByZWFkeVN0YXRlICE9ICdsb2FkaW5nJyA/IHJlYWR5U3RhdGUgOiBmYWxzZTtcbn1cblxuXG4vKipcbiAqIEZyYW1lIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0cnVlIGlmIG1pbG8gaXMgbG9hZGVkIGFuZCBoYXMgZmluaXNoZWQgaW5pdGlhbGl6aW5nIGluc2lkZSB0aGUgZnJhbWVcbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBGcmFtZSRpc01pbG9SZWFkeSgpIHtcbiAgICB2YXIgZnJhbWVNaWxvID0gdGhpcy5nZXRXaW5kb3coKS5taWxvO1xuICAgIHJldHVybiB0aGlzLmlzUmVhZHkoKSAmJiBmcmFtZU1pbG8gJiYgZnJhbWVNaWxvLm1pbG9fdmVyc2lvbjtcbn1cblxuXG4vKipcbiAqIEdpdmVzIGFjY2VzcyB0byBtaWxvIGluIHRoZSBmcmFtZSAoYXNzdW1pbmcgaXQgaXMgbG9hZGVkIHRoZXJlKVxuICogQ2FsbHMgZnVuY3Rpb24gd2hlbiBib3RoIG1pbG8gYW5kIERPTSBhcmUgcmVhZHkgaWYgZnVuY3Rpb24gaXMgcGFzc2VkLlxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIG1pbG8gaW5zaWRlIHRoZSBmcmFtZSBpZiB0aGUgd2luZG93IGlzIGFscmVhZHkgYXZhaWxhYmxlLlxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIG1pbG8gYW5kIERPTSBhcmUgcmVhZHkgaW4gdGhlIGZyYW1lXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gcmVmZXJlbmNlIHRvIG1pbG8gaW4gdGhlIGZyYW1lIFxuICovXG5mdW5jdGlvbiBGcmFtZSRtaWxvKGZ1bmMpIHtcbiAgICBpZiAodHlwZW9mIGZ1bmMgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMud2hlbk1pbG9SZWFkeShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuZ2V0V2luZG93KCkubWlsbyhmdW5jKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHdpbiA9IHRoaXMuZ2V0V2luZG93KCk7XG4gICAgcmV0dXJuIHdpbiAmJiB3aW4ubWlsbztcbn1cblxuXG5mdW5jdGlvbiBfbWFrZVdoZW5SZWFkeUZ1bmMoaXNSZWFkeUZ1bmMsIGV2ZW50KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIEZyYW1lX3doZW5SZWFkeUZ1bmMoZnVuYykgeyAvLyAsIGFyZ3VtZW50c1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgICAgICwgYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgaWYgKGlzUmVhZHlGdW5jLmNhbGwodGhpcykpXG4gICAgICAgICAgICBjYWxsRnVuYygpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLm9uKGV2ZW50LCBjYWxsRnVuYyk7XG5cbiAgICAgICAgZnVuY3Rpb24gY2FsbEZ1bmMoKSB7XG4gICAgICAgICAgICBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1vZGVsID0gbWlsb0NvcmUuTW9kZWxcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbWlsb01haWwgPSByZXF1aXJlKCcuLi8uLi9zZXJ2aWNlcy9tYWlsJyk7XG5cblxudmFyIEl0ZW1GYWNldCA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdJdGVtJyk7XG5cbl8uZXh0ZW5kUHJvdG8oSXRlbUZhY2V0LCB7XG4gICAgZ2V0U3RhdGU6IEl0ZW1GYWNldCRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogSXRlbUZhY2V0JHNldFN0YXRlLFxuICAgIGdldEluZGV4OiBJdGVtRmFjZXQkZ2V0SW5kZXgsXG4gICAgc2V0SW5kZXg6IEl0ZW1GYWNldCRzZXRJbmRleCxcbiAgICByZW1vdmVJdGVtOiBJdGVtRmFjZXQkcmVtb3ZlSXRlbSxcbiAgICBleHRyYWN0SXRlbTogSXRlbUZhY2V0JGV4dHJhY3RJdGVtLFxuICAgIHJlcXVpcmU6IFsnQ29udGFpbmVyJywgJ0RvbScsICdEYXRhJ11cbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoSXRlbUZhY2V0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBJdGVtRmFjZXQ7XG5cblxuZnVuY3Rpb24gSXRlbUZhY2V0JGdldFN0YXRlKCkge1xuICAgIHJldHVybiB7IHN0YXRlOiB7XG4gICAgICAgIGluZGV4OiB0aGlzLmdldEluZGV4KClcbiAgICB9fTtcbn1cblxuXG5mdW5jdGlvbiBJdGVtRmFjZXQkc2V0U3RhdGUoc3RhdGUpIHtcbiAgICB0aGlzLnNldEluZGV4KHN0YXRlLnN0YXRlLmluZGV4KTtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG93bmVyIGNvbXBvbmVudCBpbiBpdCdzIHBhcmVudCBsaXN0IGNvbXBvbmVudFxuICogQHJldHVybiB7SW50ZWdlcn0gVGhlIGluZGV4XG4gKi9cbmZ1bmN0aW9uIEl0ZW1GYWNldCRnZXRJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleDtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgaW5kZXggb2YgdGhpcyBjb21wb25lbnRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IHRvIGJlIHNldFxuICovXG5mdW5jdGlvbiBJdGVtRmFjZXQkc2V0SW5kZXgoaW5kZXgpIHtcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG59XG5cblxuLyoqXG4gKiBJdGVtRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGNvbXBvbmVudCBmcm9tIHRoZSBsaXN0LCBjb21wb25lbnQgZ2V0cyBkZXN0cm95ZWRcbiAqL1xuZnVuY3Rpb24gSXRlbUZhY2V0JHJlbW92ZUl0ZW0oKSB7XG4gICAgLy8gdGhpcy5saXN0IGFuZCB0aGlzLmluZGV4IGFyZSBzZXQgYnkgdGhlIGxpc3Qgd2hlbiB0aGUgaXRlbSBpcyBhZGRlZFxuICAgIHRoaXMubGlzdC5yZW1vdmVJdGVtKHRoaXMuaW5kZXgpO1xufVxuXG5cbi8qKlxuICogSXRlbUZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyBjb21wb25lbnQgZnJvbSB0aGUgbGlzdCwgY29tcG9uZW50IGlzIE5PVCBkZXN0cm95ZWRcbiAqL1xuZnVuY3Rpb24gSXRlbUZhY2V0JGV4dHJhY3RJdGVtKCkge1xuICAgIHRoaXMubGlzdC5leHRyYWN0SXRlbSh0aGlzLmluZGV4KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIG1pbG9NYWlsID0gcmVxdWlyZSgnLi4vLi4vc2VydmljZXMvbWFpbCcpXG4gICAgLCBtaWxvQmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBkb1QgPSBtaWxvQ29yZS51dGlsLmRvVFxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBkb21VdGlscyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJylcbiAgICAsIGNvbXBvbmVudE5hbWUgPSByZXF1aXJlKCcuLi8uLi91dGlsL2NvbXBvbmVudF9uYW1lJylcbiAgICAsIG1pbG9Db25maWcgPSByZXF1aXJlKCcuLi8uLi9jb25maWcnKTtcblxuXG52YXIgTElTVF9TQU1QTEVfQ1NTX0NMQVNTID0gJ21sLWxpc3QtaXRlbS1zYW1wbGUnO1xuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmZhY2V0cy5nZXQoJ0xpc3QnKWBcbiAqIEZhY2V0IGVuYWJsaW5nIGxpc3QgZnVuY3Rpb25hbGl0eVxuICovXG52YXIgTGlzdCA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdMaXN0Jyk7XG5cbl8uZXh0ZW5kUHJvdG8oTGlzdCwge1xuICAgIGluaXQ6IExpc3QkaW5pdCxcbiAgICBzdGFydDogTGlzdCRzdGFydCxcbiAgICBkZXN0cm95OiBMaXN0JGRlc3Ryb3ksXG5cbiAgICByZXF1aXJlOiBbJ0NvbnRhaW5lcicsICdEb20nLCAnRGF0YSddLFxuICAgIF9pdGVtUHJldmlvdXNDb21wb25lbnQ6IF9pdGVtUHJldmlvdXNDb21wb25lbnQsXG5cbiAgICBpdGVtOiBMaXN0JGl0ZW0sXG4gICAgY291bnQ6IExpc3QkY291bnQsXG4gICAgY29udGFpbnM6IExpc3QkY29udGFpbnMsXG4gICAgYWRkSXRlbTogTGlzdCRhZGRJdGVtLFxuICAgIGFkZEl0ZW1zOiBMaXN0JGFkZEl0ZW1zLFxuICAgIHJlcGxhY2VJdGVtOiBMaXN0JHJlcGxhY2VJdGVtLFxuICAgIHJlbW92ZUl0ZW06IExpc3QkcmVtb3ZlSXRlbSxcbiAgICBleHRyYWN0SXRlbTogTGlzdCRleHRyYWN0SXRlbSxcbiAgICBlYWNoOiBMaXN0JGVhY2gsXG4gICAgX3NldEl0ZW06IExpc3QkX3NldEl0ZW0sXG4gICAgX3JlbW92ZUl0ZW06IExpc3QkX3JlbW92ZUl0ZW0sXG4gICAgX2FkZEl0ZW06IExpc3QkX2FkZEl0ZW0sXG4gICAgX2FkZEl0ZW1zOiBMaXN0JF9hZGRJdGVtcyxcbiAgICBfY3JlYXRlQ2FjaGVUZW1wbGF0ZTogTGlzdCRfY3JlYXRlQ2FjaGVUZW1wbGF0ZSxcbiAgICBfdXBkYXRlRGF0YVBhdGhzOiBMaXN0JF91cGRhdGVEYXRhUGF0aHNcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoTGlzdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdDtcblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbGl6ZWQgTGlzdCBmYWNldCBpbnN0YW5jZSBhbmQgc2V0cyB1cCBpdGVtIHByb3BlcnRpZXMuXG4gKi9cbmZ1bmN0aW9uIExpc3QkaW5pdCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9saXN0SXRlbXM6IFtdLFxuICAgICAgICBfbGlzdEl0ZW1zSGFzaDoge31cbiAgICB9KTtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdpdGVtU2FtcGxlJywgbnVsbCwgXy5XUklUKTtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU3RhcnRzIHRoZSBMaXN0IGZhY2V0IGluc3RhbmNlLCBmaW5kcyBjaGlsZCB3aXRoIEl0ZW0gZmFjZXQuXG4gKi9cbmZ1bmN0aW9uIExpc3Qkc3RhcnQoKSB7XG4gICAgLy8gRmlyZWQgYnkgX19iaW5kZXJfXyB3aGVuIGFsbCBjaGlsZHJlbiBvZiBjb21wb25lbnQgYXJlIGJvdW5kXG4gICAgdGhpcy5vd25lci5vbignY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG59XG5cblxuZnVuY3Rpb24gb25DaGlsZHJlbkJvdW5kKCkge1xuICAgIC8vIGdldCBpdGVtcyBhbHJlYWR5IGluIHRoZSBsaXN0XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5kb20uY2hpbGRyZW4oKVxuICAgICAgICAsIGl0ZW1zID0gdGhpcy5saXN0Ll9saXN0SXRlbXNcbiAgICAgICAgLCBpdGVtc0hhc2ggPSB0aGlzLmxpc3QuX2xpc3RJdGVtc0hhc2g7XG5cbiAgICBjaGlsZHJlbiAmJiBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkRWwpIHtcbiAgICAgICAgdmFyIGNvbXAgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KGNoaWxkRWwpO1xuICAgICAgICBpZiAoY29tcCAmJiBjb21wLml0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goY29tcCk7XG4gICAgICAgICAgICBpdGVtc0hhc2hbY29tcC5uYW1lXSA9IGNvbXA7XG4gICAgICAgICAgICBjb21wLml0ZW0ubGlzdCA9IHRoaXMubGlzdDtcbiAgICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICB2YXIgZm91bmRJdGVtID0gaXRlbXNbMF07XG4gICAgICAgIGl0ZW1zLnNwbGljZSgwLCAxKTtcbiAgICAgICAgZGVsZXRlIGl0ZW1zSGFzaFtmb3VuZEl0ZW0ubmFtZV07XG4gICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgIGl0ZW0uaXRlbS5zZXRJbmRleChpbmRleCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb21wb25lbnQgbXVzdCBoYXZlIG9uZSBjaGlsZCB3aXRoIGFuIEl0ZW0gZmFjZXQgXG4gICAgaWYgKCEgZm91bmRJdGVtKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGNoaWxkIGNvbXBvbmVudCBoYXMgSXRlbSBmYWNldCcpO1xuXG4gICAgdGhpcy5saXN0Lml0ZW1TYW1wbGUgPSBmb3VuZEl0ZW07XG5cbiAgICAvLyBBZnRlciBrZWVwaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBpdGVtIHNhbXBsZSwgaXQgbXVzdCBiZSBoaWRkZW4gYW5kIHJlbW92ZWQgZnJvbSBzY29wZVxuICAgIGZvdW5kSXRlbS5kb20uaGlkZSgpO1xuICAgIGZvdW5kSXRlbS5yZW1vdmUodHJ1ZSk7XG4gICAgZm91bmRJdGVtLmRvbS5yZW1vdmVDc3NDbGFzc2VzKExJU1RfU0FNUExFX0NTU19DTEFTUyk7XG5cbiAgICAvLyByZW1vdmUgcmVmZXJlbmNlcyB0byBjb21wb25lbnRzIGZyb20gc2FtcGxlIGl0ZW1cbiAgICBmb3VuZEl0ZW0ud2Fsa1Njb3BlVHJlZShmdW5jdGlvbihjb21wKSB7XG4gICAgICAgIGRlbGV0ZSBjb21wLmVsW21pbG9Db25maWcuY29tcG9uZW50UmVmXTtcbiAgICB9KTtcblxuICAgIHRoaXMubGlzdC5fY3JlYXRlQ2FjaGVUZW1wbGF0ZSgpO1xufVxuXG5cbmZ1bmN0aW9uIExpc3QkX2NyZWF0ZUNhY2hlVGVtcGxhdGUoKSB7XG4gICAgaWYgKCF0aGlzLml0ZW1TYW1wbGUpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICB2YXIgaXRlbVNhbXBsZSA9IHRoaXMuaXRlbVNhbXBsZTtcblxuICAgIC8vIGNyZWF0ZSBpdGVtIHRlbXBsYXRlIHRvIGluc2VydCBtYW55IGl0ZW1zIGF0IG9uY2VcbiAgICB2YXIgaXRlbUVsQ29weSA9IGl0ZW1TYW1wbGUuZWwuY2xvbmVOb2RlKHRydWUpO1xuICAgIHZhciBhdHRyID0gaXRlbVNhbXBsZS5jb21wb25lbnRJbmZvLmF0dHI7XG4gICAgdmFyIGF0dHJDb3B5ID0gXy5jbG9uZShhdHRyKTtcbiAgICBhdHRyLmNvbXBOYW1lID0gJ3t7PSBpdC5jb21wb25lbnROYW1lKCkgfX0nO1xuICAgIGF0dHIuZWwgPSBpdGVtRWxDb3B5O1xuICAgIGF0dHIuZGVjb3JhdGUoKTtcblxuICAgIHZhciBpdGVtc1RlbXBsYXRlU3RyID0gXG4gICAgICAgICAgJ3t7IHZhciBpID0gaXQuY291bnQ7IHdoaWxlKGktLSkgeyB9fSdcbiAgICAgICAgKyBpdGVtRWxDb3B5Lm91dGVySFRNTFxuICAgICAgICArICd7eyB9IH19JztcblxuICAgIHRoaXMuaXRlbXNUZW1wbGF0ZSA9IGRvVC5jb21waWxlKGl0ZW1zVGVtcGxhdGVTdHIpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZSBhIHBhcnRpY3VsYXIgY2hpbGQgaXRlbSBieSBpbmRleFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIGl0ZW0gdG8gZ2V0LlxuICogQHJldHVybiB7Q29tcG9uZW50fSBUaGUgY29tcG9uZW50IGZvdW5kXG4gKi9cbmZ1bmN0aW9uIExpc3QkaXRlbShpbmRleCkge1xuICAgIHJldHVybiB0aGlzLl9saXN0SXRlbXNbaW5kZXhdO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hpbGQgaXRlbXNcbiAqIEByZXR1cm4ge0ludGVnZXJ9IFRoZSB0b3RhbFxuICovXG5mdW5jdGlvbiBMaXN0JGNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLl9saXN0SXRlbXMubGVuZ3RoO1xufVxuXG5cbmZ1bmN0aW9uIExpc3QkX3NldEl0ZW0oaW5kZXgsIGNvbXBvbmVudCkge1xuICAgIHRoaXMuX2xpc3RJdGVtcy5zcGxpY2UoaW5kZXgsIDAsIGNvbXBvbmVudCk7XG4gICAgdGhpcy5fbGlzdEl0ZW1zSGFzaFtjb21wb25lbnQubmFtZV0gPSBjb21wb25lbnQ7XG4gICAgY29tcG9uZW50Lml0ZW0ubGlzdCA9IHRoaXM7XG4gICAgY29tcG9uZW50Lml0ZW0uc2V0SW5kZXgoK2luZGV4KTtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0cnVlIGlmIGEgcGFydGljdWxhciBjaGlsZCBpdGVtIGV4aXN0cyBpbiB0aGUgbGlzdFxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIGxvb2sgZm9yLlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gTGlzdCRjb250YWlucyhjb21wb25lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdEl0ZW1zSGFzaFtjb21wb25lbnQubmFtZV0gPT0gY29tcG9uZW50O1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBBZGRzIGEgbmV3IGNoaWxkIGNvbXBvbmVudCBhdCBhIHBhcnRpY3VsYXIgaW5kZXggYW5kIHJldHVybnMgdGhlIG5ldyBjb21wb25lbnQuXG4gKiBUaGlzIG1ldGhvZCB1c2VzIGRhdGEgZmFjZXQsIHNvIG5vdGlmaWNhdGlvbiB3aWxsIGJlIGVtaXR0ZWQgb24gZGF0YSBmYWNldC5cbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IHRvIGFkZCBhdFxuICogQHJldHVybiB7Q29tcG9uZW50fSBUaGUgbmV3bHkgY3JlYXRlZCBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gTGlzdCRhZGRJdGVtKGluZGV4LCBpdGVtRGF0YSkge1xuICAgIGluZGV4ID0gaW5kZXggfHwgdGhpcy5jb3VudCgpO1xuICAgIHRoaXMub3duZXIuZGF0YS5zcGxpY2UoaW5kZXgsIDAsIGl0ZW1EYXRhIHx8IHt9KTtcbiAgICByZXR1cm4gdGhpcy5pdGVtKGluZGV4KTtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQWRkcyBhIG5ldyBjaGlsZCBjb21wb25lbnQgYXQgYSBwYXJ0aWN1bGFyIGluZGV4IGFuZCByZXR1cm5zIHRoZSBuZXcgY29tcG9uZW50XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCB0byBhZGQgYXRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH0gVGhlIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIExpc3QkX2FkZEl0ZW0oaW5kZXgpIHtcbiAgICBpbmRleCA9IGluZGV4IHx8IHRoaXMuY291bnQoKTtcbiAgICBpZiAodGhpcy5pdGVtKGluZGV4KSlcbiAgICAgICAgdGhyb3cgRXJyb3IoJ2F0dGVtcHQgdG8gY3JlYXRlIGl0ZW0gd2l0aCBJRCBvZiBleGlzdGluZyBpdGVtJyk7XG5cbiAgICAvLyBDb3B5IGNvbXBvbmVudFxuICAgIHZhciBjb21wb25lbnQgPSBDb21wb25lbnQuY29weSh0aGlzLml0ZW1TYW1wbGUsIHRydWUpO1xuICAgIHZhciBwcmV2Q29tcG9uZW50ID0gdGhpcy5faXRlbVByZXZpb3VzQ29tcG9uZW50KGluZGV4KTtcblxuICAgIGlmICghcHJldkNvbXBvbmVudC5lbC5wYXJlbnROb2RlKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ2xpc3QgaXRlbSBzYW1wbGUgd2FzIHJlbW92ZWQgZnJvbSBET00sIHByb2JhYmx5IGNhdXNlZCBieSB3cm9uZyBkYXRhLiBSZXNldCBsaXN0IGRhdGEgd2l0aCBhcnJheScpO1xuXG4gICAgLy8gQWRkIGl0IHRvIHRoZSBET01cbiAgICBwcmV2Q29tcG9uZW50LmRvbS5pbnNlcnRBZnRlcihjb21wb25lbnQuZWwpO1xuXG4gICAgLy8gQWRkIHRvIGxpc3QgaXRlbXNcbiAgICB0aGlzLl9zZXRJdGVtKGluZGV4LCBjb21wb25lbnQpO1xuXG4gICAgLy8gU2hvdyB0aGUgbGlzdCBpdGVtIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudC5lbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgICBfdXBkYXRlSXRlbXNJbmRleGVzLmNhbGwodGhpcywgaW5kZXggKyAxKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG59XG5cblxuZnVuY3Rpb24gX3VwZGF0ZUl0ZW1zSW5kZXhlcyhmcm9tSW5kZXgsIHRvSW5kZXgpIHtcbiAgICBmcm9tSW5kZXggPSBmcm9tSW5kZXggfHwgMDtcbiAgICB0b0luZGV4ID0gdG9JbmRleCB8fCB0aGlzLmNvdW50KCk7XG4gICAgZm9yICh2YXIgaSA9IGZyb21JbmRleDsgaSA8IHRvSW5kZXg7IGkrKykge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5fbGlzdEl0ZW1zW2ldO1xuICAgICAgICBpZiAoY29tcG9uZW50KVxuICAgICAgICAgICAgY29tcG9uZW50Lml0ZW0uc2V0SW5kZXgoaSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdMaXN0OiBubyBpdGVtIGF0IHBvc2l0aW9uJywgaSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIExpc3QkYWRkSXRlbXMoY291bnQsIGluZGV4KSB7IC8vICwuLi4gaXRlbXMgZGF0YVxuICAgIHZhciBpdGVtc0RhdGEgPSBfLnNsaWNlKGFyZ3VtZW50cywgMik7XG4gICAgaWYgKGl0ZW1zRGF0YS5sZW5ndGggPCBjb3VudCkgXG4gICAgICAgIGl0ZW1zRGF0YS5jb25jYXQoXy5yZXBlYXQoY291bnQgLSBpdGVtc0RhdGEubGVuZ3RoLCB7fSkpO1xuICAgIHZhciBzcGxpY2VBcmdzID0gW2luZGV4LCAwXS5jb25jYXQoaXRlbXNEYXRhKTtcbiAgICB2YXIgZGF0YUZhY2V0ID0gdGhpcy5vd25lci5kYXRhO1xuICAgIGRhdGFGYWNldC5zcGxpY2UuYXBwbHkoZGF0YUZhY2V0LCBzcGxpY2VBcmdzKTtcbn1cblxuXG4vKipcbiAqIExpc3QgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBBZGRzIGEgZ2l2ZW4gbnVtYmVyIG9mIGl0ZW1zIHVzaW5nIHRlbXBsYXRlIHJlbmRlcmluZyByYXRoZXIgdGhhbiBhZGRpbmcgZWxlbWVudHMgb25lIGJ5IG9uZVxuICpcbiAqIEBwYXJhbSB7SW50ZWdlcn0gY291bnQgbnVtYmVyIG9mIGl0ZW1zIHRvIGFkZFxuICogQHBhcmFtIHtbSW50ZWdlcl19IGluZGV4IG9wdGlvbmFsIGluZGV4IG9mIGl0ZW0gYWZ0ZXIgd2hpY2ggdG8gYWRkXG4gKi9cbmZ1bmN0aW9uIExpc3QkX2FkZEl0ZW1zKGNvdW50LCBpbmRleCkge1xuICAgIGNoZWNrKGNvdW50LCBNYXRjaC5JbnRlZ2VyKTtcbiAgICBpZiAoY291bnQgPCAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgYWRkIG5lZ2F0aXZlIG51bWJlciBvZiBpdGVtcycpO1xuXG4gICAgaWYgKGNvdW50ID09IDApIHJldHVybjtcblxuICAgIHZhciBpdGVtc0hUTUwgPSB0aGlzLml0ZW1zVGVtcGxhdGUoe1xuICAgICAgICBjb21wb25lbnROYW1lOiBjb21wb25lbnROYW1lLFxuICAgICAgICBjb3VudDogY291bnRcbiAgICB9KTtcblxuICAgIHZhciB3cmFwRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB3cmFwRWwuaW5uZXJIVE1MID0gaXRlbXNIVE1MO1xuXG4gICAgbWlsb0JpbmRlcih3cmFwRWwsIHRoaXMub3duZXIuY29udGFpbmVyLnNjb3BlKTtcbiAgICB2YXIgY2hpbGRyZW4gPSBkb21VdGlscy5jaGlsZHJlbih3cmFwRWwpO1xuXG4gICAgaWYgKGNvdW50ICE9IGNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdudW1iZXIgb2YgaXRlbXMgYWRkZWQgaXMgZGlmZmVyZW50IGZyb20gcmVxdWVzdGVkJyk7XG5cbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHZhciBsaXN0TGVuZ3RoID0gdGhpcy5jb3VudCgpO1xuICAgICAgICB2YXIgc3BsaWNlSW5kZXggPSBpbmRleCA8IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGVvZiBpbmRleCA9PSAndW5kZWZpbmVkJyB8fCBpbmRleCA+IGxpc3RMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsaXN0TGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW5kZXg7XG5cbiAgICAgICAgdmFyIHByZXZDb21wb25lbnQgPSBzcGxpY2VJbmRleCA9PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5pdGVtU2FtcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fbGlzdEl0ZW1zW3NwbGljZUluZGV4IC0gMV07XG5cbiAgICAgICAgdmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICAgICwgbmV3Q29tcG9uZW50cyA9IFtdO1xuXG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZWwsIGkpIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KGVsKTtcbiAgICAgICAgICAgIGlmICghIGNvbXBvbmVudClcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdMaXN0OiBlbGVtZW50IGluIG5ldyBpdGVtcyBpcyBub3QgYSBjb21wb25lbnQnKTtcbiAgICAgICAgICAgIG5ld0NvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5fc2V0SXRlbShzcGxpY2VJbmRleCsrLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgZnJhZy5hcHBlbmRDaGlsZChlbCk7XG4gICAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIF91cGRhdGVJdGVtc0luZGV4ZXMuY2FsbCh0aGlzLCBzcGxpY2VJbmRleCk7XG5cbiAgICAgICAgaWYgKCFwcmV2Q29tcG9uZW50LmVsLnBhcmVudE5vZGUpXG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ2xpc3QgaXRlbSBzYW1wbGUgd2FzIHJlbW92ZWQgZnJvbSBET00sIHByb2JhYmx5IGNhdXNlZCBieSB3cm9uZyBkYXRhLiBSZXNldCBsaXN0IGRhdGEgd2l0aCBhcnJheScpO1xuXG4gICAgICAgIC8vIEFkZCBpdCB0byB0aGUgRE9NXG4gICAgICAgIHByZXZDb21wb25lbnQuZG9tLmluc2VydEFmdGVyKGZyYWcpO1xuXG4gICAgICAgIF8uZGVmZXJNZXRob2QobmV3Q29tcG9uZW50cywgJ2ZvckVhY2gnLCBmdW5jdGlvbihjb21wKSB7XG4gICAgICAgICAgICBjb21wLmJyb2FkY2FzdCgnc3RhdGVyZWFkeScpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBMaXN0IGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlXG4gKiBAcmV0dXJuIHtBcnJheVtPYmplY3RdfSBUaGUgc3BsaWNlZCBkYXRhXG4gKi9cbmZ1bmN0aW9uIExpc3QkcmVtb3ZlSXRlbShpbmRleCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyLmRhdGEuc3BsaWNlKGluZGV4LCAxKTtcbn1cblxuXG4vKipcbiAqIExpc3QgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBleHRyYWN0XG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBleHRyYWN0ZWQgaXRlbVxuICovXG5mdW5jdGlvbiBMaXN0JGV4dHJhY3RJdGVtKGluZGV4KSB7XG4gICAgdmFyIGl0ZW1Db21wID0gdGhpcy5fcmVtb3ZlSXRlbShpbmRleCwgZmFsc2UpO1xuICAgIHRoaXMuX3VwZGF0ZURhdGFQYXRocyhpbmRleCwgdGhpcy5jb3VudCgpKTtcbiAgICByZXR1cm4gaXRlbUNvbXA7XG59XG5cblxuLyoqXG4gKiBMaXN0IGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyBpdGVtLCByZXR1cm5zIHRoZSByZW1vdmVkIGl0ZW0gdGhhdCBpcyBkZXN0cm95ZWQgYnkgZGVmYXVsdC5cbiAqIFxuICogQHBhcmFtICB7TnVtYmVyfSBpbmRleCBpdGVtIGluZGV4XG4gKiBAcGFyYW0gIHtCb29sZWFufSBkb0Rlc3Ryb3lJdGVtIG9wdGlvbmFsIGZhbHNlIHRvIHByZXZlbnQgaXRlbSBkZXN0cnVjdGlvbiwgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIExpc3QkX3JlbW92ZUl0ZW0oaW5kZXgsIGRvRGVzdHJveUl0ZW0pIHtcbiAgICB2YXIgY29tcCA9IHRoaXMuaXRlbShpbmRleCk7XG5cbiAgICBpZiAoISBjb21wKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ2F0dGVtcHQgdG8gcmVtb3ZlIGxpc3QgaXRlbSB3aXRoIGlkIHRoYXQgZG9lcyBub3QgZXhpc3QnKTtcblxuICAgIHRoaXMuX2xpc3RJdGVtc1tpbmRleF0gPSB1bmRlZmluZWQ7XG4gICAgZGVsZXRlIHRoaXMuX2xpc3RJdGVtc0hhc2hbY29tcC5uYW1lXTtcbiAgICBpZiAoZG9EZXN0cm95SXRlbSAhPT0gZmFsc2UpIGNvbXAuZGVzdHJveSgpO1xuICAgIGVsc2Uge1xuICAgICAgICBjb21wLnJlbW92ZSgpO1xuICAgICAgICBjb21wLmRvbS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBfdXBkYXRlSXRlbXNJbmRleGVzLmNhbGwodGhpcywgaW5kZXgpO1xuXG4gICAgcmV0dXJuIGNvbXA7XG59XG5cblxuZnVuY3Rpb24gTGlzdCRyZXBsYWNlSXRlbShpbmRleCwgbmV3SXRlbSl7XG4gICAgdmFyIG9sZEl0ZW0gPSB0aGlzLml0ZW0oaW5kZXgpO1xuICAgIG9sZEl0ZW0uZG9tLmluc2VydEFmdGVyKG5ld0l0ZW0uZWwpO1xuICAgIHRoaXMuX3JlbW92ZUl0ZW0oaW5kZXgpO1xuICAgIHRoaXMuX3NldEl0ZW0oaW5kZXgsIG5ld0l0ZW0pO1xufVxuXG5cbi8vIFJldHVybnMgdGhlIHByZXZpb3VzIGl0ZW0gY29tcG9uZW50IGdpdmVuIGFuIGluZGV4XG5mdW5jdGlvbiBfaXRlbVByZXZpb3VzQ29tcG9uZW50KGluZGV4KSB7XG4gICAgd2hpbGUgKGluZGV4ID49IDAgJiYgISB0aGlzLl9saXN0SXRlbXNbaW5kZXhdKVxuICAgICAgICBpbmRleC0tO1xuXG4gICAgcmV0dXJuIGluZGV4ID49IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMuX2xpc3RJdGVtc1tpbmRleF1cbiAgICAgICAgICAgICAgICA6IHRoaXMuaXRlbVNhbXBsZTtcbn1cblxuXG4vLyB0b0luZGV4IGlzIG5vdCBpbmNsdWRlZFxuLy8gbm8gcmFuZ2UgY2hlY2tpbmcgaXMgbWFkZVxuZnVuY3Rpb24gTGlzdCRfdXBkYXRlRGF0YVBhdGhzKGZyb21JbmRleCwgdG9JbmRleCkge1xuICAgIGZvciAodmFyIGkgPSBmcm9tSW5kZXg7IGkgPCB0b0luZGV4OyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW0oaSk7XG4gICAgICAgIGlmIChpdGVtKVxuICAgICAgICAgICAgaXRlbS5kYXRhLl9wYXRoID0gJ1snICsgaSArICddJztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0RhdGE6IG5vIGl0ZW0gZm9yIGluZGV4Jywgaik7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTaW1pbGFyIHRvIGZvckVhY2ggbWV0aG9kIG9mIEFycmF5LCBpdGVyYXRlcyBlYWNoIG9mIHRoZSBjaGlsZCBpdGVtcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEFuIGl0ZXJhdG9yIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBlYWNoIGNoaWxkIGl0ZW0uXG4gKiBAcGFyYW0ge1t0eXBlXX0gICB0aGlzQXJnICBDb250ZXh0IHRvIHNldCBgdGhpc2AuXG4gKi9cbmZ1bmN0aW9uIExpc3QkZWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIHRoaXMuX2xpc3RJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgIGlmIChpdGVtKSBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBwYXNzZXMgaXRlbSwgaW5kZXggdG8gY2FsbGJhY2tcbiAgICAgICAgZWxzZSBsb2dnZXIud2FybignTGlzdCRlYWNoOiBpdGVtJywgaW5kZXgsICdpcyB1bmRlZmluZWQnKTtcbiAgICB9LCB0aGlzQXJnIHx8IHRoaXMpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBEZXN0cm95cyB0aGUgbGlzdFxuICovXG5mdW5jdGlvbiBMaXN0JGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuaXRlbVNhbXBsZSkgdGhpcy5pdGVtU2FtcGxlLmRlc3Ryb3kodHJ1ZSk7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTW9kZWwgPSBtaWxvQ29yZS5Nb2RlbFxuICAgICwgTWl4aW4gPSBtaWxvQ29yZS5jbGFzc2VzLk1peGluXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxuLy8gZ2VuZXJpYyBkcmFnIGhhbmRsZXIsIHNob3VsZCBiZSBvdmVycmlkZGVuXG52YXIgTW9kZWxGYWNldCA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdNb2RlbCcpO1xuXG5fLmV4dGVuZFByb3RvKE1vZGVsRmFjZXQsIHtcbiAgICBpbml0OiBNb2RlbEZhY2V0JGluaXQsXG4gICAgZ2V0U3RhdGU6IE1vZGVsRmFjZXQkZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IE1vZGVsRmFjZXQkc2V0U3RhdGUsXG4gICAgX2NyZWF0ZU1lc3NlbmdlcjogTW9kZWxGYWNldCRfY3JlYXRlTWVzc2VuZ2VyLFxuICAgIGRlc3Ryb3k6IE1vZGVsRmFjZXQkZGVzdHJveVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChNb2RlbEZhY2V0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNb2RlbEZhY2V0O1xuXG5cbi8qKlxuICogRXhwb3NlIE1vZGVsIGNsYXNzIG1ldGhvZHMgb24gTW9kZWxGYWNldFxuICovXG5Nb2RlbC51c2VXaXRoKE1vZGVsRmFjZXQsICdtJyk7XG5cblxuZnVuY3Rpb24gTW9kZWxGYWNldCRpbml0KCkge1xuICAgIHRoaXMubSA9IG5ldyBNb2RlbCh0aGlzLmNvbmZpZy5kYXRhLCB0aGlzKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIC8vIHRoaXMubS5wcm94eU1ldGhvZHModGhpcyk7IC8vIENyZWF0ZXMgbW9kZWwncyBtZXRob2RzIGRpcmVjdGx5IG9uIGZhY2V0XG59XG5cblxuLyoqXG4gKiBNb2RlbEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IGBDb21wb25lbnQucHJvdG90eXBlLmdldFN0YXRlYCB0byBnZXQgZmFjZXQncyBzdGF0ZVxuICogU2ltcGx5IHJldHVybnMgbW9kZWwgZGF0YVxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gTW9kZWxGYWNldCRnZXRTdGF0ZSgpIHtcbiAgICB2YXIgbW9kZWxWYWx1ZSA9IHRoaXMubS5nZXQoKTtcbiAgICBpZiAodHlwZW9mIG1vZGVsVmFsdWUgPT0gJ29iamVjdCcpXG4gICAgICAgIG1vZGVsVmFsdWUgPSBfLmRlZXBDbG9uZShtb2RlbFZhbHVlKTtcbiAgICByZXR1cm4geyBzdGF0ZTogbW9kZWxWYWx1ZSB9O1xufVxuXG5cbi8qKlxuICogTW9kZWxGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZWAgdG8gc2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFNpbXBseSBzZXRzIG1vZGVsIGRhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgZGF0YSB0byBzZXQgb24gZmFjZXQncyBtb2RlbFxuICovXG5mdW5jdGlvbiBNb2RlbEZhY2V0JHNldFN0YXRlKHN0YXRlKSB7XG4gICAgcmV0dXJuIHRoaXMubS5zZXQoc3RhdGUuc3RhdGUpO1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsRmFjZXQkX2NyZWF0ZU1lc3NlbmdlcigpIHsgLy8gQ2FsbGVkIGJ5IGluaGVyaXRlZCBpbml0XG4gICAgdGhpcy5fbWVzc2VuZ2VyID0gdGhpcy5tLl9tZXNzZW5nZXI7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxGYWNldCRkZXN0cm95KCkge1xuICAgIHRoaXMubS5kZXN0cm95KCk7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTW9kZWwgPSBtaWxvQ29yZS5Nb2RlbFxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbi8vIGdlbmVyaWMgZHJhZyBoYW5kbGVyLCBzaG91bGQgYmUgb3ZlcnJpZGRlblxudmFyIE9wdGlvbnMgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnT3B0aW9ucycpO1xuXG5fLmV4dGVuZFByb3RvKE9wdGlvbnMsIHtcbiAgICBpbml0OiBPcHRpb25zJGluaXQsXG4gICAgZGVzdHJveTogT3B0aW9ucyRkZXN0cm95LFxuICAgIF9jcmVhdGVNZXNzZW5nZXI6IE9wdGlvbnMkX2NyZWF0ZU1lc3NlbmdlclxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChPcHRpb25zKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPcHRpb25zO1xuXG5cbmZ1bmN0aW9uIE9wdGlvbnMkaW5pdCgpIHtcbiAgICB0aGlzLm0gPSBuZXcgTW9kZWwodGhpcy5jb25maWcub3B0aW9ucywgdGhpcyk7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLm0ucHJveHlNZXRob2RzKHRoaXMpOyAvLyBDcmVhdGVzIG1vZGVsJ3MgbWV0aG9kcyBkaXJlY3RseSBvbiBmYWNldFxufVxuXG5cbmZ1bmN0aW9uIE9wdGlvbnMkX2NyZWF0ZU1lc3NlbmdlcigpIHsgLy8gQ2FsbGVkIGJ5IGluaGVyaXRlZCBpbml0XG4gICAgdGhpcy5fbWVzc2VuZ2VyID0gdGhpcy5tLl9tZXNzZW5nZXI7XG59XG5cblxuZnVuY3Rpb24gT3B0aW9ucyRkZXN0cm95KCkge1xuICAgIHRoaXMubS5kZXN0cm95KCk7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZmFjZXRzLXRlbXBsYXRlXCI+PC9hPlxuLy8gIyMjdGVtcGxhdGUgZmFjZXRcblxuLy8gc2ltcGxpZmllcyByZW5kZXJpbmcgb2YgY29tcG9uZW50IGVsZW1lbnQgZnJvbSB0ZW1wbGF0ZS5cbi8vICAgQW55IHRlbXBsYXRpbmcgZW5naW5nIGNhbiBiZSB1c2VkIHRoYXQgc3VwcG9ydHMgdGVtcGxhdGUgY29tcGlsYXRpb25cbi8vICAgKG9yIHlvdSBjYW4gbW9jayB0aGlzIGNvbXBpbGF0aW9uIGVhc2lseSBieSBjcmVhdGluZyBjbG9zdXJlIHN0b3Jpbmdcbi8vICAgdGVtcGxhdGUgc3RyaW5nIGluIGNhc2UgeW91ciBlbmdpbmUgZG9lc24ndCBzdXBwb3J0IGNvbXBpbGF0aW9uKS5cbi8vICAgQnkgZGVmYXVsdCBtaWxvIHVzZXMgW2RvVF0oKSwgdGhlIG1vc3QgdmVyc2F0aWxlLCBjb25zY2lzZSBhbmQgYXQgdGhlXG4vLyAgIHNhbWUgdGltZSB0aGUgZmFzdGVzdCB0ZW1wbGF0aW5nIGVuZ2luZS5cbi8vICAgSWYgeW91IHVzZSBtaWxvIGluIGJyb3dzZXIsIGl0IGlzIHRoZSBwYXJ0IG9mIG1pbG8gYnVuZGxlIGFuZCBhdmFpbGFibGVcbi8vICAgYXMgZ2xvYmFsIHZhcmlhYmxlIGBkb1RgLlxuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIGJpbmRlciA9IHJlcXVpcmUoJy4uLy4uL2JpbmRlcicpO1xuXG5cbi8vIGRhdGEgbW9kZWwgY29ubmVjdGlvbiBmYWNldFxudmFyIFRlbXBsYXRlID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ1RlbXBsYXRlJyk7XG5cbl8uZXh0ZW5kUHJvdG8oVGVtcGxhdGUsIHtcbiAgICBpbml0OiBUZW1wbGF0ZSRpbml0LFxuICAgIHN0YXJ0OiBUZW1wbGF0ZSRzdGFydCxcbiAgICBzZXQ6IFRlbXBsYXRlJHNldCxcbiAgICBnZXRDb21waWxlZDogVGVtcGxhdGUkZ2V0Q29tcGlsZWQsXG4gICAgcmVuZGVyOiBUZW1wbGF0ZSRyZW5kZXIsXG4gICAgYmluZGVyOiBUZW1wbGF0ZSRiaW5kZXJcblxuICAgIC8vIF9yZWF0dGFjaDogX3JlYXR0YWNoRXZlbnRzT25FbGVtZW50Q2hhbmdlXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKFRlbXBsYXRlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBUZW1wbGF0ZTtcblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyB0ZW1wbGF0ZXMgYXJlIGludGVycG9sYXRlZCB3aXRoIGRlZmF1bHQgKGRvVCkgb3IgY29uZmlndXJlZCBlbmdpbmUgKHRoaXMuY29uZmlnLmNvbXBpbGUpXG4gICAgLy8gdW5sZXNzIHRoaXMuY29uZmlnLmludGVycG9sYXRlIGlzIGZhbHNlXG4gICAgdmFyIGNvbXBpbGUgPSB0aGlzLmNvbmZpZy5pbnRlcnBvbGF0ZSA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmNvbmZpZy5jb21waWxlIHx8IG1pbG8uY29uZmlnLnRlbXBsYXRlLmNvbXBpbGU7XG5cbiAgICB0aGlzLnNldCh0aGlzLmNvbmZpZy50ZW1wbGF0ZSB8fCAnJywgY29tcGlsZSwgdGhpcy5jb25maWcuY29tcGlsZU9wdGlvbnMpO1xufVxuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJHN0YXJ0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5zdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5hdXRvUmVuZGVyKSB7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5hdXRvQmluZGVyKVxuICAgICAgICAgICAgdGhpcy5iaW5kZXIoKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkZ2V0Q29tcGlsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlO1xufVxuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJHNldCh0ZW1wbGF0ZVN0ciwgY29tcGlsZSwgY29tcGlsZU9wdGlvbnMpIHtcbiAgICBjaGVjayh0ZW1wbGF0ZVN0ciwgTWF0Y2guT25lT2YoU3RyaW5nLCBGdW5jdGlvbikpO1xuICAgIGNoZWNrKGNvbXBpbGUsIE1hdGNoLk9wdGlvbmFsKEZ1bmN0aW9uKSk7XG5cbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlU3RyID09ICdmdW5jdGlvbicpXG4gICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdGVtcGxhdGVTdHI7XG4gICAgZWxzZSB7XG4gICAgICAgIHRoaXMuX3RlbXBsYXRlU3RyID0gdGVtcGxhdGVTdHI7XG4gICAgICAgIGlmIChjb21waWxlKVxuICAgICAgICAgICAgdGhpcy5fY29tcGlsZSA9IGNvbXBpbGU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbXBpbGUgPSB0aGlzLl9jb21waWxlO1xuXG4gICAgICAgIGlmIChjb21waWxlKVxuICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSBjb21waWxlKHRlbXBsYXRlU3RyLCBjb21waWxlT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkcmVuZGVyKGRhdGEpIHsgLy8gd2UgbmVlZCBkYXRhIG9ubHkgaWYgdXNlIHRlbXBsYXRpbmcgZW5naW5lXG4gICAgdGhpcy5vd25lci5lbC5pbm5lckhUTUwgPSB0aGlzLl90ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX3RlbXBsYXRlKGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fdGVtcGxhdGVTdHI7XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRiaW5kZXIoKSB7XG4gICAgaWYgKHRoaXMub3duZXIuY29udGFpbmVyKVxuICAgICAgICByZXR1cm4gdGhpcy5vd25lci5jb250YWluZXIuYmluZGVyKCk7XG4gICAgZWxzZVxuICAgICAgICBsb2dnZXIuZXJyb3IoJ1RlbXBsYXRlRmFjZXQ6IEJpbmRlciBjYWxsZWQgd2l0aG91dCBjb250YWluZXIgZmFjZXQuJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGlzIGRlc2lnbmVkIGZvciBjb21wb25lbnRzIHRvIGJlIGFibGUgdG8gcmVwcmVzZW50IG90aGVyIGNvbXBvbmVudHNcbiAqIElmIGEgW0NvbXBvbmVudF0oLi4vY19jbGFzcy5qcy5odG1sKSBoYXMgVHJhbnNmZXIgZmFjZXQsIHdoZW4gYENvbXBvbmVudC5nZXRTdGF0ZWAgaXMgY2FsbGVkIGZvciB0aGlzIGNvbXBvbmV0IGl0IHJldHVybnMgcHJldmlvdXNseSBzYXZlZCBkYXRhLCBwb3NzaWJseSBmcm9tIGFub3RoZXIgY29tcG9uZW50LlxuICogRm9yIGV4YW1wbGUsIGEgbGlzdCBvZiBkb2N1bWVudHMgY2FuIHVzZSB0aGlzIGZhY2V0IHNvIHRoYXQgZWFjaCBpdGVtIGluIHRoZSBsaXN0IGNhbiBzdG9yZSBhY3R1YWwgZG9jdW1lbnQgY29tcG9uZW50IG9uIGl0LlxuICovXG52YXIgVHJhbnNmZXIgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnVHJhbnNmZXInKTtcblxuXy5leHRlbmRQcm90byhUcmFuc2Zlciwge1xuICAgIGluaXQ6IFRyYW5zZmVyJGluaXQsXG4gICAgZ2V0U3RhdGU6IFRyYW5zZmVyJGdldFN0YXRlLFxuICAgIHNldFN0YXRlOiBUcmFuc2ZlciRzZXRTdGF0ZSxcbiAgICBzZXRBY3RpdmVTdGF0ZTogVHJhbnNmZXIkc2V0QWN0aXZlU3RhdGUsXG4gICAgc2V0U3RhdGVXaXRoS2V5OiBUcmFuc2ZlciRzZXRTdGF0ZVdpdGhLZXksXG4gICAgZ2V0U3RhdGVXaXRoS2V5OiBUcmFuc2ZlciRnZXRTdGF0ZVdpdGhLZXksXG4gICAgZ2V0Q29tcG9uZW50TWV0YTogVHJhbnNmZXIkZ2V0Q29tcG9uZW50TWV0YVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChUcmFuc2Zlcik7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmZXI7XG5cblxuZnVuY3Rpb24gVHJhbnNmZXIkaW5pdCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2FjdGl2ZVN0YXRlID0gJyc7XG4gICAgdGhpcy5fZGVmYXVsdEtleSA9ICcnO1xuICAgIHRoaXMuX3N0YXRlID0ge307XG59XG5cblxuLyoqXG4gKiBUcmFuc2ZlciBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdHJhbnNmZXIgc3RhdGUgZm9yIGNvbXBvbmVudC4gQ2FuIGJlIG9idGFpbmVkIGZyb20gYW5vdGhlciBjb21wb25lbnQgYnkgdXNpbmcgYENvbXBvbmVudC5nZXRTdGF0ZWBcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIFRyYW5zZmVyJGdldFN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZVt0aGlzLl9hY3RpdmVTdGF0ZV0gfHwgdGhpcy5fc3RhdGVbdGhpcy5fZGVmYXVsdEtleV07XG59XG5cblxuLyoqXG4gKiBUcmFuc2ZlciBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgdHJhbnNmZXIgc3RhdGUgZm9yIGNvbXBvbmVudC4gQ2FuIGJlIG9idGFpbmVkIGZyb20gYW5vdGhlciBjb21wb25lbnQgYnkgdXNpbmcgYENvbXBvbmVudC5nZXRTdGF0ZWBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqL1xuZnVuY3Rpb24gVHJhbnNmZXIkc2V0U3RhdGUoc3RhdGUpIHtcbiAgICB0aGlzLl9zdGF0ZVsnJ10gPSBzdGF0ZTtcbiAgICB0aGlzLnNldEFjdGl2ZVN0YXRlKCcnKTtcbn1cblxuLyoqXG4gKiBUcmFuc2ZlciBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgdGhlIGFjdGl2ZSBzdGF0ZSAodXNlZCBieSBnZXRTdGF0ZSlcbiAqIEBwYXJhbSB7W3R5cGVdfSBrZXkgW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBUcmFuc2ZlciRzZXRBY3RpdmVTdGF0ZShrZXkpIHtcbiAgICB0aGlzLl9hY3RpdmVTdGF0ZSA9IGtleTtcbn1cblxuLyoqXG4gKiBUcmFuc2ZlciBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgdHJhbnNmZXIgc3RhdGUgZm9yIGNvbXBvbmVudCB3aXRob3V0IGRlZmF1bHQga2V5LiBDYW4gYmUgb2J0YWluZWQgZnJvbSBhbm90aGVyIGNvbXBvbmVudCBieSB1c2luZyBgQ29tcG9uZW50LmdldFN0YXRlYFxuICogV2hlbiB0aGUgYWN0aXZlIHN0YXRlIGlzIHNldCB0byB0aGUgZXhwZWN0ZWQga2V5XG4gKiBAcGFyYW0ge1t0eXBlXX0ga2V5ICAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtIHtbdHlwZV19IHN0YXRlIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNEZWZhdWx0S2V5IChPcHRpb25hbClcbiAqL1xuZnVuY3Rpb24gVHJhbnNmZXIkc2V0U3RhdGVXaXRoS2V5KGtleSwgc3RhdGUsIGlzRGVmYXVsdEtleSkge1xuICAgIGlmICgha2V5KSB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zZmVyJHNldFN0YXRlV2l0aEtleTogbm8ga2V5Jyk7XG5cbiAgICBpZiAoaXNEZWZhdWx0S2V5KVxuICAgICAgICB0aGlzLl9kZWZhdWx0S2V5ID0ga2V5O1xuICAgIGVsc2VcbiAgICAgICAgdGhpcy5fZGVmYXVsdEtleSA9IHRoaXMuX2RlZmF1bHRLZXkgfHwga2V5O1xuXG4gICAgdGhpcy5fc3RhdGVba2V5XSA9IHN0YXRlO1xuICAgIHRoaXMuc2V0QWN0aXZlU3RhdGUoa2V5KTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2ZlciRnZXRTdGF0ZVdpdGhLZXkoa2V5KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgdGhpcy5fc3RhdGVba2V5XTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2ZlciRnZXRDb21wb25lbnRNZXRhKCkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21wTmFtZTogc3RhdGUgJiYgc3RhdGUuY29tcE5hbWUsXG4gICAgICAgIGNvbXBDbGFzczogc3RhdGUgJiYgc3RhdGUuY29tcENsYXNzXG4gICAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENsYXNzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi8uLi9hYnN0cmFjdC9yZWdpc3RyeScpXG4gICAgLCBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKTtcblxuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmZhY2V0c2BcbiAqIENvbXBvbmVudCBmYWNldHMgcmVnaXN0cnkuIEFuIGluc3RhbmNlIG9mIFtDbGFzc1JlZ2lzdHJ5XSguLi8uLi9hYnN0cmFjdC9yZWdpc3RyeS5qcy5odG1sKSBjbGFzcyB0aGF0IGlzIHVzZWQgYnkgbWlsbyB0byByZWdpc3RlciBhbmQgZmluZCBmYWNldHMuXG4gKi9cbiB2YXIgZmFjZXRzUmVnaXN0cnkgPSBuZXcgQ2xhc3NSZWdpc3RyeShDb21wb25lbnRGYWNldCk7XG5cblxuLy8gQWRkcyBjb21tb24gYW5jZXN0b3IgdG8gYWxsIGZhY2V0cyBvZiBjb21wb25lbnRzIHRvIHRoZSByZWdpc3RyeS5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChDb21wb25lbnRGYWNldCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjZXRzUmVnaXN0cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NfcmVnaXN0cnknKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5JylcbiAgICAsIGNvbXBvbmVudE5hbWUgPSByZXF1aXJlKCcuLi91dGlsL2NvbXBvbmVudF9uYW1lJylcbiAgICAsIFNjb3BlID0gcmVxdWlyZSgnLi9zY29wZScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcG9uZW50SW5mbztcblxuXG4vKipcbiAqIFNpbXBsZSBjbGFzcyB0byBob2xkIGluZm9ybWF0aW9uIGFsbG93aW5nIHRvIGNyZWF0ZS9jb3B5IGNvbXBvbmVudCB1c2luZyBbYENvbXBvbmVudC5jcmVhdGVgXSguL2NfY2xhc3MuanMuaHRtbCNjcmVhdGUpIGFuZCBbYENvbXBvbmVudC5jb3B5YF0oLi9jX2NsYXNzLmpzLmh0bWwjY29weSkuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSBzY29wZSBvYmplY3QgdGhlIGNvbXBvbmVudCBiZWxvZ3MgdG8sIHVzdWFsbHkgZWl0aGVyIHRvcCBsZXZlbCBzY29wZSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgb3IgYHNjb3BlYCBwcm9wZXJ0eSBvZiBbQ29udGFpbmVyXSguL2NfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldCBvZiBjb250YWluaW5nIGNvbXBvbmVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBET00gZWxlbWVudCB0aGUgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvXG4gKiBAcGFyYW0ge0JpbmRBdHRyaWJ1dGV9IGF0dHIgQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSB0aGF0IHRoZSBjb21wb25lbnQgd2FzIGNyZWF0ZWQgd2l0aFxuICogQHBhcmFtIHtCb29sZWFufSB0aHJvd09uRXJyb3JzIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtDb21wb25lbnRJbmZvfVxuICovXG5mdW5jdGlvbiBDb21wb25lbnRJbmZvKHNjb3BlLCBlbCwgYXR0ciwgdGhyb3dPbkVycm9ycykge1xuICAgIGF0dHIucGFyc2UoKS52YWxpZGF0ZSgpO1xuXG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLmF0dHIgPSBhdHRyO1xuICAgIHRoaXMubmFtZSA9IGF0dHIuY29tcE5hbWU7XG4gICAgdGhpcy5Db21wb25lbnRDbGFzcyA9IGdldENvbXBvbmVudENsYXNzKGF0dHIsIHRocm93T25FcnJvcnMpO1xuICAgIHRoaXMuZXh0cmFGYWNldHNDbGFzc2VzID0gZ2V0Q29tcG9uZW50RXh0cmFGYWNldHModGhpcy5Db21wb25lbnRDbGFzcywgYXR0ciwgdGhyb3dPbkVycm9ycyk7XG5cbiAgICBpZiAodGhpcy5Db21wb25lbnRDbGFzc1xuICAgICAgICAgICAgJiYgaGFzQ29udGFpbmVyRmFjZXQodGhpcy5Db21wb25lbnRDbGFzcywgdGhpcy5leHRyYUZhY2V0c0NsYXNzZXMpKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0ge307XG4gICAgfVxufVxuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudEluZm8gaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqIFxuICogLSBbZGVzdHJveV0oI0NvbXBvbmVudEluZm8kZGVzdHJveSlcbiAqIC0gW3JlbmFtZV0oI0NvbXBvbmVudEluZm8kcmVuYW1lKVxuICovXG5fLmV4dGVuZFByb3RvKENvbXBvbmVudEluZm8sIHtcbiAgICBkZXN0cm95OiBDb21wb25lbnRJbmZvJGRlc3Ryb3ksXG4gICAgcmVuYW1lOiBDb21wb25lbnRJbmZvJHJlbmFtZVxufSk7XG5cblxuLyoqXG4gKiBDb21wb25lbnRJbmZvIGluc3RhbmNlIG1ldGhvZFxuICogRGVzdHJveXMgQ29tcG9uZW50SW5mbyBieSByZW1vdmluZyB0aGUgcmVmZXJlbmNlcyB0byBET00gZWxlbWVudFxuICovXG5mdW5jdGlvbiBDb21wb25lbnRJbmZvJGRlc3Ryb3koKSB7XG4gICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgdGhpcy5hdHRyLmRlc3Ryb3koKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudEluZm8gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW5hbWVzIENvbXBvbmVudEluZm8gb2JqZWN0XG4gKlxuICogQHBhcmFtIHtbU3RyaW5nXX0gbmFtZSBvcHRpb25hbCBuZXcgY29tcG9uZW50IG5hbWUsIGdlbmVyYXRlZCBmcm9tIHRpbWVzdGFtcCBieSBkZWZhdWx0XG4gKiBAcGFyYW0ge1tCb29sZWFuXX0gcmVuYW1lSW5TY29wZSBvcHRpb25hbCBmYWxzZSB0byBub3QgcmVuYW1lIENvbXBvbmVudEluZm8gb2JqZWN0IGluIGl0cyBzY29wZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudEluZm8kcmVuYW1lKG5hbWUsIHJlbmFtZUluU2NvcGUpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBjb21wb25lbnROYW1lKCk7XG4gICAgU2NvcGUucmVuYW1lKHRoaXMsIG5hbWUsIHJlbmFtZUluU2NvcGUpO1xuICAgIHRoaXMuYXR0ci5jb21wTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5hdHRyLmRlY29yYXRlKCk7XG59XG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50Q2xhc3MoYXR0ciwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBDb21wb25lbnRDbGFzcyA9IGNvbXBvbmVudHNSZWdpc3RyeS5nZXQoYXR0ci5jb21wQ2xhc3MpO1xuICAgIGlmICghIENvbXBvbmVudENsYXNzKVxuICAgICAgICByZXBvcnRCaW5kZXJFcnJvcih0aHJvd09uRXJyb3JzLCAnY2xhc3MgJyArIGF0dHIuY29tcENsYXNzICsgJyBpcyBub3QgcmVnaXN0ZXJlZCcpO1xuICAgIHJldHVybiBDb21wb25lbnRDbGFzcztcbn1cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRFeHRyYUZhY2V0cyhDb21wb25lbnRDbGFzcywgYXR0ciwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBmYWNldHMgPSBhdHRyLmNvbXBGYWNldHNcbiAgICAgICAgLCBleHRyYUZhY2V0c0NsYXNzZXMgPSB7fTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGZhY2V0cykpXG4gICAgICAgIGZhY2V0cy5mb3JFYWNoKGZ1bmN0aW9uKGZjdE5hbWUpIHtcbiAgICAgICAgICAgIGZjdE5hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZjdE5hbWUpO1xuICAgICAgICAgICAgaWYgKENvbXBvbmVudENsYXNzLmhhc0ZhY2V0KGZjdE5hbWUpKVxuICAgICAgICAgICAgICAgIHJlcG9ydEJpbmRlckVycm9yKHRocm93T25FcnJvcnMsICdjbGFzcyAnICsgQ29tcG9uZW50Q2xhc3MubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgYWxyZWFkeSBoYXMgZmFjZXQgJyArIGZjdE5hbWUpO1xuICAgICAgICAgICAgaWYgKGV4dHJhRmFjZXRzQ2xhc3Nlc1tmY3ROYW1lXSlcbiAgICAgICAgICAgICAgICByZXBvcnRCaW5kZXJFcnJvcih0aHJvd09uRXJyb3JzLCAnY29tcG9uZW50ICcgKyBhdHRyLmNvbXBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBhbHJlYWR5IGhhcyBmYWNldCAnICsgZmN0TmFtZSk7XG4gICAgICAgICAgICB2YXIgRmFjZXRDbGFzcyA9IGZhY2V0c1JlZ2lzdHJ5LmdldChmY3ROYW1lKTtcbiAgICAgICAgICAgIGV4dHJhRmFjZXRzQ2xhc3Nlc1tmY3ROYW1lXSA9IEZhY2V0Q2xhc3M7XG4gICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGV4dHJhRmFjZXRzQ2xhc3Nlcztcbn1cblxuXG5mdW5jdGlvbiByZXBvcnRCaW5kZXJFcnJvcih0aHJvd09uRXJyb3JzLCBtZXNzYWdlKSB7XG4gICAgaWYgKHRocm93T25FcnJvcnMgPT09IGZhbHNlKVxuICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbXBvbmVudEluZm8gYmluZGVyIGVycm9yOicsIG1lc3NhZ2UpO1xuICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufTtcblxuXG5mdW5jdGlvbiBoYXNDb250YWluZXJGYWNldChDb21wb25lbnRDbGFzcywgZXh0cmFGYWNldHNDbGFzc2VzKSB7XG4gICAgcmV0dXJuIChDb21wb25lbnRDbGFzcy5oYXNGYWNldCgnY29udGFpbmVyJylcbiAgICAgICAgfHwgJ0NvbnRhaW5lcicgaW4gZXh0cmFGYWNldHNDbGFzc2VzXG4gICAgICAgIHx8IF8uc29tZUtleShleHRyYUZhY2V0c0NsYXNzZXMsIGZhY2V0UmVxdWlyZXNDb250YWluZXIpXG4gICAgICAgIHx8IGNsYXNzSGFzRmFjZXRUaGF0UmVxdWlyZXNDb250YWluZXIoKSk7XG5cbiAgICBmdW5jdGlvbiBjbGFzc0hhc0ZhY2V0VGhhdFJlcXVpcmVzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gKENvbXBvbmVudENsYXNzLnByb3RvdHlwZS5mYWNldHNDbGFzc2VzXG4gICAgICAgICAgICAmJiBfLnNvbWVLZXkoQ29tcG9uZW50Q2xhc3MucHJvdG90eXBlLmZhY2V0c0NsYXNzZXMsIGZhY2V0UmVxdWlyZXNDb250YWluZXIpKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZhY2V0UmVxdWlyZXNDb250YWluZXIoRmFjZXRDbGFzcykge1xuICAgICAgICByZXR1cm4gRmFjZXRDbGFzcy5yZXF1aXJlc0ZhY2V0KCdjb250YWluZXInKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDbGFzc1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vYWJzdHJhY3QvcmVnaXN0cnknKVxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9jX2NsYXNzJyk7XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuY29tcG9uZW50c2BcbiAqIEFuIGluc3RhbmNlIG9mIFtDbGFzc1JlZ2lzdHJ5XSguLi9hYnN0cmFjdC9yZWdpc3RyeS5qcy5odG1sKSBjbGFzcyB0aGF0IGlzIHVzZWQgYnkgbWlsbyB0byByZWdpc3RlciBhbmQgZmluZCBjb21wb25lbnRzLlxuICovXG52YXIgY29tcG9uZW50c1JlZ2lzdHJ5ID0gbmV3IENsYXNzUmVnaXN0cnkoQ29tcG9uZW50KTtcblxuLy8gYWRkIGNvbW1vbiBhbmNlc3RvciB0byBhbGwgY29tcG9uZW50cyB0byB0aGUgcmVnaXN0cnkuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKENvbXBvbmVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcG9uZW50c1JlZ2lzdHJ5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbnZhciBjb21wb25lbnRVdGlscyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGlzQ29tcG9uZW50OiBpc0NvbXBvbmVudCxcbiAgICBnZXRDb21wb25lbnQ6IGdldENvbXBvbmVudCxcbiAgICBnZXRDb250YWluaW5nQ29tcG9uZW50OiBnZXRDb250YWluaW5nQ29tcG9uZW50LFxuICAgIF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYzogX21ha2VDb21wb25lbnRDb25kaXRpb25GdW5jXG59O1xuXG5cbi8qKlxuICogaXNDb21wb25lbnRcbiAqXG4gKiBDaGVja3MgaWYgZWxlbWVudCBoYXMgYSBjb21wb25lbnQgYXR0YWNoZWQgdG8gaXQgYnlcbiAqIGNoZWNraW5nIHRoZSBwcmVzZW5jZSBvZiBwcm9wZXJ0eSBkaWZpbmVkIGluIG1pbG8uY29uZmlnXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBET00gZWxlbWVudFxuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSwgaWYgaXQgaGFzIG1pbG8gY29tcG9uZW50IGF0dGFjaGVkIHRvIGl0XG4gKi9cbmZ1bmN0aW9uIGlzQ29tcG9uZW50KGVsKSB7XG4gICAgcmV0dXJuIGVsLmhhc093blByb3BlcnR5KGNvbmZpZy5jb21wb25lbnRSZWYpO1xufVxuXG5cbi8qKlxuICogZ2V0Q29tcG9uZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBET00gZWxlbWVudFxuICogQHJldHVybiB7Q29tcG9uZW50fSBjb21wb25lbnQgYXR0YWNoZWQgdG8gZWxlbWVudFxuICovXG5mdW5jdGlvbiBnZXRDb21wb25lbnQoZWwpIHtcbiAgICByZXR1cm4gZWwgJiYgZWxbY29uZmlnLmNvbXBvbmVudFJlZl07XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGNvbXBvbmVudCB3aGljaCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQsXG4gKiBvcHRpb25hbGx5LCBvbmx5IGNvbXBvbmVudCB0aGF0IHBhc3NlcyBgY29uZGl0aW9uYCB0ZXN0IG9yIGNvbnRhaW5zIHNwZWNpZmllZCBmYWNldFxuICpcbiAqIFVubGVzcyBgcmV0dXJuQ3VycmVudGAgcGFyYW1ldGVyIGlzIGZhbHNlLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGNvbXBvbmVudCBvZiB0aGUgZWxlbWVudCAodHJ1ZSBieSBkZWZhdWx0KS5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgRE9NIEVsZW1lbnQgb3IgdGV4dCBOb2RlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJldHVybkN1cnJlbnQgb3B0aW9uYWwgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBvZiB0aGUgZWxlbWVudCBjYW4gYmUgcmV0dXJuZWQuIFRydWUgYnkgZGVmYXVsdCwgc2hvdWxkIGJlIGZhbHNlIHRvIHJldHVybiBvbmx5IGFuY2VzdG9ycy5cbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBjb25kaXRpb25PckZhY2V0IG9wdGlvbmFsIGNvbmRpdGlvbiB0aGF0IGNvbXBvbmVudCBzaG91bGQgcGFzcyAob3IgZmFjZXQgbmFtZSBpdCBzaG91bGQgY29udGFpbilcbiAqIEByZXR1cm4ge0NvbXBvbmVudH0gXG4gKi9cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdDb21wb25lbnQobm9kZSwgcmV0dXJuQ3VycmVudCwgY29uZGl0aW9uT3JGYWNldCkge1xuICAgIC8vIGNoZWNrKG5vZGUsIE5vZGUpOyAtIGNhbid0IGNoZWNrIHRpeXBlIGhlcmUgYXMgaXQgaXMgbW9zdCBsaWtlbHkgY29taW5nIGZyb20gYW5vdGhlciBmcmFtZVxuICAgIGNoZWNrKHJldHVybkN1cnJlbnQsIE1hdGNoLk9wdGlvbmFsKEJvb2xlYW4pKTtcbiAgICBjaGVjayhjb25kaXRpb25PckZhY2V0LCBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihGdW5jdGlvbiwgU3RyaW5nKSkpO1xuXG4gICAgdmFyIGNvbmRpdGlvbkZ1bmMgPSBfbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmMoY29uZGl0aW9uT3JGYWNldCk7XG5cbiAgICByZXR1cm4gX2dldENvbnRhaW5pbmdDb21wb25lbnQobm9kZSwgcmV0dXJuQ3VycmVudCwgY29uZGl0aW9uRnVuYyk7XG59XG5cblxuZnVuY3Rpb24gX21ha2VDb21wb25lbnRDb25kaXRpb25GdW5jKGNvbmRpdGlvbk9yRmFjZXQpIHtcbiAgICBpZiAodHlwZW9mIGNvbmRpdGlvbk9yRmFjZXQgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbk9yRmFjZXQ7XG4gICAgZWxzZSBpZiAodHlwZW9mIGNvbmRpdGlvbk9yRmFjZXQgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoY29uZGl0aW9uT3JGYWNldCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoY29tcCkge1xuICAgICAgICAgICByZXR1cm4gY29tcC5oYXNGYWNldChmYWNldE5hbWUpO1xuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbCwgcmV0dXJuQ3VycmVudCwgY29uZGl0aW9uRnVuYykge1xuICAgIC8vIFdoZXJlIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgYSBjb21wb25lbnQgaXQgc2hvdWxkIGJlIHJldHVybmVkXG4gICAgLy8gaWYgcmV0dXJuQ3VycmVudCBpcyB0cnVlIG9yIHVuZGVmaW5lZFxuICAgIGlmIChyZXR1cm5DdXJyZW50ICE9PSBmYWxzZSkge1xuICAgICAgICB2YXIgY29tcCA9IGdldENvbXBvbmVudChlbCk7XG4gICAgICAgIGlmIChjb21wICYmICghIGNvbmRpdGlvbkZ1bmMgfHwgY29uZGl0aW9uRnVuYyhjb21wKSkpXG4gICAgICAgICAgICByZXR1cm4gY29tcDtcbiAgICB9XG5cbiAgICAvLyBXaGVyZSB0aGVyZSBpcyBubyBwYXJlbnQgZWxlbWVudCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICAvLyBUaGUgcGFyZW50IGVsZW1lbnQgaXMgY2hlY2tlZCByZWN1cnNpdmVseVxuICAgIGlmIChlbC5wYXJlbnROb2RlKVxuICAgICAgICByZXR1cm4gX2dldENvbnRhaW5pbmdDb21wb25lbnQoZWwucGFyZW50Tm9kZSwgdHJ1ZSwgY29uZGl0aW9uRnVuYyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKTtcblxuXG52YXIgVmlldyA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnVmlldycsIFsnY29udGFpbmVyJ10pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKFZpZXcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZpZXc7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIGdldEVsZW1lbnREYXRhQWNjZXNzID0gcmVxdWlyZSgnLi9kZV9kYXRhJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlckFQSSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2VuZ2VyQVBJXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG4vLyBjbGFzcyB0byBoYW5kbGUgc3Vic2NyaWJ0aW9ucyB0byBjaGFuZ2VzIGluIERPTSBmb3IgVUkgKG1heWJlIGFsc28gY29udGVudCBlZGl0YWJsZSkgZWxlbWVudHNcblxuLyoqXG4gKiBBIGNsYXNzXG4gKi9cbnZhciBEYXRhTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJBUEksICdEYXRhTXNnQVBJJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhEYXRhTXNnQVBJLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgaW5pdDogRGF0YU1zZ0FQSSRpbml0LFxuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxuICAgIGZpbHRlclNvdXJjZU1lc3NhZ2U6IGZpbHRlclNvdXJjZU1lc3NhZ2UsXG4gICAgY3JlYXRlSW50ZXJuYWxEYXRhOiBjcmVhdGVJbnRlcm5hbERhdGEsXG5cbiAgICAvLyBjbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgdmFsdWU6IERhdGFNc2dBUEkkdmFsdWVcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFNc2dBUEk7XG5cblxuZnVuY3Rpb24gRGF0YU1zZ0FQSSRpbml0KGNvbXBvbmVudCkge1xuICAgIE1lc3NlbmdlckFQSS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgdGhpcy5lbERhdGEgPSBnZXRFbGVtZW50RGF0YUFjY2Vzcyhjb21wb25lbnQuZWwpO1xufVxuXG5cbi8vIGdldERvbUVsZW1lbnREYXRhVmFsdWVcbmZ1bmN0aW9uIERhdGFNc2dBUEkkdmFsdWUoKSB7IC8vIHZhbHVlIG1ldGhvZFxuICAgIHZhciBjb21wb25lbnRHZXR0ZXIgPSB0aGlzLmNvbXBvbmVudC5kYXRhLmNvbmZpZy5nZXQ7XG4gICAgdmFyIG5ld1ZhbHVlID0gdHlwZW9mIGNvbXBvbmVudEdldHRlciA9PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgICAgID8gY29tcG9uZW50R2V0dGVyLmNhbGwodGhpcy5jb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5lbERhdGEuZ2V0KHRoaXMuY29tcG9uZW50LmVsKTtcblxuICAgIHRoaXMuY29tcG9uZW50LmRhdGEuX3ZhbHVlID0gbmV3VmFsdWU7XG5cbiAgICByZXR1cm4gbmV3VmFsdWU7XG59XG5cblxuLy8gVE9ETzogdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHJlbGV2YW50IERPTSBldmVudCBkZXBlbmRlbnQgb24gZWxlbWVudCB0YWdcbi8vIENhbiBhbHNvIGltcGxlbWVudCBiZWZvcmVkYXRhY2hhbmdlZCBldmVudCB0byBhbGxvdyBwcmV2ZW50aW5nIHRoZSBjaGFuZ2Vcbi8vIHRyYW5zbGF0ZVRvRG9tRXZlbnRcbmZ1bmN0aW9uIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdmFyIGNvbXBvbmVudEV2ZW50ID0gdGhpcy5jb21wb25lbnQuZGF0YS5jb25maWcuZXZlbnQ7XG4gICAgdmFyIGV2ZW50ID0gY29tcG9uZW50RXZlbnQgfHwgdGhpcy5lbERhdGEuZXZlbnQodGhpcy5jb21wb25lbnQuZWwpO1xuXG4gICAgaWYgKG1lc3NhZ2UgPT0gJycgJiYgZXZlbnQpXG4gICAgICAgIHJldHVybiBldmVudDsgIC8vIHRoaXMudGFnRXZlbnQ7XG59XG5cblxuLy8gZmlsdGVyRGF0YU1lc3NhZ2VcbmZ1bmN0aW9uIGZpbHRlclNvdXJjZU1lc3NhZ2Uoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgZGF0YSkge1xuICAgIHJldHVybiBkYXRhLm5ld1ZhbHVlICE9IGRhdGEub2xkVmFsdWU7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxEYXRhKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmNvbXBvbmVudC5kYXRhLl92YWx1ZVxuICAgICAgICAsIG5ld1ZhbHVlID0gdGhpcy52YWx1ZSgpO1xuXG4gICAgdmFyIGludGVybmFsRGF0YSA9IHsgXG4gICAgICAgIHBhdGg6ICcnLFxuICAgICAgICB0eXBlOiAnY2hhbmdlZCcsXG4gICAgICAgIG9sZFZhbHVlOiBvbGRWYWx1ZSxcbiAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgfTtcbiAgICByZXR1cm4gaW50ZXJuYWxEYXRhO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxuLyoqXG4gKiBSZXR1cm5zIGRhdGEgYWNjZXNzIG1ldGhvZHMgYW5kIGV2ZW50cyBmb3IgZ2l2ZW4gRE9NIGVsZW1lbnQuXG4gKiBVc2VkIGJ5IFtEYXRhXSguLi9jX2ZhY2V0cy9EYXRhLmpzLmh0bWwpIGZhY2V0IGFuZCBieSBbRGF0YU1zZ0FQSV0oLi9kYXRhLmpzLmh0bWwpXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52YXIgZ2V0RWxlbWVudERhdGFBY2Nlc3MgPSBmdW5jdGlvbihlbCkge1xuICAgIHZhciB0YWdOYW1lID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICwgZWxEYXRhID0gZG9tRWxlbWVudHNEYXRhQWNjZXNzW3RhZ05hbWVdO1xuICAgIHJldHVybiBlbERhdGEgfHwgZG9tRWxlbWVudHNEYXRhQWNjZXNzLmJ5RGVmYXVsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRFbGVtZW50RGF0YUFjY2VzcztcblxuXG4vKipcbiAqIERhdGEgYWNjZXNzIG1ldGhvZHMgYW5kIGV2ZW50cyBmb3IgRE9NIGVsZW1lbnRzLlxuICovXG52YXIgZG9tRWxlbWVudHNEYXRhQWNjZXNzID0ge1xuICAgIGJ5RGVmYXVsdDoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgfSxcbiAgICAnZGl2Jzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsIC8vIGhhY2ssIHNob3VsZCBiZSBpbm5lckhUTUw/IHRvIG1ha2Ugd29yayB3aXRoIEVkaXRhYmxlIGZhY2V0XG4gICAgICAgIC8vIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAnc3Bhbic6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3AnOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICdpbnB1dCc6IHtcbiAgICAgICAgcHJvcGVydHk6IGlucHV0RGF0YVByb3BlcnR5LFxuICAgICAgICBldmVudDogaW5wdXRDaGFuZ2VFdmVudFxuICAgIH0sXG4gICAgJ3RleHRhcmVhJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ3ZhbHVlJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICdzZWxlY3QnOiB7XG4gICAgICAgIHByb3BlcnR5OiAndmFsdWUnLFxuICAgICAgICBldmVudDogJ2NoYW5nZSdcbiAgICB9LFxuICAgICdpbWcnOiB7XG4gICAgICAgIHByb3BlcnR5OiAnc3JjJ1xuICAgIH0sXG4gICAgJ2NhcHRpb24nOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICd0aGVhZCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3Rib2R5Jzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAndGZvb3QnOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9XG59O1xuXG5cbi8vIGNvbnZlcnQgc3RyaW5ncyB0byBmdW5jdGlvbnMgYW5kIGNyZWF0ZSBnZXRzZXQgbWV0aG9kc1xuXy5lYWNoS2V5KGRvbUVsZW1lbnRzRGF0YUFjY2VzcywgZnVuY3Rpb24odGFnSW5mbykge1xuICAgIHZhciBwcm9wZXJ0eSA9IHRhZ0luZm8ucHJvcGVydHlcbiAgICAgICAgLCBldmVudCA9IHRhZ0luZm8uZXZlbnQ7XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSAhPSAnZnVuY3Rpb24nKVxuICAgICAgICB0YWdJbmZvLnByb3BlcnR5ID0gZnVuY3Rpb24oKSB7IHJldHVybiBwcm9wZXJ0eTsgfTtcbiAgICB2YXIgcHJvcEZ1bmMgPSB0YWdJbmZvLnByb3BlcnR5O1xuICAgIGlmICh0eXBlb2YgZXZlbnQgIT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGFnSW5mby5ldmVudCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gZXZlbnQ7IH07XG4gICAgaWYgKCEgdGFnSW5mby5nZXQpXG4gICAgICAgIHRhZ0luZm8uZ2V0ID0gZnVuY3Rpb24oZWwpIHsgcmV0dXJuIGVsW3Byb3BGdW5jKGVsKV07IH1cbiAgICBpZiAoISB0YWdJbmZvLnNldClcbiAgICAgICAgdGFnSW5mby5zZXQgPSBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAoZWxbcHJvcEZ1bmMoZWwpXSA9IHR5cGVvZiB2YWx1ZSA9PSAndW5kZWZpbmVkJyA/ICcnIDogdmFsdWUpO1xuICAgICAgICB9XG59KTtcblxuXG4vKipcbiAqIFR5cGVzIG9mIGlucHV0IGVsZW1lbnRzXG4gKi9cbnZhciBpbnB1dEVsZW1lbnRUeXBlcyA9IHtcbiAgICBieURlZmF1bHQ6IHtcbiAgICAgICAgcHJvcGVydHk6ICd2YWx1ZScsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAnY2hlY2tib3gnOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY2hlY2tlZCcsXG4gICAgICAgIGV2ZW50OiAnY2hhbmdlJ1xuICAgIH0sXG4gICAgJ3JhZGlvJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2NoZWNrZWQnLFxuICAgICAgICBldmVudDogJ2NoYW5nZSdcbiAgICB9LFxuICAgICd0ZXh0Jzoge1xuICAgICAgICBwcm9wZXJ0eTogJ3ZhbHVlJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9XG59XG5cblxuLyoqXG4gKiBSZXR1cm4gcHJvcGVydHkgb2YgaW5wdXQgZWxlbWVudCB0byBnZXQvc2V0IGl0cyBkYXRhXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBpbnB1dERhdGFQcm9wZXJ0eShlbCkge1xuICAgIHZhciBpbnB1dFR5cGUgPSBpbnB1dEVsZW1lbnRUeXBlc1tlbC50eXBlXTtcbiAgICByZXR1cm4gaW5wdXRUeXBlXG4gICAgICAgICAgICA/IGlucHV0VHlwZS5wcm9wZXJ0eVxuICAgICAgICAgICAgOiBpbnB1dEVsZW1lbnRUeXBlcy5ieURlZmF1bHQucHJvcGVydHk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIERPTSBldmVudCB0eXBlIHRvIGxpc3RlbiB0byB0byByZWFjdCB0byBpbnB1dCBlbGVtZW50IGNoYW5nZVxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaW5wdXRDaGFuZ2VFdmVudChlbCkge1xuICAgIHZhciBpbnB1dFR5cGUgPSBpbnB1dEVsZW1lbnRUeXBlc1tlbC50eXBlXTtcbiAgICByZXR1cm4gaW5wdXRUeXBlXG4gICAgICAgICAgICA/IGlucHV0VHlwZS5ldmVudFxuICAgICAgICAgICAgOiBpbnB1dEVsZW1lbnRUeXBlcy5ieURlZmF1bHQuZXZlbnQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIE1lc3NlbmdlckFQSSA9IHJlcXVpcmUoJ21pbG8tY29yZScpLmNsYXNzZXMuTWVzc2VuZ2VyQVBJO1xuXG5cbnZhciBEcm9wTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJBUEksICdEcm9wTXNnQVBJJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhEcm9wTXNnQVBJLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgZmlsdGVyU291cmNlTWVzc2FnZTogZmlsdGVyU291cmNlTWVzc2FnZSxcbn0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gRHJvcE1zZ0FQSTtcblxuXG52YXIgZHJvcEV2ZW50c01hcCA9IHtcbiAgICAnZHJhZ2luJzogJ2RyYWdlbnRlcicsXG4gICAgJ2RyYWdvdXQnOiAnZHJhZ2xlYXZlJ1xufTtcblxuXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiBkcm9wRXZlbnRzTWFwLmhhc093blByb3BlcnR5KG1lc3NhZ2UpXG4gICAgICAgICAgICA/IGRyb3BFdmVudHNNYXBbbWVzc2FnZV1cbiAgICAgICAgICAgIDogbWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gcmVzZXRGaWx0ZXJWYXJzKCkge1xuICAgIGRlbGV0ZSB0aGlzLl9jdXJyZW50VGFyZ2V0O1xuICAgIGRlbGV0ZSB0aGlzLl9pbnNpZGU7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclNvdXJjZU1lc3NhZ2Uoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgZGF0YSkgeyAvLyBkYXRhIGlzIERPTSBldmVudCBvYmplY3RcbiAgICB2YXIgb2sgPSB0cnVlO1xuXG4gICAgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ2RyYWdlbnRlcicgJiYgbWVzc2FnZSA9PSAnZHJhZ2luJykge1xuICAgICAgICB0aGlzLl9jdXJyZW50VGFyZ2V0ID0gZGF0YS50YXJnZXQ7XG4gICAgICAgIG9rID0gIXRoaXMuX2luc2lkZTtcbiAgICAgICAgdGhpcy5faW5zaWRlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ2RyYWdsZWF2ZScgJiYgbWVzc2FnZSA9PSAnZHJhZ291dCcpIHtcbiAgICAgICAgb2sgPSB0aGlzLl9jdXJyZW50VGFyZ2V0ID09IGRhdGEudGFyZ2V0O1xuICAgICAgICBpZiAob2spIHJlc2V0RmlsdGVyVmFycy5jYWxsKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoc291cmNlTWVzc2FnZSA9PSAnZHJvcCcpIHJlc2V0RmlsdGVyVmFycy5jYWxsKHRoaXMpO1xuXG4gICAgcmV0dXJuIG9rO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBET01FbWl0dGVyU291cmNlID0gcmVxdWlyZSgnLi4vLi4vc2VydmljZXMvZG9tX3NvdXJjZScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzYWdlU291cmNlID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzYWdlU291cmNlXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG52YXIgRE9NRXZlbnRzU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhET01FbWl0dGVyU291cmNlLCAnRE9NRXZlbnRzU291cmNlJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhET01FdmVudHNTb3VyY2UsIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGRlc3Ryb3k6IERPTUV2ZW50c1NvdXJjZSRkZXN0cm95LFxuICAgIGVtaXR0ZXI6IGVtaXR0ZXJcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERPTUV2ZW50c1NvdXJjZTtcblxuXG52YXIgdXNlQ2FwdHVyZVBhdHRlcm4gPSAvX19jYXB0dXJlJC9cbiAgICAsIHVzZUNhcHR1cmVQb3N0Zml4ID0gJ19fY2FwdHVyZSc7XG5cblxuLy8gaW5pdCBET00gZXZlbnQgc291cmNlXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJT3JDbGFzcywgY29tcG9uZW50KSB7XG4gICAgY2hlY2soY29tcG9uZW50LCBDb21wb25lbnQpO1xuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBET01FdmVudHNTb3VyY2UkZGVzdHJveSgpIHtcbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgZGVsZXRlIHRoaXMuY29tcG9uZW50O1xufVxuXG5cbi8vIGdldCBET00gZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LmVsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAjIyNjb21wb25lbnQgaWZyYW1lIHNvdXJjZVxuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzYWdlU291cmNlID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzYWdlU291cmNlXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cbnZhciBGcmFtZU1lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdGcmFtZU1lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKEZyYW1lTWVzc2FnZVNvdXJjZSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGluaXQ6IGluaXQsXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogYWRkU291cmNlU3Vic2NyaWJlcixcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHRyaWdnZXI6IHRyaWdnZXIsXG5cbiAgICAvL2NsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICBmcmFtZVdpbmRvdzogZnJhbWVXaW5kb3csXG4gICAgaGFuZGxlRXZlbnQ6IGhhbmRsZUV2ZW50ICAvLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBGcmFtZU1lc3NhZ2VTb3VyY2U7XG5cblxuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NlbmdlckFQSU9yQ2xhc3MsIGNvbXBvbmVudCkge1xuICAgIGNoZWNrKGNvbXBvbmVudCwgQ29tcG9uZW50KTtcbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcblxuICAgIGlmIChjb21wb25lbnQuZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9ICdpZnJhbWUnKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudCBmb3IgRnJhbWVNZXNzYWdlU291cmNlIGNhbiBvbmx5IGJlIGF0dGFjaGVkIHRvIGlmcmFtZSBlbGVtZW50Jyk7XG5cbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gZnJhbWVXaW5kb3coKSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LmVsLmNvbnRlbnRXaW5kb3c7XG59XG5cblxuLy8gYWRkSUZyYW1lTWVzc2FnZUxpc3RlbmVyXG5mdW5jdGlvbiBhZGRTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB2YXIgd2luID0gdGhpcy5mcmFtZVdpbmRvdygpO1xuICAgIGlmICh3aW4pIHdpbi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcywgZmFsc2UpO1xuICAgIGVsc2UgbG9nZ2VyLndhcm4oJ0ZyYW1lTWVzc2FnZVNvdXJjZTogZnJhbWUgd2luZG93IGlzIHVuZGVmaW5lZCcpO1xufVxuXG5cbi8vIHJlbW92ZUlGcmFtZU1lc3NhZ2VMaXN0ZW5lclxuZnVuY3Rpb24gcmVtb3ZlU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgdmFyIHdpbiA9IHRoaXMuZnJhbWVXaW5kb3coKTtcbiAgICBpZiAod2luKSB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMsIGZhbHNlKTtcbiAgICBlbHNlIGxvZ2dlci53YXJuKCdGcmFtZU1lc3NhZ2VTb3VyY2U6IGZyYW1lIHdpbmRvdyBpcyB1bmRlZmluZWQnKTtcbn1cblxuXG5mdW5jdGlvbiB0cmlnZ2VyKG1zZ1R5cGUsIGRhdGEpIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLnR5cGUgPSBtc2dUeXBlO1xuXG4gICAgdGhpcy5mcmFtZVdpbmRvdygpLnBvc3RNZXNzYWdlKGRhdGEsICcqJyk7XG59XG5cblxuLy8gVE9ETyBtYXliZSByZWZhY3RvciB0byBGcmFtZU1zZ0FQST9cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgdGhpcy5kaXNwYXRjaE1lc3NhZ2UoZXZlbnQuZGF0YS50eXBlLCBldmVudCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNvbXBvbmVudE5hbWUgPSByZXF1aXJlKCcuLi91dGlsL2NvbXBvbmVudF9uYW1lJylcbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cblxuLyoqXG4gKiBTY29wZSBjbGFzcy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsIHRoZSByb290IGVsZW1lbnQgb2YgdGhpcyBzY29wZVxuICogQHBhcmFtIHtPYmplY3R9IGhvc3RPYmplY3QgdGhlIGhvc3QgXG4gKiBAcmV0dXJuIHtTY29wZX1cbiAqL1xuZnVuY3Rpb24gU2NvcGUocm9vdEVsLCBob3N0T2JqZWN0KSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX3Jvb3RFbDogcm9vdEVsLFxuICAgICAgICBfaG9zdE9iamVjdDogaG9zdE9iamVjdFxuICAgIH0sIF8uV1JJVCk7IC8vIHdyaXRhYmxlXG59O1xuXG5fLmV4dGVuZFByb3RvKFNjb3BlLCB7XG4gICAgX2FkZDogU2NvcGUkX2FkZCxcbiAgICBfc2FmZUFkZDogU2NvcGUkX3NhZmVBZGQsXG4gICAgX2NvcHk6IFNjb3BlJF9jb3B5LFxuICAgIF9lYWNoOiBTY29wZSRfZWFjaCxcbiAgICBfbW92ZTogU2NvcGUkX21vdmUsXG4gICAgX21lcmdlOiBTY29wZSRfbWVyZ2UsXG4gICAgX2xlbmd0aDogU2NvcGUkX2xlbmd0aCxcbiAgICBfYW55OiBTY29wZSRfYW55LFxuICAgIF9yZW1vdmU6IFNjb3BlJF9yZW1vdmUsXG4gICAgX2NsZWFuOiBTY29wZSRfY2xlYW4sXG4gICAgX2RldGFjaEVsZW1lbnQ6IFNjb3BlJF9kZXRhY2hFbGVtZW50LFxuICAgIF9oYXM6IFNjb3BlJF9oYXMsXG4gICAgX2ZpbHRlcjogU2NvcGUkX2ZpbHRlclxufSk7XG5cblxuXy5leHRlbmQoU2NvcGUsIHtcbiAgICByZW5hbWU6IFNjb3BlJCRyZW5hbWVcbn0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU2NvcGU7XG5cblxudmFyIGFsbG93ZWROYW1lUGF0dGVybiA9IC9eW0EtWmEtel1bQS1aYS16MC05XFxfXFwkXSokLztcblxuXG4vKipcbiAqIFNjb3BlIGluc3RhbmNlIG1ldGhvZC5cbiAqIEFkZHMgb2JqZWN0IHRvIHRoZSBzY29wZSwgdGhyb3dpbmcgaWYgbmFtZSBpcyBub3QgdW5pcXVlXG4gKiBAcGFyYW0ge0NvbXBvbmVudHxDb21wb25lbnRJbmZvfSBvYmplY3QgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbmZvIHRvIGFkZCB0byB0aGUgc2NvcGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYWRkXG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9hZGQob2JqZWN0LCBuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09ICdzdHJpbmcnKVxuICAgICAgICBvYmplY3QubmFtZSA9IG5hbWU7XG4gICAgZWxzZVxuICAgICAgICBuYW1lID0gb2JqZWN0Lm5hbWU7XG4gICAgXG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkobmFtZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZHVwbGljYXRlIG9iamVjdCBuYW1lOiAnICsgbmFtZSk7XG5cbiAgICBjaGVja05hbWUobmFtZSk7XG4gICAgX19hZGQuY2FsbCh0aGlzLCBvYmplY3QsIG5hbWUpO1xufVxuXG5cbi8qKlxuICogU2NvcGUgaW5zdGFuY2UgbWV0aG9kXG4gKiBBZGRzIG9iamVjdCB0byBzY29wZSByZW5hbWluZyBpdCBpZiBuYW1lIGlzIG5vdCB1bmlxdWVcbiAqIEBwYXJhbSB7Q29tcG9uZW50fENvbXBvbmVudEluZm99IG9iamVjdCBjb21wb25lbnQgb3IgY29tcG9uZW50IGluZm8gdG8gYWRkIHRvIHRoZSBzY29wZVxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBhZGRcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX3NhZmVBZGQob2JqZWN0LCBuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09ICdzdHJpbmcnKVxuICAgICAgICBvYmplY3QubmFtZSA9IG5hbWU7XG4gICAgZWxzZVxuICAgICAgICBuYW1lID0gb2JqZWN0Lm5hbWU7XG5cbiAgICB2YXIgc2hvdWxkUmVuYW1lID0gdGhpcy5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgICBpZiAoc2hvdWxkUmVuYW1lKVxuICAgICAgICBsb2dnZXIuZXJyb3IoJ1Njb3BlOiBkdXBsaWNhdGUgb2JqZWN0IG5hbWU6ICcgKyBuYW1lKTtcbiAgICBlbHNlIHtcbiAgICAgICAgc2hvdWxkUmVuYW1lID0gISBhbGxvd2VkTmFtZVBhdHRlcm4udGVzdChuYW1lKTtcbiAgICAgICAgaWYgKHNob3VsZFJlbmFtZSlcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU2NvcGU6IG5hbWUgc2hvdWxkIHN0YXJ0IGZyb20gbGV0dGVyLCB0aGlzIG5hbWUgaXMgbm90IGFsbG93ZWQ6ICcgKyBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVuYW1lKSB7XG4gICAgICAgIG5hbWUgPSBjb21wb25lbnROYW1lKCk7XG4gICAgICAgIG9iamVjdC5uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICBfX2FkZC5jYWxsKHRoaXMsIG9iamVjdCwgbmFtZSk7XG59XG5cblxuZnVuY3Rpb24gX19hZGQob2JqZWN0LCBuYW1lKSB7XG4gICAgdGhpc1tuYW1lXSA9IG9iamVjdDtcbiAgICBvYmplY3Quc2NvcGUgPSB0aGlzO1xuXG4gICAgaWYgKHR5cGVvZiBvYmplY3QucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIG9iamVjdC5wb3N0TWVzc2FnZSgnYWRkZWR0b3Njb3BlJyk7IFxufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogY29waWVzIGFsbCBvYmplY3RzIGZyb20gb25lIHNjb3BlIHRvIGFub3RoZXIsXG4gKiB0aHJvd2luZyBpZiBzb21lIG9iamVjdCBpcyBub3QgdW5pcXVlXG4gKiBAcGFyYW0ge1Njb3BlfSBhU2NvcGUgdGhlIHNjb3BlIHRvIGNvcHlcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2NvcHkoYVNjb3BlKSB7XG4gICAgY2hlY2soYVNjb3BlLCBTY29wZSk7XG5cbiAgICBhU2NvcGUuX2VhY2goU2NvcGUkX2FkZCwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBNb3ZlcyBhIGNvbXBvbmVudCBmcm9tIHRoaXMgc2NvcGUgdG8gYW5vdGhlciBzY29wZS5cbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB0byBiZSBtb3ZlZFxuICogQHBhcmFtIHtTY29wZX0gb3RoZXJTY29wZSB0aGUgc2NvcGUgdG8gY29weSB0aGUgY29tcG9uZW50IHRvXG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9tb3ZlKGNvbXBvbmVudCwgb3RoZXJTY29wZSkge1xuICAgIG90aGVyU2NvcGUuX2FkZChjb21wb25lbnQpO1xuICAgIHRoaXMuX3JlbW92ZShjb21wb25lbnQubmFtZSk7XG4gICAgY29tcG9uZW50LnNjb3BlID0gb3RoZXJTY29wZTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIE1lcmdlcyBvbmUgc2NvcGUgaW50byB0aGlzIHNjb3BlXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSB0aGUgc2NvcGUgdG8gYWJzb3JiXG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9tZXJnZShzY29wZSkge1xuICAgIHNjb3BlLl9lYWNoKGZ1bmN0aW9uIChjb21wKSB7XG4gICAgICAgIHRoaXMuX2FkZChjb21wLCBjb21wLm5hbWUpO1xuICAgICAgICBzY29wZS5fcmVtb3ZlKGNvbXAubmFtZSk7XG4gICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBFbnVtZXJhdGVzIGVhY2ggY29tcG9uZW50IGluIHRoZSBzY29wZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggY29tcG9uZW50XG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyB0aGUgY29udGV4dFxuICovXG5mdW5jdGlvbiBTY29wZSRfZWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIF8uZWFjaEtleSh0aGlzLCBjYWxsYmFjaywgdGhpc0FyZyB8fCB0aGlzLCB0cnVlKTsgLy8gZW51bWVyYXRlcyBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seVxufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgY29tcG9uZW50cyBiYXNlZCBvbiBhIGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmb3IgZWFjaCBjb21wb25lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIHRoZSBjb250ZXh0XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2ZpbHRlcihjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIHJldHVybiBfLmZpbHRlcktleXModGhpcywgY2FsbGJhY2ssIHRoaXNBcmcgfHwgdGhpcywgdHJ1ZSk7XG59XG5cblxuLyoqXG4gKiBDaGVja3MgdGhlIHZhbGlkaXR5IG9mIGEgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIGNvbXBvbmVudFxuICovXG5mdW5jdGlvbiBjaGVja05hbWUobmFtZSkge1xuICAgIGlmICghIGFsbG93ZWROYW1lUGF0dGVybi50ZXN0KG5hbWUpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25hbWUgc2hvdWxkIHN0YXJ0IGZyb20gbGV0dGVyLCB0aGlzIG5hbWUgaXMgbm90IGFsbG93ZWQ6ICcgKyBuYW1lKTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBzY29wZVxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiBTY29wZSRfbGVuZ3RoKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKS5sZW5ndGg7XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBSZXR1cm5zIGEgY29tcG9uZW50IGZyb20gdGhlIHNjb3BlLiBJdCBtYXkgbG9vayBsaWtlIGl0IHJldHVybnMgdGhlIGZpcnN0IGNvbXBvbmVudFxuICogYnV0IGluIHJlYWxpdHkgZ2l2ZW4gdGhhdCBzY29wZXMgYXJlIGhhc2hlcywgdGhlcmUgaXMgbm8gc3VjaCB0aGluZy5cbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2FueSgpIHtcbiAgICB2YXIga2V5ID0gT2JqZWN0LmtleXModGhpcylbMF07XG4gICAgcmV0dXJuIGtleSAmJiB0aGlzW2tleV07XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBSZW1vdmVzIGEgY29tcG9uZW50IGZyb20gdGhlIHNjb3BlIGJ5IGl0J3MgbmFtZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gcmVtb3ZlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHF1aWV0IG9wdGlvbmFsIHRydWUgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcgbWVzc2FnZSBpZiB0aGUgY29tcG9uZW50IGlzIG5vdCBpbiBzY29wZVxuICovXG5mdW5jdGlvbiBTY29wZSRfcmVtb3ZlKG5hbWUsIHF1aWV0KSB7XG4gICAgaWYgKCEgKG5hbWUgaW4gdGhpcykpIHtcbiAgICAgICAgaWYgKCFxdWlldCkgbG9nZ2VyLndhcm4oJ3JlbW92aW5nIG9iamVjdCB0aGF0IGlzIG5vdCBpbiBzY29wZScpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG9iamVjdCA9IHRoaXNbbmFtZV07XG5cbiAgICBkZWxldGUgdGhpc1tuYW1lXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqZWN0LnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBvYmplY3QucG9zdE1lc3NhZ2UoJ3JlbW92ZWRmcm9tc2NvcGUnKTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIFJlbW92ZXMgYWxsIGNvbXBvbmVudHMgZnJvbSB0aGUgc2NvcGUuXG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9jbGVhbigpIHtcbiAgICB0aGlzLl9lYWNoKGZ1bmN0aW9uKG9iamVjdCwgbmFtZSkge1xuICAgICAgICBkZWxldGUgdGhpc1tuYW1lXS5zY29wZTtcbiAgICAgICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gICAgfSwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIFNjb3BlJF9kZXRhY2hFbGVtZW50KCkge1xuICAgIHRoaXMuX3Jvb3RFbCA9IG51bGw7XG59XG5cblxuLyoqXG4gKiBDaGVja3MgaWYgc2NvcGUgaGFzIG9iamVjdCBieSBvYmplY3QgbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2hhcyhvYmplY3QpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNPd25Qcm9wZXJ0eShvYmplY3QubmFtZSk7XG59XG5cblxuLyoqXG4gKiBDaGFuZ2Ugb2JqZWN0IG5hbWUsIHJlbmFtaW5nIGl0IGluIHNjb3BlIHVubGVzcyByZW5hbWVJblNjb3BlIGlzIGZhbHNlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBuZXcgbmFtZVxuICogQHBhcmFtIHtCb29sZWFufSByZW5hbWVJblNjb3BlIHRydWUgYnkgZGVmYXVsdFxuICovXG5mdW5jdGlvbiBTY29wZSQkcmVuYW1lKG9iaiwgbmFtZSwgcmVuYW1lSW5TY29wZSkge1xuICAgIGlmIChvYmouc2NvcGUgJiYgcmVuYW1lSW5TY29wZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgb2JqLnNjb3BlLl9yZW1vdmUob2JqLm5hbWUpO1xuICAgICAgICBvYmouc2NvcGUuX2FkZChvYmosIG5hbWUpO1xuICAgIH0gZWxzZVxuICAgICAgICBvYmoubmFtZSA9IG5hbWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbnZhciBNTEJ1dHRvbiA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxCdXR0b24nLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWJ1dHRvbidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEJ1dHRvbik7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxCdXR0b247XG5cbl8uZXh0ZW5kUHJvdG8oTUxCdXR0b24sIHtcbiAgICBkaXNhYmxlOiBNTEJ1dHRvbiRkaXNhYmxlLFxuICAgIGlzRGlzYWJsZWQ6IE1MQnV0dG9uJGlzRGlzYWJsZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MQnV0dG9uJGRpc2FibGUoZGlzYWJsZSkge1xuICAgIHRoaXMuZWwuZGlzYWJsZWQgPSBkaXNhYmxlO1xufVxuXG5mdW5jdGlvbiBNTEJ1dHRvbiRpc0Rpc2FibGVkKCkge1xuICAgIHJldHVybiAhIXRoaXMuZWwuZGlzYWJsZWQ7XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIENPTUJPX0NIQU5HRV9NRVNTQUdFID0gJ21sY29tYm9jaGFuZ2UnO1xuXG52YXIgREFUQUxJU1RfVEVNUExBVEUgPSAne3t+IGl0LmNvbWJvT3B0aW9ucyA6b3B0aW9uIH19IFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInt7PSBvcHRpb24ubGFiZWwgfX1cIj48L29wdGlvbj4gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICB7e359fSc7XG5cbnZhciBNTENvbWJvID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTENvbWJvJywge1xuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHtcbiAgICAgICAgZ2V0OiBNTENvbWJvX2dldCxcbiAgICAgICAgc2V0OiBNTENvbWJvX3NldCxcbiAgICAgICAgZGVsOiBNTENvbWJvX2RlbCxcbiAgICAgICAgc3BsaWNlOiB1bmRlZmluZWQsXG4gICAgICAgIGV2ZW50OiBDT01CT19DSEFOR0VfTUVTU0FHRVxuICAgIH0sXG4gICAgbW9kZWw6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICcqKionOiB7IHN1YnNjcmliZXI6IG9uT3B0aW9uc0NoYW5nZSwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1kYXRhbGlzdCdcbiAgICB9LFxuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkXG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTENvbWJvKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTENvbWJvO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxDb21ibywge1xuICAgIGluaXQ6IE1MQ29tYm8kaW5pdFxufSk7XG5cblxuZnVuY3Rpb24gTUxDb21ibyRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub24oJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xufVxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgJ19jb21ib0lucHV0JzogdGhpcy5jb250YWluZXIuc2NvcGUuaW5wdXQsXG4gICAgICAgICdfY29tYm9MaXN0JzogdGhpcy5jb250YWluZXIuc2NvcGUuZGF0YWxpc3RcbiAgICB9KTtcblxuICAgIHRoaXMuX2NvbWJvTGlzdC50ZW1wbGF0ZS5zZXQoREFUQUxJU1RfVEVNUExBVEUpO1xuXG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLm9uKCdpbnB1dCcsXG4gICAgICAgIHsgc3Vic2NyaWJlcjogZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlLCBjb250ZXh0OiB0aGlzIH0pO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvX2dldCgpIHtcbiAgICBpZiAoISB0aGlzLl9jb21ib0lucHV0KSByZXR1cm47XG4gICAgcmV0dXJuIHRoaXMuX2NvbWJvSW5wdXQuZGF0YS5nZXQoKTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib19zZXQodmFsdWUpIHtcbiAgICByZXR1cm4gY2hhbmdlQ29tYm9EYXRhLmNhbGwodGhpcywgJ3NldCcsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib19kZWwoKSB7XG4gICAgcmV0dXJuIGNoYW5nZUNvbWJvRGF0YS5jYWxsKHRoaXMsICdkZWwnLCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGNoYW5nZUNvbWJvRGF0YShtZXRob2QsIHZhbHVlKSB7XG4gICAgaWYgKCEgdGhpcy5fY29tYm9JbnB1dCkgcmV0dXJuO1xuICAgIHZhciByZXN1bHQgPSB0aGlzLl9jb21ib0lucHV0LmRhdGFbbWV0aG9kXSh2YWx1ZSk7XG4gICAgZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBQb3N0IHRoZSBkYXRhIGNoYW5nZVxuZnVuY3Rpb24gZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlKCkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoQ09NQk9fQ0hBTkdFX01FU1NBR0UpO1xufVxuXG5mdW5jdGlvbiBvbk9wdGlvbnNDaGFuZ2UobXNnLCBkYXRhKSB7XG4gICAgdGhpcy5fY29tYm9MaXN0LnRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgIGNvbWJvT3B0aW9uczogdGhpcy5tb2RlbC5nZXQoKVxuICAgIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxudmFyIENPTUJPX0xJU1RfQ0hBTkdFX01FU1NBR0UgPSAnbWxjb21ib2xpc3RjaGFuZ2UnO1xuXG5cbnZhciBNTENvbWJvTGlzdCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxDb21ib0xpc3QnLCB7XG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWNvbWJvLWxpc3QnXG4gICAgfSxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxDb21ib0xpc3RfZ2V0LFxuICAgICAgICBzZXQ6IE1MQ29tYm9MaXN0X3NldCxcbiAgICAgICAgZGVsOiBNTENvbWJvTGlzdF9kZWwsXG4gICAgICAgIGV2ZW50OiBDT01CT19MSVNUX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqKic6IHsgc3Vic2NyaWJlcjogb25JdGVtc0NoYW5nZSwgY29udGV4dDogJ293bmVyJ31cbiAgICAgICAgfVxuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICc8ZGl2IG1sLWJpbmQ9XCJNTFN1cGVyQ29tYm86Y29tYm9cIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgIDxkaXYgbWwtYmluZD1cIk1MTGlzdDpsaXN0XCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiTUxMaXN0SXRlbTppdGVtXCIgY2xhc3M9XCJsaXN0LWl0ZW1cIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbWwtYmluZD1cIltkYXRhXTpsYWJlbFwiPjwvc3Bhbj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbWwtYmluZD1cIltldmVudHNdOmRlbGV0ZUJ0blwiIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmVcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICA8L2Rpdj4nXG4gICAgfVxufSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTENvbWJvTGlzdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxDb21ib0xpc3Q7XG5cblxuXy5leHRlbmRQcm90byhNTENvbWJvTGlzdCwge1xuICAgIGluaXQ6IE1MQ29tYm9MaXN0JGluaXQsXG4gICAgc2V0T3B0aW9uczogTUxDb21ib0xpc3Qkc2V0T3B0aW9ucyxcbiAgICBzZXREYXRhVmFsaWRhdGlvbjogTUxDb21ib0xpc3Qkc2V0RGF0YVZhbGlkYXRpb24sXG4gICAgdG9nZ2xlQWRkQnV0dG9uOiBNTENvbWJvTGlzdCR0b2dnbGVBZGRCdXR0b24sXG4gICAgZGVzdHJveTogTUxDb21ib0xpc3QkZGVzdHJveSxcbiAgICBzZXRBZGRJdGVtUHJvbXB0OiBNTENvbWJvTGlzdCRzZXRBZGRJdGVtUHJvbXB0LFxuICAgIGNsZWFyQ29tYm9JbnB1dCA6IE1MQ29tYm9MaXN0JGNsZWFyQ29tYm9JbnB1dFxufSk7XG5cblxuZnVuY3Rpb24gTUxDb21ib0xpc3QkaW5pdCgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLl9kYXRhVmFsaWRhdGlvbiA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIHRoaXMubW9kZWwuc2V0KFtdKTtcbiAgICB0aGlzLm9uY2UoJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xufVxuXG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JHNldERhdGFWYWxpZGF0aW9uKGRhdGFWYWxpZGF0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhVmFsaWRhdGlvbiA9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aGlzLl9kYXRhVmFsaWRhdGlvbiA9IGRhdGFWYWxpZGF0aW9uO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdCRzZXRPcHRpb25zKGFycikge1xuICAgIHRoaXMuX2NvbWJvLnNldE9wdGlvbnMoYXJyKTtcbn1cblxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdCRjbGVhckNvbWJvSW5wdXQgKCkge1xuICAgIHRoaXMuX2NvbWJvLmNsZWFyQ29tYm9JbnB1dCgpO1xufVxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEhpZGVzIGFkZCBidXR0b25cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2hvd1xuICovXG5mdW5jdGlvbiBNTENvbWJvTGlzdCR0b2dnbGVBZGRCdXR0b24oc2hvdykge1xuICAgIHRoaXMuX2NvbWJvLnRvZ2dsZUFkZEJ1dHRvbihzaG93KTtcbn1cblxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdCRzZXRBZGRJdGVtUHJvbXB0KHByb21wdCkge1xuICAgdGhpcy5fY29tYm8uc2V0QWRkSXRlbVByb21wdChwcm9tcHQpO1xufVxuXG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JGRlc3Ryb3koKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5fY29ubmVjdG9yICYmIG1pbG8ubWluZGVyLmRlc3Ryb3lDb25uZWN0b3IodGhpcy5fY29ubmVjdG9yKTtcbiAgICB0aGlzLl9jb25uZWN0b3IgPSBudWxsO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcigpLmJpbmRlcigpO1xuICAgIGNvbXBvbmVudFNldHVwLmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIGNvbXBvbmVudFNldHVwKCkge1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICdfY29tYm8nOiB0aGlzLmNvbnRhaW5lci5zY29wZS5jb21ibyxcbiAgICAgICAgJ19saXN0JzogdGhpcy5jb250YWluZXIuc2NvcGUubGlzdFxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29ubmVjdG9yID0gbWlsby5taW5kZXIodGhpcy5fbGlzdC5tb2RlbCwgJzw8PC0+Pj4nLCB0aGlzLm1vZGVsKTtcbiAgICB0aGlzLl9jb21iby5kYXRhLm9uKCcnLCB7IHN1YnNjcmliZXI6IG9uQ29tYm9DaGFuZ2UsIGNvbnRleHQ6IHRoaXMgfSk7XG4gICAgdGhpcy5fY29tYm8ub24oJ2FkZGl0ZW0nLCB7IHN1YnNjcmliZXI6IG9uQWRkSXRlbSwgY29udGV4dDogdGhpcyB9KTtcbn1cblxuZnVuY3Rpb24gb25Db21ib0NoYW5nZShtc2csIGRhdGEpIHtcbiAgICBpZiAoZGF0YS5uZXdWYWx1ZSAmJiB0aGlzLl9kYXRhVmFsaWRhdGlvbihtc2csIGRhdGEsIHRoaXMuX2xpc3QubW9kZWwuZ2V0KCkpKVxuICAgICAgICB0aGlzLl9saXN0Lm1vZGVsLnB1c2goZGF0YS5uZXdWYWx1ZSk7XG4gICAgdGhpcy5fY29tYm8uZGF0YS5kZWwoKTtcbiAgICAvLyBiZWNhdXNlIG9mIHN1cGVyY29tYm8gbGlzdGVuZXJzIG9mZiB5b3UgaGF2ZSB0byBzZXQgX3ZhbHVlIGV4cGxpY2l0bHlcbiAgICB0aGlzLl9jb21iby5kYXRhLl92YWx1ZSA9ICcnO1xufVxuXG5mdW5jdGlvbiBvbkl0ZW1zQ2hhbmdlKG1zZywgZGF0YSkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoQ09NQk9fTElTVF9DSEFOR0VfTUVTU0FHRSk7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0X2dldCgpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLm1vZGVsLmdldCgpO1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgPyBfLmNsb25lKHZhbHVlKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdF9zZXQodmFsdWUpIHtcbiAgICB0aGlzLm1vZGVsLnNldCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0X2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5zZXQoW10pO1xufVxuXG5cbmZ1bmN0aW9uIG9uQWRkSXRlbShtc2csIGRhdGEpIHtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCdhZGRpdGVtJywgZGF0YSk7XG4gICAgdGhpcy5ldmVudHMucG9zdE1lc3NhZ2UoJ21pbG9fY29tYm9saXN0YWRkaXRlbScsIGRhdGEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxudmFyIE1MRGF0ZSA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxEYXRlJywge1xuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHtcbiAgICAgICAgZ2V0OiBNTERhdGVfZ2V0LFxuICAgICAgICBzZXQ6IE1MRGF0ZV9zZXQsXG4gICAgICAgIGRlbDogTUxEYXRlX2RlbCxcbiAgICB9LFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1kYXRlJ1xuICAgIH1cbn0pO1xuXG5fLmV4dGVuZFByb3RvKE1MRGF0ZSwge1xuICAgIGdldE1pbjogTUxEYXRlJGdldE1pbixcbiAgICBzZXRNaW46IE1MRGF0ZSRzZXRNaW4sXG4gICAgZ2V0TWF4OiBNTERhdGUkZ2V0TWF4LFxuICAgIHNldE1heDogTUxEYXRlJHNldE1heFxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxEYXRlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTERhdGU7XG5cblxuZnVuY3Rpb24gTUxEYXRlJGdldE1pbigpIHtcbiAgICByZXR1cm4gXy5kYXRlKHRoaXMuZWwubWluKTtcbn1cblxuXG5mdW5jdGlvbiBNTERhdGUkc2V0TWluKHZhbHVlKSB7XG4gICAgdmFyIGRhdGUgPSBfLnRvRGF0ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLmVsLm1pbiA9IGRhdGUgPyB0b0lTTzg2MDFGb3JtYXQoZGF0ZSkgOiAnJztcbn1cblxuXG5mdW5jdGlvbiBNTERhdGUkZ2V0TWF4KCkge1xuICAgIHJldHVybiBfLmRhdGUodGhpcy5lbC5tYXgpO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGF0ZSRzZXRNYXgodmFsdWUpIHtcbiAgICB2YXIgZGF0ZSA9IF8udG9EYXRlKHZhbHVlKTtcblxuICAgIHRoaXMuZWwubWF4ID0gZGF0ZSA/IHRvSVNPODYwMUZvcm1hdChkYXRlKSA6ICcnO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGF0ZV9nZXQoKSB7XG4gICAgcmV0dXJuIF8udG9EYXRlKHRoaXMuZWwudmFsdWUpO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGF0ZV9zZXQodmFsdWUpIHtcbiAgICB2YXIgZGF0ZSA9IF8udG9EYXRlKHZhbHVlKTtcblxuICAgIHRoaXMuZWwudmFsdWUgPSBkYXRlID8gdG9JU084NjAxRm9ybWF0KGRhdGUpIDogJyc7XG5cbiAgICBkaXNwYXRjaElucHV0TWVzc2FnZS5jYWxsKHRoaXMpO1xufVxuXG5mdW5jdGlvbiBNTERhdGVfZGVsKCkge1xuICAgIHRoaXMuZWwudmFsdWUgPSAnJztcblxuICAgIGRpc3BhdGNoSW5wdXRNZXNzYWdlLmNhbGwodGhpcyk7XG59XG5cblxuZnVuY3Rpb24gZGlzcGF0Y2hJbnB1dE1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZSgnaW5wdXQnKTsgLy8gRGlzcGF0Y2ggdGhlICdpbnB1dCcgKHVzdWFsbHkgZGlzcGF0Y2hlZCBieSB0aGUgdW5kZXJseWluZyA8aW5wdXQ+IGVsZW1lbnQpIGV2ZW50IHNvIHRoYXQgdGhlIGRhdGEgY2hhbmdlIGNhbiBiZSBsaXN0ZW5lZCB0b1xufVxuXG5cbmZ1bmN0aW9uIHRvSVNPODYwMUZvcm1hdChkYXRlKSB7XG4gICAgdmFyIGRhdGVBcnIgPSBbXG4gICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpLFxuICAgICAgICBwYWQoZGF0ZS5nZXREYXRlKCkpXG4gICAgXTtcblxuICAgIHZhciBkYXRlU3RyID0gZGF0ZUFyci5qb2luKCctJyk7XG5cbiAgICByZXR1cm4gZGF0ZVN0cjtcblxuICAgIGZ1bmN0aW9uIHBhZChuKSB7IHJldHVybiBuIDwgMTAgPyAnMCcgKyBuIDogbjsgfVxufSIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5Jyk7XG5cblxudmFyIE1MRHJvcFRhcmdldCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxEcm9wVGFyZ2V0JywgWydkcm9wJ10pO1xuXG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxEcm9wVGFyZ2V0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTERyb3BUYXJnZXQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkb1QgPSByZXF1aXJlKCdtaWxvLWNvcmUnKS51dGlsLmRvVFxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIHVuaXF1ZUlkID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91bmlxdWVfaWQnKTtcblxudmFyIFRSRUVfVEVNUExBVEUgPSAnPHVsIGNsYXNzPVwibWwtdWktZm9sZHRyZWUtbGlzdFwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7e34gaXQuZGF0YS5pdGVtcyA6aXRlbTppbmRleCB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdmFyIGhhc1N1YlRyZWUgPSBpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoOyB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIHt7PyBoYXNTdWJUcmVlIH19Y2xhc3M9XCJtbC11aS1mb2xkdHJlZS0taGFzLW11bHRpcGxlXCJ7ez99fT5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtdWktZm9sZHRyZWUtaXRlbVwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez8gaGFzU3ViVHJlZSB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLXVpLWZvbGR0cmVlLWJ1dHRvblwiPjwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez0gaXQuaXRlbVRlbXBsYXRlKHsgaXRlbTogaXRlbSwgaWQ6IGl0Lml0ZW1JRHNbaW5kZXhdIH0pIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGhhc1N1YlRyZWUgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s9IGl0LnRyZWVUZW1wbGF0ZShpdGVtKSB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7P319XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7e359fVxcXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+JztcblxudmFyIERFRkFVTFRfQ09NUElMRURfSVRFTV9URU1QTEFURSA9IGRvVC5jb21waWxlKCdcXFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC11aS1mb2xkdHJlZS1sYWJlbFwiIGRhdGEtaXRlbS1pZD1cInt7PSBpdC5pZCB9fVwiPlxcXG4gICAgICAgICAgICAgICAge3s9IGl0Lml0ZW0ubGFiZWwgfX1cXFxuICAgICAgICAgICAgPC9zcGFuPicpXG4gICAgLCBDT01QSUxFRF9UUkVFX1RFTVBMQVRFID0gZG9ULmNvbXBpbGUoVFJFRV9URU1QTEFURSk7XG5cblxudmFyIE1MRm9sZFRyZWUgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MRm9sZFRyZWUnLCB7XG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnY2xpY2sgZGJsY2xpY2snOiB7IHN1YnNjcmliZXI6IG9uSXRlbUV2ZW50LCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWZvbGR0cmVlLW1haW4nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxGb2xkVHJlZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxGb2xkVHJlZTtcblxuXy5leHRlbmRQcm90byhNTEZvbGRUcmVlLCB7XG4gICAgc2V0SXRlbVRlbXBsYXRlOiBNTEZvbGRUcmVlJHNldEl0ZW1UZW1wbGF0ZSxcbiAgICByZW5kZXJUcmVlOiBNTEZvbGRUcmVlJHJlbmRlclRyZWVcbn0pO1xuXG5mdW5jdGlvbiBmb2xkVW5mb2xkKGVsKSB7XG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnbWwtdWktZm9sZHRyZWUtLXVuZm9sZCcpO1xufVxuXG5mdW5jdGlvbiBpdGVtTWVzc2FnZShtc2csIGVsKSB7XG4gICAgdmFyIGlkID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWl0ZW0taWQnKVxuICAgICAgICAsIGl0ZW0gPSB0aGlzLl9pdGVtc01hcFtpZF07XG5cbiAgICB0aGlzLnBvc3RNZXNzYWdlKCdtbGZvbGR0cmVlXycgKyBtc2csIHtcbiAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgZWw6IGVsXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uSXRlbUV2ZW50KG1zZywgZSkge1xuICAgIHZhciBlbCA9IGUudGFyZ2V0O1xuICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ21sLXVpLWZvbGR0cmVlLWJ1dHRvbicpKVxuICAgICAgICBmb2xkVW5mb2xkKGVsLnBhcmVudE5vZGUucGFyZW50Tm9kZSk7XG4gICAgZWxzZSBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdtbC11aS1mb2xkdHJlZS1sYWJlbCcpKVxuICAgICAgICBpdGVtTWVzc2FnZS5jYWxsKHRoaXMsIG1zZywgZWwpO1xuICAgIGVsc2UgcmV0dXJuO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG59XG5cbmZ1bmN0aW9uIE1MRm9sZFRyZWUkc2V0SXRlbVRlbXBsYXRlICh0ZW1wbGF0ZVN0cikge1xuICAgIHRoaXMuX2l0ZW1UZW1wbGF0ZSA9IGRvVC5jb21waWxlKHRlbXBsYXRlU3RyKTtcbn1cblxuZnVuY3Rpb24gTUxGb2xkVHJlZSRyZW5kZXJUcmVlIChkYXRhKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgIHNlbGYuX2l0ZW1zTWFwID0ge307XG4gICAgdGhpcy5lbC5pbm5lckhUTUwgPSBfcmVuZGVyVHJlZShkYXRhKTtcblxuICAgIGZ1bmN0aW9uIF9yZW5kZXJUcmVlIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLml0ZW1zKVxuICAgICAgICAgICAgdmFyIGl0ZW1zSURzID0gXy5tYXAoZGF0YS5pdGVtcywgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBpZCA9IHVuaXF1ZUlkKCk7XG4gICAgICAgICAgICAgICAgc2VsZi5faXRlbXNNYXBbaWRdID0gaXRlbTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWQ7IFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIENPTVBJTEVEX1RSRUVfVEVNUExBVEUoe1xuICAgICAgICAgICAgaXRlbUlEczogaXRlbXNJRHMsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgaXRlbVRlbXBsYXRlOiBzZWxmLl9pdGVtVGVtcGxhdGUgfHwgREVGQVVMVF9DT01QSUxFRF9JVEVNX1RFTVBMQVRFLFxuICAgICAgICAgICAgdHJlZVRlbXBsYXRlOiBfcmVuZGVyVHJlZVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKTtcblxuXG52YXIgTUxHcm91cCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxHcm91cCcsIHtcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWdyb3VwJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MR3JvdXApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MR3JvdXA7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKTtcblxuXG52YXIgTUxIeXBlcmxpbmsgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MSHlwZXJsaW5rJywge1xuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktaHlwZXJsaW5rJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MSHlwZXJsaW5rKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEh5cGVybGluaztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIElNQUdFX0NIQU5HRV9NRVNTQUdFID0gJ21saW1hZ2VjaGFuZ2UnO1xuXG52YXIgTUxJbWFnZSA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxJbWFnZScsIHtcbiAgICBkYXRhOiB7XG4gICAgICAgIHNldDogTUxJbWFnZV9zZXQsXG4gICAgICAgIGdldDogTUxJbWFnZV9nZXQsXG4gICAgICAgIGRlbDogTUxJbWFnZV9kZWwsXG4gICAgICAgIHNwbGljZTogdW5kZWZpbmVkLFxuICAgICAgICBldmVudDogSU1BR0VfQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnLnNyYyc6IHsgc3Vic2NyaWJlcjogb25Nb2RlbENoYW5nZSwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICB0YWdOYW1lOiAnaW1nJyxcbiAgICAgICAgY2xzOiAnbWwtdWktaW1hZ2UnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxJbWFnZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxJbWFnZTtcblxuXG5fLmV4dGVuZFByb3RvKE1MSW1hZ2UsIHtcbiAgICBpbml0OiBNTEltYWdlJGluaXRcbn0pO1xuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbGl6ZSByYWRpbyBncm91cCBhbmQgc2V0dXBcbiAqL1xuZnVuY3Rpb24gTUxJbWFnZSRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogU2V0cyBpbWFnZSB2YWx1ZVxuICogUmVwbGFjZXMgdGhlIGRhdGEgc2V0IG9wZXJhdGlvbiB0byBkZWFsIHdpdGggcmFkaW8gYnV0dG9uc1xuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBzZXRcbiAqL1xuZnVuY3Rpb24gTUxJbWFnZV9zZXQodmFsdWUpIHtcbiAgICB0aGlzLm1vZGVsLnNldCh2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5cbi8qKlxuICogR2V0cyBncm91cCB2YWx1ZVxuICogUmV0cmlldmVzIHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGUgZ3JvdXBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIE1MSW1hZ2VfZ2V0KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KCk7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyA/IF8uY2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cblxuLyoqXG4gKiBEZWxldGVkIGdyb3VwIHZhbHVlXG4gKiBEZWxldGVzIHRoZSB2YWx1ZSBvZiB0aGUgZ3JvdXAsIHNldHRpbmcgaXQgdG8gZW1wdHlcbiAqL1xuZnVuY3Rpb24gTUxJbWFnZV9kZWwoKSB7XG4gICAgdGhpcy5tb2RlbC5kZWwoKTtcbn1cblxuXG4vLyBQb3N0IHRoZSBkYXRhIGNoYW5nZVxuZnVuY3Rpb24gZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlKCkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoSU1BR0VfQ0hBTkdFX01FU1NBR0UpO1xufVxuXG5cbmZ1bmN0aW9uIG9uTW9kZWxDaGFuZ2UocGF0aCwgZGF0YSkge1xuICAgIHRoaXMuZWwuc3JjID0gZGF0YS5uZXdWYWx1ZTtcbiAgICBkaXNwYXRjaENoYW5nZU1lc3NhZ2UuY2FsbCh0aGlzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIE1MSW5wdXQgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MSW5wdXQnLCB7XG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1pbnB1dCdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTElucHV0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTElucHV0O1xuXG5fLmV4dGVuZFByb3RvKE1MSW5wdXQsIHtcbiAgICBkaXNhYmxlOiBNTElucHV0JGRpc2FibGUsXG4gICAgaXNEaXNhYmxlZDogTUxJbnB1dCRpc0Rpc2FibGVkLFxuICAgIHNldE1heExlbmd0aDogTUxJbnB1dCRzZXRNYXhMZW5ndGhcbn0pO1xuXG5mdW5jdGlvbiBNTElucHV0JGRpc2FibGUoZGlzYWJsZSkge1xuICAgIHRoaXMuZWwuZGlzYWJsZWQgPSBkaXNhYmxlO1xufVxuXG5mdW5jdGlvbiBNTElucHV0JGlzRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5lbC5kaXNhYmxlZDtcbn1cblxuZnVuY3Rpb24gTUxJbnB1dCRzZXRNYXhMZW5ndGgobGVuZ3RoKSB7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ21heGxlbmd0aCcsIGxlbmd0aCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG52YXIgSU5QVVRfTElTVF9DSEFOR0VfTUVTU0FHRSA9ICdtbGlucHV0bGlzdGNoYW5nZSc7XG5cbnZhciBhc3luY0hhbmRsZXIgPSBmdW5jdGlvbiAodmFsdWUsIGNhbGxiYWNrKSB7Y2FsbGJhY2sodmFsdWUpO307XG5cbnZhciBNTElucHV0TGlzdCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxJbnB1dExpc3QnLCB7XG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWlucHV0LWxpc3QnXG4gICAgfSxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxJbnB1dExpc3RfZ2V0LFxuICAgICAgICBzZXQ6IE1MSW5wdXRMaXN0X3NldCxcbiAgICAgICAgZGVsOiBNTElucHV0TGlzdF9kZWwsXG4gICAgICAgIHNwbGljZTogTUxJbnB1dExpc3Rfc3BsaWNlLFxuICAgICAgICBldmVudDogSU5QVVRfTElTVF9DSEFOR0VfTUVTU0FHRVxuICAgIH0sXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgbW9kZWw6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICcqKionOiB7IHN1YnNjcmliZXI6IG9uSXRlbXNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJ1xcXG4gICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJNTExpc3Q6bGlzdFwiPlxcXG4gICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiTUxMaXN0SXRlbTppdGVtXCIgY2xhc3M9XCJsaXN0LWl0ZW1cIj5cXFxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBtbC1iaW5kPVwiW2RhdGFdOmxhYmVsXCI+PC9zcGFuPlxcXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCJbZXZlbnRzXTpkZWxldGVCdG5cIiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlXCI+PC9zcGFuPlxcXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgIDwvZGl2PlxcXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtbC1iaW5kPVwiTUxJbnB1dDppbnB1dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XFxcbiAgICAgICAgICAgIDxidXR0b24gbWwtYmluZD1cIk1MQnV0dG9uOmJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCI+XFxcbiAgICAgICAgICAgICAgICBBZGRcXFxuICAgICAgICAgICAgPC9idXR0b24+J1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MSW5wdXRMaXN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTElucHV0TGlzdDtcblxuXy5leHRlbmRQcm90byhNTElucHV0TGlzdCwge1xuICAgIGluaXQ6IE1MSW5wdXRMaXN0JGluaXQsXG4gICAgc2V0QXN5bmM6IE1MSW5wdXRMaXN0JHNldEFzeW5jLFxuICAgIHNldFBsYWNlSG9sZGVyOiBNTElucHV0TGlzdCRzZXRQbGFjZUhvbGRlcixcbiAgICBkZXN0cm95OiBNTElucHV0TGlzdCRkZXN0cm95XG59KTtcblxuZnVuY3Rpb24gTUxJbnB1dExpc3QkaW5pdCgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLm9uY2UoJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xuICAgIHRoaXMubW9kZWwuc2V0KFtdKTtcbn1cblxuZnVuY3Rpb24gb25DaGlsZHJlbkJvdW5kKCkge1xuICAgIHJlbmRlci5jYWxsKHRoaXMpO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdCRzZXRQbGFjZUhvbGRlcihwbGFjZUhvbGRlcikge1xuICAgIHRoaXMuX2lucHV0LmVsLnNldEF0dHJpYnV0ZSgncGxhY2VIb2xkZXInLCBwbGFjZUhvbGRlcik7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0JHNldEFzeW5jKG5ld0hhbmRsZXIpIHtcbiAgICBhc3luY0hhbmRsZXIgPSBuZXdIYW5kbGVyIHx8IGFzeW5jSGFuZGxlcjtcbn1cblxuZnVuY3Rpb24gTUxJbnB1dExpc3QkZGVzdHJveSgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLl9jb25uZWN0b3IgJiYgbWlsby5taW5kZXIuZGVzdHJveUNvbm5lY3Rvcih0aGlzLl9jb25uZWN0b3IpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcigpLmJpbmRlcigpO1xuICAgIGNvbXBvbmVudFNldHVwLmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIGNvbXBvbmVudFNldHVwKCkge1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICdfaW5wdXQnOiB0aGlzLmNvbnRhaW5lci5zY29wZS5pbnB1dCxcbiAgICAgICAgJ19idXR0b24nOiB0aGlzLmNvbnRhaW5lci5zY29wZS5idXR0b24sXG4gICAgICAgICdfbGlzdCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmxpc3RcbiAgICB9KTtcbiAgICB0aGlzLl9jb25uZWN0b3IgPSBtaWxvLm1pbmRlcih0aGlzLl9saXN0Lm1vZGVsLCAnPDw8LT4+PicsIHRoaXMubW9kZWwpO1xuICAgIHRoaXMuX2J1dHRvbi5ldmVudHMub24oJ2NsaWNrJywge3N1YnNjcmliZXI6IG9uQ2xpY2ssIGNvbnRleHQ6IHRoaXMgfSk7ICAgXG59XG5cbmZ1bmN0aW9uIG9uQ2xpY2sobXNnKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5faW5wdXQuZGF0YS5nZXQoMCk7XG4gICAgaWYgKHRoaXMuX2lucHV0LmRhdGEpXG4gICAgICAgIGFzeW5jSGFuZGxlcih2YWx1ZSwgZnVuY3Rpb24gKGxhYmVsLCB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fbGlzdC5tb2RlbC5wdXNoKHsgbGFiZWw6IGxhYmVsLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5faW5wdXQuZGF0YS5kZWwoKTtcbn1cblxuZnVuY3Rpb24gb25JdGVtc0NoYW5nZShtc2csIGRhdGEpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKElOUFVUX0xJU1RfQ0hBTkdFX01FU1NBR0UpO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9nZXQoKSB7XG4gICAgdmFyIG1vZGVsID0gdGhpcy5tb2RlbC5nZXQoKTtcbiAgICByZXR1cm4gbW9kZWwgPyBfLmNsb25lKG1vZGVsKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gTUxJbnB1dExpc3Rfc2V0KHZhbHVlKSB7XG4gICAgdGhpcy5tb2RlbC5zZXQodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuc2V0KFtdKTtcbn1cblxuZnVuY3Rpb24gTUxJbnB1dExpc3Rfc3BsaWNlKCkgeyAvLyAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5tb2RlbC5zcGxpY2UuYXBwbHkodGhpcy5tb2RlbCwgYXJndW1lbnRzKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG52YXIgTElTVF9DSEFOR0VfTUVTU0FHRSA9ICdtbGxpc3RjaGFuZ2UnXG4gICAgLCBERUxFVEVfQlVUVE9OX05BTUUgPSAnZGVsZXRlQnRuJztcblxuXG52YXIgTUxMaXN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTExpc3QnLCB7XG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWxpc3QnXG4gICAgfSxcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgbW9kZWw6IHVuZGVmaW5lZCxcbiAgICBsaXN0OiB1bmRlZmluZWRcbn0pO1xuXG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxMaXN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTExpc3Q7XG5cblxuXy5leHRlbmRQcm90byhNTExpc3QsIHtcbiAgICBpbml0OiBNTExpc3QkaW5pdCxcbiAgICBkZXN0cm95OiBNTExpc3QkZGVzdHJveSxcbiAgICByZW1vdmVJdGVtOiBNTExpc3QkcmVtb3ZlSXRlbSxcbiAgICBtb3ZlSXRlbTogTUxMaXN0JG1vdmVJdGVtXG59KTtcblxuXG5mdW5jdGlvbiBNTExpc3QkaW5pdCgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLm9uKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3QkZGVzdHJveSgpIHtcbiAgICB0aGlzLl9jb25uZWN0b3IgJiYgbWlsby5taW5kZXIuZGVzdHJveUNvbm5lY3Rvcih0aGlzLl9jb25uZWN0b3IpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG51bGw7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0JHJlbW92ZUl0ZW0oaW5kZXgpe1xuICAgIHRoaXMubW9kZWwuc3BsaWNlKGluZGV4LCAxKTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3QkbW92ZUl0ZW0oZnJvbSwgdG8pIHtcbiAgICB2YXIgc3BsaWNlZERhdGEgPSB0aGlzLm1vZGVsLnNwbGljZShmcm9tLCAxKTtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5zcGxpY2UodG8sIDAsIHNwbGljZWREYXRhWzBdKTtcbn1cblxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgdGhpcy5tb2RlbC5zZXQoW10pO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG1pbG8ubWluZGVyKHRoaXMubW9kZWwsICc8PDwtJywgdGhpcy5kYXRhKS5kZWZlckNoYW5nZU1vZGUoJzw8PC0+Pj4nKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgRHJhZ0Ryb3AgPSByZXF1aXJlKCcuLi8uLi91dGlsL2RyYWdkcm9wJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbnZhciBMSVNUSVRFTV9DSEFOR0VfTUVTU0FHRSA9ICdtbGxpc3RpdGVtY2hhbmdlJ1xuXG52YXIgTUxMaXN0SXRlbSA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxMaXN0SXRlbScsIHtcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBkb206IHVuZGVmaW5lZCxcbiAgICBkcmFnOiB7XG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIHBhcmFtczogZ2V0TWV0YURhdGFcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZHJvcDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJ2RyYWdlbnRlcic6IHsgc3Vic2NyaWJlcjogb25EcmFnSG92ZXIsIGNvbnRleHQ6ICdvd25lcicgfSxcbiAgICAgICAgICAgICdkcmFnb3Zlcic6IHsgc3Vic2NyaWJlcjogb25EcmFnSG92ZXIsIGNvbnRleHQ6ICdvd25lcicgfSxcbiAgICAgICAgICAgICdkcmFnbGVhdmUnOiB7IHN1YnNjcmliZXI6IG9uRHJhZ091dCwgY29udGV4dDogJ293bmVyJyB9LFxuICAgICAgICAgICAgJ2Ryb3AnOiB7IHN1YnNjcmliZXI6IG9uSXRlbURyb3AsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9LFxuICAgICAgICBhbGxvdzoge1xuICAgICAgICAgICAgY29tcG9uZW50czogaXNDb21wb25lbnRBbGxvd2VkXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgICAgZ2V0OiBNTExpc3RJdGVtX2dldCxcbiAgICAgICAgc2V0OiBNTExpc3RJdGVtX3NldCxcbiAgICAgICAgZGVsOiBNTExpc3RJdGVtX2RlbCxcbiAgICAgICAgZXZlbnQ6IExJU1RJVEVNX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBtb2RlbDogdW5kZWZpbmVkLFxuICAgIGl0ZW06IHVuZGVmaW5lZFxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxMaXN0SXRlbSk7XG5cbnZhciBNTExpc3RJdGVtID0gbW9kdWxlLmV4cG9ydHMgPSBNTExpc3RJdGVtO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxMaXN0SXRlbSwge1xuICAgIGluaXQ6IE1MTGlzdEl0ZW0kaW5pdCxcbiAgICBtb3ZlSXRlbTogTUxMaXN0SXRlbSRtb3ZlSXRlbSxcbiAgICByZW1vdmVJdGVtOiBNTExpc3RJdGVtJHJlbW92ZUl0ZW0sXG4gICAgaXNEcm9wQWxsb3dlZDogTUxMaXN0SXRlbSRpc0Ryb3BBbGxvd2VkXG59KTtcblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5vbignY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG59XG5cblxuZnVuY3Rpb24gb25DaGlsZHJlbkJvdW5kKCkge1xuICAgIHZhciBkZWxldGVCdG4gPSB0aGlzLmNvbnRhaW5lci5zY29wZS5kZWxldGVCdG47XG4gICAgZGVsZXRlQnRuICYmIGRlbGV0ZUJ0bi5ldmVudHMub24oJ2NsaWNrJywgeyBzdWJzY3JpYmVyOiB0aGlzLnJlbW92ZUl0ZW0sIGNvbnRleHQ6IHRoaXMgfSk7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbSRyZW1vdmVJdGVtKCkge1xuICAgIHRyeSB7IHZhciBsaXN0T3duZXIgPSB0aGlzLml0ZW0ubGlzdC5vd25lcjsgfSBjYXRjaChlKSB7fVxuICAgIGxpc3RPd25lciAmJiBsaXN0T3duZXIucmVtb3ZlSXRlbSh0aGlzLml0ZW0uaW5kZXgpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW0kbW92ZUl0ZW0oaW5kZXgpIHtcbiAgICB2YXIgbGlzdE93bmVyID0gdGhpcy5pdGVtLmxpc3Qub3duZXI7XG4gICAgbGlzdE93bmVyICYmIGxpc3RPd25lci5tb3ZlSXRlbSh0aGlzLml0ZW0uaW5kZXgsIGluZGV4KTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtJGlzRHJvcEFsbG93ZWQobWV0YSwgZHJhZ0Ryb3Ape1xuICAgIHJldHVybiBtZXRhLnBhcmFtcyAmJiBtZXRhLnBhcmFtcy5pbmRleCAmJiBtZXRhLmNvbXBDbGFzcyA9PSAnTUxMaXN0SXRlbSc7XG59XG5cblxuZnVuY3Rpb24gaXNDb21wb25lbnRBbGxvd2VkKCkge1xuICAgIHJldHVybiB0aGlzLmlzRHJvcEFsbG93ZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBvbkl0ZW1Ecm9wKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBvbkRyYWdPdXQuY2FsbCh0aGlzKTtcbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICAgIHZhciBtZXRhID0gZHQuZ2V0Q29tcG9uZW50TWV0YSgpO1xuICAgIHZhciBzdGF0ZSA9IGR0LmdldENvbXBvbmVudFN0YXRlKCk7XG4gICAgdmFyIGxpc3RPd25lciA9IHRoaXMuaXRlbS5saXN0Lm93bmVyO1xuICAgIHZhciBpbmRleCA9IG1ldGEucGFyYW1zICYmIG1ldGEucGFyYW1zLmluZGV4O1xuXG4gICAgbGlzdE93bmVyLm1vdmVJdGVtKCtpbmRleCwgdGhpcy5pdGVtLmluZGV4LCBzdGF0ZSk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnSG92ZXIoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIHRoaXMuZG9tLmFkZENzc0NsYXNzZXMoJ21sLWRyYWctb3ZlcicpO1xufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ091dChldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5kb20ucmVtb3ZlQ3NzQ2xhc3NlcygnbWwtZHJhZy1vdmVyJyk7XG59XG5cblxuZnVuY3Rpb24gZ2V0TWV0YURhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZXg6IHRoaXMuaXRlbS5pbmRleFxuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtX2dldCgpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLm1vZGVsLmdldCgpO1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgPyBfLmNsb25lKHZhbHVlKSA6IHZhbHVlO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW1fc2V0KHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JylcbiAgICAgICAgdGhpcy5kYXRhLl9zZXQodmFsdWUpO1xuICAgIHRoaXMubW9kZWwuc2V0KHZhbHVlKTtcbiAgICBfc2VuZENoYW5nZU1lc3NhZ2UuY2FsbCh0aGlzKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbV9kZWwoKSB7XG4gICAgdGhpcy5kYXRhLl9kZWwoKTtcbiAgICB0aGlzLm1vZGVsLmRlbCgpO1xuICAgIF9zZW5kQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpOyAgICBcbn1cblxuXG5mdW5jdGlvbiBfc2VuZENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShMSVNUSVRFTV9DSEFOR0VfTUVTU0FHRSk7XG59XG5cblxuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgdW5pcXVlSWQgPSByZXF1aXJlKCcuLi8uLi91dGlsL3VuaXF1ZV9pZCcpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIFJBRElPX0NIQU5HRV9NRVNTQUdFID0gJ21scmFkaW9ncm91cGNoYW5nZSdcbiAgICAsIEVMRU1FTlRfTkFNRV9QUk9QRVJUWSA9ICdfbWxSYWRpb0dyb3VwRWxlbWVudElEJ1xuICAgICwgRUxFTUVOVF9OQU1FX1BSRUZJWCA9ICdtbC1yYWRpby1ncm91cC0nO1xuXG52YXIgTUxSYWRpb0dyb3VwID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFJhZGlvR3JvdXAnLCB7XG4gICAgZGF0YToge1xuICAgICAgICBzZXQ6IE1MUmFkaW9Hcm91cF9zZXQsXG4gICAgICAgIGdldDogTUxSYWRpb0dyb3VwX2dldCxcbiAgICAgICAgZGVsOiBNTFJhZGlvR3JvdXBfZGVsLFxuICAgICAgICBzcGxpY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgZXZlbnQ6IFJBRElPX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqKic6IHsgc3Vic2NyaWJlcjogb25PcHRpb25zQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnY2xpY2snOiB7IHN1YnNjcmliZXI6IG9uR3JvdXBDbGljaywgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1yYWRpby1ncm91cCdcbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAne3t+IGl0LnJhZGlvT3B0aW9ucyA6b3B0aW9uIH19IFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyMjZGVmLmVsSUQ6e3s9IGl0LmVsZW1lbnROYW1lIH19LXt7PSBvcHRpb24udmFsdWUgfX0jfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwie3s9IGl0Ll9yZW5kZXJPcHRpb25zLm9wdGlvbkNzc0NsYXNzIHx8IFwiJyArIEVMRU1FTlRfTkFNRV9QUkVGSVggKyAnb3B0aW9uXCIgfX1cIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJ7eyMgZGVmLmVsSUQgfX1cIiB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cInt7PSBvcHRpb24udmFsdWUgfX1cIiBuYW1lPVwie3s9IGl0LmVsZW1lbnROYW1lIH19XCI+IFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInt7IyBkZWYuZWxJRCB9fVwiPnt7PSBvcHRpb24ubGFiZWwgfX08L2xhYmVsPiBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPiBcXFxuICAgICAgICAgICAgICAgICAgIHt7fn19J1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MUmFkaW9Hcm91cCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxSYWRpb0dyb3VwO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxSYWRpb0dyb3VwLCB7XG4gICAgaW5pdDogTUxSYWRpb0dyb3VwJGluaXQsXG4gICAgZGVzdHJveTogTUxSYWRpb0dyb3VwJGRlc3Ryb3ksXG4gICAgc2V0UmVuZGVyT3B0aW9uczogTUxSYWRpb0dyb3VwJHNldFJlbmRlck9wdGlvbnNcbn0pO1xuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbGl6ZSByYWRpbyBncm91cCBhbmQgc2V0dXBcbiAqL1xuZnVuY3Rpb24gTUxSYWRpb0dyb3VwJGluaXQoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX3JhZGlvTGlzdCcsIFtdLCBfLkNPTkYpO1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgRUxFTUVOVF9OQU1FX1BST1BFUlRZLCBFTEVNRU5UX05BTUVfUFJFRklYICsgdW5pcXVlSWQoKSk7XG4gICAgdGhpcy5fcmVuZGVyT3B0aW9ucyA9IHt9O1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIE1MUmFkaW9Hcm91cCRzZXRSZW5kZXJPcHRpb25zKG9wdGlvbnMpIHtcbiAgICB0aGlzLl9yZW5kZXJPcHRpb25zID0gb3B0aW9ucztcbn1cblxuXG4vKipcbiAqIFNldHMgZ3JvdXAgdmFsdWVcbiAqIFJlcGxhY2VzIHRoZSBkYXRhIHNldCBvcGVyYXRpb24gdG8gZGVhbCB3aXRoIHJhZGlvIGJ1dHRvbnNcbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgc2V0XG4gKi9cbmZ1bmN0aW9uIE1MUmFkaW9Hcm91cF9zZXQodmFsdWUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuX3JhZGlvTGlzdFxuICAgICAgICAsIHNldFJlc3VsdDtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgICAgICAgICByYWRpby5jaGVja2VkID0gcmFkaW8udmFsdWUgPT0gdmFsdWU7XG4gICAgICAgICAgICBpZiAocmFkaW8uY2hlY2tlZClcbiAgICAgICAgICAgICAgICBzZXRSZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIHNldFJlc3VsdDtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBHZXRzIGdyb3VwIHZhbHVlXG4gKiBSZXRyaWV2ZXMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBncm91cFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gTUxSYWRpb0dyb3VwX2dldCgpIHtcbiAgICB2YXIgY2hlY2tlZCA9IF8uZmluZCh0aGlzLl9yYWRpb0xpc3QsIGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgICAgIHJldHVybiByYWRpby5jaGVja2VkO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNoZWNrZWQgJiYgY2hlY2tlZC52YWx1ZSB8fCB1bmRlZmluZWQ7XG59XG5cblxuLyoqXG4gKiBEZWxldGVkIGdyb3VwIHZhbHVlXG4gKiBEZWxldGVzIHRoZSB2YWx1ZSBvZiB0aGUgZ3JvdXAsIHNldHRpbmcgaXQgdG8gZW1wdHlcbiAqL1xuZnVuY3Rpb24gTUxSYWRpb0dyb3VwX2RlbCgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuX3JhZGlvTGlzdDtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGgpXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbihyYWRpbykge1xuICAgICAgICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cblxuLyoqXG4gKiBNYW5hZ2UgcmFkaW8gY2hpbGRyZW4gY2xpY2tzXG4gKi9cbmZ1bmN0aW9uIG9uR3JvdXBDbGljayhldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldC50eXBlID09ICdyYWRpbycpXG4gICAgICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xufVxuXG4vLyBQb3N0IHRoZSBkYXRhIGNoYW5nZVxuZnVuY3Rpb24gZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlKCkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoUkFESU9fQ0hBTkdFX01FU1NBR0UpO1xufVxuXG5cbi8vIFNldCByYWRpbyBidXR0b24gY2hpbGRyZW4gb24gbW9kZWwgY2hhbmdlXG5mdW5jdGlvbiBvbk9wdGlvbnNDaGFuZ2UocGF0aCwgZGF0YSkge1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKHtcbiAgICAgICAgcmFkaW9PcHRpb25zOiB0aGlzLm1vZGVsLmdldCgpLFxuICAgICAgICBlbGVtZW50TmFtZTogdGhpc1tFTEVNRU5UX05BTUVfUFJPUEVSVFldLFxuICAgICAgICBfcmVuZGVyT3B0aW9uczogdGhpcy5fcmVuZGVyT3B0aW9uc1xuICAgIH0pO1xuXG4gICAgdmFyIHJhZGlvRWxzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwicmFkaW9cIl0nKVxuICAgICAgICAsIG9wdGlvbnMgPSBfLnRvQXJyYXkocmFkaW9FbHMpO1xuXG4gICAgdGhpcy5fcmFkaW9MaXN0Lmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fcmFkaW9MaXN0LnNwbGljZS5hcHBseSh0aGlzLl9yYWRpb0xpc3QsIFswLCAwXS5jb25jYXQob3B0aW9ucykpO1xufVxuXG5cbmZ1bmN0aW9uIE1MUmFkaW9Hcm91cCRkZXN0cm95KCkge1xuICAgIGRlbGV0ZSB0aGlzLl9yYWRpb0xpc3Q7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbnZhciBNTFNlbGVjdCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxTZWxlY3QnLCB7XG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXNlbGVjdCdcbiAgICB9LFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqJzogeyBzdWJzY3JpYmVyOiBvbk9wdGlvbnNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJ3t7fiBpdC5zZWxlY3RPcHRpb25zIDpvcHRpb24gfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7ez0gb3B0aW9uLnZhbHVlIH19XCIge3s/IG9wdGlvbi5zZWxlY3RlZCB9fXNlbGVjdGVke3s/fX0+e3s9IG9wdGlvbi5sYWJlbCB9fTwvb3B0aW9uPiBcXFxuICAgICAgICAgICAgICAgICAgIHt7fn19J1xuICAgIH1cbn0pO1xuXG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxTZWxlY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MU2VsZWN0O1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxTZWxlY3QsIHtcbiAgICBzZXRPcHRpb25zOiBNTFNlbGVjdCRzZXRPcHRpb25zLFxuICAgIGRpc2FibGU6IE1MU2VsZWN0JGRpc2FibGVcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MU2VsZWN0JHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgIC8vIFNldCBvcHRpb25zIHRlbXBvcmFyaWx5IGRpc2FibGVzIG1vZGVsIHN1YnNjcmlwdGlvbnMgKEFzIGEgd29ya2Fyb3VuZCBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzIHJlbGF0aW5nIHRvIG1vZGVsIHVwZGF0ZXMgLyB0ZW1wbGF0ZSByZS1yZW5kZXJpbmcpXG4gICAgdmFyIG1vZGVsQ2hhbmdlTGlzdGVuZXIgPSB7IGNvbnRleHQ6IHRoaXMsIHN1YnNjcmliZXI6IG9uT3B0aW9uc0NoYW5nZSB9O1xuXG4gICAgdGhpcy5tb2RlbC5vZmYoJyoqJywgbW9kZWxDaGFuZ2VMaXN0ZW5lcik7XG4gICAgdGhpcy5tb2RlbC5zZXQob3B0aW9ucyk7XG4gICAgdGhpcy5tb2RlbC5vbignKionLCBtb2RlbENoYW5nZUxpc3RlbmVyKTtcblxuICAgIG9uT3B0aW9uc0NoYW5nZS5jYWxsKHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIE1MU2VsZWN0JGRpc2FibGUoZGlzYWJsZSkge1xuICAgIHRoaXMuZWwuZGlzYWJsZWQgPSBkaXNhYmxlO1xufVxuXG5cbmZ1bmN0aW9uIG9uT3B0aW9uc0NoYW5nZShwYXRoLCBkYXRhKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXIoeyBzZWxlY3RPcHRpb25zOiB0aGlzLm1vZGVsLmdldCgpIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1MU3VwZXJDb21ib1xuICogQSBjb21ibyBzZWxlY3QgbGlzdCB3aXRoIGludGVsbGlnZW50IHNjcm9sbGluZyBvZiBzdXBlciBsYXJnZSBsaXN0cy5cbiAqL1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgZG9UID0gbWlsb0NvcmUudXRpbC5kb1RcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG52YXIgQ09NQk9fT1BFTiA9ICdtbC11aS1zdXBlcmNvbWJvLW9wZW4nO1xudmFyIENPTUJPX0NIQU5HRV9NRVNTQUdFID0gJ21sc3VwZXJjb21ib2NoYW5nZSc7XG5cbnZhciBPUFRJT05TX1RFTVBMQVRFID0gJ3t7fiBpdC5jb21ib09wdGlvbnMgOm9wdGlvbjppbmRleCB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB7ez8gb3B0aW9uLnNlbGVjdGVkfX1jbGFzcz1cInNlbGVjdGVkXCIge3s/fX1kYXRhLXZhbHVlPVwie3s9IGluZGV4IH19XCI+e3s9IG9wdGlvbi5sYWJlbCB9fTwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7e359fSc7XG5cbnZhciBNQVhfUkVOREVSRUQgPSAxMDA7XG52YXIgQlVGRkVSID0gMjU7XG52YXIgREVGQVVMVF9FTEVNRU5UX0hFSUdIVCA9IDIwO1xuXG52YXIgTUxTdXBlckNvbWJvID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFN1cGVyQ29tYm8nLCB7XG4gICAgZXZlbnRzOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnbW91c2VsZWF2ZSc6IHtzdWJzY3JpYmVyOiBvbk1vdXNlTGVhdmUsIGNvbnRleHQ6ICdvd25lcid9LFxuICAgICAgICAgICAgJ21vdXNlb3Zlcic6IHtzdWJzY3JpYmVyOiBvbk1vdXNlT3ZlciwgY29udGV4dDogJ293bmVyJ31cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MU3VwZXJDb21ib19nZXQsXG4gICAgICAgIHNldDogTUxTdXBlckNvbWJvX3NldCxcbiAgICAgICAgZGVsOiBNTFN1cGVyQ29tYm9fZGVsLFxuICAgICAgICBzcGxpY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgZXZlbnQ6IENPTUJPX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktc3VwZXJjb21ibydcbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnPGlucHV0IG1sLWJpbmQ9XCJbZGF0YSwgZXZlbnRzXTppbnB1dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1sLXVpLWlucHV0XCI+XFxcbiAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tXTphZGRJdGVtRGl2XCIgY2xhc3M9XCJtbC11aS1zdXBlcmNvbWJvLWFkZFwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBtbC1iaW5kPVwiOmFkZFByb21wdFwiPjwvc3Bhbj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtbC1iaW5kPVwiW2V2ZW50cywgZG9tXTphZGRCdG5cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBtbC11aS1idXR0b25cIj5BZGQ8L2J1dHRvbj5cXFxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW2RvbSwgZXZlbnRzXTpsaXN0XCIgY2xhc3M9XCJtbC11aS1zdXBlcmNvbWJvLWRyb3Bkb3duXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW2RvbV06YmVmb3JlXCI+PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW3RlbXBsYXRlLCBkb20sIGV2ZW50c106b3B0aW9uc1wiIGNsYXNzPVwibWwtdWktc3VwZXJjb21iby1vcHRpb25zXCI+PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW2RvbV06YWZ0ZXJcIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgIDwvZGl2PidcbiAgICB9LFxuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkXG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFN1cGVyQ29tYm8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MU3VwZXJDb21ibztcblxuLyoqXG4gKiBQdWJsaWMgQXBpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTUxTdXBlckNvbWJvLCB7XG4gICAgaW5pdDogTUxTdXBlckNvbWJvJGluaXQsXG4gICAgc2hvd09wdGlvbnM6IE1MU3VwZXJDb21ibyRzaG93T3B0aW9ucyxcbiAgICBoaWRlT3B0aW9uczogTUxTdXBlckNvbWJvJGhpZGVPcHRpb25zLFxuICAgIHRvZ2dsZU9wdGlvbnM6IE1MU3VwZXJDb21ibyR0b2dnbGVPcHRpb25zLFxuICAgIHNldE9wdGlvbnM6IE1MU3VwZXJDb21ibyRzZXRPcHRpb25zLFxuICAgIGluaXRPcHRpb25zVVJMOiBNTFN1cGVyQ29tYm8kaW5pdE9wdGlvbnNVUkwsXG4gICAgc2V0RmlsdGVyZWRPcHRpb25zOiBNTFN1cGVyQ29tYm8kc2V0RmlsdGVyZWRPcHRpb25zLFxuICAgIHVwZGF0ZTogTUxTdXBlckNvbWJvJHVwZGF0ZSxcbiAgICB0b2dnbGVBZGRCdXR0b246IE1MU3VwZXJDb21ibyR0b2dnbGVBZGRCdXR0b24sXG4gICAgc2V0QWRkSXRlbVByb21wdDogTUxTdXBlckNvbWJvJHNldEFkZEl0ZW1Qcm9tcHQsXG4gICAgY2xlYXJDb21ib0lucHV0OiBNTFN1cGVyQ29tYm9fZGVsXG59KTtcblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpc2UgdGhlIGNvbXBvbmVudCwgd2FpdCBmb3IgY2hpbGRyZW5ib3VuZCwgc2V0dXAgZW1wdHkgb3B0aW9ucyBhcnJheXMuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5vbmNlKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9vcHRpb25zRGF0YTogW10sXG4gICAgICAgIF9maWx0ZXJlZE9wdGlvbnNEYXRhOiBbXVxuICAgIH0sIF8uV1JJVCk7XG59XG5cbi8qKlxuICogSGFuZGxlciBmb3IgaW5pdCBjaGlsZHJlbmJvdW5kIGxpc3RlbmVyLiBSZW5kZXJzIHRlbXBsYXRlLlxuICovXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXIoKS5iaW5kZXIoKTtcbiAgICBjb21wb25lbnRTZXR1cC5jYWxsKHRoaXMpO1xufVxuXG5cbi8qKlxuICogRGVmaW5lIGluc3RhbmNlIHByb3BlcnRpZXMsIGdldCBzdWJjb21wb25lbnRzLCBjYWxsIHNldHVwIHN1Yi10YXNrc1xuICovXG5mdW5jdGlvbiBjb21wb25lbnRTZXR1cCgpIHtcbiAgICB2YXIgc2NvcGUgPSB0aGlzLmNvbnRhaW5lci5zY29wZTtcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9jb21ib0lucHV0OiBzY29wZS5pbnB1dCxcbiAgICAgICAgX2NvbWJvTGlzdDogc2NvcGUubGlzdCxcbiAgICAgICAgX2NvbWJvT3B0aW9uczogc2NvcGUub3B0aW9ucyxcbiAgICAgICAgX2NvbWJvQmVmb3JlOiBzY29wZS5iZWZvcmUsXG4gICAgICAgIF9jb21ib0FmdGVyOiBzY29wZS5hZnRlcixcbiAgICAgICAgX2NvbWJvQWRkSXRlbURpdjogc2NvcGUuYWRkSXRlbURpdixcbiAgICAgICAgX2NvbWJvQWRkUHJvbXB0OiBzY29wZS5hZGRQcm9tcHQsXG4gICAgICAgIF9jb21ib0FkZEJ0bjogc2NvcGUuYWRkQnRuLFxuICAgICAgICBfb3B0aW9uVGVtcGxhdGU6IGRvVC5jb21waWxlKE9QVElPTlNfVEVNUExBVEUpXG4gICAgfSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfc3RhcnRJbmRleDogMCxcbiAgICAgICAgX2VuZEluZGV4OiBNQVhfUkVOREVSRUQsXG4gICAgICAgIF9oaWRkZW46IGZhbHNlLFxuICAgICAgICBfZWxlbWVudEhlaWdodDogREVGQVVMVF9FTEVNRU5UX0hFSUdIVCxcbiAgICAgICAgX3RvdGFsOiAwLFxuICAgICAgICBfb3B0aW9uc0hlaWdodDogMjAwLFxuICAgICAgICBfbGFzdFNjcm9sbFBvczogMCxcbiAgICAgICAgX2N1cnJlbnRWYWx1ZTogbnVsbCxcbiAgICAgICAgX3NlbGVjdGVkOiBudWxsLFxuICAgICAgICBfaXNBZGRCdXR0b25TaG93bjogZmFsc2VcbiAgICB9LCBfLldSSVQpO1xuXG4gICAgLy8gQ29tcG9uZW50IFNldHVwXG4gICAgdGhpcy5kb20uc2V0U3R5bGVzKHsgcG9zaXRpb246ICdyZWxhdGl2ZScgfSk7XG4gICAgc2V0dXBDb21ib0xpc3QodGhpcy5fY29tYm9MaXN0LCB0aGlzLl9jb21ib09wdGlvbnMsIHRoaXMpO1xuICAgIHNldHVwQ29tYm9JbnB1dCh0aGlzLl9jb21ib0lucHV0LCB0aGlzKTtcbiAgICBzZXR1cENvbWJvQnRuKHRoaXMuX2NvbWJvQWRkQnRuLCB0aGlzKTtcblxuICAgIHRoaXMuZXZlbnRzLm9uKCdrZXlkb3duJywgeyBzdWJzY3JpYmVyOiBjaGFuZ2VTZWxlY3RlZCwgY29udGV4dDogdGhpcyB9KTtcbiAgICAvL3RoaXMuZXZlbnRzLm9uKCdtb3VzZWxlYXZlJywgeyBzdWJzY3JpYmVyOiBNTFN1cGVyQ29tYm8kaGlkZU9wdGlvbnMsIGNvbnRleHQ6IHRoaXMgfSk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2hvd3Mgb3IgaGlkZXMgb3B0aW9uIGxpc3QuXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBzaG93IHRydWUgdG8gc2hvdywgZmFsc2UgdG8gaGlkZVxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kdG9nZ2xlT3B0aW9ucyhzaG93KSB7XG4gICAgdGhpcy5faGlkZGVuID0gIXNob3c7XG4gICAgdGhpcy5fY29tYm9MaXN0LmRvbS50b2dnbGUoc2hvdyk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2hvd3Mgb3B0aW9ucyBsaXN0XG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRzaG93T3B0aW9ucygpIHtcbiAgICB0aGlzLl9oaWRkZW4gPSBmYWxzZTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoQ09NQk9fT1BFTik7XG4gICAgdGhpcy5fY29tYm9MaXN0LmRvbS50b2dnbGUodHJ1ZSk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSGlkZXMgb3B0aW9ucyBsaXN0XG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRoaWRlT3B0aW9ucygpIHtcbiAgICB0aGlzLl9oaWRkZW4gPSB0cnVlO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZShDT01CT19PUEVOKTtcbiAgICB0aGlzLl9jb21ib0xpc3QuZG9tLnRvZ2dsZShmYWxzZSk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSGlkZXMgYWRkIGJ1dHRvblxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kdG9nZ2xlQWRkQnV0dG9uKHNob3csIG9wdGlvbnMpIHtcbiAgICB0aGlzLl9jb21ib0FkZEl0ZW1EaXYuZG9tLnRvZ2dsZShzaG93KTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnByZXNlcnZlU3RhdGUpIHRoaXMuX19zaG93QWRkT25DbGljayA9IHRoaXMuX2lzQWRkQnV0dG9uU2hvd247XG4gICAgdGhpcy5faXNBZGRCdXR0b25TaG93biA9IHNob3c7XG59XG5cblxuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHNldEFkZEl0ZW1Qcm9tcHQocHJvbXB0KSB7XG4gICAgdGhpcy5fYWRkSXRlbVByb21wdCA9IHByb21wdDtcbiAgICB0aGlzLl9jb21ib0FkZFByb21wdC5lbC5pbm5lckhUTUwgPSBwcm9tcHQ7XG4gICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgb3B0aW9ucyBvZiB0aGUgZHJvcGRvd25cbiAqXG4gKiBAcGFyYW0ge0FycmF5W09iamVjdF19IGFyciB0aGUgb3B0aW9ucyB0byBzZXQgd2l0aCBsYWJlbCBhbmQgdmFsdWUgcGFpcnMuIFZhbHVlIGNhbiBiZSBhbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRzZXRPcHRpb25zKGFycikge1xuICAgIHRoaXMuX29wdGlvbnNEYXRhID0gYXJyO1xuICAgIHRoaXMuc2V0RmlsdGVyZWRPcHRpb25zKGFycik7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXNlIHRoZSByZW1vdGUgb3B0aW9ucyBvZiB0aGUgZHJvcGRvd25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byBpbml0aWFsaXNlLlxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kaW5pdE9wdGlvbnNVUkwob3B0aW9ucykge1xuICAgIHRoaXMuX29wdGlvbnNVUkwgPSBvcHRpb25zLnVybDtcbiAgICB0aGlzLl9mb3JtYXRPcHRpb25zVVJMID0gb3B0aW9ucy5mb3JtYXRPcHRpb25zIHx8IGZ1bmN0aW9uKGUpe3JldHVybiBlO307XG59XG5cblxuLyoqXG4gKiBQcml2YXRlIG1ldGhvZFxuICogU2V0cyB0aGUgb3B0aW9ucyBvZiB0aGUgZHJvcGRvd24gYmFzZWQgb24gYSByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIF9nZXRPcHRpb25zVVJMKGNiKSB7XG4gICAgdmFyIHVybCA9IHRoaXMuX29wdGlvbnNVUkwsXG4gICAgICAgIHF1ZXJ5U3RyaW5nID0gdGhpcy5fY29tYm9JbnB1dC5kYXRhLmdldCgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBjYiA9IGNiIHx8IF8ubm9vcDtcbiAgICBtaWxvLnV0aWwucmVxdWVzdC5wb3N0KHVybCwgeyBuYW1lOiBxdWVyeVN0cmluZyB9LCBmdW5jdGlvbiAoZXJyLCByZXNwb25zZSkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NhbiBub3Qgc2VhcmNoIGZvciBcIicgKyBxdWVyeVN0cmluZyArICdcIicpO1xuICAgICAgICAgICAgcmV0dXJuIGNiKG5ldyBFcnJvcignUmVxdWVzdCBlcnJvcicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXNwb25zZURhdGEgPSBfLmpzb25QYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGlmIChyZXNwb25zZURhdGEpIGNiKG51bGwsIHJlc3BvbnNlRGF0YSk7XG4gICAgICAgIGVsc2UgY2IobmV3IEVycm9yKCdEYXRhIGVycm9yJykpO1xuICAgIH0pO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgZmlsdGVyZWQgb3B0aW9ucywgd2hpY2ggaXMgYSBzdWJzZXQgb2Ygbm9ybWFsIG9wdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1t0eXBlXX0gYXJyIFRoZSBvcHRpb25zIHRvIHNldFxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kc2V0RmlsdGVyZWRPcHRpb25zKGFycikge1xuICAgIGlmICghIGFycikgcmV0dXJuIGxvZ2dlci5lcnJvcignc2V0RmlsdGVyZWRPcHRpb25zOiBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkJyk7XG4gICAgdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YSA9IGFycjtcbiAgICB0aGlzLl90b3RhbCA9IGFyci5sZW5ndGg7XG4gICAgdGhpcy51cGRhdGUoKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBVcGRhdGVzIHRoZSBsaXN0LiBUaGlzIGlzIHVzZWQgb24gc2Nyb2xsLCBhbmQgbWFrZXMgdXNlIG9mIHRoZSBmaWx0ZXJlZE9wdGlvbnMgdG9cbiAqIGludGVsbGlnZW50bHkgc2hvdyBhIHN1YnNldCBvZiB0aGUgZmlsdGVyZWQgbGlzdCBhdCBhIHRpbWUuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyR1cGRhdGUoKSB7XG4gICAgdmFyIHdhc0hpZGRlbiA9IHRoaXMuX2hpZGRlbjtcblxuICAgIHZhciBhcnJUb1Nob3cgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNEYXRhLnNsaWNlKHRoaXMuX3N0YXJ0SW5kZXgsIHRoaXMuX2VuZEluZGV4KTtcblxuICAgIHRoaXMuX2NvbWJvT3B0aW9ucy50ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICBjb21ib09wdGlvbnM6IGFyclRvU2hvd1xuICAgIH0pO1xuXG4gICAgdGhpcy5fZWxlbWVudEhlaWdodCA9IHRoaXMuX2VsZW1lbnRIZWlnaHQgfHwgREVGQVVMVF9FTEVNRU5UX0hFSUdIVDtcblxuICAgIGlmICh3YXNIaWRkZW4pXG4gICAgICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcblxuICAgIHZhciBiZWZvcmVIZWlnaHQgPSB0aGlzLl9zdGFydEluZGV4ICogdGhpcy5fZWxlbWVudEhlaWdodDtcbiAgICB2YXIgYWZ0ZXJIZWlnaHQgPSAodGhpcy5fdG90YWwgLSB0aGlzLl9lbmRJbmRleCkgKiB0aGlzLl9lbGVtZW50SGVpZ2h0O1xuICAgIHRoaXMuX2NvbWJvQmVmb3JlLmVsLnN0eWxlLmhlaWdodCA9IGJlZm9yZUhlaWdodCArICdweCc7XG4gICAgdGhpcy5fY29tYm9BZnRlci5lbC5zdHlsZS5oZWlnaHQgPSBhZnRlckhlaWdodCA+IDAgPyBhZnRlckhlaWdodCArICdweCcgOiAnMHB4Jztcbn1cblxuLyoqXG4gKiBTZXR1cCB0aGUgY29tYm8gbGlzdFxuICpcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gbGlzdFxuICogQHBhcmFtICB7QXJyYXl9IG9wdGlvbnNcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gc2VsZlxuICovXG5mdW5jdGlvbiBzZXR1cENvbWJvTGlzdChsaXN0LCBvcHRpb25zLCBzZWxmKSB7XG4gICAgc2VsZi50b2dnbGVBZGRCdXR0b24oZmFsc2UpO1xuICAgIG9wdGlvbnMudGVtcGxhdGUuc2V0KE9QVElPTlNfVEVNUExBVEUpO1xuXG4gICAgbGlzdC5kb20uc2V0U3R5bGVzKHtcbiAgICAgICAgb3ZlcmZsb3c6ICdzY3JvbGwnLFxuICAgICAgICBoZWlnaHQ6IHNlbGYuX29wdGlvbnNIZWlnaHQgKyAncHgnLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgekluZGV4OiAxMFxuICAgICAgICAvLyB0b3A6IHlQb3MgKyAncHgnLFxuICAgICAgICAvLyBsZWZ0OiB4UG9zICsgJ3B4JyxcbiAgICB9KTtcblxuICAgIHNlbGYuaGlkZU9wdGlvbnMoKTtcbiAgICBsaXN0LmV2ZW50cy5vbk1lc3NhZ2VzKHtcbiAgICAgICAgJ2NsaWNrJzoge3N1YnNjcmliZXI6IG9uTGlzdENsaWNrLCBjb250ZXh0OiBzZWxmfSxcbiAgICAgICAgJ3Njcm9sbCc6IHtzdWJzY3JpYmVyOiBvbkxpc3RTY3JvbGwsIGNvbnRleHQ6IHNlbGZ9XG4gICAgfSk7XG59XG5cbi8qKlxuICogU2V0dXAgdGhlIGlucHV0IGNvbXBvbmVudFxuICpcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gaW5wdXRcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gc2VsZlxuICovXG5mdW5jdGlvbiBzZXR1cENvbWJvSW5wdXQoaW5wdXQsIHNlbGYpIHtcbiAgICBpbnB1dC5ldmVudHMub25jZSgnZm9jdXMnLCBmdW5jdGlvbigpe1xuICAgICAgICBpbnB1dC5kYXRhLm9uKCcnLCB7IHN1YnNjcmliZXI6IG9uRGF0YUNoYW5nZSwgY29udGV4dDogc2VsZiB9KTtcbiAgICAgICAgaW5wdXQuZXZlbnRzLm9uKCdjbGljaycsIHtzdWJzY3JpYmVyOiBvbklucHV0Q2xpY2ssIGNvbnRleHQ6IHNlbGYgfSk7XG4gICAgICAgIGlucHV0LmV2ZW50cy5vbigna2V5ZG93bicsIHtzdWJzY3JpYmVyOiBvbkVudGVyS2V5LCBjb250ZXh0OiBzZWxmIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFNldHVwIHRoZSBidXR0b25cbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gYnRuXG4gKiBAcGFyYW0gIHtDb21wb25lbnR9IHNlbGZcbiAqL1xuZnVuY3Rpb24gc2V0dXBDb21ib0J0bihidG4sIHNlbGYpIHtcbiAgICBidG4uZXZlbnRzLm9uKCdjbGljaycsIHsgc3Vic2NyaWJlcjogb25BZGRCdG4sIGNvbnRleHQ6IHNlbGYgfSk7XG59XG5cblxuLyoqXG4gKiBDdXN0b20gZGF0YSBmYWNldCBnZXQgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ib19nZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWYWx1ZTtcbn1cblxuLyoqXG4gKiBDdXN0b20gZGF0YSBmYWNldCBzZXQgbWV0aG9kXG4gKiBAcGFyYW0ge1ZhcmlhYmxlfSBvYmpcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvX3NldChvYmopIHtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSBvYmo7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLnNldChvYmogJiYgb2JqLmxhYmVsKTtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICdoaWRlT3B0aW9ucycpO1xufVxuXG4vKipcbiAqIEN1c3RvbSBkYXRhIGZhY2V0IGRlbCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvX2RlbCgpIHtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSBudWxsO1xuICAgIHRoaXMuX2NvbWJvSW5wdXQuZGF0YS5zZXQoJycpO1xufVxuXG5cbi8qKlxuICogSW5wdXQgZGF0YSBjaGFuZ2UgaGFuZGxlclxuICogV2hlbiB0aGUgaW5wdXQgZGF0YSBjaGFuZ2VzLCB0aGlzIG1ldGhvZCBmaWx0ZXJzIHRoZSBvcHRpb25zRGF0YSwgYW5kIHNldHMgdGhlIGZpcnN0IGVsZW1lbnRcbiAqIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtICB7U3RyaW5nfSBtc2dcbiAqIEBwYXJhbSAge09iamV4dH0gZGF0YVxuICovXG5mdW5jdGlvbiBvbkRhdGFDaGFuZ2UobXNnLCBkYXRhKSB7XG4gICAgdmFyIHRleHQgPSBkYXRhLm5ld1ZhbHVlICYmIGRhdGEubmV3VmFsdWUudHJpbSgpO1xuICAgIGlmICh0aGlzLl9vcHRpb25zVVJMKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgX2dldE9wdGlvbnNVUkwuY2FsbCh0aGlzLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlRGF0YSl7XG4gICAgICAgICAgICBpZiAoZXJyIHx8ICFyZXNwb25zZURhdGEpIHJldHVybjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSByZXNwb25zZURhdGEuZGF0YS5tYXAoc2VsZi5fZm9ybWF0T3B0aW9uc1VSTCk7XG4gICAgICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIF91cGRhdGVPcHRpb25zQW5kQWRkQnV0dG9uLmNhbGwoc2VsZiwgdGV4dCwgc2VsZi5fb3B0aW9uc0RhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdEYXRhIGVycm9yJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBmaWx0ZXJlZERhdGEgPSBfZmlsdGVyRGF0YS5jYWxsKHRoaXMsIHRleHQpO1xuICAgICAgICBfdXBkYXRlT3B0aW9uc0FuZEFkZEJ1dHRvbi5jYWxsKHRoaXMsIHRleHQsIGZpbHRlcmVkRGF0YSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9maWx0ZXJEYXRhKHRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0RhdGEuZmlsdGVyKGZ1bmN0aW9uKG9wdGlvbikge1xuICAgICAgICBkZWxldGUgb3B0aW9uLnNlbGVjdGVkO1xuICAgICAgICBpZiAob3B0aW9uLmxhYmVsKSB7XG4gICAgICAgICAgICB2YXIgbGFiZWwgPSBvcHRpb24ubGFiZWwudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBsYWJlbC50cmltKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRleHQudG9Mb3dlckNhc2UoKSkgPT0gMDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF91cGRhdGVPcHRpb25zQW5kQWRkQnV0dG9uKHRleHQsIGZpbHRlcmVkQXJyKSB7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgIHRoaXMudG9nZ2xlQWRkQnV0dG9uKGZhbHNlLCB7IHByZXNlcnZlU3RhdGU6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpbHRlcmVkQXJyLmxlbmd0aCAmJiBfLmZpbmQoZmlsdGVyZWRBcnIsIGlzRXhhY3RNYXRjaCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQWRkQnV0dG9uKGZhbHNlLCB7IHByZXNlcnZlU3RhdGU6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYWRkSXRlbVByb21wdCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVBZGRCdXR0b24odGhpcy5fb3B0aW9uc0RhdGEubGVuZ3RoID4gMSB8fCB0aGlzLl9vcHRpb25zVVJMKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJlZEFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd09wdGlvbnMoKTtcbiAgICAgICAgICAgIGZpbHRlcmVkQXJyWzBdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gZmlsdGVyZWRBcnJbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVPcHRpb25zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldEZpbHRlcmVkT3B0aW9ucyhmaWx0ZXJlZEFycik7XG4gICAgdGhpcy5fY29tYm9MaXN0LmVsLnNjcm9sbFRvcCA9IDA7XG5cbiAgICBmdW5jdGlvbiBpc0V4YWN0TWF0Y2goaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgbWFwIG9mIGtleUNvZGVzIHRvIGRpcmVjdGlvbnNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbnZhciBkaXJlY3Rpb25NYXAgPSB7ICc0MCc6IDEsICczOCc6IC0xIH07XG5cbi8qKlxuICogTGlzdCBrZXlkb3duIGhhbmRsZXJcbiAqIENoYW5nZXMgdGhlIHNlbGVjdGVkIGxpc3QgaXRlbSBieSBmaW5kaW5nIHRoZSBhZGphY2VudCBpdGVtIGFuZCBzZXR0aW5nIGl0IHRvIHNlbGVjdGVkLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGNoYW5nZVNlbGVjdGVkKHR5cGUsIGV2ZW50KSB7XG4gICAgLy9UT0RPIHRlc3QgbW9jaGFcbiAgICB2YXIgZGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwW2V2ZW50LmtleUNvZGVdO1xuXG4gICAgaWYoZGlyZWN0aW9uKVxuICAgICAgICBfY2hhbmdlU2VsZWN0ZWQuY2FsbCh0aGlzLCBkaXJlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBfY2hhbmdlU2VsZWN0ZWQoZGlyZWN0aW9uKSB7XG4gICAgLy8gVE9ETzogcmVmYWN0b3IgYW5kIHRpZHkgdXAsIGxvb2tzIGxpa2Ugc29tZSBjb2RlIGR1cGxpY2F0aW9uLlxuICAgIHZhciBzZWxlY3RlZCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkJylbMF1cbiAgICAgICAgLCBzY3JvbGxQb3MgPSB0aGlzLl9jb21ib0xpc3QuZWwuc2Nyb2xsVG9wXG4gICAgICAgICwgc2VsZWN0ZWRQb3MgPSBzZWxlY3RlZCA/IHNlbGVjdGVkLm9mZnNldFRvcCA6IDBcbiAgICAgICAgLCByZWxhdGl2ZVBvcyA9IHNlbGVjdGVkUG9zIC0gc2Nyb2xsUG9zO1xuXG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIHZhciBpbmRleCA9IF9nZXREYXRhVmFsdWVGcm9tRWxlbWVudC5jYWxsKHRoaXMsIHNlbGVjdGVkKVxuICAgICAgICAgICAgLCB0aGlzSXRlbSA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbaW5kZXhdXG4gICAgICAgICAgICAsIGFkakl0ZW0gPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNEYXRhW2luZGV4ICsgZGlyZWN0aW9uXTtcblxuICAgICAgICBpZiAoYWRqSXRlbSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXNJdGVtLnNlbGVjdGVkO1xuICAgICAgICAgICAgYWRqSXRlbS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IGFkakl0ZW07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbMF0pIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWxhdGl2ZVBvcyA+IHRoaXMuX29wdGlvbnNIZWlnaHQgLSB0aGlzLl9lbGVtZW50SGVpZ2h0KjIgJiYgZGlyZWN0aW9uID09PSAxKVxuICAgICAgICB0aGlzLl9jb21ib0xpc3QuZWwuc2Nyb2xsVG9wICs9IHRoaXMuX2VsZW1lbnRIZWlnaHQqZGlyZWN0aW9uKjU7XG5cbiAgICBpZiAocmVsYXRpdmVQb3MgPCB0aGlzLl9lbGVtZW50SGVpZ2h0ICYmIGRpcmVjdGlvbiA9PT0gLTEpXG4gICAgICAgIHRoaXMuX2NvbWJvTGlzdC5lbC5zY3JvbGxUb3AgKz0gdGhpcy5fZWxlbWVudEhlaWdodCpkaXJlY3Rpb24qNTtcbn1cblxuXG4vKipcbiAqIE1vdXNlIG92ZXIgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uTW91c2VPdmVyKHR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5fbW91c2VJc092ZXIgPSB0cnVlO1xufVxuXG5cbi8qKlxuICogTW91c2UgbGVhdmUgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uTW91c2VMZWF2ZSh0eXBlLCBldmVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9tb3VzZUlzT3ZlciA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9tb3VzZU91dFRpbWVyKSBjbGVhckludGVydmFsKHRoaXMuX21vdXNlT3V0VGltZXIpO1xuICAgIHRoaXMuX21vdXNlT3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmICghc2VsZi5fbW91c2VJc092ZXIpXG4gICAgICAgICAgICBfb25Nb3VzZUxlYXZlLmNhbGwoc2VsZik7XG4gICAgfSwgNzUwKTtcbn1cblxuZnVuY3Rpb24gX29uTW91c2VMZWF2ZSgpIHtcbiAgICB0aGlzLmhpZGVPcHRpb25zKCk7XG4gICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UsIHsgcHJlc2VydmVTdGF0ZTogdHJ1ZSB9KTtcbn1cblxuXG4vKipcbiAqIElucHV0IGNsaWNrIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbklucHV0Q2xpY2sodHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLnNob3dPcHRpb25zKCk7XG4gICAgaWYgKHRoaXMuX19zaG93QWRkT25DbGljaykgdGhpcy50b2dnbGVBZGRCdXR0b24odHJ1ZSk7XG59XG5cblxuLyoqXG4gKiBFbnRlciBrZXkgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uRW50ZXJLZXkodHlwZSwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpXG4gICAgICAgICAgICBfc2V0RGF0YS5jYWxsKHRoaXMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBZGQgYnV0dG9uIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbkFkZEJ0biAodHlwZSwgZXZlbnQpIHtcbiAgICB2YXIgZGF0YSA9IHsgbGFiZWw6IHRoaXMuX2NvbWJvSW5wdXQuZWwudmFsdWUgfTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCdhZGRpdGVtJywgZGF0YSk7XG4gICAgdGhpcy5ldmVudHMucG9zdE1lc3NhZ2UoJ21pbG9fc3VwZXJjb21ib2FkZGl0ZW0nLCBkYXRhKTtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSwgeyBwcmVzZXJ2ZVN0YXRlOiB0cnVlIH0pO1xuXG59XG5cbi8qKlxuICogTGlzdCBjbGljayBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25MaXN0Q2xpY2sgKHR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIGluZGV4ID0gX2dldERhdGFWYWx1ZUZyb21FbGVtZW50LmNhbGwodGhpcywgZXZlbnQudGFyZ2V0KTtcbiAgICB2YXIgZGF0YSA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbaW5kZXhdO1xuXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBkYXRhO1xuICAgIF9zZXREYXRhLmNhbGwodGhpcyk7XG4gICAgdGhpcy51cGRhdGUoKTtcbn1cblxuXG4vKipcbiAqIExpc3Qgc2Nyb2xsIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbkxpc3RTY3JvbGwgKHR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIHNjcm9sbFBvcyA9IGV2ZW50LnRhcmdldC5zY3JvbGxUb3BcbiAgICAgICAgLCBkaXJlY3Rpb24gPSBzY3JvbGxQb3MgPiB0aGlzLl9sYXN0U2Nyb2xsUG9zID8gJ2Rvd24nIDogJ3VwJ1xuICAgICAgICAsIGZpcnN0Q2hpbGQgPSB0aGlzLl9jb21ib09wdGlvbnMuZWwubGFzdEVsZW1lbnRDaGlsZFxuICAgICAgICAsIGxhc3RDaGlsZCA9IHRoaXMuX2NvbWJvT3B0aW9ucy5lbC5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgICAsIGxhc3RFbFBvc2l0aW9uID0gZmlyc3RDaGlsZCA/IGZpcnN0Q2hpbGQub2Zmc2V0VG9wIDogMFxuICAgICAgICAsIGZpcnN0RWxQb3NpdGlvbiA9IGxhc3RDaGlsZCA/IGxhc3RDaGlsZC5vZmZzZXRUb3AgOiAwXG4gICAgICAgICwgZGlzdEZyb21MYXN0RWwgPSBsYXN0RWxQb3NpdGlvbiAtIHNjcm9sbFBvcyAtIHRoaXMuX29wdGlvbnNIZWlnaHQgKyB0aGlzLl9lbGVtZW50SGVpZ2h0XG4gICAgICAgICwgZGlzdEZyb21GaXJzdEVsID0gc2Nyb2xsUG9zIC0gZmlyc3RFbFBvc2l0aW9uXG4gICAgICAgICwgZWxzRnJvbVN0YXJ0ID0gTWF0aC5mbG9vcihkaXN0RnJvbUZpcnN0RWwgLyB0aGlzLl9lbGVtZW50SGVpZ2h0KVxuICAgICAgICAsIGVsc1RvVGhlRW5kID0gTWF0aC5mbG9vcihkaXN0RnJvbUxhc3RFbCAvIHRoaXMuX2VsZW1lbnRIZWlnaHQpXG4gICAgICAgICwgdG90YWxFbGVtZW50c0JlZm9yZSA9IE1hdGguZmxvb3Ioc2Nyb2xsUG9zIC8gdGhpcy5fZWxlbWVudEhlaWdodCkgLSBCVUZGRVI7XG5cbiAgICBpZiAoKGRpcmVjdGlvbiA9PSAnZG93bicgJiYgZWxzVG9UaGVFbmQgPCBCVUZGRVIpXG4gICAgICAgIHx8IChkaXJlY3Rpb24gPT0gJ3VwJyAmJiBlbHNGcm9tU3RhcnQgPCBCVUZGRVIpKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0SW5kZXggPSB0b3RhbEVsZW1lbnRzQmVmb3JlID4gMCA/IHRvdGFsRWxlbWVudHNCZWZvcmUgOiAwO1xuICAgICAgICB0aGlzLl9lbmRJbmRleCA9IHRvdGFsRWxlbWVudHNCZWZvcmUgKyBNQVhfUkVOREVSRUQ7XG4gICAgICAgIHRoaXMuX2VsZW1lbnRIZWlnaHQgPSBmaXJzdENoaWxkLnN0eWxlLmhlaWdodDtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gICAgdGhpcy5fbGFzdFNjcm9sbFBvcyA9IHNjcm9sbFBvcztcbn1cblxuXG4vKipcbiAqIFByaXZhdGUgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgdGhlIGRhdGEtdmFsdWUgYXR0cmlidXRlIHZhbHVlIGZyb20gdGhlIGVsZW1lbnQgYW5kIHJldHVybnMgaXQgYXMgYW4gaW5kZXggb2ZcbiAqIHRoZSBmaWx0ZXJlZE9wdGlvbnNcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiBfZ2V0RGF0YVZhbHVlRnJvbUVsZW1lbnQoZWwpIHtcbiAgICByZXR1cm4gTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKSArIHRoaXMuX3N0YXJ0SW5kZXg7XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RcbiAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIFN1cGVyQ29tYm8sIHRha2luZyBjYXJlIHRvIHJlc2V0IHNvbWUgdGhpbmdzIGFuZCB0ZW1wb3JhcmlseVxuICogdW5zdWJzY3JpYmUgZGF0YSBsaXN0ZW5lcnMuXG4gKi9cbmZ1bmN0aW9uIF9zZXREYXRhKCkge1xuICAgIGRlbGV0ZSB0aGlzLl9zZWxlY3RlZC5zZWxlY3RlZDtcbiAgICB0aGlzLmhpZGVPcHRpb25zKCk7XG4gICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UpO1xuICAgIHRoaXMuX2NvbWJvSW5wdXQuZGF0YS5vZmYoJycsIHsgc3Vic2NyaWJlcjogb25EYXRhQ2hhbmdlLCBjb250ZXh0OiB0aGlzIH0pO1xuICAgIC8vc3VwZXJjb21ibyBsaXN0ZW5lcnMgb2ZmXG4gICAgdGhpcy5kYXRhLnNldCh0aGlzLl9zZWxlY3RlZCk7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShDT01CT19DSEFOR0VfTUVTU0FHRSk7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLm9uKCcnLCB7IHN1YnNjcmliZXI6IG9uRGF0YUNoYW5nZSwgY29udGV4dDogdGhpcyB9KTtcbiAgICAvL3N1cGVyY29tYm8gbGlzdGVuZXJzIG9uXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBudWxsO1xuICAgIHRoaXMuc2V0RmlsdGVyZWRPcHRpb25zKHRoaXMuX29wdGlvbnNEYXRhKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTFRleHQgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MVGV4dCcsIHtcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXRleHQnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxUZXh0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTFRleHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG52YXIgTUxUZXh0YXJlYSA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxUZXh0YXJlYScsIHtcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXRleHRhcmVhJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MVGV4dGFyZWEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MVGV4dGFyZWE7XG5cblxudmFyIFNBTVBMRV9BVVRPUkVTSVpFX1RFWFQgPSAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVlciBhZGlwaXNjaW5nIGVsaXQsJztcblxuXG5fLmV4dGVuZFByb3RvKE1MVGV4dGFyZWEsIHtcbiAgICBzdGFydEF1dG9yZXNpemU6IE1MVGV4dGFyZWEkc3RhcnRBdXRvcmVzaXplLFxuICAgIHN0b3BBdXRvcmVzaXplOiBNTFRleHRhcmVhJHN0b3BBdXRvcmVzaXplLFxuICAgIGlzQXV0b3Jlc2l6ZWQ6IE1MVGV4dGFyZWEkaXNBdXRvcmVzaXplZCxcbiAgICBkaXNhYmxlOiBNTFRleHRhcmVhJGRpc2FibGVcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkc3RhcnRBdXRvcmVzaXplKG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5fYXV0b3Jlc2l6ZSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdNTFRleHRhcmVhIHN0YXJ0QXV0b3Jlc2l6ZTogYXV0b3Jlc2l6ZSBpcyBhbHJlYWR5IG9uJyk7XG4gICAgdGhpcy5fYXV0b3Jlc2l6ZSA9IHRydWU7XG4gICAgdGhpcy5fYXV0b3Jlc2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgX2FkanVzdEFyZWFIZWlnaHQuY2FsbCh0aGlzKTtcbiAgICBfbWFuYWdlU3Vic2NyaXB0aW9ucy5jYWxsKHRoaXMsICdvbicpO1xufVxuXG5cbmZ1bmN0aW9uIF9tYW5hZ2VTdWJzY3JpcHRpb25zKG9uT2ZmKSB7XG4gICAgdGhpcy5ldmVudHNbb25PZmZdKCdjbGljaycsIHsgc3Vic2NyaWJlcjogX2FkanVzdEFyZWFIZWlnaHQsIGNvbnRleHQ6IHRoaXMgfSk7XG4gICAgdGhpcy5kYXRhW29uT2ZmXSgnJywgeyBzdWJzY3JpYmVyOiBfYWRqdXN0QXJlYUhlaWdodCwgY29udGV4dDogdGhpcyB9KTtcbn1cblxuXG5mdW5jdGlvbiBfYWRqdXN0QXJlYUhlaWdodCgpIHtcbiAgICB0aGlzLmVsLnN0eWxlLmhlaWdodCA9IDA7XG5cbiAgICB2YXIgbmV3SGVpZ2h0ID0gdGhpcy5lbC5zY3JvbGxIZWlnaHRcbiAgICAgICAgLCBtaW5IZWlnaHQgPSB0aGlzLl9hdXRvcmVzaXplT3B0aW9ucy5taW5IZWlnaHRcbiAgICAgICAgLCBtYXhIZWlnaHQgPSB0aGlzLl9hdXRvcmVzaXplT3B0aW9ucy5tYXhIZWlnaHQ7XG5cbiAgICBuZXdIZWlnaHQgPSBuZXdIZWlnaHQgPj0gbWF4SGVpZ2h0XG4gICAgICAgICAgICAgICAgPyBtYXhIZWlnaHRcbiAgICAgICAgICAgICAgICA6IG5ld0hlaWdodCA8PSBtaW5IZWlnaHRcbiAgICAgICAgICAgICAgICA/IG1pbkhlaWdodFxuICAgICAgICAgICAgICAgIDogbmV3SGVpZ2h0O1xuXG4gICAgdGhpcy5lbC5zdHlsZS5oZWlnaHQgPSBuZXdIZWlnaHQgKyAncHgnO1xufVxuXG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkc3RvcEF1dG9yZXNpemUoKSB7XG4gICAgaWYgKCEgdGhpcy5fYXV0b3Jlc2l6ZSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdNTFRleHRhcmVhIHN0b3BBdXRvcmVzaXplOiBhdXRvcmVzaXplIGlzIG5vdCBvbicpO1xuICAgIHRoaXMuX2F1dG9yZXNpemUgPSBmYWxzZTtcbiAgICBfbWFuYWdlU3Vic2NyaXB0aW9ucy5jYWxsKHRoaXMsICdvZmYnKTtcbn1cblxuXG5mdW5jdGlvbiBNTFRleHRhcmVhJGlzQXV0b3Jlc2l6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9yZXNpemU7XG59XG5cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl9hdXRvcmVzaXplKVxuICAgICAgICB0aGlzLnN0b3BBdXRvcmVzaXplKCk7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgTUxUaW1lID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFRpbWUnLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MVGltZV9nZXQsXG4gICAgICAgIHNldDogTUxUaW1lX3NldCxcbiAgICAgICAgZGVsOiBNTFRpbWVfZGVsLFxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXRpbWUnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxUaW1lKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTFRpbWU7XG5cblxudmFyIFRJTUVfUkVHRVggPSAvXihbMC05XXsxLDJ9KSg/OlxcOnxcXC4pKFswLTldezEsMn0pJC9cbiAgICAsIFRJTUVfVEVNUExBVEUgPSAnaGg6bW0nO1xuXG5mdW5jdGlvbiBNTFRpbWVfZ2V0KCkge1xuICAgIHZhciB0aW1lU3RyID0gdGhpcy5lbC52YWx1ZTtcbiAgICB2YXIgbWF0Y2ggPSB0aW1lU3RyLm1hdGNoKFRJTUVfUkVHRVgpO1xuICAgIGlmICghIG1hdGNoKSByZXR1cm47XG4gICAgdmFyIGhvdXJzID0gbWF0Y2hbMV1cbiAgICAgICAgLCBtaW5zID0gbWF0Y2hbMl07XG4gICAgaWYgKGhvdXJzID4gMjMgfHwgbWlucyA+IDU5KSByZXR1cm47XG4gICAgdmFyIHRpbWUgPSBuZXcgRGF0ZSgxOTcwLCAwLCAxLCBob3VycywgbWlucyk7XG5cbiAgICByZXR1cm4gXy50b0RhdGUodGltZSk7XG59XG5cblxuZnVuY3Rpb24gTUxUaW1lX3NldCh2YWx1ZSkge1xuICAgIHZhciB0aW1lID0gXy50b0RhdGUodmFsdWUpO1xuICAgIGlmICghIHRpbWUpIHtcbiAgICAgICAgdGhpcy5lbC52YWx1ZSA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRpbWVTdHIgPSBUSU1FX1RFTVBMQVRFXG4gICAgICAgICAgICAucmVwbGFjZSgnaGgnLCBwYWQodGltZS5nZXRIb3VycygpKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCdtbScsIHBhZCh0aW1lLmdldE1pbnV0ZXMoKSkpO1xuXG4gICAgdGhpcy5lbC52YWx1ZSA9IHRpbWVTdHI7XG4gICAgcmV0dXJuIHRpbWVTdHI7XG5cbiAgICBmdW5jdGlvbiBwYWQobikge3JldHVybiBuIDwgMTAgPyAnMCcgKyBuIDogbjsgfVxufVxuXG5cbmZ1bmN0aW9uIE1MVGltZV9kZWwoKSB7XG4gICAgdGhpcy5lbC52YWx1ZSA9ICcnO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5Jyk7XG5cblxudmFyIE1MV3JhcHBlciA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxXcmFwcGVyJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktd3JhcHBlcidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFdyYXBwZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MV3JhcHBlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uLy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vLi4vY19yZWdpc3RyeScpXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIEFMRVJUX0NTU19DTEFTU0VTID0ge1xuICAgIHN1Y2Nlc3M6ICdhbGVydC1zdWNjZXNzJyxcbiAgICB3YXJuaW5nOiAnYWxlcnQtd2FybmluZycsXG4gICAgaW5mbzogJ2FsZXJ0LWluZm8nLFxuICAgIGRhbmdlcjogJ2FsZXJ0LWRhbmdlcicsXG4gICAgZml4ZWQ6ICdhbGVydC1maXhlZCdcbn07XG5cblxudmFyIE1MQWxlcnQgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MQWxlcnQnLCB7XG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogWydtbC1icy1hbGVydCcsICdhbGVydCcsICdmYWRlJ10sXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICdyb2xlJzogJ2FsZXJ0JyxcbiAgICAgICAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJ1xcXG4gICAgICAgICAgICB7ez8gaXQuY2xvc2UgfX1cXFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWwtYmluZD1cIltldmVudHNdOmNsb3NlQnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJhbGVydFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L2J1dHRvbj5cXFxuICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAge3s9IGl0Lm1lc3NhZ2V9fSdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEFsZXJ0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEFsZXJ0O1xuXG5cbl8uZXh0ZW5kKE1MQWxlcnQsIHtcbiAgICBjcmVhdGVBbGVydDogTUxBbGVydCQkY3JlYXRlQWxlcnQsXG4gICAgb3BlbkFsZXJ0OiBNTEFsZXJ0JCRvcGVuQWxlcnQsXG59KTtcblxuXG5fLmV4dGVuZFByb3RvKE1MQWxlcnQsIHtcbiAgICBvcGVuQWxlcnQ6IE1MQWxlcnQkb3BlbkFsZXJ0LFxuICAgIGNsb3NlQWxlcnQ6IE1MQWxlcnQkY2xvc2VBbGVydFxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGFsZXJ0IGluc3RhbmNlLiBUbyBjcmVhdGUgYW5kIG9wZW4gYXQgdGhlIHNhbWUgdGltZSB1c2UgW29wZW5BbGVydF0oI01MQWxlcnQkJG9wZW5BbGVydClcbiAqIGBvcHRpb25zYCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAgICBtZXNzYWdlOiBzdHJpbmcgYWxlcnQgbWVzc2FnZVxuICogICAgICB0eXBlOiAgICBvcHRpb25hbCBzdHJpbmcgdGhlIHR5cGUgb2YgYWxlcnQgbWVzc2FnZSwgb25lIG9mIHN1Y2Nlc3MsIHdhcm5pbmcsIGluZm8sIGRhbmdlciwgZml4ZWRcbiAqICAgICAgICAgICAgICAgZGVmYXVsdCAnaW5mbydcbiAqICAgICAgY2xvc2U6ICAgb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCB1c2VyIGZyb20gY2xvc2luZ1xuICogICAgICAgICAgICAgICBvciB0cnVlIChkZWZhdWx0KSB0byBlbmFibGUgY2xvc2luZyBhbmQgcmVuZGVyIGEgY2xvc2UgYnV0dG9uXG4gKiAgICAgIHRpbWVvdXQ6IG9wdGlvbmFsIHRpbWVyLCBpbiBtaWxsaXNlY29uZHMgdG8gYXV0b21hdGljYWxseSBjbG9zZSB0aGUgYWxlcnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBhbGVydCBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIE1MQWxlcnQkJGNyZWF0ZUFsZXJ0KG9wdGlvbnMpIHtcbiAgICBjaGVjayhvcHRpb25zLCB7XG4gICAgICAgIG1lc3NhZ2U6IFN0cmluZyxcbiAgICAgICAgdHlwZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY2xvc2U6IE1hdGNoLk9wdGlvbmFsKEJvb2xlYW4pLFxuICAgICAgICB0aW1lb3V0OiBNYXRjaC5PcHRpb25hbChOdW1iZXIpXG4gICAgfSk7XG5cbiAgICB2YXIgYWxlcnQgPSBNTEFsZXJ0LmNyZWF0ZU9uRWxlbWVudCgpO1xuXG4gICAgb3B0aW9ucyA9IF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIHZhciBhbGVydENscyA9IEFMRVJUX0NTU19DTEFTU0VTW29wdGlvbnMudHlwZV07XG4gICAgYWxlcnQuZG9tLmFkZENzc0NsYXNzZXMoYWxlcnRDbHMpO1xuXG4gICAgYWxlcnQuX2FsZXJ0ID0ge1xuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgIH07XG5cbiAgICBhbGVydC50ZW1wbGF0ZS5yZW5kZXIob3B0aW9ucykuYmluZGVyKCk7XG5cbiAgICB2YXIgYWxlcnRTY29wZSA9IGFsZXJ0LmNvbnRhaW5lci5zY29wZTtcblxuICAgIGlmIChvcHRpb25zLmNsb3NlKVxuICAgICAgICBhbGVydFNjb3BlLmNsb3NlQnRuLmV2ZW50cy5vbignY2xpY2snLFxuICAgICAgICAgICAgeyBzdWJzY3JpYmVyOiBfb25DbG9zZUJ0bkNsaWNrLCBjb250ZXh0OiBhbGVydCB9KTtcblxuICAgIGlmIChvcHRpb25zLnRpbWVvdXQpXG4gICAgICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKGFsZXJ0Ll9hbGVydC52aXNpYmxlKVxuICAgICAgICAgICAgICAgIGFsZXJ0LmNsb3NlQWxlcnQoKTtcbiAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0KTtcblxuICAgIHJldHVybiBhbGVydDtcbn1cblxuXG4vKipcbiAqIENyZWF0ZSBhbmQgc2hvdyBhbGVydCBwb3B1cFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIG9iamVjdCB3aXRoIG1lc3NhZ2UsIHR5cGUsIGNsb3NlIGFuZCB0aW1lb3V0XG4gKiBAcmV0dXJuIHtNTEFsZXJ0fSB0aGUgYWxlcnQgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gTUxBbGVydCQkb3BlbkFsZXJ0KG9wdGlvbnMpIHtcbiAgICB2YXIgYWxlcnQgPSBNTEFsZXJ0LmNyZWF0ZUFsZXJ0KG9wdGlvbnMpO1xuICAgIGFsZXJ0Lm9wZW5BbGVydCgpO1xuICAgIHJldHVybiBhbGVydDtcbn1cblxuXG5mdW5jdGlvbiBfb25DbG9zZUJ0bkNsaWNrKHR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5jbG9zZUFsZXJ0KCk7XG59XG5cblxuZnVuY3Rpb24gX3ByZXBhcmVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gXy5jbG9uZShvcHRpb25zKTtcbiAgICBvcHRpb25zLmNsb3NlID0gdHlwZW9mIG9wdGlvbnMuY2xvc2UgPT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZTtcbiAgICBvcHRpb25zLnRpbWVvdXQgPSBNYXRoLmZsb29yKG9wdGlvbnMudGltZW91dCk7XG4gICAgb3B0aW9ucy50eXBlID0gb3B0aW9ucy50eXBlIHx8ICdpbmZvJztcblxuICAgIHJldHVybiBvcHRpb25zO1xufVxuXG5cbi8qKlxuICogT3BlbiB0aGUgYWxlcnRcbiAqL1xuZnVuY3Rpb24gTUxBbGVydCRvcGVuQWxlcnQoKSB7XG4gICAgX3RvZ2dsZUFsZXJ0LmNhbGwodGhpcywgdHJ1ZSk7XG59XG5cblxuLyoqXG4gKiBDbG9zZSB0aGUgYWxlcnRcbiAqL1xuZnVuY3Rpb24gTUxBbGVydCRjbG9zZUFsZXJ0KCkge1xuICAgIF90b2dnbGVBbGVydC5jYWxsKHRoaXMsIGZhbHNlKTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbn1cblxuXG5mdW5jdGlvbiBfdG9nZ2xlQWxlcnQoZG9TaG93KSB7XG4gICAgZG9TaG93ID0gdHlwZW9mIGRvU2hvdyA9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gISB0aGlzLl9hbGVydC52aXNpYmxlXG4gICAgICAgICAgICAgICAgOiAhISBkb1Nob3c7XG5cbiAgICB2YXIgYWRkUmVtb3ZlID0gZG9TaG93ID8gJ2FkZCcgOiAncmVtb3ZlJ1xuICAgICAgICAsIGFwcGVuZFJlbW92ZSA9IGRvU2hvdyA/ICdhcHBlbmRDaGlsZCcgOiAncmVtb3ZlQ2hpbGQnO1xuXG4gICAgdGhpcy5fYWxlcnQudmlzaWJsZSA9IGRvU2hvdztcblxuICAgIGRvY3VtZW50LmJvZHlbYXBwZW5kUmVtb3ZlXSh0aGlzLmVsKTtcbiAgICB0aGlzLmRvbS50b2dnbGUoZG9TaG93KTtcbiAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAhZG9TaG93KTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdFthZGRSZW1vdmVdKCdpbicpO1xuICAgIHRoaXMuZWxbZG9TaG93ID8gJ2ZvY3VzJyA6ICdibHVyJ10oKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uLy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vLi4vY19yZWdpc3RyeScpXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIERFRkFVTFRfQlVUVE9OUyA9IFsgeyB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAnT0snLCByZXN1bHQ6ICdPSycgfSBdO1xuXG52YXIgQ0xPU0VfT1BUSU9OUyA9IFsnYmFja2Ryb3AnLCAna2V5Ym9hcmQnLCAnYnV0dG9uJ107XG5cbnZhciBCVVRUT05fQ1NTX0NMQVNTRVMgPSB7IC8vIFRPRE8gLSB1c2UgaW4gdGVtcGxhdGVcbiAgICBkZWZhdWx0OiAnYnRuLWRlZmF1bHQnLFxuICAgIHByaW1hcnk6ICdidG4tcHJpbWFyeScsXG4gICAgc3VjY2VzczogJ2J0bi1zdWNjZXNzJyxcbiAgICBpbmZvOiAnYnRuLWluZm8nLFxuICAgIHdhcm5pbmc6ICdidG4td2FybmluZycsXG4gICAgZGFuZ2VyOiAnYnRuLWRhbmdlcicsXG4gICAgbGluazogJ2J0bi1saW5rJ1xufTtcblxuXG4vKipcbiAqIERpYWxvZyBjbGFzcyB0byBzaG93IGN1c3RvbSBkaWFsb2cgYm94ZXMgYmFzZWQgb24gY29uZmlndXJhdGlvbiAtIHNlZSBbY3JlYXRlRGlhbG9nXSgjTUxEaWFsb2ckJGNyZWF0ZURpYWxvZykgbWV0aG9kLlxuICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgYSB0aW1lIC0gdHJ5aW5nIHRvIG9wZW4gYW5vdGhlciB3aWxsIGxvZyBlcnJvciB0byBjb25zb2xlLiBDdXJyZW50bHkgb3BlbmVkIGRpYWxvZyBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIFtnZXRDdXJyZW50RGlhbG9nXSgjTUxEaWFsb2ckJGdldEN1cnJlbnREaWFsb2cpIGNsYXNzIG1ldGhvZC5cbiAqL1xudmFyIE1MRGlhbG9nID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERpYWxvZycsIHtcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiBbJ21sLWJzLWRpYWxvZycsICdtb2RhbCcsICdmYWRlJ10sXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICdyb2xlJzogJ2RpYWxvZycsXG4gICAgICAgICAgICAnYXJpYS1oaWRkZW4nOiAndHJ1ZSdcbiAgICAgICAgfVxuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICdcXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyB7ez0gaXQuY3NzQ2xhc3MgfX1cIj5cXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XFxcbiAgICAgICAgICAgICAgICAgICAge3s/IGl0LnRpdGxlIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PyBpdC5jbG9zZS5idXR0b24gfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1sLWJpbmQ9XCJbZXZlbnRzXTpjbG9zZUJ0blwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCI+JnRpbWVzOzwvYnV0dG9uPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+e3s9IGl0LnRpdGxlIH19PC9oND5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAgICAgICAgICB7ez8gaXQuaHRtbCB8fCBpdC50ZXh0IH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgbWwtYmluZD1cIltjb250YWluZXJdOmRpYWxvZ0JvZHlcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PyBpdC5odG1sIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s9IGl0Lmh0bWwgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Pz99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPnt7PSBpdC50ZXh0IH19PC9wPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAgICAgICAgICB7ez8gaXQuYnV0dG9ucyAmJiBpdC5idXR0b25zLmxlbmd0aCB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e34gaXQuYnV0dG9ucyA6YnRuIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXt7PSBidG4udHlwZSB9fXt7PyBidG4uY2xzIH19IHt7PSBidG4uY2xzIH19e3s/fX1cIlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbC1iaW5kPVwiW2V2ZW50c106e3s9IGJ0bi5uYW1lIH19XCI+e3s9IGJ0bi5sYWJlbCB9fTwvYnV0dG9uPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3t+fX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcXG4gICAgICAgICAgICA8L2Rpdj4nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxEaWFsb2cpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRGlhbG9nO1xuXG5cbl8uZXh0ZW5kKE1MRGlhbG9nLCB7XG4gICAgY3JlYXRlRGlhbG9nOiBNTERpYWxvZyQkY3JlYXRlRGlhbG9nLFxuICAgIG9wZW5EaWFsb2c6IE1MRGlhbG9nJCRvcGVuRGlhbG9nLFxuICAgIGdldE9wZW5lZERpYWxvZzogTUxEaWFsb2ckJGdldE9wZW5lZERpYWxvZ1xufSk7XG5cblxuXy5leHRlbmRQcm90byhNTERpYWxvZywge1xuICAgIG9wZW5EaWFsb2c6IE1MRGlhbG9nJG9wZW5EaWFsb2csXG4gICAgY2xvc2VEaWFsb2c6IE1MRGlhbG9nJGNsb3NlRGlhbG9nLFxuICAgIGRlc3Ryb3k6IE1MRGlhbG9nJGRlc3Ryb3lcbn0pO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgcmV0dXJucyBkaWFsb2cgaW5zdGFuY2UuIFRvIGNyZWF0ZSBhbmQgb3BlbiBhdCB0aGUgc2FtZSB0aW1lIFtvcGVuRGlhbG9nXSgjTUxEaWFsb2ckJG9wZW5EaWFsb2cpXG4gKiBgb3B0aW9uc2AgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgICB0aXRsZTogb3B0aW9uYWwgZGlhbG9nIHRpdGxlXG4gKiAgICAgaHRtbDogb3B0aW9uYWwgZGlhbG9nIHRleHQgYXMgaHRtbCAod2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0ZXh0IGlmIGJvdGggdGV4dCBuZCBodG1sIGFyZSBwYXNzZWQpXG4gKiAgICAgICBvclxuICogICAgIHRleHQ6IG9wdGlvbmFsIGRpYWxvZyB0ZXh0XG4gKiAgICAgY2xvc2U6IG9wdGlvbmFsIGZhbHNlIHRvIHByZXZlbnQgYmFja2Ryb3AgYW5kIGVzYyBrZXkgZnJvbSBjbG9zaW5nIHRoZSBkaWFsb2cgYW5kIHJlbW92aW5nIGNsb3NlIGJ1dHRvbiBpbiB0b3AgcmlnaHQgY29ybmVyXG4gKiAgICAgICAgICAgIG9yIHRydWUgKGRlZmF1bHQpIHRvIGVuYWJsZSBhbGwgY2xvc2Ugb3B0aW9uc1xuICogICAgICAgICAgICBvciBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzXG4gKiAgICAgICAgIGJhY2tkcm9wOiBmYWxzZSBvciB0cnVlIChkZWZhdWx0KSwgY2xvc2UgZGlhbG9nIHdoZW4gYmFja2Ryb3AgY2xpY2tlZFxuICogICAgICAgICBrZXlib2FyZDogZmFsc2Ugb3IgdHJ1ZSAoZGVmYXVsdCksIGNsb3NlIGRpYWxvZyB3aGVuIGVzYyBrZXkgaXMgcHJlc3NlZFxuICogICAgICAgICBidXR0b246IGZhbHNlIG9yIHRydWUgKGRlZmF1bHQpLCBzaG93IGNsb3NlIGJ1dHRvbiBpbiB0aGUgaGVhZGVyICh3b24ndCBiZSBzaG93biBpZiB0aGVyZSBpcyBubyBoZWFkZXIgd2hlbiB0aXRsZSBpcyBub3QgcGFzc2VkKVxuICogICAgIGJ1dHRvbnM6IG9wdGlvbmFsIGFycmF5IG9mIGJ1dHRvbnMgY29uZmlndXJhdGlvbnMsIHdoZXJlIGVhY2ggYnV0dG9uIGNvbmZpZyBpcyBhbiBvYmplY3RcbiAqICAgICAgICAgbmFtZTogICBvcHRpb25hbCBuYW1lIG9mIGNvbXBvbmVudCwgc2hvdWxkIGJlIHVuaXF1ZSBhbmQgc2hvdWxkIG5vdCBiZSBgY2xvc2VCdG5gLCBpZiBub3QgcGFzc2VkIGEgdGltZXN0YW1wIGJhc2VkIG5hbWUgd2lsbCBiZSB1c2VkXG4gKiAgICAgICAgIHR5cGU6ICAgYnV0dG9uIHR5cGUsIHdpbGwgZGV0ZXJtaW5lIGJ1dHRvbiBDU1Mgc3R5bGUuIFBvc3NpYmxlIHR5cGVzIGFyZTogZGVmdWx0LCBwcmltYXJ5LCBzdWNjZXNzLCBpbmZvLCB3YXJuaW5nLCBkYW5nZXIsIGxpbmsgKG1hcCB0byByZWxhdGVkIGJvb3RzdHJhcCBidXR0b24gc3R5bGVzKVxuICogICAgICAgICBsYWJlbDogIGJ1dHRvbiBsYWJlbFxuICogICAgICAgICBjbG9zZTogIG9wdGlvbmFsIGZhbHNlIHRvIHByZXZlbnQgdGhpcyBidXR0b24gZnJvbSBjbG9zaW5nIGRpYWxvZ1xuICogICAgICAgICByZXN1bHQ6IHN0cmluZyB3aXRoIGRpYWxvZyBjbG9zZSByZXN1bHQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBkaWFsb2cgc3Vic2NyaWJlciBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyXG4gKiAgICAgICAgIGRhdGE6ICAgYW55IHZhbHVlL29iamVjdCBvciBmdW5jdGlvbiB0byBjcmVhdGUgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGRpYWxvZyBzdWJzY3JpYmVyIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLlxuICogICAgICAgICAgICAgICAgIElmIGZ1bmN0aW9uIGlzIHBhc3NlZCBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGRpYWxvZyBhcyBjb250ZXh0IGFuZCBidXR0b24gb3B0aW9ucyBhcyBwYXJhbWV0ZXIuXG4gKlxuICogICAgIElmIGB0aXRsZWAgaXMgbm90IHBhc3NlZCwgZGlhbG9nIHdpbGwgbm90IGhhdmUgdGl0bGUgc2VjdGlvblxuICogICAgIElmIG5laXRoZXIgYHRleHRgIG5vciBgaHRtbGAgaXMgcGFzc2VkLCBkaWFsb2cgd2lsbCBub3QgaGF2ZSBib2R5IHNlY3Rpb24uXG4gKiAgICAgSWYgYGJ1dHRvbnNgIGFyZSBub3QgcGFzc2VkLCB0aGVyZSB3aWxsIG9ubHkgYmUgT0sgYnV0dG9uLlxuICpcbiAqIFdoZW4gZGlhbG9nIGlzIGNsb3NlZCwgdGhlIHN1YnNjcmliZXIgaXMgY2FsbGVkIHdpdGggcmVhdWx0IGFuZCBvcHRpb25hbCBkYXRhIGFzIGRlZmluZWQgaW4gYnV0dG9ucyBjb25maWd1cmF0aW9ucy5cbiAqIElmIGJhY2tkcm9wIGlzIGNsaWNrZWQgb3IgRVNDIGtleSBpcyBwcmVzc2VkIHRoZSByZXN1bHQgd2lsbCBiZSAnZGlzbWlzc2VkJ1xuICogSWYgY2xvc2UgYnV0dG9uIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyIGlzIGNsaWNrZWQsIHRoZSByZXN1bHQgd2lsbCBiZSAnY2xvc2VkJyAoZGVmYXVsdCByZXN1bHQpXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgZGlhbG9nIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGluaXRpYWxpemUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZGlhbG9nXG4gKi9cbmZ1bmN0aW9uIE1MRGlhbG9nJCRjcmVhdGVEaWFsb2cob3B0aW9ucywgaW5pdGlhbGl6ZSkge1xuICAgIGNoZWNrKG9wdGlvbnMsIHtcbiAgICAgICAgdGl0bGU6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgIGh0bWw6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgIHRleHQ6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgIGNsb3NlOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihCb29sZWFuLCB7XG4gICAgICAgICAgICBiYWNrZHJvcDogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbiksXG4gICAgICAgICAgICBrZXlib2FyZDogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbiksXG4gICAgICAgICAgICBidXR0b246IE1hdGNoLk9wdGlvbmFsKEJvb2xlYW4pXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnV0dG9uczogTWF0Y2guT3B0aW9uYWwoWyB7XG4gICAgICAgICAgICBuYW1lOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgbGFiZWw6IFN0cmluZyxcbiAgICAgICAgICAgIGNsb3NlOiBNYXRjaC5PcHRpb25hbChCb29sZWFuKSxcbiAgICAgICAgICAgIHJlc3VsdDogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgICAgIGRhdGE6IE1hdGNoLk9wdGlvbmFsKE1hdGNoLkFueSksXG4gICAgICAgICAgICBjbHM6IE1hdGNoLk9wdGlvbmFsKFN0cmluZylcbiAgICAgICAgfSBdKSxcbiAgICAgICAgY3NzQ2xhc3M6IE1hdGNoLk9wdGlvbmFsKFN0cmluZylcbiAgICB9KTtcblxuICAgIHZhciBkaWFsb2cgPSBNTERpYWxvZy5jcmVhdGVPbkVsZW1lbnQoKTtcblxuICAgIG9wdGlvbnMgPSBfcHJlcGFyZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgZGlhbG9nLl9kaWFsb2cgPSB7XG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgfTtcblxuICAgIGRpYWxvZy50ZW1wbGF0ZVxuICAgICAgICAucmVuZGVyKG9wdGlvbnMpXG4gICAgICAgIC5iaW5kZXIoKTtcblxuICAgIHZhciBkaWFsb2dTY29wZSA9IGRpYWxvZy5jb250YWluZXIuc2NvcGU7XG5cbiAgICBpZiAob3B0aW9ucy5jbG9zZS5iYWNrZHJvcClcbiAgICAgICAgZGlhbG9nLmV2ZW50cy5vbignY2xpY2snLFxuICAgICAgICAgICAgeyBzdWJzY3JpYmVyOiBfb25CYWNrZHJvcENsaWNrLCBjb250ZXh0OiBkaWFsb2cgfSk7XG5cbiAgICBpZiAob3B0aW9ucy50aXRsZSAmJiBvcHRpb25zLmNsb3NlLmJ1dHRvbilcbiAgICAgICAgZGlhbG9nU2NvcGUuY2xvc2VCdG4uZXZlbnRzLm9uKCdjbGljaycsXG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9vbkNsb3NlQnRuQ2xpY2ssIGNvbnRleHQ6IGRpYWxvZyB9KTtcblxuICAgIG9wdGlvbnMuYnV0dG9ucy5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICB2YXIgYnV0dG9uU3Vic2NyaWJlciA9IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXI6IF8ucGFydGlhbChfZGlhbG9nQnV0dG9uQ2xpY2ssIGJ0biksXG4gICAgICAgICAgICBjb250ZXh0OiBkaWFsb2dcbiAgICAgICAgfTtcbiAgICAgICAgZGlhbG9nU2NvcGVbYnRuLm5hbWVdLmV2ZW50cy5vbignY2xpY2snLCBidXR0b25TdWJzY3JpYmVyKTtcbiAgICB9KTtcblxuICAgIGlmIChpbml0aWFsaXplKSBpbml0aWFsaXplKGRpYWxvZyk7XG4gICAgcmV0dXJuIGRpYWxvZztcbn1cblxuXG5mdW5jdGlvbiBfZGlhbG9nQnV0dG9uQ2xpY2soYnV0dG9uKSB7XG4gICAgaWYgKGJ1dHRvbi5jbG9zZSAhPT0gZmFsc2UpXG4gICAgICAgIF90b2dnbGVEaWFsb2cuY2FsbCh0aGlzLCBmYWxzZSk7XG5cbiAgICB2YXIgZGF0YSA9IF8ucmVzdWx0KGJ1dHRvbi5kYXRhLCB0aGlzLCBidXR0b24pO1xuICAgIF9kaXNwYXRjaFJlc3VsdC5jYWxsKHRoaXMsIGJ1dHRvbi5yZXN1bHQsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9kaXNwYXRjaFJlc3VsdChyZXN1bHQsIGRhdGEpIHtcbiAgICB2YXIgc3Vic2NyaWJlciA9IHRoaXMuX2RpYWxvZy5zdWJzY3JpYmVyO1xuICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlciA9PSAnZnVuY3Rpb24nKVxuICAgICAgICBzdWJzY3JpYmVyLmNhbGwodGhpcywgcmVzdWx0LCBkYXRhKTtcbiAgICBlbHNlXG4gICAgICAgIHN1YnNjcmliZXIuc3Vic2NyaWJlci5jYWxsKHN1YnNjcmliZXIuY29udGV4dCwgcmVzdWx0LCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBfb25CYWNrZHJvcENsaWNrKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09IHRoaXMuZWwpXG4gICAgICAgIHRoaXMuY2xvc2VEaWFsb2coJ2Rpc21pc3NlZCcpO1xufVxuXG5cbmZ1bmN0aW9uIF9vbkNsb3NlQnRuQ2xpY2soKSB7XG4gICAgdGhpcy5jbG9zZURpYWxvZygnY2xvc2VkJyk7XG59XG5cblxuZnVuY3Rpb24gX29uS2V5RG93bihldmVudCkge1xuICAgIGlmIChvcGVuZWREaWFsb2dcbiAgICAgICAgICAgICYmIG9wZW5lZERpYWxvZy5fZGlhbG9nLm9wdGlvbnMuY2xvc2Uua2V5Ym9hcmRcbiAgICAgICAgICAgICYmIGV2ZW50LmtleUNvZGUgPT0gMjcpIC8vIGVzYyBrZXlcbiAgICAgICAgb3BlbmVkRGlhbG9nLmNsb3NlRGlhbG9nKCdkaXNtaXNzZWQnKTtcbn1cblxuXG5mdW5jdGlvbiBfcHJlcGFyZU9wdGlvbnMob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBfLmNsb25lKG9wdGlvbnMpO1xuICAgIG9wdGlvbnMuYnV0dG9ucyA9IF8uY2xvbmUob3B0aW9ucy5idXR0b25zIHx8IERFRkFVTFRfQlVUVE9OUyk7XG4gICAgb3B0aW9ucy5idXR0b25zLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5uYW1lID0gYnRuLm5hbWUgfHwgY29tcG9uZW50TmFtZSgpO1xuICAgIH0pO1xuXG4gICAgb3B0aW9ucy5jbG9zZSA9IHR5cGVvZiBvcHRpb25zLmNsb3NlID09ICd1bmRlZmluZWQnIHx8IG9wdGlvbnMuY2xvc2UgPT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXy5vYmplY3QoQ0xPU0VfT1BUSU9OUywgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZW9mIG9wdGlvbnMuY2xvc2UgPT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF8ubWFwVG9PYmplY3QoQ0xPU0VfT1BUSU9OUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ob3B0KSB7IHJldHVybiBvcHRpb25zLmNsb3NlW29wdF0gIT09IGZhbHNlOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXy5vYmplY3QoQ0xPU0VfT1BUSU9OUywgZmFsc2UpO1xuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5cblxuLyoqXG4gKiBDcmVhdGUgYW5kIHNob3cgZGlhbG9nIHBvcHVwXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgb2JqZWN0IHdpdGggdGl0bGUsIHRleHQgYW5kIGJ1dHRvbnMuIFNlZSBbY3JlYXRlRGlhbG9nXSgjTUxEaWFsb2ckJGNyZWF0ZURpYWxvZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gc3Vic2NyaWJlciBvcHRpb25hbCBzdWJzY3JpYmVyIGZ1bmN0aW9uIG9yIG9iamVjdCB0aGF0IGlzIHBhc3NlZCByZXN1bHQgYW5kIG9wdGlvbmFsIGRhdGEuIFVubGVzcyBjb250ZXh0IGlzIGRlZmluZWQsIGRpYWxvZyB3aWxsIGJlIHRoZSBjb250ZXh0LlxuICovXG5mdW5jdGlvbiBNTERpYWxvZyQkb3BlbkRpYWxvZyhvcHRpb25zLCBzdWJzY3JpYmVyLCBpbml0aWFsaXplKSB7XG4gICAgdmFyIGRpYWxvZyA9IE1MRGlhbG9nLmNyZWF0ZURpYWxvZyhvcHRpb25zLCBpbml0aWFsaXplKTtcbiAgICBkaWFsb2cub3BlbkRpYWxvZyhzdWJzY3JpYmVyKTtcbiAgICByZXR1cm4gZGlhbG9nO1xufVxuXG5cblxuZnVuY3Rpb24gX3RvZ2dsZURpYWxvZyhkb1Nob3cpIHtcbiAgICBkb1Nob3cgPSB0eXBlb2YgZG9TaG93ID09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyAhIHRoaXMuX2RpYWxvZy52aXNpYmxlXG4gICAgICAgICAgICAgICAgOiAhISBkb1Nob3c7XG5cbiAgICB2YXIgYWRkUmVtb3ZlID0gZG9TaG93ID8gJ2FkZCcgOiAncmVtb3ZlJ1xuICAgICAgICAsIGFwcGVuZFJlbW92ZSA9IGRvU2hvdyA/ICdhcHBlbmRDaGlsZCcgOiAncmVtb3ZlQ2hpbGQnO1xuXG4gICAgdGhpcy5fZGlhbG9nLnZpc2libGUgPSBkb1Nob3c7XG5cbiAgICBpZiAoZG9TaG93ICYmICEgZGlhbG9nc0luaXRpYWxpemVkKVxuICAgICAgICBfaW5pdGlhbGl6ZURpYWxvZ3MoKTtcblxuICAgIGRvY3VtZW50LmJvZHlbYXBwZW5kUmVtb3ZlXSh0aGlzLmVsKTtcbiAgICBpZiAoYmFja2Ryb3BFbClcbiAgICAgICAgZG9jdW1lbnQuYm9keVthcHBlbmRSZW1vdmVdKGJhY2tkcm9wRWwpO1xuICAgIHRoaXMuZG9tLnRvZ2dsZShkb1Nob3cpO1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICFkb1Nob3cpO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0W2FkZFJlbW92ZV0oJ21vZGFsLW9wZW4nKTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdFthZGRSZW1vdmVdKCdpbicpO1xuXG4gICAgb3BlbmVkRGlhbG9nID0gZG9TaG93ID8gdGhpcyA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVsW2RvU2hvdyA/ICdmb2N1cycgOiAnYmx1ciddKCk7XG59XG5cblxudmFyIGRpYWxvZ3NJbml0aWFsaXplZCwgYmFja2Ryb3BFbDtcblxuZnVuY3Rpb24gX2luaXRpYWxpemVEaWFsb2dzKCkge1xuICAgIGJhY2tkcm9wRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBiYWNrZHJvcEVsLmNsYXNzTmFtZSA9ICdtb2RhbC1iYWNrZHJvcCBmYWRlIGluJztcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX29uS2V5RG93bik7XG4gICAgZGlhbG9nc0luaXRpYWxpemVkID0gdHJ1ZTtcbn1cblxuXG52YXIgb3BlbmVkRGlhbG9nO1xuXG4vKipcbiAqIE9wZW5zIGRpYWxvZyBpbnN0YW5jZS5cbiAqIFN1YnNjcmliZXIgb2JqZWN0IHNob3VsZCBoYXZlIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgc3Vic2NyaWJlciBmb3IgdGhlIE1lc3NlbmdlciAoYWx0aG91Z2ggTWVzc2VuZ2VyIGlzIG5vdCB1c2VkKSAtIGVpdGhlciBmdW5jdGlvbiBvciBvYmplY3Qgd2l0aCBzdWJzY3JpYmVyIGFuZCBjb250ZXh0IHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IHN1YnNjcmliZXIgc3Vic2NyaWJlciBvYmplY3RcbiAqL1xuZnVuY3Rpb24gTUxEaWFsb2ckb3BlbkRpYWxvZyhzdWJzY3JpYmVyKSB7XG4gICAgY2hlY2soc3Vic2NyaWJlciwgTWF0Y2guT25lT2YoRnVuY3Rpb24sIHsgc3Vic2NyaWJlcjogRnVuY3Rpb24sIGNvbnRleHQ6IE1hdGNoLkFueSB9KSk7XG5cbiAgICBpZiAob3BlbmVkRGlhbG9nKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ01MRGlhbG9nIG9wZW5EaWFsb2c6IGNhblxcJ3Qgb3BlbiBkaWFsb2csIGFub3RoZXIgZGlhbG9nIGlzIGFscmVhZHkgb3BlbicpO1xuXG4gICAgdGhpcy5fZGlhbG9nLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuICAgIF90b2dnbGVEaWFsb2cuY2FsbCh0aGlzLCB0cnVlKTtcbn1cblxuXG4vKipcbiAqIENsb3NlcyBkaWFsb2cgaW5zdGFuY2UsIG9wdGlvbmFsbHkgcGFzc2luZyByZXN1bHQgYW5kIGRhdGEgdG8gZGlhbG9nIHN1YnNjcmliZXIuXG4gKiBJZiBubyByZXN1bHQgaXMgcGFzc2VkLCAnY2xvc2VkJyB3aWxsIGJlIHBhc3NlZCB0byBzdWJzY3JpYmVyLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByZXN1bHQgZGlhbG9nIHJlc3VsdCwgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gc3ViY3NyaWJlclxuICogQHBhcmFtIHtBbnl9IGRhdGEgb3B0aW9uYWwgZGlhbG9nIGRhdGEsIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBzdWJzY3JpYmVyXG4gKi9cbmZ1bmN0aW9uIE1MRGlhbG9nJGNsb3NlRGlhbG9nKHJlc3VsdCwgZGF0YSkge1xuICAgIGlmICghIG9wZW5lZERpYWxvZylcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdNTERpYWxvZyBjbG9zZURpYWxvZzogY2FuXFwndCBjbG9zZSBkaWFsb2csIG5vIGRpYWxvZyBvcGVuJyk7XG5cbiAgICByZXN1bHQgPSByZXN1bHQgfHwgJ2Nsb3NlZCc7XG5cbiAgICBfdG9nZ2xlRGlhbG9nLmNhbGwodGhpcywgZmFsc2UpO1xuICAgIF9kaXNwYXRjaFJlc3VsdC5jYWxsKHRoaXMsIHJlc3VsdCwgZGF0YSk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGN1cnJlbnRseSBvcGVuZWQgZGlhbG9nXG4gKlxuICogQHJldHVybiB7TUxEaWFsb2d9XG4gKi9cbmZ1bmN0aW9uIE1MRGlhbG9nJCRnZXRPcGVuZWREaWFsb2coKSB7XG4gICAgcmV0dXJuIG9wZW5lZERpYWxvZztcbn1cblxuXG5mdW5jdGlvbiBNTERpYWxvZyRkZXN0cm95KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfb25LZXlEb3duKTtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uLy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vLi4vY19yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBET01MaXN0ZW5lcnMgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlsL2RvbV9saXN0ZW5lcnMnKTtcblxuXG52YXIgVE9HR0xFX0NTU19DTEFTUyA9ICdkcm9wZG93bi10b2dnbGUnXG4gICAgLCBNRU5VX0NTU19DTEFTUyA9ICdkcm9wZG93bi1tZW51JztcblxuXG52YXIgTUxEcm9wZG93biA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxEcm9wZG93bicsIHtcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiBbJ21sLWJzLWRyb3Bkb3duJywgJ2Ryb3Bkb3duJ11cbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERyb3Bkb3duKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTERyb3Bkb3duO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxEcm9wZG93biwge1xuICAgIHN0YXJ0OiBNTERyb3Bkb3duJHN0YXJ0LFxuICAgIGRlc3Ryb3k6IE1MRHJvcGRvd24kZGVzdHJveSxcbiAgICB0b2dnbGVNZW51OiBNTERyb3Bkb3duJHRvZ2dsZU1lbnUsXG4gICAgc2hvd01lbnU6IE1MRHJvcGRvd24kc2hvd01lbnUsXG4gICAgaGlkZU1lbnU6IE1MRHJvcGRvd24kaGlkZU1lbnVcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kc3RhcnQoKSB7XG4gICAgdmFyIHRvZ2dsZUVsID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuJyArIFRPR0dMRV9DU1NfQ0xBU1MpXG4gICAgICAgICwgbWVudUVsID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuJyArIE1FTlVfQ1NTX0NMQVNTKTtcblxuICAgIGlmICghICh0b2dnbGVFbCAmJiBtZW51RWwpKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdNTERyb3Bkb3duOicsIFRPR0dMRV9DU1NfQ0xBU1MsICdvcicsIE1FTlVfQ1NTX0NMQVNTLCAnaXNuXFwndCBmb3VuZCcpO1xuXG4gICAgdmFyIGRvYyA9IHdpbmRvdy5kb2N1bWVudFxuICAgICAgICAsIGNsaWNrSGFuZGxlciA9IHRoaXMudG9nZ2xlTWVudS5iaW5kKHRoaXMsIHVuZGVmaW5lZCk7XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gbmV3IERPTUxpc3RlbmVycztcbiAgICB0aGlzLl9kcm9wZG93biA9IHtcbiAgICAgICAgbWVudTogbWVudUVsLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9O1xuICAgIHRoaXMuaGlkZU1lbnUoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBsaXN0ZW5lcnMuYWRkKHRvZ2dsZUVsLCAnY2xpY2snLCBjbGlja0hhbmRsZXIpO1xuICAgIC8vbWF5YmUgb25seSBhZGQgdGhpcyBldmVudHMgaWYgaXMgb3Blbj9cbiAgICBsaXN0ZW5lcnMuYWRkKGRvYywgJ21vdXNlb3V0Jywgb25Eb2NPdXQpO1xuICAgIGxpc3RlbmVycy5hZGQoZG9jLCAnY2xpY2snLCBvbkNsaWNrKTtcblxuXG4gICAgZnVuY3Rpb24gb25Eb2NPdXQoZXZlbnQpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldFxuICAgICAgICAgICAgLCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldFxuICAgICAgICAgICAgLCBsaXN0ZW5lcnMgPSBzZWxmLl9kcm9wZG93bi5saXN0ZW5lcnM7XG5cbiAgICAgICAgaWYgKGlzSWZyYW1lKHRhcmdldCkpXG4gICAgICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKHRhcmdldC5jb250ZW50V2luZG93LmRvY3VtZW50LCAnY2xpY2snLCBvbkNsaWNrKTtcblxuICAgICAgICBpZiAoaXNJZnJhbWUocmVsYXRlZFRhcmdldCkpXG4gICAgICAgICAgICBsaXN0ZW5lcnMuYWRkKHJlbGF0ZWRUYXJnZXQuY29udGVudFdpbmRvdy5kb2N1bWVudCwgJ2NsaWNrJywgb25DbGljayk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25DbGljayhldmVudCkge1xuICAgICAgICBpZiAoIXNlbGYuZWwuY29udGFpbnMoZXZlbnQudGFyZ2V0KSlcbiAgICAgICAgICAgIHNlbGYuaGlkZU1lbnUoKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gaXNJZnJhbWUoZWwpIHtcbiAgICByZXR1cm4gZWwgJiYgZWwudGFnTmFtZSA9PSAnSUZSQU1FJztcbn1cblxuXG5mdW5jdGlvbiBNTERyb3Bkb3duJGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZHJvcGRvd24ubGlzdGVuZXJzLnJlbW92ZUFsbCgpO1xuICAgIGRlbGV0ZSB0aGlzLl9kcm9wZG93bjtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBNTERyb3Bkb3duJHNob3dNZW51KCkge1xuICAgIHRoaXMudG9nZ2xlTWVudSh0cnVlKTtcbn1cblxuXG5mdW5jdGlvbiBNTERyb3Bkb3duJGhpZGVNZW51KCkge1xuICAgIHRoaXMudG9nZ2xlTWVudShmYWxzZSk7XG59XG5cblxuZnVuY3Rpb24gTUxEcm9wZG93biR0b2dnbGVNZW51KGRvU2hvdykge1xuICAgIGRvU2hvdyA9IHR5cGVvZiBkb1Nob3cgPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/ICEgdGhpcy5fZHJvcGRvd24udmlzaWJsZVxuICAgICAgICAgICAgICAgIDogISEgZG9TaG93O1xuXG4gICAgdGhpcy5fZHJvcGRvd24udmlzaWJsZSA9IGRvU2hvdztcblxuICAgIHZhciBtZW51ID0gdGhpcy5fZHJvcGRvd24ubWVudTtcbiAgICBtZW51LnN0eWxlLmRpc3BsYXkgPSBkb1Nob3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdibG9jaydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdub25lJztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vLyA8YSBuYW1lPVwiY29uZmlnXCI+PC9hPlxuLy8gbWlsby5jb25maWdcbi8vIC0tLS0tLS0tLS0tXG5cbi8vIEl0IGlzIHRoZSBmdW5jdGlvbiB0aGF0IGFsbG93cyB0byBjaGFuZ2UgbWlsbyBjb25maWd1cmF0aW9ucyBhbmQgYWxzb1xuLy8gYWNjZXNzIHRoZW0gb24gY29uZmlnJ3MgcHJvcGVydGllcy5cblxuLy8gYGBgamF2YXNjcmlwdFxuLy8gbWlsby5jb25maWcoe1xuLy8gICAgIGF0dHJzOiB7XG4vLyAgICAgICAgIGJpbmQ6ICdtbC1iaW5kJyxcbi8vICAgICAgICAgbG9hZDogJ21sLWxvYWQnXG4vLyAgICAgfVxuLy8gfSk7XG4vLyBgYGBcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBkb1QgPSBtaWxvQ29yZS51dGlsLmRvVDtcblxuXG52YXIgY29uZmlnID0gbW9kdWxlLmV4cG9ydHMgPSBtaWxvQ29yZS5jb25maWc7XG5cblxuY29uZmlnKHtcbiAgICBhdHRyczoge1xuICAgICAgICBiaW5kOiAnbWwtYmluZCcsXG4gICAgICAgIGxvYWQ6ICdtbC1sb2FkJ1xuICAgIH0sXG4gICAgY29tcG9uZW50UmVmOiAnX19fbWlsb19jb21wb25lbnQnLFxuICAgIGNvbXBvbmVudFByZWZpeDogJ21pbG9fJyxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICBjb21waWxlOiBkb1QuY29tcGlsZVxuICAgIH0sXG4gICAgZG9tU3RvcmFnZToge1xuICAgICAgICB0eXBlU3VmZml4OiAnOl9fX21pbG9fZGF0YV90eXBlJyxcbiAgICAgICAgcHJlZml4U2VwYXJhdG9yOiAnLycsXG4gICAgICAgIHJvb3Q6ICcnLFxuICAgICAgICBtZXNzYWdlS2V5OiAnX19fbWlsb19tZXNzYWdlLycsXG4gICAgICAgIG1lc3NhZ2VUaW1lc3RhbXA6ICdfX19taWxvX3RpbWVzdGFtcCcsXG4gICAgICAgIHF1b3RhRXhjZWVkZWQ6IHtcbiAgICAgICAgICAgIHRocm93RXJyb3I6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBmYWxzZVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkcmFnRHJvcDoge1xuICAgICAgICBkYXRhVHlwZXM6IHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogJ3gtYXBwbGljYXRpb24vbWlsby9jb21wb25lbnQnLFxuICAgICAgICAgICAgY29tcG9uZW50TWV0YVRlbXBsYXRlOiAneC1hcHBsaWNhdGlvbi9taWxvL2NvbXBvbmVudC1tZXRhLyVjbGFzcy8lbmFtZS8lcGFyYW1zJyxcbiAgICAgICAgICAgIGNvbXBvbmVudE1ldGFSZWdleDogL154XFwtYXBwbGljYXRpb25cXC9taWxvXFwvY29tcG9uZW50XFwtbWV0YVxcLyhbYS16MC05XSspXFwvKFthLXowLTldKylcXC8oW2EtejAtOV0qKSQvLFxuICAgICAgICB9XG4gICAgfSxcbiAgICByZXF1ZXN0OiB7XG4gICAgICAgIGpzb25wVGltZW91dDogNjAwMDAsXG4gICAgICAgIGpzb25wQ2FsbGJhY2tQcmVmaXg6ICdfX19taWxvX2NhbGxiYWNrXycsXG4gICAgICAgIG9wdGlvbnNLZXk6ICdfX19taWxvX29wdGlvbnMnLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgdGltZW91dDogNjAwMDBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgd2Vic29ja2V0OiB7XG4gICAgICAgIHJwYzoge1xuICAgICAgICAgICAgdGltZW91dDogMTUwMDAsXG4gICAgICAgICAgICByZXNwb25zZVByZWZpeDogJ3Jlc3BvbnNlXydcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGVwcmVjYXRpb25XYXJuaW5nOiAnb25jZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvTWFpbCA9IHJlcXVpcmUoJy4vc2VydmljZXMvbWFpbCcpXG4gICAgLCByZXF1ZXN0ID0gcmVxdWlyZSgnLi91dGlsL3JlcXVlc3QnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgdXRpbERvbSA9IHJlcXVpcmUoJy4vdXRpbC9kb20nKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKVxuICAgICwgTG9hZEF0dHJpYnV0ZSA9IHJlcXVpcmUoJy4vYXR0cmlidXRlcy9hX2xvYWQnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGxvYWRlcjtcblxuLyoqXG4gKiBgbWlsby5sb2FkZXJgXG4gKiBcbiAqIFJlY3Vyc2l2ZWx5IHNjYW5zIHRoZSBkb2N1bWVudCB0cmVlIGluc2lkZSBgcm9vdEVsYCAoZG9jdW1lbnQuYm9keSBieSBkZWZhdWx0KSBsb29raW5nIGZvciBfX21sLWxvYWRfXyBAYXR0cmlidXRlLlxuICogT25lIGxldmVsIGxvYWQgaXMgZXhlY3V0ZWQuIE5vIGFkZGl0aW9uYWwgbG9hZGVyIGdldCBjYWxsZWQgb24gaW5zaWRlIF9fbWwtbG9hZF9fIGF0dHJpYnV0ZXMuIFxuICpcbiAqIFBvc3NpYmxlIHVzYWdlczpcbiAqIC0gbWlsby5sb2FkZXIoW215Um9vdEVsLF1bbXlSZW1vdmVBdHRyaWJ1dGUsXW15Q2FsbGJhY2spXG4gKiBcbiAqIEBwYXJhbSAge0VsZW1lbnR9ICByb290RWwgICAgICAgICAgUm9vdCBlbGVtZW50IGluc2lkZSB3aGljaCBET00gd2lsbCBiZSBzY2FubmVkIChkb2N1bWVudC5ib2R5IGJ5IGRlZmF1bHQpLlxuICogQHBhcmFtICB7Qm9vbGVhbn0gIHJlbW92ZUF0dHJpYnV0ZSBJZiBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgX19tbC1sb2FkX18gYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIGxvYWRlciBoYXMgYmVlbiBleGVjdXRlZCAoRmFsc2UgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2sgICAgICAgIENhbGxiYWNrIHRvIGNhbGwgYWZ0ZXIgYWxsIGVsZW1lbnRzIGdldCBsb2FkZWQgKFJlcXVpcmVkKS5cbiAqL1xuZnVuY3Rpb24gbG9hZGVyKHJvb3RFbCwgcmVtb3ZlQXR0cmlidXRlLCBjYWxsYmFjaykge1xuICAgIG1pbG8oZnVuY3Rpb24oKSB7XG4gICAgICAgIF9sb2FkZXIocm9vdEVsLCByZW1vdmVBdHRyaWJ1dGUsIGNhbGxiYWNrKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBfbG9hZGVyKHJvb3RFbCwgcmVtb3ZlQXR0cmlidXRlLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygcm9vdEVsID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2FsbGJhY2sgPSByb290RWw7XG4gICAgICAgIHJvb3RFbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmVtb3ZlQXR0cmlidXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZW1vdmVBdHRyaWJ1dGUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjayA9IHJlbW92ZUF0dHJpYnV0ZTtcbiAgICAgICAgcmVtb3ZlQXR0cmlidXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcm9vdEVsID0gcm9vdEVsIHx8IGRvY3VtZW50LmJvZHk7XG5cbiAgICBtaWxvTWFpbC5wb3N0TWVzc2FnZSgnbG9hZGVyJywgeyBzdGF0ZTogJ3N0YXJ0ZWQnIH0pO1xuICAgIF9sb2FkVmlld3NJbkVsZW1lbnQocm9vdEVsLCByZW1vdmVBdHRyaWJ1dGUsIGZ1bmN0aW9uKHZpZXdzKSB7XG4gICAgICAgIG1pbG9NYWlsLnBvc3RNZXNzYWdlKCdsb2FkZXInLCB7IFxuICAgICAgICAgICAgc3RhdGU6ICdmaW5pc2hlZCcsXG4gICAgICAgICAgICB2aWV3czogdmlld3NcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbGxiYWNrKHZpZXdzKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBfbG9hZFZpZXdzSW5FbGVtZW50KHJvb3RFbCwgcmVtb3ZlQXR0cmlidXRlLCBjYWxsYmFjaykge1xuICAgIHZhciBsb2FkRWxlbWVudHMgPSByb290RWwuZ2V0QXR0cmlidXRlKGNvbmZpZy5hdHRycy5sb2FkKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbcm9vdEVsXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiByb290RWwucXVlcnlTZWxlY3RvckFsbCgnWycgKyBjb25maWcuYXR0cnMubG9hZCArICddJyk7XG5cbiAgICB2YXIgdmlld3MgPSB7fVxuICAgICAgICAsIHRvdGFsQ291bnQgPSBsb2FkRWxlbWVudHMubGVuZ3RoXG4gICAgICAgICwgbG9hZGVkQ291bnQgPSAwO1xuXG4gICAgXy5mb3JFYWNoKGxvYWRFbGVtZW50cywgZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIGxvYWRWaWV3KGVsLCByZW1vdmVBdHRyaWJ1dGUsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgdmlld3NbZWwuaWRdID0gZXJyIHx8IGVsO1xuICAgICAgICAgICAgbG9hZGVkQ291bnQrKztcbiAgICAgICAgICAgIGlmIChsb2FkZWRDb3VudCA9PSB0b3RhbENvdW50KVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZpZXdzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5cbmZ1bmN0aW9uIGxvYWRWaWV3KGVsLCByZW1vdmVBdHRyaWJ1dGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHV0aWxEb20uY2hpbGRyZW4oZWwpLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IGxvYWQgaHRtbCBpbnRvIGVsZW1lbnQgdGhhdCBpcyBub3QgZW1wdHknKTtcblxuICAgIHZhciBhdHRyID0gbmV3IExvYWRBdHRyaWJ1dGUoZWwpO1xuXG4gICAgYXR0ci5wYXJzZSgpLnZhbGlkYXRlKCk7XG5cbiAgICByZXF1ZXN0LmdldChhdHRyLmxvYWRVcmwsIGZ1bmN0aW9uKGVyciwgaHRtbCkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlIHx8ICdjYW5cXCd0IGxvYWQgZmlsZSAnICsgYXR0ci5sb2FkVXJsO1xuICAgICAgICAgICAgLy8gbG9nZ2VyLmVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBlbC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICBpZiAocmVtb3ZlQXR0cmlidXRlKSBMb2FkQXR0cmlidXRlLnJlbW92ZShlbCk7XG4gICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbi8vIHJlZ2lzdGVyIGluY2x1ZGVkIGZhY2V0c1xucmVxdWlyZSgnLi91c2VfZmFjZXRzJyk7XG5cbi8vIHJlZ2lzdGVyIGluY2x1ZGVkIGNvbXBvbmVudHNcbnJlcXVpcmUoJy4vdXNlX2NvbXBvbmVudHMnKTtcblxuXG4vKipcbiAqIGBtaWxvYFxuICpcbiAqIEEgbWluaW1hbGlzdCBicm93c2VyIGZyYW1ld29yayB0aGF0IGJpbmRzIERPTSBlbGVtZW50cyB0byBKUyBjb21wb25lbnRzIGFuZCBjb21wb25lbnRzIHRvIG1vZGVscy5cbiAqXG4gKiBgbWlsb2AgaXMgYXZhaWxhYmxlIGFzIGdsb2JhbCBvYmplY3QgaW4gdGhlIGJyb3dzZXIuXG4gKiBBdCB0aGUgbW9tZW50IGl0IGlzIG5vdCBwb3NzaWlibGUgdG8gcmVxdWlyZSBpdCB3aXRoIGJyb3dzZXJpZnkgdG8gaGF2ZSBpdCBidW5kbGVkIHdpdGggdGhlIGFwcCBiZWNhdXNlIG9mIHRoZSB3YXkgW2JyZnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zdWJzdGFjay9icmZzKSBicm93c2VyaWZ5IHBsdWdpbiBpcyBpbXBsZW1lbnRlZC5cbiAqIEl0IGlzIHBvc3NpYmxlIHRob3VnaCB0byByZXF1aXJlIGBtaWxvYCB3aXRoIG5vZGUgdG8gdXNlIHVuaXZlcnNhbCBwYXJ0cyBvZiB0aGUgZnJhbWV3b3JrIChhYnN0cmFjdCBjbGFzc2VzLCBNZXNzZW5nZXIsIE1vZGVsLCBldGMuKTpcbiAqIGBgYFxuICogdmFyIG1pbG8gPSByZXF1aXJlKCdtaWxvanMnKTtcbiAqIGBgYFxuICogXG4gKiBgbWlsb2AgaXRzZWxmIGlzIGEgZnVuY3Rpb24gdGhhdCBpbiB0aGUgYnJvd3NlciBjYW4gYmUgdXNlZCB0byBkZWxheSBleGVjdXRpb24gdW50aWwgRE9NIGlzIHJlYWR5LlxuICovXG5mdW5jdGlvbiBtaWxvKGZ1bmMpIHtcbiAgICBtaWxvLnV0aWwuZG9tUmVhZHkoZnVuYyk7XG59XG5cblxuLyoqXG4gKiAjIyMjTWlsbyBwYWNrYWdlcyMjIyNcbiAqXG4gKiAtIFtsb2FkZXJdKC4vbG9hZGVyLmpzLmh0bWwpIC0gbG9hZGluZyBzdWJ2aWV3cyBpbnRvIHBhZ2VcbiAqIC0gW2JpbmRlcl0oLi9iaW5kZXIuanMuaHRtbCkgLSBjb21wb25lbnRzIGluc3RhbnRpYXRpb24gYW5kIGJpbmRpbmcgb2YgRE9NIGVsZW1lbnRzIHRvIHRoZW1cbiAqIC0gW21pbmRlcl0oLi9taW5kZXIuanMuaHRtbCkgLSBkYXRhIHJlYWN0aXZpdHksIG9uZSBvciB0d28gd2F5LCBzaGFsbG93IG9yIGRlZXAsIGFzIHlvdSBsaWtlIGl0XG4gKiAtIFttYWlsXSguL21haWwvaW5kZXguanMuaHRtbCkgLSBhcHBsaWNhaXRvbiBsZXZlbCBtZXNzZW5nZXIsIGFsc28gY29ubmVjdHMgdG8gbWVzc2FnZXMgZnJvbSBvdGhlciB3aW5kb3dzIGRpc3BhdGNoZWQgd2l0aCBgd2luZG93LnBvc3RNZXNzYWdlYC5cbiAqIC0gW2NvbmZpZ10oLi9jb25maWcuanMuaHRtbCkgLSBtaWxvIGNvbmZpZ3VyYXRpb25cbiAqIC0gW3V0aWxdKC4vdXRpbC9pbmRleC5qcy5odG1sKSAtIGxvZ2dlciwgcmVxdWVzdCwgZG9tLCBjaGVjaywgZXJyb3IsIGV0Yy5cbiAqIC0gW2NsYXNzZXNdKC4vY2xhc3Nlcy5qcy5odG1sKSAtIGFic3RyYWN0IGFuZCBiYXNlIGNsYXNzZXNcbiAqIC0gW2F0dHJpYnV0ZXNdKC4vYXR0cmlidXRlcy9pbmRleC5qcy5odG1sKSAtIGNsYXNzZXMgdGhhdCB3cmFwIERPTSBlbGVtZW50cyBhdHRyaWJ1dGVzIHJlY29nbml6ZWQgYnkgbWlsb1xuICogLSBbQ29tcG9uZW50RmFjZXRdKC4vY29tcG9uZW50cy9jX2ZhY2V0LmpzLmh0bWwpIC0gYmFzZSBjbGFzcyBvZiBDb21wb25lbnQgZmFjZXRcbiAqIC0gW0NvbXBvbmVudF0oLi9jb21wb25lbnRzL2NfY2xhc3MuanMuaHRtbCkgLSBiYXNlIENvbXBvbmVudCBjbGFzc1xuICogLSBbTWVzc2VuZ2VyXSguL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSAtIGdlbmVyaWMgTWVzc2VuZ2VyIHVzZWQgaW4gbW9zdCBvdGhlciBtaWxvIGNsYXNzZXMsIGNhbiBiZSBtaXhlZCBpbnRvIGFwcCBjbGFzc2VzIHRvby5cbiAqIC0gW01vZGVsXSguL21vZGVsL2luZGV4LmpzLmh0bWwpIC0gTW9kZWwgY2xhc3MgdGhhdCBlbWl0cyBtZXNzYWdlcyBvbiBjaGFuZ2VzIHRvIGFueSBkZXB0aCB3aXRob3V0IHRpbWVyIGJhc2VkIHdhdGNoaW5nXG4gKiAtIFtyZWdpc3RyeV0oLi9yZWdpc3RyeS5qcy5odG1sKSAtIHJlZ2lzdHJpZXMgb2YgZmFzZXRzIGFuZCBjb21wb25lbnRzIGNsYXNzZXNcbiAqL1xuXy5leHRlbmQobWlsbywge1xuICAgIE1lc3NlbmdlcjogbWlsb0NvcmUuTWVzc2VuZ2VyLFxuICAgIE1vZGVsOiBtaWxvQ29yZS5Nb2RlbCxcbiAgICBtaW5kZXI6IG1pbG9Db3JlLm1pbmRlcixcbiAgICBsb2FkZXI6IHJlcXVpcmUoJy4vbG9hZGVyJyksXG4gICAgYmluZGVyOiByZXF1aXJlKCcuL2JpbmRlcicpLFxuICAgIG1haWw6IHJlcXVpcmUoJy4vc2VydmljZXMvbWFpbCcpLFxuICAgIHdpbmRvdzogcmVxdWlyZSgnLi9zZXJ2aWNlcy93aW5kb3cnKSxcbiAgICBjb25maWc6IHJlcXVpcmUoJy4vY29uZmlnJyksXG4gICAgdXRpbDogcmVxdWlyZSgnLi91dGlsJyksXG4gICAgY2xhc3NlczogcmVxdWlyZSgnLi9jbGFzc2VzJyksXG4gICAgYXR0cmlidXRlczogcmVxdWlyZSgnLi9hdHRyaWJ1dGVzJyksXG4gICAgQ29tcG9uZW50RmFjZXQ6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0JyksXG4gICAgQ29tcG9uZW50OiByZXF1aXJlKCcuL2NvbXBvbmVudHMvY19jbGFzcycpLFxuICAgIENvbW1hbmQ6IHJlcXVpcmUoJy4vY29tbWFuZCcpLFxuICAgIHJlZ2lzdHJ5OiByZXF1aXJlKCcuL3JlZ2lzdHJ5JyksXG4gICAgbWlsb192ZXJzaW9uOiAnMC4yLjUnLFxuICAgIGNyZWF0ZUNvbXBvbmVudENsYXNzOiByZXF1aXJlKCcuL3V0aWwvY3JlYXRlX2NvbXBvbmVudF9jbGFzcycpLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3lcbn0pO1xuXG5cbi8vIGV4cG9ydCBmb3Igbm9kZS9icm93c2VyaWZ5XG5pZiAodHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykgICAgXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBtaWxvO1xuXG4vLyBnbG9iYWwgbWlsbyBmb3IgYnJvd3NlclxuaWYgKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcpIHtcbiAgICB3aW5kb3cubWlsbyA9IG1pbG87XG4gICAgbWlsby5tYWlsLnRyaWdnZXIoJ21pbG9yZWFkeScpO1xufVxuXG5cbmZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgbWlsb0NvcmUuZGVzdHJveSgpO1xuICAgIG1pbG8ubWFpbC5kZXN0cm95KCk7XG4gICAgbWlsby53aW5kb3cuZGVzdHJveSgpO1xuICAgIG1pbG8udXRpbC5kZXN0cm95KCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmVnaXN0cmllcyBvZiBmYWNldHMgYW5kIG9mIGNvbXBvbmVudHNcbiAqXG4gKiAtIFtmYWNldHNdKC4vY29tcG9uZW50cy9jX2ZhY2V0cy9jZl9yZWdpc3RyeS5qcy5odG1sKVxuICogLSBbY29tcG9uZW50c10oLi9jb21wb25lbnRzL2NfcmVnaXN0cnkuanMuaHRtbClcbiAqL1xudmFyIHJlZ2lzdHJ5ID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZmFjZXRzOiByZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvY2ZfcmVnaXN0cnknKSxcbiAgICBjb21wb25lbnRzOiByZXF1aXJlKCcuL2NvbXBvbmVudHMvY19yZWdpc3RyeScpLFxuICAgIGNvbW1hbmRzOiByZXF1aXJlKCcuL2NvbW1hbmQvY21kX3JlZ2lzdHJ5Jylcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIDxhIG5hbWU9XCJjb21wb25lbnRzLWRvbS1jb25zdHJ1Y3RvcnNcIj48L2E+XG4vLyAjIyNkb20gZXZlbnRzIGNvbnN0cnVjdG9yc1xuXG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvUmVmZXJlbmNlL0V2ZW50c1xuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgICBDbGlwYm9hcmRFdmVudDogWydjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdiZWZvcmVjb3B5JywgJ2JlZm9yZWN1dCcsICdiZWZvcmVwYXN0ZSddLFxuICAgIEV2ZW50OiBbJ2lucHV0JywgJ3JlYWR5c3RhdGVjaGFuZ2UnXSxcbiAgICBGb2N1c0V2ZW50OiBbJ2ZvY3VzJywgJ2JsdXInLCAnZm9jdXNpbicsICdmb2N1c291dCddLFxuICAgIEtleWJvYXJkRXZlbnQ6IFsna2V5ZG93bicsICdrZXlwcmVzcycsICAna2V5dXAnXSxcbiAgICBNb3VzZUV2ZW50OiBbJ2NsaWNrJywgJ2NvbnRleHRtZW51JywgJ2RibGNsaWNrJywgJ21vdXNlZG93bicsICdtb3VzZXVwJyxcbiAgICAgICAgICAgICAgICAgJ21vdXNlZW50ZXInLCAnbW91c2VsZWF2ZScsICdtb3VzZW1vdmUnLCAnbW91c2VvdXQnLCAnbW91c2VvdmVyJyxcbiAgICAgICAgICAgICAgICAgJ3Nob3cnIC8qIGNvbnRleHQgbWVudSAqL10sXG4gICAgVG91Y2hFdmVudDogWyd0b3VjaHN0YXJ0JywgJ3RvdWNoZW5kJywgJ3RvdWNobW92ZScsICd0b3VjaGVudGVyJywgJ3RvdWNobGVhdmUnLCAndG91Y2hjYW5jZWwnXSxcbn07XG5cblxuLy8gbW9jayB3aW5kb3cgYW5kIGV2ZW50IGNvbnN0cnVjdG9ycyBmb3IgdGVzdGluZ1xuaWYgKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpXG4gICAgdmFyIGdsb2JhbCA9IHdpbmRvdztcbmVsc2Uge1xuICAgIGdsb2JhbCA9IHt9O1xuICAgIF8uZWFjaEtleShldmVudFR5cGVzLCBmdW5jdGlvbihlVHlwZXMsIGV2ZW50Q29uc3RydWN0b3JOYW1lKSB7XG4gICAgICAgIHZhciBldmVudENvbnN0cnVjdG9yID0gXy5tYWtlRnVuY3Rpb24oZXZlbnRDb25zdHJ1Y3Rvck5hbWUsICd0eXBlJywgJ3Byb3BlcnRpZXMnLFxuICAgICAgICAgICAgJ3RoaXMudHlwZSA9IHR5cGU7IF8uZXh0ZW5kKHRoaXMsIHByb3BlcnRpZXMpOycpO1xuICAgICAgICBnbG9iYWxbZXZlbnRDb25zdHJ1Y3Rvck5hbWVdID0gZXZlbnRDb25zdHJ1Y3RvcjtcbiAgICB9KTtcbn1cblxuXG52YXIgZG9tRXZlbnRzQ29uc3RydWN0b3JzID0ge307XG5cbl8uZWFjaEtleShldmVudFR5cGVzLCBmdW5jdGlvbihlVHlwZXMsIGV2ZW50Q29uc3RydWN0b3JOYW1lKSB7XG4gICAgZVR5cGVzLmZvckVhY2goZnVuY3Rpb24odHlwZSkge1xuICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5KGRvbUV2ZW50c0NvbnN0cnVjdG9ycywgdHlwZSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2R1cGxpY2F0ZSBldmVudCB0eXBlICcgKyB0eXBlKTtcblxuICAgICAgICBkb21FdmVudHNDb25zdHJ1Y3RvcnNbdHlwZV0gPSBnbG9iYWxbZXZlbnRDb25zdHJ1Y3Rvck5hbWVdO1xuICAgIH0pO1xufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBkb21FdmVudHNDb25zdHJ1Y3RvcnM7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvY19jbGFzcycpXG4gICAgLCBkb21FdmVudHNDb25zdHJ1Y3RvcnMgPSByZXF1aXJlKCcuL2RlX2NvbnN0cnMnKSAvLyBUT0RPIG1lcmdlIHdpdGggRE9NRXZlbnRTb3VyY2UgPz9cbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG52YXIgRE9NRW1pdHRlclNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2FnZVNvdXJjZSwgJ0RPTUVtaXR0ZXJTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKERPTUVtaXR0ZXJTb3VyY2UsIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICBpbml0OiBpbml0LFxuICAgIGRlc3Ryb3k6IERPTUVtaXR0ZXJTb3VyY2UkZGVzdHJveSxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBfLnBhcnRpYWwoc291cmNlU3Vic2NyaWJlck1ldGhvZCwgJ2FkZEV2ZW50TGlzdGVuZXInKSxcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiBfLnBhcnRpYWwoc291cmNlU3Vic2NyaWJlck1ldGhvZCwgJ3JlbW92ZUV2ZW50TGlzdGVuZXInKSxcbiAgICBwb3N0TWVzc2FnZTogRE9NRW1pdHRlclNvdXJjZSRwb3N0TWVzc2FnZSxcbiAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuXG4gICAgLy8gY2xhc3Mgc3BlY2lmaWMgbWV0aG9kc1xuICAgIGVtaXR0ZXI6IGVtaXR0ZXIsXG4gICAgaGFuZGxlRXZlbnQ6IGhhbmRsZUV2ZW50LCAgLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NRW1pdHRlclNvdXJjZTtcblxuXG52YXIgdXNlQ2FwdHVyZVBhdHRlcm4gPSAvX19jYXB0dXJlJC9cbiAgICAsIHVzZUNhcHR1cmVQb3N0Zml4ID0gJ19fY2FwdHVyZSc7XG5cblxuLy8gaW5pdCBET00gZXZlbnQgc291cmNlXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJT3JDbGFzcywgZXZlbnRFbWl0dGVyKSB7XG4gICAgdGhpcy5ldmVudEVtaXR0ZXIgPSBldmVudEVtaXR0ZXI7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIERPTUVtaXR0ZXJTb3VyY2UkZGVzdHJveSgpIHtcbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgZGVsZXRlIHRoaXMuZXZlbnRFbWl0dGVyO1xufVxuXG5cbi8vIGdldCBET00gZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyO1xufVxuXG5cbmZ1bmN0aW9uIHNvdXJjZVN1YnNjcmliZXJNZXRob2QobWV0aG9kLCBldmVudFR5cGUpIHtcbiAgICBpZiAoISAoZXZlbnRUeXBlICYmIHR5cGVvZiBldmVudFR5cGUgPT0gJ3N0cmluZycpKSByZXR1cm47XG4gICAgdmFyIGNhcHR1cmUgPSB1c2VDYXB0dXJlUGF0dGVybi50ZXN0KGV2ZW50VHlwZSk7XG4gICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlLnJlcGxhY2UodXNlQ2FwdHVyZVBhdHRlcm4sICcnKTtcbiAgICB0aGlzLmVtaXR0ZXIoKVttZXRob2RdKGV2ZW50VHlwZSwgdGhpcywgY2FwdHVyZSk7XG59XG5cblxuLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxuZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICB2YXIgaXNDYXB0dXJlUGhhc2U7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIGlzQ2FwdHVyZVBoYXNlID0gZXZlbnQuZXZlbnRQaGFzZSA9PSB3aW5kb3cuRXZlbnQuQ0FQVFVSSU5HX1BIQVNFO1xuXG4gICAgaWYgKGlzQ2FwdHVyZVBoYXNlKVxuICAgICAgICBldmVudCArPSB1c2VDYXB0dXJlUG9zdGZpeDtcblxuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKGV2ZW50LnR5cGUsIGV2ZW50KTtcbn1cblxuXG5mdW5jdGlvbiBET01FbWl0dGVyU291cmNlJHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZVN5bmMobWVzc2FnZSwgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gdHJpZ2dlcihldmVudFR5cGUsIHByb3BlcnRpZXMpIHtcbiAgICBjaGVjayhldmVudFR5cGUsIFN0cmluZyk7XG4gICAgY2hlY2socHJvcGVydGllcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG5cbiAgICBldmVudFR5cGUgPSBldmVudFR5cGUucmVwbGFjZSh1c2VDYXB0dXJlUGF0dGVybiwgJycpO1xuICAgIHZhciBFdmVudENvbnN0cnVjdG9yID0gZG9tRXZlbnRzQ29uc3RydWN0b3JzW2V2ZW50VHlwZV07XG5cbiAgICBpZiAodHlwZW9mIEV2ZW50Q29uc3RydWN0b3IgIT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBldmVudCB0eXBlJyk7XG5cbiAgICAvLyBjaGVjayBpZiBpdCBpcyBjb3JyZWN0XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0aWVzICE9ICd1bmRlZmluZWQnKVxuICAgICAgICBwcm9wZXJ0aWVzLnR5cGUgPSBldmVudFR5cGU7XG5cbiAgICB2YXIgZG9tRXZlbnQgPSBuZXcgRXZlbnRDb25zdHJ1Y3RvcihldmVudFR5cGUsIHByb3BlcnRpZXMpO1xuICAgIHZhciBub3RDYW5jZWxsZWQgPSB0aGlzLmVtaXR0ZXIoKS5kaXNwYXRjaEV2ZW50KGRvbUV2ZW50KTtcbiAgICByZXR1cm4gbm90Q2FuY2VsbGVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLm1haWxgXG4gKiBJdCBpcyBhbiBhcHBsaWNhdGlvbiBsZXZlbCBtZXNzZW5nZXIgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZiBNZXNzZW5nZXIgY2xhc3MuXG4gKlxuICogQXQgdGhlIG1vbWVudCwgaW4gYWRkaXRpb24gdG8gYXBwbGljYXRpb24gbWVzc2FnZXMgdGhhdCB5b3UgZGVmaW5lLCB5b3UgY2FuIHN1YnNjcmliZSB0byBfX2RvbXJlYWR5X18gbWVzc2FnZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gZmlyZSBvbmNlLFxuICogZXZlbiBpZiBET00gd2FzIHJlYWR5IGF0IHRoZSB0aW1lIG9mIHRoZSBzdWJzY3JpcHRpb24uXG4gKlxuICogTWVzc2FnaW5nIGJldHdlZW4gZnJhbWVzIGlzIGF2YWlsYWJsZSB2aWEgbWlsby5tYWlsLiBTZWUgW0ZyYW1lIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0ZyYW1lLmpzLmh0bWwpLlxuICpcbiAqIFNlZSBbTWVzc2VuZ2VyXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkuXG4gKiBcbioqL1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIE1haWxNc2dBUEkgPSByZXF1aXJlKCcuL21haWxfYXBpJylcbiAgICAsIE1haWxNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi9tYWlsX3NvdXJjZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIG1pbG9NYWlsID0gbmV3IE1lc3NlbmdlcjtcblxudmFyIG1haWxNc2dTb3VyY2UgPSBuZXcgTWFpbE1lc3NhZ2VTb3VyY2UobWlsb01haWwsIHsgdHJpZ2dlcjogJ3RyaWdnZXInIH0sIG5ldyBNYWlsTXNnQVBJKTtcblxubWlsb01haWwuX3NldE1lc3NhZ2VTb3VyY2UobWFpbE1zZ1NvdXJjZSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBtaWxvTWFpbDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlckFQSSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2VuZ2VyQVBJXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgTWFpbE1zZ0FQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyQVBJLCAnTWFpbE1zZ0FQSScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTWFpbE1zZ0FQSSwge1xuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxuICAgIGZpbHRlclNvdXJjZU1lc3NhZ2U6IGZpbHRlclNvdXJjZU1lc3NhZ2Vcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1haWxNc2dBUEk7XG5cblxuLy8gVE9ETzogdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHJlbGV2YW50IERPTSBldmVudCBkZXBlbmRlbnQgb24gZWxlbWVudCB0YWdcbi8vIENhbiBhbHNvIGltcGxlbWVudCBiZWZvcmVkYXRhY2hhbmdlZCBldmVudCB0byBhbGxvdyBwcmV2ZW50aW5nIHRoZSBjaGFuZ2Vcbi8vIHRyYW5zbGF0ZVRvRG9tRXZlbnRcbnZhciB3aW5kb3dNZXNzYWdlUmVnRXhwID0gL15tZXNzYWdlXFw6L1xuICAgICwgd2luZG93TWVzc2FnZVByZWZpeCA9ICdtZXNzYWdlOic7XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgaWYgKG1lc3NhZ2UgPT0gJ2RvbXJlYWR5JylcbiAgICAgICAgcmV0dXJuICdyZWFkeXN0YXRlY2hhbmdlJztcbiAgICBlbHNlIGlmICh3aW5kb3dNZXNzYWdlUmVnRXhwLnRlc3QobWVzc2FnZSkpXG4gICAgICAgIHJldHVybiAnbWVzc2FnZSc7XG59XG5cblxuLy8gZmlsdGVyRGF0YU1lc3NhZ2VcbmZ1bmN0aW9uIGZpbHRlclNvdXJjZU1lc3NhZ2Uoc291cmNlTWVzc2FnZSwgbXNnVHlwZSwgbXNnRGF0YSkge1xuICAgIGlmIChzb3VyY2VNZXNzYWdlID09ICdyZWFkeXN0YXRlY2hhbmdlJykge1xuICAgICAgICAvL3JldHVybiBkb2N1bWVudC5yZWFkeVN0YXRlID09ICdpbnRlcmFjdGl2ZSc7XG4gICAgICAgIC8vICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19kb21SZWFkeUZpcmVkJywgdHJ1ZSwgXy5XUklUKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNZXNzYWdlID09ICdtZXNzYWdlJylcbiAgICAgICAgcmV0dXJuIHdpbmRvd01lc3NhZ2VQcmVmaXggKyBtc2dEYXRhLmRhdGEudHlwZSA9PSBtc2dUeXBlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIGRvbUV2ZW50c0NvbnN0cnVjdG9ycyA9IHJlcXVpcmUoJy4uL2RlX2NvbnN0cnMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cblxudmFyIE1haWxNZXNzYWdlU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnTWFpbE1lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKE1haWxNZXNzYWdlU291cmNlLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogYWRkU291cmNlU3Vic2NyaWJlcixcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHRyaWdnZXI6IHRyaWdnZXIsXG5cbiAgICAvLyBjbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgX3dpbmRvd1N1YnNjcmliZXJNZXRob2Q6IF93aW5kb3dTdWJzY3JpYmVyTWV0aG9kLFxuICAgIGhhbmRsZUV2ZW50OiBoYW5kbGVFdmVudCwgIC8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbn0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWFpbE1lc3NhZ2VTb3VyY2U7XG5cblxuZnVuY3Rpb24gYWRkU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgaWYgKGlzUmVhZHlTdGF0ZUNoYW5nZShzb3VyY2VNZXNzYWdlKSkge1xuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAnbG9hZGluZycpXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgdGhpcywgZmFsc2UpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBFdmVudENvbnN0cnVjdG9yID0gZG9tRXZlbnRzQ29uc3RydWN0b3JzLnJlYWR5c3RhdGVjaGFuZ2U7XG4gICAgICAgICAgICB2YXIgZG9tRXZlbnQgPSBuZXcgRXZlbnRDb25zdHJ1Y3RvcigncmVhZHlzdGF0ZWNoYW5nZScsIHsgdGFyZ2V0OiBkb2N1bWVudCB9KTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKCdyZWFkeXN0YXRlY2hhbmdlJywgZG9tRXZlbnQpO1xuICAgICAgICB9XG4gICAgfSBlbHNlXG4gICAgICAgIHRoaXMuX3dpbmRvd1N1YnNjcmliZXJNZXRob2QoJ2FkZEV2ZW50TGlzdGVuZXInLCBzb3VyY2VNZXNzYWdlKTtcbn1cblxuXG5mdW5jdGlvbiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICBpZiAoaXNSZWFkeVN0YXRlQ2hhbmdlKHNvdXJjZU1lc3NhZ2UpKVxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgdGhpcywgZmFsc2UpO1xuICAgIGVsc2UgXG4gICAgICAgIHRoaXMuX3dpbmRvd1N1YnNjcmliZXJNZXRob2QoJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCBzb3VyY2VNZXNzYWdlKTtcbn1cblxuXG5mdW5jdGlvbiBpc1JlYWR5U3RhdGVDaGFuZ2Uoc291cmNlTWVzc2FnZSkge1xuICAgIHJldHVybiBzb3VyY2VNZXNzYWdlID09ICdyZWFkeXN0YXRlY2hhbmdlJyAmJiB0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCc7XG59XG5cbmZ1bmN0aW9uIGlzV2luZG93TWVzc2FnZShzb3VyY2VNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2UgPT0gJ21lc3NhZ2UnICYmIHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCc7XG59XG5cbmZ1bmN0aW9uIF93aW5kb3dTdWJzY3JpYmVyTWV0aG9kKG1ldGhvZCwgc291cmNlTWVzc2FnZSkge1xuICAgIGlmIChpc1dpbmRvd01lc3NhZ2Uoc291cmNlTWVzc2FnZSkpXG4gICAgICAgIHdpbmRvd1ttZXRob2RdKCdtZXNzYWdlJywgdGhpcywgZmFsc2UpO1xufVxuXG5cbi8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbmZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgdGhpcy5kaXNwYXRjaE1lc3NhZ2UoZXZlbnQudHlwZSwgZXZlbnQpO1xufVxuXG5cbmZ1bmN0aW9uIHRyaWdnZXIobXNnVHlwZSwgZGF0YSkge1xuICAgIGRhdGEgPSBkYXRhIHx8IHt9O1xuICAgIGRhdGEudHlwZSA9ICdtZXNzYWdlOicgKyBtc2dUeXBlO1xuICAgIFxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnKVxuICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoZGF0YSwgJyonKVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIERPTUVtaXR0ZXJTb3VyY2UgPSByZXF1aXJlKCcuL2RvbV9zb3VyY2UnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbnZhciB3aW5kb3dTZXJ2aWNlID0gbmV3IE1lc3NlbmdlcjtcbnZhciBkb21FbWl0dGVyU291cmNlID0gbmV3IERPTUVtaXR0ZXJTb3VyY2Uod2luZG93U2VydmljZSwgeyB0cmlnZ2VyOiAndHJpZ2dlcicgfSwgdW5kZWZpbmVkLCB3aW5kb3cpO1xud2luZG93U2VydmljZS5fc2V0TWVzc2FnZVNvdXJjZShkb21FbWl0dGVyU291cmNlKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1NlcnZpY2U7XG5cblxuXy5leHRlbmQod2luZG93U2VydmljZSwge1xuICAgIGlzVG9wOiB3aW5kb3dTZXJ2aWNlX2lzVG9wXG59KTtcblxuXG5mdW5jdGlvbiB3aW5kb3dTZXJ2aWNlX2lzVG9wKCkge1xuICAgIHJldHVybiB3aW5kb3cudG9wID09IHdpbmRvdy5zZWxmIHx8IHdpbmRvdy5fX2thcm1hX187XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jbGFzc2VzL1ZpZXcnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9Hcm91cCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1dyYXBwZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9UZXh0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvU2VsZWN0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvSW5wdXQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9JbnB1dExpc3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9UZXh0YXJlYScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1JhZGlvR3JvdXAnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9CdXR0b24nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9IeXBlcmxpbmsnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9MaXN0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvTGlzdEl0ZW0nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9UaW1lJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvRGF0ZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0NvbWJvJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvU3VwZXJDb21ibycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0NvbWJvTGlzdCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0ltYWdlJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvRHJvcFRhcmdldCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0ZvbGRUcmVlJyk7XG5cbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9ib290c3RyYXAvRHJvcGRvd24nKTtcbi8vIHJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9ib290c3RyYXAvRGlhbG9nJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9Eb20nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvRnJhbWUnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9FdmVudHMnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9PcHRpb25zJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvVGVtcGxhdGUnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9Db250YWluZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9Nb2RlbEZhY2V0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvRHJhZycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0Ryb3AnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9MaXN0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvSXRlbScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL1RyYW5zZmVyJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1bmlxdWVJZCA9IHJlcXVpcmUoJy4vdW5pcXVlX2lkJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBwcmVmaXggPSBjb25maWcuY29tcG9uZW50UHJlZml4O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gY29tcG9uZW50TmFtZTtcblxuXG5mdW5jdGlvbiBjb21wb25lbnROYW1lKCkge1xuICAgIHJldHVybiBwcmVmaXggKyB1bmlxdWVJZCgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIGNvbXBvbmVudFJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cy9jX3JlZ2lzdHJ5Jyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVDb21wb25lbnRDbGFzcztcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYW5kIHJlZ2lzdGVycyBuZXcgbWlsbyBjb21wb25lbnQuICBUaGUgY29tcG9uZW50IGNyZWF0ZWQgd2lsbCBoYXZlXG4gKiBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgY2xhc3MgdXNlZCBpbiBpdHMgY3JlYXRpb24gKEFjY2Vzc2FibGUgdXNpbmcgPENvbXBvbmVudENsYXNzPi5zdXBlcikuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZy5jbGFzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbmV3IGNvbXBvbmVudFxuICogQHBhcmFtIHtzdHJpbmd9IFsnQ29tcG9uZW50J10gY29uZmlnLnN1cGVyQ2xhc3NOYW1lIC0gVGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgY29tcG9uZW50IHRvIGJlIHVzZWQgYXMgdGhlIG5ldyBjb21wb25lbnQncyBzdXBlciBjbGFzc1xuICogQHBhcmFtIHtvYmplY3Q9fSBjb25maWcuZmFjZXRzIC0gRmFjZXQgY29uZmlndXJhdGlvbiAoSGFzaCBvZiBmYWNldCBuYW1lIHtzdHJpbmd9IHRvIGNvbmZpZyB7b2JqZWN0fSlcbiAqIEBwYXJhbSB7b2JqZWN0PX0gY29uZmlnLm1ldGhvZHMgLSBNZXRob2RzIG9mIHRoZSBuZXcgY29tcG9uZW50IChIYXNoIG9mIGZ1bmN0aW9uIG5hbWUge3N0cmluZ30gdG8gZnVuY3Rpb24ge2Z1bmN0aW9ufSlcbiAqIEBwYXJhbSB7b2JqZWN0PX0gY29uZmlnLnN0YXRpY01ldGhvZHMgLSBTdGF0aWMgbWV0aG9kcyBvZiB0aGUgbmV3IGNvbXBvbmVudCAoSGFzaCBvZiBmdW5jdGlvbiBuYW1lIHtzdHJpbmd9IHRvIGZ1bmN0aW9uIHtmdW5jdGlvbn0pXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudENsYXNzKGNvbmZpZykge1xuICAgIGNoZWNrKGNvbmZpZywge1xuICAgICAgICBzdXBlckNsYXNzTmFtZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY2xhc3NOYW1lOiBTdHJpbmcsXG4gICAgICAgIGZhY2V0czogTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSxcbiAgICAgICAgbWV0aG9kczogTWF0Y2guT3B0aW9uYWwoTWF0Y2guT2JqZWN0SGFzaChGdW5jdGlvbikpLFxuICAgICAgICBzdGF0aWNNZXRob2RzOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PYmplY3RIYXNoKEZ1bmN0aW9uKSksXG4gICAgfSk7XG4gICAgdmFyIFN1cGVyQ2xhc3MgPSBjb21wb25lbnRSZWdpc3RyeS5nZXQoY29uZmlnLnN1cGVyQ2xhc3NOYW1lIHx8ICdDb21wb25lbnQnKTtcbiAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBTdXBlckNsYXNzLmNyZWF0ZUNvbXBvbmVudENsYXNzKGNvbmZpZy5jbGFzc05hbWUsIGNvbmZpZy5mYWNldHMpO1xuXG4gICAgaWYgKGNvbmZpZy5tZXRob2RzKSBfLmV4dGVuZFByb3RvKENvbXBvbmVudENsYXNzLCBjb25maWcubWV0aG9kcyk7XG5cbiAgICBpZiAoY29uZmlnLnN0YXRpY01ldGhvZHMpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5zdGF0aWNNZXRob2RzLnN1cGVyICE9PSB1bmRlZmluZWQpIHRocm93ICdcXCdzdXBlclxcJyBpcyBhIHJlc2VydmVkIGtleXdvcmQnO1xuICAgICAgICBfLmV4dGVuZChDb21wb25lbnRDbGFzcywgY29uZmlnLnN0YXRpY01ldGhvZHMpO1xuICAgIH1cblxuICAgIENvbXBvbmVudENsYXNzLnN1cGVyID0gU3VwZXJDbGFzcy5wcm90b3R5cGU7XG4gICAgY29tcG9uZW50UmVnaXN0cnkuYWRkKENvbXBvbmVudENsYXNzKTtcbiAgICByZXR1cm4gQ29tcG9uZW50Q2xhc3M7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVwcmVjYXRlKGZuLCBtZXNzYWdlKSB7XG4gICAgdmFyIHdhcm5lZDtcbiAgICBzd2l0Y2ggKHR5cGVvZiBmbikge1xuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgcmV0dXJuIF8ubWFwS2V5cyhmbiwgZnVuY3Rpb24oZikgeyByZXR1cm4gZGVwcmVjYXRlKGYsIG1lc3NhZ2UpOyB9KTtcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBmbilcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVkW3Byb3BdID0gZGVwcmVjYXRlKGZuW3Byb3BdLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiBkZXByZWNhdGVkO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZuO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5kZXByZWNhdGlvbldhcm5pbmdcbiAgICAgICAgICAgICYmICghd2FybmVkIHx8IGNvbmZpZy5kZXByZWNhdGlvbldhcm5pbmcgPT0gJ2Fsd2F5cycpKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSB8fCAnRnVuY3Rpb24gJyArIGZuLm5hbWUgKyAnIGlzIERFUFJFQ0FURUQnKTtcbiAgICAgICAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cbnZhciBkb21VdGlscyA9IHtcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgZmlsdGVyTm9kZUxpc3RCeVR5cGU6IGZpbHRlck5vZGVMaXN0QnlUeXBlLFxuICAgIGNvbnRhaW5pbmdFbGVtZW50OiBjb250YWluaW5nRWxlbWVudCxcbiAgICBzZWxlY3RFbGVtZW50Q29udGVudHM6IHNlbGVjdEVsZW1lbnRDb250ZW50cyxcbiAgICBzZWxlY3RFbGVtZW50VGV4dDogc2VsZWN0RWxlbWVudFRleHQsXG4gICAgZ2V0RWxlbWVudE9mZnNldDogZ2V0RWxlbWVudE9mZnNldCxcbiAgICBzZXRDYXJldFBvc2l0aW9uOiBzZXRDYXJldFBvc2l0aW9uLFxuICAgIGdldFNlbGVjdGlvbkRpcmVjdGlvbjogZ2V0U2VsZWN0aW9uRGlyZWN0aW9uLFxuICAgIHNldFNlbGVjdGlvbjogc2V0U2VsZWN0aW9uLFxuICAgIGNsZWFyU2VsZWN0aW9uOiBjbGVhclNlbGVjdGlvbixcbiAgICByZW1vdmVFbGVtZW50OiByZW1vdmVFbGVtZW50LFxuICAgIHVud3JhcEVsZW1lbnQ6IHVud3JhcEVsZW1lbnQsXG4gICAgd3JhcEluRWxlbWVudDogd3JhcEluRWxlbWVudCxcbiAgICBkZXRhY2hDb21wb25lbnQ6IGRldGFjaENvbXBvbmVudCxcbiAgICBmaXJzdFRleHROb2RlOiBmaXJzdFRleHROb2RlLFxuICAgIGxhc3RUZXh0Tm9kZTogbGFzdFRleHROb2RlLFxuICAgIHRyaW1Ob2RlUmlnaHQ6IHRyaW1Ob2RlUmlnaHQsXG4gICAgdHJpbU5vZGVMZWZ0OiB0cmltTm9kZUxlZnQsXG4gICAgc3RyaXBIdG1sOiBzdHJpcEh0bWwsXG4gICAgaHRtbEVudGl0aWVzOiBodG1sRW50aXRpZXMsXG4gICAgd2Fsa1RyZWU6IHdhbGtUcmVlLFxuICAgIGNyZWF0ZVRyZWVXYWxrZXI6IGNyZWF0ZVRyZWVXYWxrZXIsXG5cbiAgICB0cmVlUGF0aE9mOiB0cmVlUGF0aE9mLFxuICAgIGdldE5vZGVBdFRyZWVQYXRoOiBnZXROb2RlQXRUcmVlUGF0aCxcbiAgICBpbnNlcnRBdFRyZWVQYXRoOiBpbnNlcnRBdFRyZWVQYXRoLFxuICAgIGlzVHJlZVBhdGhCZWZvcmU6IGlzVHJlZVBhdGhCZWZvcmUsXG5cbiAgICBnZXROb2RlV2luZG93OiBnZXROb2RlV2luZG93LFxuXG4gICAgZ2V0Q29tcG9uZW50c0Zyb21SYW5nZTogZ2V0Q29tcG9uZW50c0Zyb21SYW5nZSxcbiAgICBkZWxldGVSYW5nZVdpdGhDb21wb25lbnRzOiBkZWxldGVSYW5nZVdpdGhDb21wb25lbnRzLFxuICAgIGZvckVhY2hOb2Rlc0luUmFuZ2U6IGZvckVhY2hOb2Rlc0luUmFuZ2UsXG4gICAgYXJlUmFuZ2VzRXF1YWw6IGFyZVJhbmdlc0VxdWFsLFxuXG4gICAgYWRkRGVidWdQb2ludDogYWRkRGVidWdQb2ludFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBkb21VdGlscztcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZWxlbWVudCBjaGlsZHJlbiBvZiBET00gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgZWxlbWVudCB0byByZXR1cm4gdGhlIGNoaWxkcmVuIG9mIChvbmx5IERPTSBlbGVtZW50cylcbiAqIEByZXR1cm4ge0FycmF5W0VsZW1lbnRdfVxuICovXG4gZnVuY3Rpb24gY2hpbGRyZW4oZWwpIHtcbiAgICByZXR1cm4gZmlsdGVyTm9kZUxpc3RCeVR5cGUoZWwuY2hpbGROb2RlcywgTm9kZS5FTEVNRU5UX05PREUpO1xuIH1cblxuXG4vKipcbiAqIEZpbHRlcnMgdGhlIGxpc3Qgb2Ygbm9kZXMgYnkgdHlwZVxuICpcbiAqIEBwYXJhbSB7Tm9kZUxpc3R9IG5vZGVMaXN0IHRoZSBsaXN0IG9mIG5vZGVzLCBmb3IgZXhhbXBsZSBjaGlsZE5vZGVzIHByb3BlcnR5IG9mIERPTSBlbGVtZW50XG4gKiBAcGFyYW0ge0ludGVnZXJ9IG5vZGVUeXBlIGFuIGludGVnZXIgY29uc3RhbnQgW2RlZmluZWQgYnkgRE9NIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUubm9kZVR5cGUpLCBlLmcuIGBOb2RlLkVMRU1FTlRfTk9ERWAgb3IgYE5vZGUuVEVYVF9OT0RFYFxuICogQHJldHVybiB7QXJyYXlbTm9kZV19XG4gKi9cbmZ1bmN0aW9uIGZpbHRlck5vZGVMaXN0QnlUeXBlKG5vZGVMaXN0LCBub2RlVHlwZSkge1xuICAgIHJldHVybiBfLmZpbHRlcihub2RlTGlzdCwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gbm9kZVR5cGU7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBGaW5kIG5lYXJlc3QgcGFyZW50IGVsZW1lbnQgZm9yIG5vZGUuXG4gKiBJZiBub2RlIGlzIGFuIGVsZW1lbnQsIGl0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5pbmdFbGVtZW50KG5vZGUpIHtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSlcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuXG4vKipcbiAqIFNlbGVjdHMgaW5uZXIgY29udGVudHMgb2YgRE9NIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNlbGVjdEVsZW1lbnRDb250ZW50cyhlbCkge1xuICAgIHZhciBkb2MgPSBlbC5vd25lckRvY3VtZW50O1xuICAgIGlmICghIGRvYykgcmV0dXJuIGxvZ2dlci5lcnJvcignc2VsZWN0RWxlbWVudENvbnRlbnRzOiBlbGVtZW50IGhhcyBubyBkb2N1bWVudCcpO1xuICAgIHZhciByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbCk7XG4gICAgdmFyIHdpbiA9IGdldE5vZGVXaW5kb3coZWwpXG4gICAgICAgICwgc2VsID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xufVxuXG5cbi8qKlxuICogU2VsZWN0cyB0ZXh0IGluc2lkZSBlbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdEVsZW1lbnRUZXh0KGVsKSB7XG4gICAgdmFyIGZyb21Ob2RlID0gZmlyc3RUZXh0Tm9kZShlbClcbiAgICAgICAgLCB0b05vZGUgPSBsYXN0VGV4dE5vZGUoZWwpO1xuXG4gICAgaWYgKGZyb21Ob2RlICYmIHRvTm9kZSlcbiAgICAgICAgc2V0U2VsZWN0aW9uKGZyb21Ob2RlLCAwLCB0b05vZGUsIHRvTm9kZS50ZXh0Q29udGVudC5sZW5ndGgpO1xufVxuXG5cbi8qKlxuICogU2V0cyB0aGUgY2FyZXQgcG9zaXRpb24gdG8gdGhlIHBvc2l0aW9uIGluIHRoZSBub2RlXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIERPTSBub2RlXG4gKiBAcGFyYW0ge051bWJlcn0gcG9zIGNhcmV0IHBvc2l0aW9uXG4gKi9cbmZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24obm9kZSwgcG9zKSB7XG4gICAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICBpZiAoISBkb2MpIHJldHVybiBsb2dnZXIuZXJyb3IoJ3NldENhcmV0UG9zaXRpb246IGVsZW1lbnQgaGFzIG5vIGRvY3VtZW50Jyk7XG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgcG9zKTtcbiAgICB2YXIgd2luID0gZ2V0Tm9kZVdpbmRvdyhub2RlKVxuICAgICAgICAsIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGRpcmVjdGlvbiBvZiBhIHNlbGVjdGlvblxuICpcbiAqIDEgZm9yd2FyZCwgLTEgYmFja3dhcmQsIDAgbm8gZGlyZWN0aW9uLCB1bmRlZmluZWQgb25lIG9mIHRoZSBub2RlIGlzIGRldGFjaGVkIG9yIGluIGEgZGlmZmVyZW50IGZyYW1lXG4gKlxuICogQHBhcmFtIHtzZWx9IGEgc2VsZWN0aW9uIG9iamVjdFxuICogQHJldHVybiB7LTF8MHwxfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uRGlyZWN0aW9uKHNlbCl7XG4gICAgcmV0dXJuIF9nZXREaXJlY3Rpb24oc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQsIHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCk7XG59XG5cbmZ1bmN0aW9uIF9nZXREaXJlY3Rpb24oZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0LCB0b05vZGUsIGVuZE9mZnNldCl7XG4gICAgdmFyIGRvY1Bvc2l0aW9uID0gZnJvbU5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odG9Ob2RlKTtcbiAgICBpZiAoZG9jUG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORyl7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBlbHNlIGlmIChkb2NQb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKXtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBlbHNlIGlmIChmcm9tTm9kZSA9PSB0b05vZGUpe1xuICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPCBlbmRPZmZzZXQpe1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpe1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogU2VsZWN0cyBhIHJhbmdlIGluIGEgZG9jdW1lbnRcbiAqXG4gKiBAcGFyYW0ge05vZGV9IGZyb21Ob2RlIERPTSBub2RlIHRvIHN0YXJ0IHNlbGVjdGlvbiBpblxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0T2Zmc2V0XG4gKiBAcGFyYW0ge05vZGV9IHRvTm9kZSBET00gbm9kZSB0byBlbmQgc2VsZWN0aW9uIGluXG4gKiBAcGFyYW0ge051bWJlcn0gZW5kT2Zmc2V0XG4gKi9cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihmcm9tTm9kZSwgc3RhcnRPZmZzZXQsIHRvTm9kZSwgZW5kT2Zmc2V0KSB7XG4gICAgdmFyIGRvYyA9IGZyb21Ob2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgaWYgKCEgZG9jKSByZXR1cm4gbG9nZ2VyKCdzZXRDYXJldFBvc2l0aW9uOiBlbGVtZW50IGhhcyBubyBkb2N1bWVudCcpO1xuICAgIHZhciBiYWNrd2FyZCA9IF9nZXREaXJlY3Rpb24oZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0LCB0b05vZGUsIGVuZE9mZnNldCkgPT0gLTE7XG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgdmFyIGNvbnRhaW5lciwgb3JpZ2luYWxDb250ZW50RWRpdGFibGU7XG4gICAgLy8gZG9lcyBub3Qgd29yayBpbiBub24gY29udGVudEVkaXRhYmxlIGl0ZW1zXG5cbiAgICB2YXIgd2luID0gZ2V0Tm9kZVdpbmRvdyhmcm9tTm9kZSlcbiAgICAgICAgLCBzZWwgPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cblxuICAgIGlmIChiYWNrd2FyZCl7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KHRvTm9kZSwgZW5kT2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKGZyb21Ob2RlLCBzdGFydE9mZnNldCk7XG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGZyb21Ob2RlLCBzdGFydE9mZnNldCk7XG4gICAgICAgIHJhbmdlLnNldEVuZCh0b05vZGUsIGVuZE9mZnNldCk7XG4gICAgfVxuXG4gICAgY29udGFpbmVyID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIgPT0gTm9kZS5FTEVNRU5UX05PREUgP1xuICAgICAgICByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lciA6XG4gICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLnBhcmVudEVsZW1lbnQ7XG5cbiAgICBpZiAoIWNvbnRhaW5lci5pc0NvbnRlbnRFZGl0YWJsZSl7XG4gICAgICAgIG9yaWdpbmFsQ29udGVudEVkaXRhYmxlID0gY29udGFpbmVyLmNvbnRlbnRFZGl0YWJsZTsgLy8gZmFsc2Ugb3IgaW5oZXJpdFxuICAgICAgICBjb250YWluZXIuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgfVxuXG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG5cbiAgICBpZiAoYmFja3dhcmQpe1xuICAgICAgICBzZWwuZXh0ZW5kKHRvTm9kZSwgZW5kT2Zmc2V0KTtcbiAgICB9XG5cbiAgICBpZiAob3JpZ2luYWxDb250ZW50RWRpdGFibGUpe1xuICAgICAgICAvLyByZXN0b3JpbmcgY29udGVudEVkaXRhYmxlXG4gICAgICAgIGNvbnRhaW5lci5jb250ZW50RWRpdGFibGUgPSBvcmlnaW5hbENvbnRlbnRFZGl0YWJsZTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2xlYXJzIHNlbGVjdGlvbiBpbiBhIGdpdmVuIHdpbmRvd1xuICogQHBhcmFtIHtXaW5kb3d9IHdpblxuICovXG5mdW5jdGlvbiBjbGVhclNlbGVjdGlvbih3aW4pIHtcbiAgICB3aW4gPSB3aW4gfHwgd2luZG93O1xuICAgIHZhciBzZWwgPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xufVxuXG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhbiBlbGVtZW50J3MgdG90YWwgdG9wIGFuZCBsZWZ0IG9mZnNldCBmcm9tIHRoZSBkb2N1bWVudCBlZGdlLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHBvc2l0aW9uIG5lZWRzIHRvIGJlIHJldHVybmVkXG4gKiBAcGFyYW0ge2luY2x1ZGVCb3JkZXJ9IGlmIGlzIHRvIGluY2x1ZGUgdGhlIGJvcmRlciB3aWR0aFxuICogQHJldHVybiB7T2JqZWN0fSB2ZWN0b3Igb2JqZWN0IHdpdGggcHJvcGVydGllcyB0b3BPZmZzZXQgYW5kIGxlZnRPZmZzZXRcbiAqL1xuZnVuY3Rpb24gZ2V0RWxlbWVudE9mZnNldChlbCwgaW5jbHVkZUJvcmRlcikge1xuICAgIHZhciB5UG9zLCB4UG9zO1xuXG4gICAgeVBvcyA9IGVsLm9mZnNldFRvcDtcbiAgICB4UG9zID0gZWwub2Zmc2V0TGVmdDtcbiAgICBlbCA9IGVsLm9mZnNldFBhcmVudDtcblxuICAgIHdoaWxlIChlbCkge1xuICAgICAgICB5UG9zICs9IGVsLm9mZnNldFRvcCArIGdldEJvcmRlcihlbCwgJ0hlaWdodCcsIGluY2x1ZGVCb3JkZXIpO1xuICAgICAgICB4UG9zICs9IGVsLm9mZnNldExlZnQgKyBnZXRCb3JkZXIoZWwsICdXaWR0aCcsIGluY2x1ZGVCb3JkZXIpO1xuICAgICAgICBlbCA9IGVsLm9mZnNldFBhcmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0b3BPZmZzZXQ6IHlQb3MsIGxlZnRPZmZzZXQ6IHhQb3MgfTtcbn1cblxuXG5mdW5jdGlvbiBnZXRCb3JkZXIoZWwsIHR5cGUsIGluY2x1ZGVCb3JkZXIpIHtcbiAgICBpZiAoaW5jbHVkZUJvcmRlcikge1xuICAgICAgICB2YXIgc2lkZSA9ICh0eXBlID09ICdIZWlnaHQnKSA/ICd0b3AnIDogJ2xlZnQnLFxuICAgICAgICAgICAgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLFxuICAgICAgICAgICAgc2lkZVZhbHVlID0gcGFyc2VJbnQoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci0nICsgc2lkZSArICctd2lkdGgnKSwgMTApO1xuXG4gICAgICAgIGlmIChzaWRlVmFsdWUpIHJldHVybiBzaWRlVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBlbGVtZW50IGZyb20gdGhlIGRvY3VtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCB0aGUgZWxlbWVudCB0byBiZSByZW1vdmVkXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWwpIHtcbiAgICB2YXIgcGFyZW50ID0gZWwucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50KXtcbiAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgcGFyZW50Lm5vcm1hbGl6ZSgpO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIHRleHQgbm9kZSBvZiBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fE5vZGV9IG5vZGUgdGhlIG5vZGUgdG8gYmUgc2VhcmNoZWQsIGlmIHRoZSBub2RlIGlzIHRleHQgbm9kZSB3ZSByZXR1cm4gdGhlIG5vZGUuXG4gKiBAcmV0dXJuIHtUZXh0Tm9kZX1cbiAqL1xuZnVuY3Rpb24gZmlyc3RUZXh0Tm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHJldHVybiBub2RlO1xuICAgIHZhciB0cmVlV2Fsa2VyID0gY3JlYXRlVHJlZVdhbGtlcihub2RlLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG4gICAgcmV0dXJuIHRyZWVXYWxrZXIuZmlyc3RDaGlsZCgpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFzdCBjaGlsZCB0ZXh0IG5vZGUgb2YgYW4gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudHxOb2RlfSBub2RlIHRoZSBub2RlIHRvIGJlIHNlYXJjaGVkLCBpZiB0aGUgbm9kZSBpcyB0ZXh0IG5vZGUgd2UgcmV0dXJuIHRoZSBub2RlLlxuICogQHJldHVybiB7VGV4dE5vZGV9XG4gKi9cbmZ1bmN0aW9uIGxhc3RUZXh0Tm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHJldHVybiBub2RlO1xuICAgIHZhciB0cmVlV2Fsa2VyID0gY3JlYXRlVHJlZVdhbGtlcihub2RlLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG4gICAgcmV0dXJuIHRyZWVXYWxrZXIubGFzdENoaWxkKCk7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGVsZW1lbnQgZnJvbSB0aGUgZG9jdW1lbnQgcHV0dGluZyBpdHMgY2hpbGRyZW4gaW4gaXRzIHBsYWNlXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCB0aGUgZWxlbWVudCB0byBiZSBcInVud3JhcHBlZFwiXG4gKi9cbmZ1bmN0aW9uIHVud3JhcEVsZW1lbnQoZWwpIHtcbiAgICB2YXIgcGFyZW50ID0gZWwucGFyZW50Tm9kZTtcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgdmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIC8vIG11c3QgYmUgY29waWVkIHRvIGF2b2lkIGl0ZXJhdGluZyBhIG11dGF0aW5nIGxpc3Qgb2YgY2hpbGROb2Rlc1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBfLnNsaWNlKGVsLmNoaWxkTm9kZXMpO1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZyYWcuYXBwZW5kQ2hpbGQsIGZyYWcpO1xuICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKGZyYWcsIGVsKTtcbiAgICAgICAgcGFyZW50Lm5vcm1hbGl6ZSgpO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFdyYXBzIGFuIGVsZW1lbnQgaW4gYW5vdGhlciBlbGVtZW50XG4gKlxuICogQHBhcmFtICB7RWxlbWVudH0gd3JhcEludG9FbFxuICogQHBhcmFtICB7RWxlbWVudH0gZWxcbiAqL1xuZnVuY3Rpb24gd3JhcEluRWxlbWVudCh3cmFwSW50b0VsLCBlbCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHdyYXBJbnRvRWwsIGVsKTtcbiAgICAgICAgd3JhcEludG9FbC5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogVHJpbXMgYSB0ZXh0IG5vZGUgb2YgdHJhaWxpbmcgc3BhY2VzLCBhbmQgcmV0dXJucyB0cnVlIGlmIGEgdHJpbSB3YXMgcGVyZm9ybWVkLlxuICpcbiAqIEBwYXJhbSAge1RleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiB0cmltTm9kZVJpZ2h0KG5vZGUpIHtcbiAgICByZXR1cm4gX3RyaW1Ob2RlKG5vZGUsICd0cmltUmlnaHQnKTtcbn1cblxuXG4vKipcbiAqIFRyaW1zIGEgdGV4dCBub2RlIG9mIGxlYWRpbmcgc3BhY2VzLCBhbmQgcmV0dXJucyB0cnVlIGlmIGEgdHJpbSB3YXMgcGVyZm9ybWVkLlxuICpcbiAqIEBwYXJhbSAge1RleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiB0cmltTm9kZUxlZnQobm9kZSkge1xuICAgIHJldHVybiBfdHJpbU5vZGUobm9kZSwgJ3RyaW1MZWZ0Jyk7XG59XG5cblxuZnVuY3Rpb24gX3RyaW1Ob2RlKG5vZGUsIG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbGVuID0gbm9kZS5sZW5ndGg7XG4gICAgbm9kZS50ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnRbbWV0aG9kTmFtZV0oKTtcbiAgICByZXR1cm4gbGVuICE9PSBub2RlLmxlbmd0aDtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHJlZmVyZW5jZSB0byBjb21wb25lbnQgZnJvbSBlbGVtZW50XG4gKlxuICogQHBhcmFtICB7RWxlbWVudH0gZWxcbiAqL1xuZnVuY3Rpb24gZGV0YWNoQ29tcG9uZW50KGVsKSB7XG4gICAgZGVsZXRlIGVsW2NvbmZpZy5jb21wb25lbnRSZWZdO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjb250ZW50IG9mIGEgaHRtbCBzdHJpbmdcbiAqIEBwYXJhbSAge1N0cmluZ30gc3RyIEFueSBzdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgc3RyaW5nIGNsZWFuZWQgb2YgYW55IGh0bWwgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBIdG1sKHN0cikge1xuICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICBkaXYuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiBkaXYudGV4dENvbnRlbnQgfHwgJyc7XG59XG5cblxuLyoqXG4gKiBDb252ZW5pZW5jZSB3cmFwcGVyIGZvciBuYXRpdmUgVHJlZVdhbGtlciB0aGF0IGF1dG9tYXRpY2FsbHkgd2Fsa3MgdGhlIHRyZWUgYW5kIGNhbGxzIGFuIGl0ZXJhdG9yIGZ1bmN0aW9uLlxuICogVGhpcyB3aWxsIG5vdCBpdGVyYXRlIHRoZSByb290IGVsZW1lbnQuXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gcm9vdCBUaGUgY29udGFpbmluZyByb290IGVsZW1lbnQgdG8gYmUgd2Fsa2VkLiBXaWxsIG5vdCBiZSBpdGVyYXRlZC5cbiAqIEBwYXJhbSAge05vZGVGaWxlcn0gZmlsdGVyIEEgTm9kZUZpbHRlciBjb25zdGFudCwgc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0FQSS9UcmVlV2Fsa2VyXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gaXRlcmF0b3IgQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZWFjaCBub2RlLiBSZXR1cm5pbmcgJ2ZhbHNlJyB3aWxsIGJyZWFrLlxuICogQHBhcmFtICB7T2JqZWN0fSBjb250ZXh0IEFuIG9wdGlvbmFsIGNvbnRleHQgdG8gcGFzc2VkLCBkZWZhdWx0cyB0byByb290LlxuICovXG5mdW5jdGlvbiB3YWxrVHJlZShyb290LCBmaWx0ZXIsIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgdmFyIHR3ID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihyb290LCBmaWx0ZXIpO1xuICAgIHdoaWxlKHR3Lm5leHROb2RlKCkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCB8fCByb290LCB0dy5jdXJyZW50Tm9kZSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSBicmVhaztcbiAgICB9XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IG9mIGNoaWxkIGluZGV4ZXMgb2YgZWxlbWVudCBwYXRoIGluc2lkZSByb290IGVsZW1lbnQgaW4gRE9NIHRyZWUgdXNpbmcgYnJlYWR0aCBmaXJzdCB0cmVlIHRyYXZlcnNhbC5cbiAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBpbnNpZGUgcm9vdCBlbGVtZW50LCAwIGlmIHRoZSByb290IGVsZW1lbnQgaXRzZWxmIGlzIHBhc3NlZC5cbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSByb290RWwgZWxlbWVudCB0byBzZWFyY2hcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsIGVsZW1lbnQgdG8gZmluZCB0aGUgaW5kZXggb2ZcbiAqIEByZXR1cm4ge0FycmF5W051bWJlcl19XG4gKi9cbmZ1bmN0aW9uIHRyZWVQYXRoT2Yocm9vdEVsLCBlbCkge1xuICAgIGlmICghIChyb290RWwgJiYgcm9vdEVsLmNvbnRhaW5zKGVsKSkpIHJldHVybjtcblxuICAgIHZhciB0cmVlUGF0aCA9IFtdXG4gICAgICAgICwgbm9kZSA9IHJvb3RFbDtcblxuICAgIHdoaWxlIChub2RlICE9IGVsKSB7XG4gICAgICAgIHZhciBub2RlSW5kZXggPSBfLmZpbmRJbmRleChub2RlLmNoaWxkTm9kZXMsIGNvbnRhaW5zRWwpO1xuICAgICAgICB0cmVlUGF0aC5wdXNoKG5vZGVJbmRleCk7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbbm9kZUluZGV4XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZVBhdGg7XG5cbiAgICBmdW5jdGlvbiBjb250YWluc0VsKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBjaGlsZC5jb250YWlucyhlbCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJucyBlbGVtZW50IGF0IGdpdmVuIHRyZWUgcGF0aFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsXG4gKiBAcGFyYW0ge0FycmF5W051bWJlcl19IHRyZWVQYXRoXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG5lYXJlc3QgcmV0dXJuIG5lYXJlc3QgcG9zc2libGUgbm9kZSBpZiBleGFjdCBub2RlIGRvZXMgbm90IGV4aXN0XG4gKiBAcmV0dXJuIHtOb2RlfVxuICovXG5mdW5jdGlvbiBnZXROb2RlQXRUcmVlUGF0aChyb290RWwsIHRyZWVQYXRoLCBuZWFyZXN0KSB7XG4gICAgaWYgKCF0cmVlUGF0aCkgcmV0dXJuO1xuXG4gICAgdmFyIGxlbiA9IHRyZWVQYXRoLmxlbmd0aDtcbiAgICBpZiAobGVuID09PSAwKSByZXR1cm4gcm9vdEVsO1xuXG4gICAgdmFyIG5vZGUgPSByb290RWw7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcztcbiAgICAgICAgaWYgKCEgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmICghIG5lYXJlc3QpIG5vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hpbGRJbmRleCA9IHRyZWVQYXRoW2ldXG4gICAgICAgICAgICAsIGNoaWxkID0gY2hpbGRyZW5bY2hpbGRJbmRleF07XG4gICAgICAgIGlmICghIGNoaWxkKSB7XG4gICAgICAgICAgICBub2RlID0gbmVhcmVzdFxuICAgICAgICAgICAgICAgICAgICA/IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IGNoaWxkO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xufVxuXG5cbi8qKlxuICogSW5zZXJ0cyBhbiBlbGVtZW50IGluc2lkZSByb290IGF0IGEgZ2l2ZW4gcGF0aCBpbiB0cmVlICh0aGF0IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHRoZSBpbmRleCByZXR1cm5lZCBieSBgdHJlZVBhdGhPZmAgZnVuY3Rpb24pLiBJZiBlbGVtZW50IGlzIGFscmVhZHkgaW4gdGhlIHJvb3QncyB0cmVlLCBpdCB3aWxsIGJlIHJlbW92ZWQgZmlyc3QgYW5kIHRoZW4gbW92ZWQgdG8gdGhlIHBhc3NlZCB0cmVlSW5kZXhcbiAqIEluc2VydGlvbiBhdCBpbmRleCAwIGlzIG5vdCBwb3NzaWJsZSBhbmQgd2lsbCByZXR1cm4gdW5kZWZpbmVkIGFzIGl0IHdvdWxkIG1lYW4gcmVwbGFjaW5nIHRoZSByb290IGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSByb290RWwgZWxlbWVudCBpbnRvIHdoaWNoIHRvIGluc2VydFxuICogQHBhcmFtIHtOdW1iZXJ9IHRyZWVJbmRleCBpbmRleCBpbiBET00gdHJlZSBpbnNpZGUgcm9vdCBlbGVtZW50IChzZWUgdHJlZVBhdGhPZilcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgZWxlbWVudCB0byBiZSBpbnNlcnRlZFxuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB3YXMgc3VjY2Vzc2Z1bGx5IGluc2VydGVkXG4gKi9cbmZ1bmN0aW9uIGluc2VydEF0VHJlZVBhdGgocm9vdEVsLCB0cmVlUGF0aCwgZWwsIG5lYXJlc3QpIHtcbiAgICB2YXIgdG9Ob3JtYWxpemUgPSBlbC5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERTtcbiAgICBpZiAocm9vdEVsLmNvbnRhaW5zKGVsKSlcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbCk7IC8vIGNhbid0IHVzZSByZW1vdmVDaGlsZCBhcyByb290RWwgaGVyZSBpcyBub3QgYW4gaW1tZWRpYXRlIHBhcmVudFxuXG4gICAgaWYgKHRyZWVQYXRoLmxlbmd0aCA9PSAwKSByZXR1cm47XG5cbiAgICB2YXIgcGFyZW50ID0gZ2V0Tm9kZUF0VHJlZVBhdGgocm9vdEVsLCB0cmVlUGF0aC5zbGljZSgwLCAtMSksIG5lYXJlc3QpXG4gICAgICAgICwgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcztcblxuICAgIGlmICghIGNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChuZWFyZXN0KSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gcGFyZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIH0gZWxzZSByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkSW5kZXggPSB0cmVlUGF0aFt0cmVlUGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAsIGNoaWxkID0gY2hpbGRyZW5bY2hpbGRJbmRleF07XG5cbiAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShlbCwgY2hpbGQpO1xuICAgICAgICBpZiAodG9Ob3JtYWxpemUpIHBhcmVudC5ub3JtYWxpemUoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgKGNoaWxkSW5kZXggPT09IDAgfHwgbmVhcmVzdCkpIHtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgaWYgKHRvTm9ybWFsaXplKSBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkID0gY2hpbGRyZW5bY2hpbGRJbmRleCAtIDFdO1xuICAgICAgICBpZiAoY2hpbGQgfHwgbmVhcmVzdCkge1xuICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgICAgIGlmICh0b05vcm1hbGl6ZSkgcGFyZW50Lm5vcm1hbGl6ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZmlyc3QgdHJlZSBwYXRoIHBvaW50cyB0byBhIG5vZGUgd2hpY2ggaXMgYmVmb3JlIHRoZSBvdGhlciBpbiB0aGUgZG9jdW1lbnQgb3JkZXIuXG4gKiBAcGFyYW0gIHtBcnJheX0gIHBhdGgxICAgQSB0cmVlcGF0aCBhcnJheVxuICogQHBhcmFtICB7QXJyYXl9ICBwYXRoMiAgIEEgdHJlZXBhdGggYXJyYXlcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVHJlZVBhdGhCZWZvcmUocGF0aDEsIHBhdGgyKSB7XG4gICAgdmFyIGkgPSAwXG4gICAgICAgICwgaXNCZWZvcmU7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGgxKSAmJiBBcnJheS5pc0FycmF5KHBhdGgyKSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci5lcnJvcignaXNUcmVlUGF0aEJlZm9yZTogT25lIG9yIGJvdGggcGF0aHMgYXJlIG5vdCB2YWxpZCB0cmVlcGF0aCBhcnJheXMuJyk7XG5cbiAgICBmb3IgKGk7IGkgPCBwYXRoMS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0aDFbaV0gPCBwYXRoMltpXSkge1xuICAgICAgICAgICAgaXNCZWZvcmUgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0aDFbaV0gPiBwYXRoMltpXSkge1xuICAgICAgICAgICAgaXNCZWZvcmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpc0JlZm9yZSA9PSAndW5kZWZpbmVkJylcbiAgICAgICAgaWYgKHBhdGgxLmxlbmd0aCA8IHBhdGgyLmxlbmd0aClcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdpc1RyZWVQYXRoQmVmb3JlOiBPbmUgbm9kZSBpcyBpbnNpZGUgYW5vdGhlcicpO1xuXG4gICAgcmV0dXJuIGlzQmVmb3JlIHx8IGZhbHNlO1xufVxuXG5cbi8qKlxuICogQ29udmVydHMgbm9uIGxhdGluIGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdHkgY29kZXMuXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm4ge1N0cmluZ30gICAgIHRoZSBzdHJpbmcgd2l0aCBodG1sIGVudGl0aWVzXG4gKi9cbmZ1bmN0aW9uIGh0bWxFbnRpdGllcyhzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1tcXHUwMEEwLVxcdTk5OTk5PD5cXCZdL2dpbSwgZnVuY3Rpb24oaSkge1xuICAgICAgICByZXR1cm4gJyYjJytpLmNoYXJDb2RlQXQoMCkrJzsnO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVRyZWVXYWxrZXIoZWwsIHdoYXRUb1Nob3cpIHtcbiAgICB3aGF0VG9TaG93ID0gd2hhdFRvU2hvdyB8fCAoTm9kZUZpbHRlci5TSE9XX1RFWFQgfCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZWwsIHdoYXRUb1Nob3cpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIHRoZSB3aW5kb3cgdGhlIG5vZGUgaXMgaW5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm4ge1dpbmRvd31cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZVdpbmRvdyhub2RlKSB7XG4gICAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gZG9jICYmIChkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdyk7XG59XG5cblxuXG4vKipcbiAqIGRvIHNvbWV0aGluZyBmb3IgZWFjaCBub2RlcyBjb250YWluZWQgaW4gYSByYW5nZVxuICpcbiAqIEBwYXJhbSB7cmFuZ2V9IGEgcmFuZ2VcbiAqIEBwYXJhbSB7Y2J9IGEgZnVuY3Rpb24gdGFraW5nIGEgbm9kZSBhcyBhcmd1bWVudFxuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hOb2Rlc0luUmFuZ2UocmFuZ2UsIGNiKXtcbiAgICB2YXIgcmFuZ2VDb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lclxuICAgICAgICAsIGRvYyA9IHJhbmdlQ29udGFpbmVyLm93bmVyRG9jdW1lbnQ7XG5cbiAgICBmdW5jdGlvbiBpc05vZGVJbnNpZGVSYW5nZShub2RlKXtcbiAgICAgICAgdmFyIG5vZGVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHZhciBpc0luc2lkZSA9IGZhbHNlO1xuICAgICAgICBub2RlUmFuZ2Uuc2VsZWN0Tm9kZShub2RlKTtcblxuICAgICAgICBpZiAobm9kZVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyh3aW5kb3cuUmFuZ2UuU1RBUlRfVE9fU1RBUlQsIHJhbmdlKSAhPSAtMVxuICAgICAgICAgICAgJiYgbm9kZVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyh3aW5kb3cuUmFuZ2UuRU5EX1RPX0VORCwgcmFuZ2UpICE9IDEpe1xuICAgICAgICAgICAgaXNJbnNpZGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVSYW5nZS5kZXRhY2goKTtcbiAgICAgICAgcmV0dXJuIGlzSW5zaWRlO1xuICAgIH1cblxuICAgIHZhciB0cmVlV2Fsa2VyID0gZG9jLmNyZWF0ZVRyZWVXYWxrZXIocmFuZ2VDb250YWluZXIsXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcblxuICAgIHZhciBjdXJyZW50Tm9kZTtcbiAgICB3aGlsZSAoY3VycmVudE5vZGUgPSB0cmVlV2Fsa2VyLm5leHROb2RlKCkpeyAvLyBzaG91bGQgYmUgYXNzaWdubWVudFxuICAgICAgICBpZiAoaXNOb2RlSW5zaWRlUmFuZ2UoY3VycmVudE5vZGUpKXtcbiAgICAgICAgICAgIGNiKGN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBnZXQgYWxsIGNvbXBvbmVudHMgY29udGFpbmVkIGluIGEgcmFuZ2VcbiAqXG4gKiBAcGFyYW0ge3JhbmdlfSBhIERPTSByYW5nZS5cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50c0Zyb21SYW5nZShyYW5nZSkge1xuICAgIHZhciB3aW4gPSBnZXROb2RlV2luZG93KHJhbmdlLnN0YXJ0Q29udGFpbmVyKVxuICAgICAgICAsIENvbXBvbmVudCA9IHdpbi5taWxvLkNvbXBvbmVudDtcblxuICAgIHZhciBjb21wb25lbnRzID0gW107XG4gICAgZm9yRWFjaE5vZGVzSW5SYW5nZShyYW5nZSwgZnVuY3Rpb24gKG5vZGUpe1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgdmFyIGNvbXAgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KG5vZGUpO1xuICAgICAgICAgICAgaWYgKGNvbXApXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50cztcbn1cblxuLyoqXG4gKiBkZWxldGUgYSByYW5nZVxuICpcbiAqIEBwYXJhbSB7cmFuZ2V9IGRlbGV0ZSBhIERPTSByYW5nZSBhbmQgYWxsIHRoZSBjb21wb25lbnRzIGluc2lkZVxuICovXG5mdW5jdGlvbiBkZWxldGVSYW5nZVdpdGhDb21wb25lbnRzKHJhbmdlKSB7XG4gICAgdmFyIGNvbXBvbmVudHMgPSBnZXRDb21wb25lbnRzRnJvbVJhbmdlKHJhbmdlKTtcblxuICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbihjb21wKSB7XG4gICAgICAgIGNvbXAuZGVzdHJveSh0cnVlKTtcbiAgICB9KTtcblxuICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG59XG5cbi8qKlxuICogY2hlY2sgaWYgdHdvIHJhbmdlcyBhcmUgZXF1aXZhbGVudFxuICpcbiAqIEBwYXJhbSB7cmFuZ2V9IHJhbmdlMVxuICogQHBhcmFtIHtyYW5nZX0gcmFuZ2UyXG4gKiBAcmV0dXJuIHtCb29sZWFufSBhcmUgdGhlIHR3byByYW5nZXMgZXF1aXZhbGVudFxuICovXG5mdW5jdGlvbiBhcmVSYW5nZXNFcXVhbChyYW5nZTEsIHJhbmdlMil7XG4gICAgcmV0dXJuIHJhbmdlMS5jb21wYXJlQm91bmRhcnlQb2ludHMod2luZG93LlJhbmdlLlNUQVJUX1RPX1NUQVJULCByYW5nZTIpID09IDAgJiYgcmFuZ2UxLmNvbXBhcmVCb3VuZGFyeVBvaW50cyh3aW5kb3cuUmFuZ2UuRU5EX1RPX0VORCwgcmFuZ2UyKSA9PSAwO1xufVxuXG5cbi8qKlxuICogQWRkcyBhIHNpbmdsZSBwaXhlbCBkaXYgdG8gdGhlIGJvZHkgYXQgYSBnaXZlbiB4IGFuZCB5IHBvc2l0aW9uLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBwb3NpdGlvbiBzcGVjaWZpYyBjb2RlLlxuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKi9cbmZ1bmN0aW9uIGFkZERlYnVnUG9pbnQoeCwgeSkge1xuICAgIHZhciBkYkVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGJFbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBwb3NpdGlvbjpmaXhlZDsgbGVmdDonK3grJ3B4OyB0b3A6Jyt5KydweDsgYmFja2dyb3VuZC1jb2xvcjpyZWQ7IHotaW5kZXg6IDEwMCcpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkYkVsKTt9LCAyMDApO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBET01MaXN0ZW5lcnM7XG5cblxuZnVuY3Rpb24gRE9NTGlzdGVuZXJzKCkge1xuICAgIHRoaXMubGlzdGVuZXJzID0gW107XG59XG5cblxuXy5leHRlbmRQcm90byhET01MaXN0ZW5lcnMsIHtcbiAgICBhZGQ6IERPTUxpc3RlbmVycyRhZGQsXG4gICAgcmVtb3ZlOiBET01MaXN0ZW5lcnMkcmVtb3ZlLFxuICAgIHJlbW92ZUFsbDogRE9NTGlzdGVuZXJzJHJlbW92ZUFsbFxufSk7XG5cblxuZnVuY3Rpb24gRE9NTGlzdGVuZXJzJGFkZCh0YXJnZXQsIGV2ZW50VHlwZSwgaGFuZGxlcikge1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2goe1xuICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUsXG4gICAgICAgIGhhbmRsZXI6IGhhbmRsZXJcbiAgICB9KTtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIpO1xufVxuXG5cbmZ1bmN0aW9uIERPTUxpc3RlbmVycyRyZW1vdmUodGFyZ2V0LCBldmVudFR5cGUsIGhhbmRsZXIpIHtcbiAgICB2YXIgbGlzdGVuZXIgPSB7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgaGFuZGxlcjogaGFuZGxlclxuICAgIH07XG4gICAgdmFyIGlkeCA9IF8uZmluZEluZGV4KHRoaXMubGlzdGVuZXJzLCBfLnBhcnRpYWwoXy5pc0VxdWFsLCBsaXN0ZW5lcikpO1xuXG4gICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICBfcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBET01MaXN0ZW5lcnMkcmVtb3ZlQWxsKCkge1xuICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goX3JlbW92ZUxpc3RlbmVyKTtcbiAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW1vdmVMaXN0ZW5lcihsKSB7XG4gICAgbC50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihsLmV2ZW50VHlwZSwgbC5oYW5kbGVyKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZG9tUmVhZHk7XG5cblxudmFyIGRvbVJlYWR5RnVuY3MgPSBbXVxuICAgICwgZG9tUmVhZHlTdWJzY3JpYmVkID0gZmFsc2U7XG5cblxuZnVuY3Rpb24gZG9tUmVhZHkoZnVuYykgeyAvLyAsIGFyZ3VtZW50c1xuICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICAsIGFyZ3MgPSBfLnNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgaWYgKGlzUmVhZHkuY2FsbCh0aGlzKSlcbiAgICAgICAgY2FsbEZ1bmMoKTtcbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFkb21SZWFkeVN1YnNjcmliZWQpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBvbkRvbVJlYWR5KTtcbiAgICAgICAgICAgIGRvbVJlYWR5U3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZG9tUmVhZHlGdW5jcy5wdXNoKGNhbGxGdW5jKTsgLy8gY2xvc3VyZSBpcyBhZGRlZCwgc28gZXZlcnkgdGltZSBkaWZmZXJlbnQgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWRcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxsRnVuYygpIHtcbiAgICAgICAgZnVuYy5hcHBseShzZWxmLCBhcmdzKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gb25Eb21SZWFkeSgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgb25Eb21SZWFkeSk7XG4gICAgZG9tUmVhZHlGdW5jcy5mb3JFYWNoKGZ1bmN0aW9uKGZ1bmMpIHsgZnVuYygpOyB9KTtcbn1cblxuXG5fLmV4dGVuZChkb21SZWFkeSwge1xuICAgIGlzUmVhZHk6IGlzUmVhZHlcbn0pO1xuXG5cbmZ1bmN0aW9uIGlzUmVhZHkoKSB7XG4gICAgdmFyIHJlYWR5U3RhdGUgPSBkb2N1bWVudC5yZWFkeVN0YXRlO1xuICAgIHJldHVybiByZWFkeVN0YXRlID09ICdsb2FkaW5nJyA/IGZhbHNlIDogcmVhZHlTdGF0ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvY19jbGFzcycpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIGRyYWdEcm9wQ29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJykuZHJhZ0Ryb3BcbiAgICAsIGNvbXBvbmVudE1ldGFSZWdleCA9IGRyYWdEcm9wQ29uZmlnLmRhdGFUeXBlcy5jb21wb25lbnRNZXRhUmVnZXhcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgYmFzZTMyID0gcmVxdWlyZSgnYmFzZTMyJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBEcmFnRHJvcDtcblxuXG4vKipcbiAqIFdyYXBwZXIgZm9yIGV2ZW50LmRhdGFUcmFuc2ZlciBvZiBkcmFnLWRyb3AgSFRNTCBBUElcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZXZlbnR9IERPTSBldmVudFxuICogQHJldHVybiB7RHJhZ0Ryb3B9XG4gKi9cbmZ1bmN0aW9uIERyYWdEcm9wKGV2ZW50KSB7XG4gICAgdGhpcy5ldmVudCA9IGV2ZW50O1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyID0gZXZlbnQuZGF0YVRyYW5zZmVyO1xuICAgIHRoaXMudHlwZXMgPSBldmVudC5kYXRhVHJhbnNmZXIudHlwZXM7XG59XG5cbi8qKlxuICogVXNhZ2U6XG4gKiB2YXIgdGVzdERUID0gbmV3IERyYWdEcm9wKGV2ZW50KTtcbiAqIHRlc3REVC5zZXRDb21wb25lbnRNZXRhKG5ld0NvbXBvbmVudCwge3Rlc3Q6ICd0ZXN0JywgdGVzdDI6ICd0ZXN0Mid9KTtcbiAqIHRlc3REVC5nZXRDb21wb25lbnRNZXRhKCk7XG4gKi9cblxuXy5leHRlbmQoRHJhZ0Ryb3AsIHtcbiAgICBjb21wb25lbnREYXRhVHlwZTogRHJhZ0Ryb3AkJGNvbXBvbmVudERhdGFUeXBlXG59KTtcblxuXy5leHRlbmRQcm90byhEcmFnRHJvcCwge1xuICAgIGlzQ29tcG9uZW50OiBEcmFnRHJvcCRpc0NvbXBvbmVudCxcbiAgICBnZXRDb21wb25lbnRTdGF0ZTogRHJhZ0Ryb3AkZ2V0Q29tcG9uZW50U3RhdGUsXG4gICAgc2V0Q29tcG9uZW50U3RhdGU6IERyYWdEcm9wJHNldENvbXBvbmVudFN0YXRlLFxuICAgIGdldENvbXBvbmVudE1ldGE6IERyYWdEcm9wJGdldENvbXBvbmVudE1ldGEsXG4gICAgc2V0Q29tcG9uZW50TWV0YTogRHJhZ0Ryb3Akc2V0Q29tcG9uZW50TWV0YSxcbiAgICBnZXRBbGxvd2VkRWZmZWN0czogRHJhZ0Ryb3AkZ2V0QWxsb3dlZEVmZmVjdHMsXG4gICAgc2V0QWxsb3dlZEVmZmVjdHM6IERyYWdEcm9wJHNldEFsbG93ZWRFZmZlY3RzLFxuICAgIGdldERyb3BFZmZlY3Q6IERyYWdEcm9wJGdldERyb3BFZmZlY3QsXG4gICAgc2V0RHJvcEVmZmVjdDogRHJhZ0Ryb3Akc2V0RHJvcEVmZmVjdCxcbiAgICBpc0VmZmVjdEFsbG93ZWQ6IERyYWdEcm9wJGlzRWZmZWN0QWxsb3dlZCxcbiAgICBnZXREYXRhOiBEcmFnRHJvcCRnZXREYXRhLFxuICAgIHNldERhdGE6IERyYWdEcm9wJHNldERhdGEsXG4gICAgY2xlYXJEYXRhOiBEcmFnRHJvcCRjbGVhckRhdGFcbn0pO1xuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJCRjb21wb25lbnREYXRhVHlwZSgpIHtcbiAgICByZXR1cm4gZHJhZ0Ryb3BDb25maWcuZGF0YVR5cGVzLmNvbXBvbmVudDtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRpc0NvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gXy5pbmRleE9mKHRoaXMudHlwZXMsIERyYWdEcm9wLmNvbXBvbmVudERhdGFUeXBlKCkpID49IDA7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3AkZ2V0Q29tcG9uZW50U3RhdGUoKSB7XG4gICAgdmFyIGRhdGFUeXBlID0gRHJhZ0Ryb3AuY29tcG9uZW50RGF0YVR5cGUoKVxuICAgICAgICAsIHN0YXRlU3RyID0gdGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSlcbiAgICAgICAgLCBzdGF0ZSA9IF8uanNvblBhcnNlKHN0YXRlU3RyKTtcblxuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRzZXRDb21wb25lbnRTdGF0ZShjb21wb25lbnQsIHN0YXRlU3RyKXtcbiAgICBpZiAoISBzdGF0ZVN0cikge1xuICAgICAgICB2YXIgc3RhdGUgPSBjb21wb25lbnQuZ2V0VHJhbnNmZXJTdGF0ZSh7IHJlcXVlc3RlZEJ5OiAnZHJhZycgfSk7XG4gICAgICAgIHN0YXRlU3RyID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUpO1xuICAgIH1cbiAgICB2YXIgZGF0YVR5cGUgPSBEcmFnRHJvcC5jb21wb25lbnREYXRhVHlwZSgpO1xuXG4gICAgc3RhdGVTdHIgJiYgdGhpcy5kYXRhVHJhbnNmZXIuc2V0RGF0YShkYXRhVHlwZSwgc3RhdGVTdHIpO1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvaHRtbCcsIGNvbXBvbmVudC5lbC5vdXRlckhUTUwpO1xuICAgIHJldHVybiBzdGF0ZVN0cjtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRzZXRDb21wb25lbnRNZXRhKGNvbXBvbmVudCwgcGFyYW1zLCBkYXRhKSB7XG4gICAgdmFyIG1ldGEgPSBfY29tcG9uZW50TWV0YShjb21wb25lbnQpO1xuXG4gICAgdmFyIHBhcmFtc1N0ciA9IF8udG9RdWVyeVN0cmluZyhwYXJhbXMpO1xuICAgIHZhciBkYXRhVHlwZSA9IGRyYWdEcm9wQ29uZmlnLmRhdGFUeXBlcy5jb21wb25lbnRNZXRhVGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJyVjbGFzcycsIF9lbmNvZGUobWV0YS5jb21wQ2xhc3MgfHwgJycpKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnJW5hbWUnLCBfZW5jb2RlKG1ldGEuY29tcE5hbWUgfHwgJycpKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnJXBhcmFtcycsIF9lbmNvZGUocGFyYW1zU3RyIHx8ICcnKSk7XG5cbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXG4gICAgdGhpcy5kYXRhVHJhbnNmZXIuc2V0RGF0YShkYXRhVHlwZSwgZGF0YSB8fCAnJyk7XG5cbiAgICByZXR1cm4gZGF0YVR5cGU7XG59XG5cblxuZnVuY3Rpb24gX2VuY29kZShzdHIpIHtcbiAgICByZXR1cm4gYmFzZTMyLmVuY29kZShzdHIpLnRvTG93ZXJDYXNlKCk7XG59XG5cblxuZnVuY3Rpb24gX2NvbXBvbmVudE1ldGEoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudC50cmFuc2ZlclxuICAgICAgICAgICAgPyBjb21wb25lbnQudHJhbnNmZXIuZ2V0Q29tcG9uZW50TWV0YSgpXG4gICAgICAgICAgICA6IHsgXG4gICAgICAgICAgICAgICAgY29tcENsYXNzOiBjb21wb25lbnQuY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgICAgICBjb21wTmFtZTogY29tcG9uZW50Lm5hbWVcbiAgICAgICAgICAgIH07XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3AkZ2V0Q29tcG9uZW50TWV0YSgpIHtcbiAgICB2YXIgbWF0Y2g7XG4gICAgdmFyIG1ldGFEYXRhVHlwZSA9IF8uZmluZCh0aGlzLnR5cGVzLCBmdW5jdGlvbiAoZFR5cGUpIHtcbiAgICAgICAgbWF0Y2ggPSBkVHlwZS5tYXRjaChjb21wb25lbnRNZXRhUmVnZXgpO1xuICAgICAgICByZXR1cm4gISFtYXRjaDtcbiAgICB9KTtcbiAgICBpZiAoIW1ldGFEYXRhVHlwZSkgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaT0xOyBpPDQ7IGkrKylcbiAgICAgICAgbWF0Y2hbaV0gPSBiYXNlMzIuZGVjb2RlKG1hdGNoW2ldKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBDbGFzczogbWF0Y2hbMV0sXG4gICAgICAgIGNvbXBOYW1lOiBtYXRjaFsyXSxcbiAgICAgICAgcGFyYW1zOiBfLmZyb21RdWVyeVN0cmluZyhtYXRjaFszXSksXG4gICAgICAgIG1ldGFEYXRhVHlwZTogbWV0YURhdGFUeXBlLFxuICAgICAgICBtZXRhRGF0YTogXy5qc29uUGFyc2UodGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShtZXRhRGF0YVR5cGUpKSBcbiAgICAgICAgICAgICAgICAgICAgPyBfLmpzb25QYXJzZSh0aGlzLmRhdGFUcmFuc2Zlci5nZXREYXRhKG1ldGFEYXRhVHlwZSkpIFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZGF0YVRyYW5zZmVyLmdldERhdGEobWV0YURhdGFUeXBlKVxuICAgIH07XG59XG5cblxuLy8gYXMgZGVmaW5lZCBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RyYWdEcm9wL0RyYWdfT3BlcmF0aW9ucyNkcmFnc3RhcnRcbmZ1bmN0aW9uIERyYWdEcm9wJGdldEFsbG93ZWRFZmZlY3RzKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldEFsbG93ZWRFZmZlY3RzKGVmZmVjdHMpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gZWZmZWN0cztcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXREcm9wRWZmZWN0KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0O1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldERyb3BFZmZlY3QoZWZmZWN0KSB7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IGVmZmVjdDtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRpc0VmZmVjdEFsbG93ZWQoZWZmZWN0KSB7XG4gICAgdmFyIGFsbG93ZWRFZmZlY3RzID0gdGhpcy5nZXRBbGxvd2VkRWZmZWN0cygpXG4gICAgICAgICwgaXNDb3B5ID0gZWZmZWN0ID09ICdjb3B5J1xuICAgICAgICAsIGlzTW92ZSA9IGVmZmVjdCA9PSAnbW92ZSdcbiAgICAgICAgLCBpc0xpbmsgPSBlZmZlY3QgPT0gJ2xpbmsnXG4gICAgICAgICwgaXNBbGxvd2VkID0gaXNDb3B5IHx8IGlzTGluayB8fCBpc01vdmU7XG5cbiAgICBzd2l0Y2ggKGFsbG93ZWRFZmZlY3RzKSB7XG4gICAgICAgIGNhc2UgJ2NvcHknOlxuICAgICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgY2FzZSAnbGluayc6XG4gICAgICAgICAgICByZXR1cm4gYWxsb3dlZEVmZmVjdHMgPT0gZWZmZWN0O1xuICAgICAgICBjYXNlICdjb3B5TGluayc6XG4gICAgICAgICAgICByZXR1cm4gaXNDb3B5IHx8IGlzTGluaztcbiAgICAgICAgY2FzZSAnY29weU1vdmUnOlxuICAgICAgICAgICAgcmV0dXJuIGlzQ29weSB8fCBpc01vdmU7XG4gICAgICAgIGNhc2UgJ2xpbmtNb3ZlJzpcbiAgICAgICAgICAgIHJldHVybiBpc0xpbmsgfHwgaXNNb3ZlO1xuICAgICAgICBjYXNlICdhbGwnOlxuICAgICAgICBjYXNlICd1bmluaXRpYWxpemVkJzpcbiAgICAgICAgICAgIHJldHVybiBpc0FsbG93ZWQ7XG4gICAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXREYXRhKGRhdGFUeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRyYW5zZmVyLmdldERhdGEoZGF0YVR5cGUpO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldERhdGEoZGF0YVR5cGUsIGRhdGFTdHIpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5zZXREYXRhKGRhdGFUeXBlLCBkYXRhU3RyKTtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRjbGVhckRhdGEoZGF0YVR5cGUpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5jbGVhckRhdGEoZGF0YVR5cGUpO1xufVxuXG5cbi8qKlxuICogRHJhZyBkcm9wIHNlcnZpY2UgY29tcGVuc2F0aW5nIGZvciB0aGUgbGFjayBvZiBjb21tdW5pY2F0aW9uIGZyb20gZHJvcCB0YXJnZXQgdG8gZHJhZyBzb3VyY2UgaW4gRE9NIEFQSVxuICovXG52YXIgZHJhZ0Ryb3BTZXJ2aWNlID0gbmV3IE1lc3NlbmdlcjtcblxudmFyIF9jdXJyZW50RHJhZ0Ryb3AsIF9jdXJyZW50RHJhZ0ZhY2V0O1xuXG5fLmV4dGVuZChEcmFnRHJvcCwge1xuICAgIHNlcnZpY2U6IGRyYWdEcm9wU2VydmljZSxcbiAgICBkZXN0cm95OiBEcmFnRHJvcF9kZXN0cm95XG59KTtcblxuXG5kcmFnRHJvcFNlcnZpY2Uub25NZXNzYWdlcyh7XG4gICAgLy8gZGF0YSBpcyBEcmFnRHJvcERhdGFUcmFuc2ZlciBpbnN0YW5jZVxuICAgIC8vIGZpcmVkIGJ5IERyYWcgZmFjZXQgb24gXCJkcmFnc3RhcnRcIiBldmVudFxuICAgICdkcmFnZHJvcHN0YXJ0ZWQnOiBvbkRyYWdEcm9wU3RhcnRlZCwgXG4gICAgLy8gZGF0YSBpcyBvYmplY3Qgd2l0aCBhdCBsZWFzdCBkcm9wRWZmZWN0IHByb3BlcnR5XG4gICAgLy8gZmlyZWQgYnkgRHJvcCBmYWNldCBvbiBcImRyb3BcIiBldmVudFxuICAgICdkcmFnZHJvcGNvbXBsZXRlZCc6IG9uRHJhZ0Ryb3BDb21wbGV0ZWQsIFxuICAgIC8vIGZpcmVkIGJ5IERyYWcgZmFjZXQgb24gXCJkcmFnZW5kXCIgZXZlbnQgdG8gY29tcGxldGUgZHJhZ1xuICAgIC8vIGlmIGRyb3AgaGFwcGVuZGVkIGluIGFub3RoZXIgd2luZG93IG9yIGlmIGl0IHdhcyBjYW5jZWxsZWRcbiAgICAnY29tcGxldGVkcmFnZHJvcCc6IG9uQ29tcGxldGVEcmFnRHJvcFxufSk7XG5cblxuXy5leHRlbmQoZHJhZ0Ryb3BTZXJ2aWNlLCB7XG4gICAgZ2V0Q3VycmVudERyYWdEcm9wOiBnZXRDdXJyZW50RHJhZ0Ryb3Bcbn0pO1xuXG5cbmZ1bmN0aW9uIG9uRHJhZ0Ryb3BTdGFydGVkKG1zZywgZGF0YSkge1xuICAgIF9jdXJyZW50RHJhZ0Ryb3AgPSBkYXRhLmRyYWdEcm9wO1xuICAgIF9jdXJyZW50RHJhZ0ZhY2V0ID0gZGF0YS5kcmFnRmFjZXQ7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnRHJvcENvbXBsZXRlZChtc2csIGRhdGEpIHtcbiAgICBfY3VycmVudERyYWdGYWNldCAmJiBfY3VycmVudERyYWdGYWNldC5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wY29tcGxldGVkJywgZGF0YSk7XG4gICAgX2N1cnJlbnREcmFnRHJvcCA9IHVuZGVmaW5lZDtcbiAgICBfY3VycmVudERyYWdGYWNldCA9IHVuZGVmaW5lZDtcbn1cblxuXG5mdW5jdGlvbiBvbkNvbXBsZXRlRHJhZ0Ryb3AobXNnLCBkYXRhKSB7XG4gICAgaWYgKF9jdXJyZW50RHJhZ0Ryb3ApXG4gICAgICAgIGRyYWdEcm9wU2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wY29tcGxldGVkJywgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gZ2V0Q3VycmVudERyYWdEcm9wKCkge1xuICAgIHJldHVybiBfY3VycmVudERyYWdEcm9wO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wX2Rlc3Ryb3koKSB7XG4gICAgZHJhZ0Ryb3BTZXJ2aWNlLm9mZkFsbCgpO1xufVxuIiwiLy8gPGEgbmFtZT1cInV0aWxzLWVycm9yXCI+PC9hPlxuLy8gbWlsby51dGlscy5lcnJvclxuLy8gLS0tLS0tLS0tLS1cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8vIG1vZHVsZSBleHBvcnRzIGVycm9yIGNsYXNzZXMgZm9yIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoaXMgYXJyYXlcbnZhciBlcnJvckNsYXNzTmFtZXMgPSBbJ0Fic3RyYWN0Q2xhc3MnLCAnTWl4aW4nLCAnTWVzc2VuZ2VyJywgJ0NvbXBvbmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICdBdHRyaWJ1dGUnLCAnQmluZGVyJywgJ0xvYWRlcicsICdNYWlsTWVzc2FnZVNvdXJjZScsICdGYWNldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICdTY29wZScsICdNb2RlbCcsICdEb21GYWNldCcsICdFZGl0YWJsZUZhY2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ0xpc3QnLCAnQ29ubmVjdG9yJywgJ1JlZ2lzdHJ5JywgJ0ZyYW1lTWVzc2FnZVNvdXJjZScsXG4gICAgICAgICAgICAgICAgICAgICAgICdEcm9wJywgJ0FuZ3VsYXInLCAnU3RvcmFnZU1lc3NhZ2VTb3VyY2UnXTtcblxudmFyIGVycm9yID0ge1xuICAgIHRvQmVJbXBsZW1lbnRlZDogZXJyb3IkdG9CZUltcGxlbWVudGVkLFxuICAgIGNyZWF0ZUNsYXNzOiBlcnJvciRjcmVhdGVDbGFzc1xufTtcblxuZXJyb3JDbGFzc05hbWVzLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgIGVycm9yW25hbWVdID0gZXJyb3IkY3JlYXRlQ2xhc3MobmFtZSArICdFcnJvcicpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXJyb3I7XG5cblxuZnVuY3Rpb24gZXJyb3IkY3JlYXRlQ2xhc3MoZXJyb3JDbGFzc05hbWUpIHtcbiAgICB2YXIgRXJyb3JDbGFzcyA9IF8ubWFrZUZ1bmN0aW9uKGVycm9yQ2xhc3NOYW1lLCAnbWVzc2FnZScsXG4gICAgICAgICAgICAndGhpcy5uYW1lID0gXCInICsgZXJyb3JDbGFzc05hbWUgKyAnXCI7IFxcXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwiVGhlcmUgd2FzIGFuICBlcnJvclwiOycpO1xuICAgIF8ubWFrZVN1YmNsYXNzKEVycm9yQ2xhc3MsIEVycm9yKTtcblxuICAgIHJldHVybiBFcnJvckNsYXNzO1xufVxuXG5cbmZ1bmN0aW9uIGVycm9yJHRvQmVJbXBsZW1lbnRlZCgpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3IuQWJzdHJhY3RDbGFzcygnY2FsbGluZyB0aGUgbWV0aG9kIG9mIGFuIGFic2N0cmFjdCBjbGFzcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL2NfY2xhc3MnKVxuICAgICwgQmluZEF0dHJpYnV0ZSA9IHJlcXVpcmUoJy4uL2F0dHJpYnV0ZXMvYV9iaW5kJylcbiAgICAsIGJpbmRlciA9IHJlcXVpcmUoJy4uL2JpbmRlcicpXG4gICAgLCBkb21VdGlscyA9IHJlcXVpcmUoJy4vZG9tJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgY3JlYXRlUmFuZ2VQYXRocyA9IF9jcmVhdGVOb2Rlc0FuZFBhdGhzRnVuYyhkb21VdGlscy50cmVlUGF0aE9mKTtcbnZhciBjcmVhdGVSYW5nZU5vZGVzID0gX2NyZWF0ZU5vZGVzQW5kUGF0aHNGdW5jKGRvbVV0aWxzLmdldE5vZGVBdFRyZWVQYXRoKTtcblxuXG52YXIgZnJhZ21lbnRVdGlscyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldFN0YXRlOiBmcmFnbWVudF9nZXRTdGF0ZSxcbiAgICBnZXRTdGF0ZUFzeW5jOiBmcmFnbWVudF9nZXRTdGF0ZUFzeW5jLFxuXG4gICAgZXhwYW5kUmFuZ2VUb1NpYmxpbmdzOiBleHBhbmRSYW5nZVRvU2libGluZ3MsXG4gICAgZ2V0UmFuZ2VTaWJsaW5nczogZ2V0UmFuZ2VTaWJsaW5ncyxcbiAgICBjcmVhdGVSYW5nZUZyb21TaWJsaW5nczogY3JlYXRlUmFuZ2VGcm9tU2libGluZ3MsXG4gICAgY3JlYXRlUmFuZ2VGcm9tTm9kZXM6IGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzLCAvLyBhbGlhc1xuICAgIGNyZWF0ZVJhbmdlUGF0aHM6IGNyZWF0ZVJhbmdlUGF0aHMsXG4gICAgY3JlYXRlUmFuZ2VOb2RlczogY3JlYXRlUmFuZ2VOb2Rlc1xufTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHN0YXRlIG9mIHdyYXBwZWQgcmFuZ2Ugd2l0aCBjb21wb25lbnRzLCBpbmNsdWRpbmcgcGFydGlhbGx5IHNlbGVjdGVkLiBUaGUgcmFuZ2Ugd2lsbCBiZSBjbG9uZWQgYW5kIHdyYXBwZWQgaW4gY29tcG9uZW50IHdpdGggY29udGFpbmVyIGZhY2V0IGJlZm9yZSBnZXR0aW5nIGl0cyBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2cgZXJyb3IgYW5kIHJldHVybiB1bmRlZmluZWQgaWYgcmFuZ2UgaGFzIG5vIGNvbW1vbiBhbmNlc3RvciB0aGF0IGhhcyBjb21wb25lbnQgd2l0aCBjb250YWluZXIgZmFjZXRcbiAqIFxuICogQHBhcmFtIHtSYW5nZX0gcmFuZ2UgRE9NIFJhbmdlIGluc3RhbmNlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlbmFtZUNoaWxkcmVuIG9wdGlvbmFsIHBhcmFtZXRlciwgYHRydWVgIHRvIHJlbmFtZSBmcmFnbWVudCBjaGlsZCBjb21wb25lbnRzXG4gKiBAcGFyYW0ge1N0cmluZ30gd3JhcHBlckNsYXNzTmFtZSBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gd3JhcCBpbiBhIGN1c3RvbSBjb21wb25lbnQgY2xhc3NcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZnJhZ21lbnRfZ2V0U3RhdGUocmFuZ2UsIHJlbmFtZUNoaWxkcmVuLCB3cmFwcGVyQ2xhc3NOYW1lKSB7XG4gICAgdmFyIHJhbmdlQ29udGFpbmVyID0gX2dldFJhbmdlQ29udGFpbmVyKHJhbmdlKTtcbiAgICBpZiAoISByYW5nZUNvbnRhaW5lcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ2ZyYWdtZW50LmdldFN0YXRlOiByYW5nZSBoYXMgbm8gY29tbW9uIGNvbnRhaW5lcicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGZyYWcgPSByYW5nZS5jbG9uZUNvbnRlbnRzKClcbiAgICAgICAgLCB3cmFwcGVyID0gX3dyYXBGcmFnbWVudEluQ29udGFpbmVyKGZyYWcsIHdyYXBwZXJDbGFzc05hbWUpO1xuXG4gICAgX3RyYW5zZmVyU3RhdGVzKHJhbmdlQ29udGFpbmVyLCB3cmFwcGVyKTtcbiAgICBpZiAocmVuYW1lQ2hpbGRyZW4pIF9yZW5hbWVDaGlsZHJlbih3cmFwcGVyKTtcbiAgICB2YXIgd3JhcHBlclN0YXRlID0gd3JhcHBlci5nZXRTdGF0ZSgpO1xuICAgIF8uZGVmZXJNZXRob2Qod3JhcHBlciwgJ2Rlc3Ryb3knKTtcbiAgICByZXR1cm4gd3JhcHBlclN0YXRlO1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc3RhdGUgb2Ygd3JhcHBlZCByYW5nZSB3aXRoIGNvbXBvbmVudHMsIGluY2x1ZGluZyBwYXJ0aWFsbHkgc2VsZWN0ZWQuIFRoZSByYW5nZSB3aWxsIGJlIGNsb25lZCBhbmQgd3JhcHBlZCBpbiBjb21wb25lbnQgd2l0aCBjb250YWluZXIgZmFjZXQgYmVmb3JlIGdldHRpbmcgaXRzIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiByZXN1bHQgYW5kIGFueSBlcnJvciB2aWEgY2FsbGJhY2suXG4gKiBcbiAqIEBwYXJhbSB7UmFuZ2V9IHJhbmdlIERPTSBSYW5nZSBpbnN0YW5jZVxuICogQHBhcmFtIHtCb29sZWFufSByZW5hbWVDaGlsZHJlbiBvcHRpb25hbCBwYXJhbWV0ZXIsIGB0cnVlYCB0byByZW5hbWUgZnJhZ21lbnQgY2hpbGQgY29tcG9uZW50c1xuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYWx3YXlzIHRoZSBsYXN0IHBhcmFtZXRlciwgb3B0aW9uYWwgcGFyYW1ldGVycyBjYW4gYmUgZHJvcHBlZDsgcmVzdWx0IGlzIHBhc3NlZCB2aWEgY2FsbGJhY2sgd2l0aCBhbnkgZXJyb3IgYXMgZmlyc3QgcGFyYW1ldGVyXG4gKi9cbmZ1bmN0aW9uIGZyYWdtZW50X2dldFN0YXRlQXN5bmMocmFuZ2UsIHJlbmFtZUNoaWxkcmVuLCBjYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciByYW5nZUNvbnRhaW5lciA9IF9nZXRSYW5nZUNvbnRhaW5lcihyYW5nZSk7XG4gICAgICAgIGlmICghIHJhbmdlQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ2ZyYWdtZW50LmdldFN0YXRlOiByYW5nZSBoYXMgbm8gY29tbW9uIGNvbnRhaW5lcicpKTtcbiAgICAgICAgICAgIHJldHVybjsgLy8gZG8gTk9UIGNvbm5lY3QgcmV0dXJuIHRvIHByZXZpb3VzIGNhbGxiYWNrLCBnZXRTdGF0ZSBzaG91bGQgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZW5hbWVDaGlsZHJlbiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IHJlbmFtZUNoaWxkcmVuO1xuICAgICAgICAgICAgcmVuYW1lQ2hpbGRyZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmcmFnID0gcmFuZ2UuY2xvbmVDb250ZW50cygpXG4gICAgICAgICAgICAsIHdyYXBwZXIgPSBfd3JhcEZyYWdtZW50SW5Db250YWluZXIoZnJhZyk7XG5cbiAgICAgICAgX3RyYW5zZmVyU3RhdGVzKHJhbmdlQ29udGFpbmVyLCB3cmFwcGVyKTtcbiAgICAgICAgXy5kZWZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHdyYXBwZXIuYnJvYWRjYXN0KCdzdGF0ZXJlYWR5Jyk7XG4gICAgICAgICAgICBfLmRlZmVyKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmIChyZW5hbWVDaGlsZHJlbikgX3JlbmFtZUNoaWxkcmVuKHdyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHZhciB3cmFwcGVyU3RhdGUgPSB3cmFwcGVyLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgd3JhcHBlci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgd3JhcHBlclN0YXRlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX3dyYXBGcmFnbWVudEluQ29udGFpbmVyKGZyYWcsIHdyYXBwZXJDbGFzc05hbWUpIHtcbiAgICB2YXIgd3JhcEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgICAgLCBhdHRyID0gbmV3IEJpbmRBdHRyaWJ1dGUod3JhcEVsKTtcblxuICAgIF8uZXh0ZW5kKGF0dHIsIHtcbiAgICAgICAgY29tcENsYXNzOiB3cmFwcGVyQ2xhc3NOYW1lIHx8ICdDb21wb25lbnQnLFxuICAgICAgICBjb21wRmFjZXRzOiB3cmFwcGVyQ2xhc3NOYW1lID8gW10gOiBbJ2NvbnRhaW5lciddLFxuICAgICAgICBjb21wTmFtZTogJ3dyYXBwZXInXG4gICAgfSk7XG5cbiAgICBhdHRyLmRlY29yYXRlKCk7XG5cbiAgICB3cmFwRWwuYXBwZW5kQ2hpbGQoZnJhZyk7XG4gICAgdmFyIHNjb3BlID0gYmluZGVyKHdyYXBFbCk7XG4gICAgcmV0dXJuIHNjb3BlLndyYXBwZXI7XG59XG5cblxuZnVuY3Rpb24gX2dldFJhbmdlQ29udGFpbmVyKHJhbmdlKSB7XG4gICAgdmFyIGVsID0gZG9tVXRpbHMuY29udGFpbmluZ0VsZW1lbnQocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIpO1xuICAgIHJldHVybiBDb21wb25lbnQuZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbCwgdHJ1ZSwgJ2NvbnRhaW5lcicpO1xufVxuXG5cbmZ1bmN0aW9uIF90cmFuc2ZlclN0YXRlcyhmcm9tQ29tcCwgdG9Db21wKSB7XG4gICAgdmFyIGZyb21TY29wZSA9IGZyb21Db21wLmNvbnRhaW5lci5zY29wZTtcbiAgICB0b0NvbXAuY29udGFpbmVyLnNjb3BlLl9lYWNoKGZ1bmN0aW9uKHRvQ2hpbGRDb21wLCBuYW1lKSB7XG4gICAgICAgIHZhciBmcm9tQ2hpbGRDb21wID0gZnJvbVNjb3BlW25hbWVdO1xuICAgICAgICBpZiAoISBmcm9tQ2hpbGRDb21wKSByZXR1cm4gbG9nZ2VyLmVycm9yKCdmcmFnbWVudC5nZXRTdGF0ZTogY29ucG9uZW50JywgbmFtZSwgJ25vdCBmb3VuZCBpbiByYW5nZScpO1xuICAgICAgICB2YXIgc3RhdGUgPSBmcm9tQ2hpbGRDb21wLl9nZXRTdGF0ZSh0cnVlKTtcbiAgICAgICAgdG9DaGlsZENvbXAuc2V0U3RhdGUoc3RhdGUpO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW5hbWVDaGlsZHJlbihjb21wKSB7XG4gICAgY29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgY2hpbGQucmVuYW1lKCk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gZXhwYW5kUmFuZ2VUb1NpYmxpbmdzKHJhbmdlKSB7XG4gICAgdmFyIHNpYmxpbmdzID0gZ2V0UmFuZ2VTaWJsaW5ncyhyYW5nZSk7XG4gICAgcmFuZ2UgPSBjcmVhdGVSYW5nZUZyb21TaWJsaW5ncyhzaWJsaW5ncyk7XG4gICAgcmV0dXJuIHJhbmdlO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzKG5vZGVzKSB7XG4gICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBpZiAobm9kZXMuc2libGluZ3MpIHtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUobm9kZXMuc3RhcnQpO1xuICAgICAgICByYW5nZS5zZXRFbmRBZnRlcihub2Rlcy5lbmQpO1xuICAgIH0gZWxzZVxuICAgICAgICByYW5nZS5zZWxlY3ROb2RlKG5vZGVzLnN0YXJ0KTtcbiAgICByZXR1cm4gcmFuZ2U7XG59XG5cblxuZnVuY3Rpb24gZ2V0UmFuZ2VTaWJsaW5ncyhyYW5nZSkge1xuICAgIHZhciBjb250YWluZXJOb2RlID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXJcbiAgICAgICAgLCBzdGFydE5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lclxuICAgICAgICAsIGVuZE5vZGUgPSByYW5nZS5lbmRDb250YWluZXI7XG5cbiAgICBpZiAoc3RhcnROb2RlID09IGVuZE5vZGUpIHtcbiAgICAgICAgaWYgKHN0YXJ0Tm9kZSAhPSBjb250YWluZXJOb2RlKSBsb2dnZXIuZXJyb3IoJ2RlbGV0ZVNlbGVjdGlvbkNvbW1hbmQgbG9naWNhbCBlcnJvcjogc3RhcnQ9PWVuZCwgYnV0IGNvbnRhaW5lciBpcyBkaWZmZXJlbnQnKTtcbiAgICAgICAgcmV0dXJuIHsgc2libGluZ3M6IGZhbHNlLCBzdGFydDogc3RhcnROb2RlIH07XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0Tm9kZSA9PSBjb250YWluZXJOb2RlIHx8IGVuZE5vZGUgPT0gY29udGFpbmVyTm9kZSlcbiAgICAgICAgcmV0dXJuIHsgc2libGluZ3M6IGZhbHNlLCBzdGFydDogY29udGFpbmVyTm9kZSB9O1xuXG4gICAgdmFyIHN0YXJ0U2libGluZyA9IF9maW5kQ29udGFpbmluZ0NoaWxkKGNvbnRhaW5lck5vZGUsIHN0YXJ0Tm9kZSk7XG4gICAgdmFyIGVuZFNpYmxpbmcgPSBfZmluZENvbnRhaW5pbmdDaGlsZChjb250YWluZXJOb2RlLCBlbmROb2RlKTtcblxuICAgIGlmIChzdGFydFNpYmxpbmcgJiYgZW5kU2libGluZykge1xuICAgICAgICBpZiAoc3RhcnRTaWJsaW5nID09IGVuZFNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignZGVsZXRlU2VsZWN0aW9uQ29tbWFuZCBsb2dpY2FsIGVycm9yOiBzYW1lIHNpYmxpbmdzJyk7XG4gICAgICAgICAgICByZXR1cm4geyBzaWJsaW5nczogZmFsc2UsIHN0YXJ0OiBzdGFydFNpYmxpbmcgfTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4geyBzaWJsaW5nczogdHJ1ZSwgc3RhcnQ6IHN0YXJ0U2libGluZywgZW5kOiBlbmRTaWJsaW5nIH07XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9maW5kQ29udGFpbmluZ0NoaWxkKGNvbnRhaW5lck5vZGUsIHNlbE5vZGUpIHtcbiAgICByZXR1cm4gXy5maW5kKGNvbnRhaW5lck5vZGUuY2hpbGROb2RlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5jb250YWlucyhzZWxOb2RlKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBfY3JlYXRlTm9kZXNBbmRQYXRoc0Z1bmMoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbihyb290RWwsIGZyb21PYmopIHtcbiAgICAgICAgdmFyIHRvT2JqID0ge1xuICAgICAgICAgICAgc2libGluZ3M6IGZyb21PYmouc2libGluZ3MsXG4gICAgICAgICAgICBzdGFydDogZnVuYyhyb290RWwsIGZyb21PYmouc3RhcnQpXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0b09iai5zaWJsaW5ncylcbiAgICAgICAgICAgIHRvT2JqLmVuZCA9IGZ1bmMocm9vdEVsLCBmcm9tT2JqLmVuZCk7XG4gICAgICAgIHJldHVybiB0b09iajtcbiAgICB9O1xufVxuXG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJy4vZGVwcmVjYXRlJyk7XG5cbi8qKlxuICogYG1pbG8udXRpbGBcbiAqL1xudmFyIHV0aWwgPSB7XG4gICAgbG9nZ2VyOiBtaWxvQ29yZS51dGlsLmxvZ2dlcixcbiAgICByZXF1ZXN0OiByZXF1aXJlKCcuL3JlcXVlc3QnKSxcbiAgICB3ZWJzb2NrZXQ6IHJlcXVpcmUoJy4vd2Vic29ja2V0JyksXG4gICAgY2hlY2s6IG1pbG9Db3JlLnV0aWwuY2hlY2ssXG4gICAgZXJyb3I6IGRlcHJlY2F0ZShyZXF1aXJlKCcuL2Vycm9yJyksICdtaWxvLnV0aWwuZXJyb3IgaXMgREVQUkVDQVRFRCBhbmQgd2lsbCBiZSBSRU1PVkVEIHNvb24hJyksXG4gICAgY291bnQ6IGRlcHJlY2F0ZShyZXF1aXJlKCcuL3VuaXF1ZV9pZCcpLCAnbWlsby51dGlsLmNvdW50IGlzIERFUFJFQ0FURUQhIFVzZSBtaWxvLnV0aWwudW5pcXVlSWQgaW5zdGVhZCcpLFxuICAgIHVuaXF1ZUlkOiByZXF1aXJlKCcuL3VuaXF1ZV9pZCcpLFxuICAgIGNvbXBvbmVudE5hbWU6IHJlcXVpcmUoJy4vY29tcG9uZW50X25hbWUnKSxcbiAgICBkb206IHJlcXVpcmUoJy4vZG9tJyksXG4gICAgZG9tTGlzdGVuZXJzOiByZXF1aXJlKCcuL2RvbV9saXN0ZW5lcnMnKSxcbiAgICBzZWxlY3Rpb246IHJlcXVpcmUoJy4vc2VsZWN0aW9uJyksXG4gICAgZnJhZ21lbnQ6IHJlcXVpcmUoJy4vZnJhZ21lbnQnKSxcbiAgICBqc29uUGFyc2U6IGRlcHJlY2F0ZShyZXF1aXJlKCcuL2pzb25fcGFyc2UnKSwgJ21pbG8udXRpbC5qc29uUGFyc2UgaXMgREVQUkVDQVRFRCEgVXNlIF8uanNvblBhcnNlIGluc3RlYWQnKSxcbiAgICBzdG9yYWdlOiByZXF1aXJlKCcuL3N0b3JhZ2UnKSxcbiAgICBkb21SZWFkeTogcmVxdWlyZSgnLi9kb21yZWFkeScpLFxuICAgIGRyYWdEcm9wOiByZXF1aXJlKCcuL2RyYWdkcm9wJyksXG4gICAgZGlhbG9nOiBkZXByZWNhdGUocmVxdWlyZSgnLi4vY29tcG9uZW50cy91aS9ib290c3RyYXAvRGlhbG9nJyksXG4gICAgICAgICdtaWxvLnV0aWwuZGlhbG9nIGlzIERFUFJFQ0FURUQhIFVzZSBtaWxvLnJlZ2lzdHJ5LmNvbXBvbmVudHMuZ2V0KFxcJ01MRGlhbG9nXFwnKSBpbnN0ZWFkJyksXG4gICAgYWxlcnQ6IGRlcHJlY2F0ZShyZXF1aXJlKCcuLi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9BbGVydCcpLFxuICAgICAgICAnbWlsby51dGlsLmFsZXJ0IGlzIERFUFJFQ0FURUQhIFVzZSBtaWxvLnJlZ2lzdHJ5LmNvbXBvbmVudHMuZ2V0KFxcJ01MQWxlcnRcXCcpIGluc3RlYWQnKSxcbiAgICBkZXByZWNhdGU6IGRlcHJlY2F0ZSxcbiAgICBkb1Q6IG1pbG9Db3JlLnV0aWwuZG9ULFxuICAgIGRlc3Ryb3k6IHV0aWxfZGVzdHJveVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB1dGlsO1xuXG5cbmZ1bmN0aW9uIHV0aWxfZGVzdHJveSgpIHtcbiAgICB1dGlsLnJlcXVlc3QuZGVzdHJveSgpO1xuICAgIHV0aWwuZHJhZ0Ryb3AuZGVzdHJveSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbm1vZHVsZS5leHBvcnRzID0ganNvblBhcnNlO1xuXG5cbi8qKlxuICogYG1pbG8udXRpbC5qc29uUGFyc2VgXG4gKiBTYWZlIEpTT04ucGFyc2UsIHJldHVybnMgdW5kZWZpbmVkIGlmIEpTT04ucGFyc2UgdGhyb3dzIGFuIGV4Y2VwdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgLSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3RcbiAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGpzb25QYXJzZShzdHIpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIG1pbG8udXRpbHMucmVxdWVzdFxuLy8gLS0tLS0tLS0tLS1cblxuLy8gQ29udmVuaWVuY2UgZnVuY3Rpb25zIHdyYXBwaW5nIFhNTEhUVFBSZXF1ZXN0IGZ1bmN0aW9uYWxpdHkuXG5cbi8vIGBgYFxuLy8gdmFyIHJlcXVlc3QgPSBtaWxvLnV0aWxzLnJlcXVlc3Rcbi8vICAgICAsIG9wdHM6IHsgbWV0aG9kOiAnR0VUJyB9O1xuXG4vLyByZXF1ZXN0KHVybCwgb3B0cywgZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4vLyAgICAgbG9nZ2VyLmRlYnVnKGRhdGEpO1xuLy8gfSk7XG5cbi8vIHJlcXVlc3QuZ2V0KHVybCwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4vLyAgICAgbG9nZ2VyLmRlYnVnKGRhdGEpO1xuLy8gfSk7XG4vLyBgYGBcblxuLy8gT25seSBnZW5lcmljIHJlcXVlc3QgYW5kIGdldCwganNvbiwgcG9zdCBjb252ZW5pZW5jZSBtZXRob2RzIGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQuXG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgdW5pcXVlSWQgPSByZXF1aXJlKCcuL3VuaXF1ZV9pZCcpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlcjtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1ZXN0O1xuXG5cbnZhciBfcGVuZGluZ1JlcXVlc3RzID0gW107XG5cbnZhciBwcm9taXNlVGhlbiA9IGNyZWF0ZVByb21pc2VPdmVycmlkZSgndGhlbicpO1xudmFyIHByb21pc2VDYXRjaCA9IGNyZWF0ZVByb21pc2VPdmVycmlkZSgnY2F0Y2gnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBvdmVycmlkZSBzdGFuZGFyZCBwcm9taXNlIGJlaGF2aW91ciBhbmQgYWxsb3cgcHJvbWlzZSBpbnN0YW5jZXNcbiAqIGNyZWF0ZWQgdG8gbWFpbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIHJlcXVlc3Qgb2JqZWN0IG5vIG1hdHRlciBpZiAudGhlbigpIG9yIC5jYXRjaCgpIGlzIGNhbGxlZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUHJvbWlzZU92ZXJyaWRlKGZ1bmN0aW9uTmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnByb3RvdHlwZVtmdW5jdGlvbk5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGtlZXBSZXF1ZXN0T2JqZWN0KHByb21pc2UsIHRoaXMuX3JlcXVlc3QpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCh1cmwsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgb3B0cy51cmwgPSB1cmw7XG4gICAgb3B0cy5jb250ZW50VHlwZSA9IG9wdHMuY29udGVudFR5cGUgfHwgJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCc7XG4gICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2VTeW5jKCdyZXF1ZXN0JywgeyBvcHRpb25zOiBvcHRzIH0pO1xuXG4gICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHJlcS5vcGVuKG9wdHMubWV0aG9kLCBvcHRzLnVybCwgdHJ1ZSk7XG4gICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIG9wdHMuY29udGVudFR5cGUpO1xuICAgIHNldFJlcXVlc3RIZWFkZXJzKHJlcSwgb3B0cy5oZWFkZXJzKTtcblxuICAgIHJlcS50aW1lb3V0ID0gb3B0cy50aW1lb3V0IHx8IGNvbmZpZy5yZXF1ZXN0LmRlZmF1bHRzLnRpbWVvdXQ7XG4gICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHJlcS5vbnRpbWVvdXQgPSByZXEub25hYm9ydCA9IG9uUmVhZHk7XG5cbiAgICB2YXIgeFByb21pc2UgPSBfY3JlYXRlWFByb21pc2UocmVxKTtcblxuICAgIHJlcS5zZW5kKEpTT04uc3RyaW5naWZ5KG9wdHMuZGF0YSkpO1xuICAgIHJlcVtjb25maWcucmVxdWVzdC5vcHRpb25zS2V5XSA9IG9wdHM7XG5cbiAgICBfcGVuZGluZ1JlcXVlc3RzLnB1c2gocmVxKTtcblxuICAgIHJldHVybiB4UHJvbWlzZS5wcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gb25SZWFkeShlKSB7XG4gICAgICAgIF9vblJlYWR5KHJlcSwgY2FsbGJhY2ssIHhQcm9taXNlLCBlLnR5cGUpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfY3JlYXRlWFByb21pc2UocmVxdWVzdCkge1xuICAgIHZhciByZXNvbHZlUHJvbWlzZSwgcmVqZWN0UHJvbWlzZTtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICAgIHJlamVjdFByb21pc2UgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBrZWVwUmVxdWVzdE9iamVjdChwcm9taXNlLCByZXF1ZXN0KTtcbiAgICBwcm9taXNlLmNhdGNoKF8ubm9vcCk7IC8vIFNvbWV0aW1lcyBlcnJvcnMgYXJlIGhhbmRsZWQgd2l0aGluIGNhbGxiYWNrcywgc28gdW5jYXVnaHQgcHJvbWlzZSBlcnJvciBtZXNzYWdlIHNob3VsZCBiZSBzdXBwcmVzc2VkLlxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZTogcHJvbWlzZSxcbiAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZVByb21pc2UsXG4gICAgICAgIHJlamVjdDogcmVqZWN0UHJvbWlzZVxuICAgIH1cbn1cblxuLy8gRW5zdXJlcyB0aGF0IHRoZSBwcm9taXNlIChhbmQgYW55IHByb21pc2VzIGNyZWF0ZWQgd2hlbiBjYWxsaW5nIC50aGVuLy5jYXRjaCkgaGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCByZXF1ZXN0IG9iamVjdFxuZnVuY3Rpb24ga2VlcFJlcXVlc3RPYmplY3QocHJvbWlzZSwgcmVxdWVzdCkge1xuICAgIHByb21pc2UuX3JlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHByb21pc2UudGhlbiA9IHByb21pc2VUaGVuO1xuICAgIHByb21pc2UuY2F0Y2ggPSBwcm9taXNlQ2F0Y2g7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuXG5mdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVycyhyZXEsIGhlYWRlcnMpIHtcbiAgICBpZiAoaGVhZGVycylcbiAgICAgICAgXy5lYWNoS2V5KGhlYWRlcnMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbn1cblxuZnVuY3Rpb24gX29uUmVhZHkocmVxLCBjYWxsYmFjaywgeFByb21pc2UsIGV2ZW50VHlwZSkge1xuICAgIGlmIChyZXEucmVhZHlTdGF0ZSAhPSA0KSByZXR1cm47XG4gICAgaWYgKCFyZXEuc3RhdHVzICYmIGV2ZW50VHlwZSA9PSAncmVhZHlzdGF0ZWNoYW5nZScpIHJldHVybjtcblxuICAgIF8uc3BsaWNlSXRlbShfcGVuZGluZ1JlcXVlc3RzLCByZXEpO1xuXG4gICAgdmFyIGVycm9yO1xuICAgIHRyeSB7XG4gICAgICAgIGlmICggcmVxLnN0YXR1cyA+PSAyMDAgJiYgcmVxLnN0YXR1cyA8IDQwMCApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhudWxsLCByZXEucmVzcG9uc2VUZXh0LCByZXEpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7IGVycm9yID0gZTsgfVxuICAgICAgICAgICAgeFByb21pc2UucmVzb2x2ZShyZXEucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBlcnJvclJlYXNvbiA9IHJlcS5zdGF0dXMgfHwgZXZlbnRUeXBlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSgnZXJyb3InKTtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSgnZXJyb3InICsgZXJyb3JSZWFzb24pO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGVycm9yUmVhc29uLCByZXEucmVzcG9uc2VUZXh0LCByZXEpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7IGVycm9yID0gZTsgfVxuICAgICAgICAgICAgeFByb21pc2UucmVqZWN0KHsgcmVhc29uOiBlcnJvclJlYXNvbiwgcmVzcG9uc2U6IHJlcS5yZXNwb25zZVRleHQgfSk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgZXJyb3IgPSBlcnJvciB8fCBlO1xuICAgIH1cblxuICAgIC8vIG5vdCByZW1vdmluZyBzdWJzY3JpcHRpb24gY3JlYXRlcyBtZW1vcnkgbGVhaywgZGVsZXRpbmcgcHJvcGVydHkgd291bGQgbm90IHJlbW92ZSBzdWJzY3JpcHRpb25cbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcmVxLm9udGltZW91dCA9IHJlcS5vbmFib3J0ID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFfcGVuZGluZ1JlcXVlc3RzLmxlbmd0aClcbiAgICAgICAgcG9zdE1lc3NhZ2UoJ3JlcXVlc3RzY29tcGxldGVkJyk7XG5cbiAgICBpZiAoZXJyb3IpIHRocm93IG5ldyBFcnJvcignRXhjZXB0aW9uOiAnICsgZXJyb3IpO1xuXG4gICAgZnVuY3Rpb24gcG9zdE1lc3NhZ2UobXNnKSB7XG4gICAgICAgIGlmIChfbWVzc2VuZ2VyKSByZXF1ZXN0LnBvc3RNZXNzYWdlKG1zZyxcbiAgICAgICAgICAgIHsgc3RhdHVzOiBzdGF0dXMsIHJlc3BvbnNlOiByZXEucmVzcG9uc2VUZXh0IH0pO1xuICAgIH1cbn1cblxuXG5fLmV4dGVuZChyZXF1ZXN0LCB7XG4gICAgZ2V0OiByZXF1ZXN0JGdldCxcbiAgICBwb3N0OiByZXF1ZXN0JHBvc3QsXG4gICAganNvbjogcmVxdWVzdCRqc29uLFxuICAgIGpzb25wOiByZXF1ZXN0JGpzb25wLFxuICAgIGZpbGU6IHJlcXVlc3QkZmlsZSxcbiAgICB1c2VNZXNzZW5nZXI6IHJlcXVlc3QkdXNlTWVzc2VuZ2VyLFxuICAgIGRlc3Ryb3k6IHJlcXVlc3QkZGVzdHJveSxcbiAgICB3aGVuUmVxdWVzdHNDb21wbGV0ZWQ6IHdoZW5SZXF1ZXN0c0NvbXBsZXRlZFxufSk7XG5cblxudmFyIF9tZXNzZW5nZXI7XG5cblxuZnVuY3Rpb24gcmVxdWVzdCR1c2VNZXNzZW5nZXIoKSB7XG4gICAgX21lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIocmVxdWVzdCwgWydvbicsICdvbmNlJywgJ29uU3luYycsICdvZmYnLCAnb25NZXNzYWdlcycsICdvZmZNZXNzYWdlcycsICdwb3N0TWVzc2FnZScsICdwb3N0TWVzc2FnZVN5bmMnXSk7XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRnZXQodXJsLCBjYWxsYmFjaykge1xuICAgIHJldHVybiByZXF1ZXN0KHVybCwgeyBtZXRob2Q6ICdHRVQnIH0sIGNhbGxiYWNrKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1ZXN0JHBvc3QodXJsLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIHJldHVybiByZXF1ZXN0KHVybCwgeyBtZXRob2Q6ICdQT1NUJywgZGF0YTogZGF0YSB9LCBjYWxsYmFjayk7XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRqc29uKHVybCwgY2FsbGJhY2spIHtcbiAgICB2YXIgcHJvbWlzZSA9IHJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ0dFVCcgfSk7XG5cbiAgICB2YXIganNvblByb21pc2UgPSBwcm9taXNlLnRoZW4oSlNPTi5wYXJzZSk7XG5cbiAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgIGpzb25Qcm9taXNlXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJEYXRhKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnJEYXRhLnJlYXNvbiwgZXJyRGF0YS5yZXNwb25zZSk7XG4gICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGpzb25Qcm9taXNlO1xufVxuXG5cbnZhciBqc29ucE9wdGlvbnMgPSB7IG1ldGhvZDogJ0dFVCcsIGpzb25wOiB0cnVlIH07XG5mdW5jdGlvbiByZXF1ZXN0JGpzb25wKHVybCwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JyksXG4gICAgICAgIHhQcm9taXNlID0gX2NyZWF0ZVhQcm9taXNlKHNjcmlwdCksXG4gICAgICAgIGhlYWQgPSB3aW5kb3cuZG9jdW1lbnQuaGVhZCxcbiAgICAgICAgdW5pcXVlQ2FsbGJhY2sgPSBjb25maWcucmVxdWVzdC5qc29ucENhbGxiYWNrUHJlZml4ICsgdW5pcXVlSWQoKTtcblxuICAgIHZhciBvcHRzID0gXy5leHRlbmQoeyB1cmw6IHVybCB9LCBqc29ucE9wdGlvbnMpO1xuICAgIGlmIChfbWVzc2VuZ2VyKSByZXF1ZXN0LnBvc3RNZXNzYWdlU3luYygncmVxdWVzdCcsIHsgb3B0aW9uczogb3B0cyB9KTtcblxuICAgIGlmICghIF8uaXNFcXVhbChfLm9taXRLZXlzKG9wdHMsICd1cmwnKSwganNvbnBPcHRpb25zKSlcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0lnbm9yZWQgbm90IGFsbG93ZWQgcmVxdWVzdCBvcHRpb25zIGNoYW5nZSBpbiBKU09OUCByZXF1ZXN0IC0gb25seSBVUkwgY2FuIGJlIGNoYW5nZWQnKTtcblxuICAgIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignTm8gSlNPTlAgcmVzcG9uc2Ugb3Igbm8gY2FsbGJhY2sgaW4gcmVzcG9uc2UnKTtcbiAgICAgICAgX29uUmVzdWx0KGVycik7XG4gICAgfSwgY29uZmlnLnJlcXVlc3QuanNvbnBUaW1lb3V0KTtcblxuICAgIHdpbmRvd1t1bmlxdWVDYWxsYmFja10gPSBfLnBhcnRpYWwoX29uUmVzdWx0LCBudWxsKTtcblxuICAgIF9wZW5kaW5nUmVxdWVzdHMucHVzaCh3aW5kb3dbdW5pcXVlQ2FsbGJhY2tdKTtcblxuICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgc2NyaXB0LnNyYyA9IG9wdHMudXJsICsgKG9wdHMudXJsLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJykgKyAnY2FsbGJhY2s9JyArIHVuaXF1ZUNhbGxiYWNrO1xuXG4gICAgaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXG4gICAgcmV0dXJuIHhQcm9taXNlLnByb21pc2U7XG5cblxuICAgIGZ1bmN0aW9uIF9vblJlc3VsdChlcnIsIHJlc3VsdCkge1xuICAgICAgICBfLnNwbGljZUl0ZW0oX3BlbmRpbmdSZXF1ZXN0cywgd2luZG93W3VuaXF1ZUNhbGxiYWNrXSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwb3N0TWVzc2FnZShlcnIgPyAnZXJyb3InIDogJ3N1Y2Nlc3MnLCBlcnIsIHJlc3VsdCk7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdObyBKU09OUCByZXNwb25zZSBvciB0aW1lb3V0Jyk7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoJ2Vycm9yanNvbnB0aW1lb3V0JywgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlKSB7IHZhciBlcnJvciA9IGU7IH1cbiAgICAgICAgaWYgKGVycikgeFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgIGVsc2UgeFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuXG4gICAgICAgIGNsZWFuVXAoKTtcbiAgICAgICAgaWYgKCFfcGVuZGluZ1JlcXVlc3RzLmxlbmd0aClcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKCdyZXF1ZXN0c2NvbXBsZXRlZCcpO1xuXG4gICAgICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBjbGVhblVwKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgZGVsZXRlIHdpbmRvd1t1bmlxdWVDYWxsYmFja107XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBwb3N0TWVzc2FnZShtc2csIHN0YXR1cywgcmVzdWx0KSB7XG4gICAgICAgIGlmIChfbWVzc2VuZ2VyKSByZXF1ZXN0LnBvc3RNZXNzYWdlKG1zZyxcbiAgICAgICAgICAgIHsgc3RhdHVzOiBzdGF0dXMsIHJlc3BvbnNlOiByZXN1bHQgfSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIHJlcXVlc3QkZmlsZShvcHRzLCBmaWxlRGF0YSwgY2FsbGJhY2ssIHByb2dyZXNzKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09ICdzdHJpbmcnKVxuICAgICAgICBvcHRzID0geyBtZXRob2Q6ICdQT1NUJywgdXJsOiBvcHRzIH07XG5cbiAgICBvcHRzLm1ldGhvZCA9IG9wdHMubWV0aG9kIHx8ICdQT1NUJztcbiAgICBvcHRzLmZpbGUgPSB0cnVlO1xuXG4gICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2VTeW5jKCdyZXF1ZXN0JywgeyBvcHRpb25zOiBvcHRzIH0pO1xuXG4gICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGlmIChwcm9ncmVzcykgcmVxLnVwbG9hZC5vbnByb2dyZXNzID0gcHJvZ3Jlc3M7XG5cbiAgICByZXEub3BlbihvcHRzLm1ldGhvZCwgb3B0cy51cmwsIHRydWUpO1xuICAgIHNldFJlcXVlc3RIZWFkZXJzKHJlcSwgb3B0cy5oZWFkZXJzKTtcblxuICAgIHJlcS50aW1lb3V0ID0gb3B0cy50aW1lb3V0IHx8IGNvbmZpZy5yZXF1ZXN0LmRlZmF1bHRzLnRpbWVvdXQ7XG4gICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHJlcS5vbnRpbWVvdXQgPSByZXEub25hYm9ydCA9IG9uUmVhZHk7XG5cbiAgICB2YXIgeFByb21pc2UgPSBfY3JlYXRlWFByb21pc2UocmVxKTtcblxuICAgIGlmIChvcHRzLmJpbmFyeSlcbiAgICAgICAgcmVxLnNlbmQoZmlsZURhdGEpO1xuICAgIGVsc2Uge1xuICAgICAgICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZURhdGEpO1xuICAgICAgICByZXEuc2VuZChmb3JtRGF0YSk7XG4gICAgfVxuXG4gICAgX3BlbmRpbmdSZXF1ZXN0cy5wdXNoKHJlcSk7XG5cbiAgICByZXR1cm4geFByb21pc2UucHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIG9uUmVhZHkoZSkge1xuICAgICAgICBpZiAocHJvZ3Jlc3MpIHJlcS51cGxvYWQub25wcm9ncmVzcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgX29uUmVhZHkocmVxLCBjYWxsYmFjaywgeFByb21pc2UsIGUudHlwZSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIHJlcXVlc3QkZGVzdHJveSgpIHtcbiAgICBpZiAoX21lc3NlbmdlcikgX21lc3Nlbmdlci5kZXN0cm95KCk7XG4gICAgcmVxdWVzdC5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cblxuXG5mdW5jdGlvbiB3aGVuUmVxdWVzdHNDb21wbGV0ZWQoY2FsbGJhY2ssIHRpbWVvdXQpIHtcbiAgICBjYWxsYmFjayA9IF8ub25jZShjYWxsYmFjayk7XG4gICAgaWYgKHRpbWVvdXQpXG4gICAgICAgIF8uZGVsYXkoY2FsbGJhY2ssIHRpbWVvdXQsICd0aW1lb3V0Jyk7XG5cbiAgICBpZiAoX3BlbmRpbmdSZXF1ZXN0cy5sZW5ndGgpXG4gICAgICAgIF9tZXNzZW5nZXIub25jZSgncmVxdWVzdHNjb21wbGV0ZWQnLCBjYWxsYmFjayk7XG4gICAgZWxzZVxuICAgICAgICBfLmRlZmVyKGNhbGxiYWNrKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgZG9tVXRpbHMgPSByZXF1aXJlKCcuLi9kb20nKVxuICAgICwgY29udGFpbmluZ0VsZW1lbnQgPSBkb21VdGlscy5jb250YWluaW5nRWxlbWVudFxuICAgICwgc2V0Q2FyZXRQb3NpdGlvbiA9IGRvbVV0aWxzLnNldENhcmV0UG9zaXRpb25cbiAgICAsIGdldENvbXBvbmVudHNGcm9tUmFuZ2UgPSBkb21VdGlscy5nZXRDb21wb25lbnRzRnJvbVJhbmdlXG4gICAgLCBkZWxldGVSYW5nZVdpdGhDb21wb25lbnRzID0gZG9tVXRpbHMuZGVsZXRlUmFuZ2VXaXRoQ29tcG9uZW50c1xuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uLy4uL2NvbXBvbmVudHMvY19jbGFzcycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cbm1vZHVsZS5leHBvcnRzID0gVGV4dFNlbGVjdGlvbjtcblxuXG4vKipcbiAqIFRleHQgc2VsZWN0aW9uIGNsYXNzLlxuICogU2VydmVzIGFzIGEgaGVscGVyIHRvIG1hbmFnZSBjdXJyZW50IHNlbGVjdGlvblxuICogVGhlIG9iamVjdCBjYW5ub3QgYmUgcmV1c2VkLCBpZiB0aGUgc2VsZWN0aW9uIGNoYW5nZXMgc29tZSBvZiBpdHMgcHJvcGVydGllcyBtYXkgY29udGFpbiBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHByZXZpb3VzIHNlbGVjdGlvblxuICpcbiAqIEBwYXJhbSB7V2luZG93fSB3aW4gd2luZG93IGluIHdoaWNoIHRleHQgc2VsZWN0aW9uIGlzIHByb2Nlc3NlZFxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uKHdpbikge1xuICAgIGlmICghIHRoaXMgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKVxuICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24od2luKTtcbiAgICB0aGlzLndpbmRvdyA9IHdpbiB8fCB3aW5kb3c7XG4gICAgdGhpcy5pbml0KCk7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gc3RhcnQgZWxlbWVudFxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kc3RhcnRFbGVtZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRFbGVtZW50LCAnX3N0YXJ0RWxlbWVudCcsICdzdGFydENvbnRhaW5lcicpO1xuXG5cbi8qKlxuICogVGV4dFNlbGVjdGlvbiBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgc2VsZWN0aW9uIGVuZCBlbGVtZW50XG4gKlxuICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRlbmRFbGVtZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRFbGVtZW50LCAnX2VuZEVsZW1lbnQnLCAnZW5kQ29udGFpbmVyJyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJGNvbnRhaW5pbmdFbGVtZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRFbGVtZW50LCAnX2NvbnRhaW5pbmdFbGVtZW50JywgJ2NvbW1vbkFuY2VzdG9yQ29udGFpbmVyJyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gc3RhcnQgQ29tcG9uZW50XG4gKlxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRzdGFydENvbXBvbmVudCA9IFxuICAgIF8ucGFydGlhbChfZ2V0Q29tcG9uZW50LCAnX3N0YXJ0Q29tcG9uZW50JywgJ3N0YXJ0RWxlbWVudCcpO1xuXG5cbi8qKlxuICogVGV4dFNlbGVjdGlvbiBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgc2VsZWN0aW9uIGVuZCBDb21wb25lbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJGVuZENvbXBvbmVudCA9IFxuICAgIF8ucGFydGlhbChfZ2V0Q29tcG9uZW50LCAnX2VuZENvbXBvbmVudCcsICdlbmRFbGVtZW50Jyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIENvbXBvbmVudFxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kY29udGFpbmluZ0NvbXBvbmVudCA9IFxuICAgIF8ucGFydGlhbChfZ2V0Q29tcG9uZW50LCAnX2NvbnRhaW5pbmdDb21wb25lbnQnLCAnY29udGFpbmluZ0VsZW1lbnQnKTtcblxuXG5fLmV4dGVuZFByb3RvKFRleHRTZWxlY3Rpb24sIHtcbiAgICBpbml0OiBUZXh0U2VsZWN0aW9uJGluaXQsXG4gICAgdGV4dDogVGV4dFNlbGVjdGlvbiR0ZXh0LFxuICAgIHRleHROb2RlczogVGV4dFNlbGVjdGlvbiR0ZXh0Tm9kZXMsXG4gICAgY2xlYXI6IFRleHRTZWxlY3Rpb24kY2xlYXIsXG5cbiAgICBzdGFydEVsZW1lbnQ6IFRleHRTZWxlY3Rpb24kc3RhcnRFbGVtZW50LFxuICAgIGVuZEVsZW1lbnQ6IFRleHRTZWxlY3Rpb24kZW5kRWxlbWVudCxcbiAgICBjb250YWluaW5nRWxlbWVudDogVGV4dFNlbGVjdGlvbiRjb250YWluaW5nRWxlbWVudCxcblxuICAgIHN0YXJ0Q29tcG9uZW50OiBUZXh0U2VsZWN0aW9uJHN0YXJ0Q29tcG9uZW50LFxuICAgIGVuZENvbXBvbmVudDogVGV4dFNlbGVjdGlvbiRlbmRDb21wb25lbnQsXG4gICAgY29udGFpbmluZ0NvbXBvbmVudDogVGV4dFNlbGVjdGlvbiRjb250YWluaW5nQ29tcG9uZW50LFxuXG4gICAgY29udGFpbmVkQ29tcG9uZW50czogVGV4dFNlbGVjdGlvbiRjb250YWluZWRDb21wb25lbnRzLFxuICAgIGVhY2hDb250YWluZWRDb21wb25lbnQ6IFRleHRTZWxlY3Rpb24kZWFjaENvbnRhaW5lZENvbXBvbmVudCxcbiAgICBkZWw6IFRleHRTZWxlY3Rpb24kZGVsLFxuICAgIF9nZXRQb3N0RGVsZXRlU2VsZWN0aW9uUG9pbnQ6IF9nZXRQb3N0RGVsZXRlU2VsZWN0aW9uUG9pbnQsXG4gICAgX3NlbGVjdEFmdGVyRGVsZXRlOiBfc2VsZWN0QWZ0ZXJEZWxldGUsXG5cbiAgICBnZXRSYW5nZTogVGV4dFNlbGVjdGlvbiRnZXRSYW5nZSxcbiAgICBnZXRTdGF0ZTogVGV4dFNlbGVjdGlvbiRnZXRTdGF0ZSxcbiAgICBnZXROb3JtYWxpemVkUmFuZ2U6IFRleHRTZWxlY3Rpb24kJGdldE5vcm1hbGl6ZWRSYW5nZSxcbiAgICBnZXREaXJlY3Rpb246IFRleHRTZWxlY3Rpb24kJGdldERpcmVjdGlvblxufSk7XG5cblxuXy5leHRlbmQoVGV4dFNlbGVjdGlvbiwge1xuICAgIGNyZWF0ZUZyb21SYW5nZTogVGV4dFNlbGVjdGlvbiQkY3JlYXRlRnJvbVJhbmdlLFxuICAgIGNyZWF0ZUZyb21TdGF0ZTogVGV4dFNlbGVjdGlvbiQkY3JlYXRlRnJvbVN0YXRlLFxuICAgIGNyZWF0ZVN0YXRlT2JqZWN0OiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVTdGF0ZU9iamVjdFxufSk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbGl6ZXMgVGV4dFNlbGVjdGlvbiBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGluaXQoKSB7XG4gICAgdGhpcy5zZWxlY3Rpb24gPSB0aGlzLndpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24ucmFuZ2VDb3VudClcbiAgICAgICAgdGhpcy5yYW5nZSA9IHRoaXMuc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9IHRoaXMuc2VsZWN0aW9uLmlzQ29sbGFwc2VkO1xufVxuXG5cbi8qKlxuICogVGV4dFNlbGVjdGlvbiBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHJpZXZlcyBhbmQgcmV0dXJucyBzZWxlY3Rpb24gdGV4dFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiR0ZXh0KCkge1xuICAgIGlmICghIHRoaXMucmFuZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoISB0aGlzLl90ZXh0KVxuICAgICAgICB0aGlzLl90ZXh0ID0gdGhpcy5yYW5nZS50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3RleHQ7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHNlbGVjdGlvbiB0ZXh0IG5vZGVzXG4gKlxuICogQHJldHVybiB7QXJyYXlbTm9kZV19XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kdGV4dE5vZGVzKCkge1xuICAgIGlmICghIHRoaXMucmFuZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoISB0aGlzLl90ZXh0Tm9kZXMpXG4gICAgICAgIHRoaXMuX3RleHROb2RlcyA9IF9nZXRUZXh0Tm9kZXMuY2FsbCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fdGV4dE5vZGVzO1xufVxuXG5cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kY2xlYXIoKSB7XG4gICAgdGhpcy5zZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG59XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGV4dCBhbmQgdGV4dCBub2RlcyBmcm9tIHNlbGVjdGlvbiBzYXZpbmcgdGhlbSBvbiBwcm9wZXJ0aWVzIG9mIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1RleHRTZWxlY3Rpb259IHRoaXNcbiAqL1xuZnVuY3Rpb24gX2dldFRleHROb2RlcygpIHtcbiAgICAvLyBsaXN0IG9mIHNlbGVjdGVkIHRleHQgbm9kZXNcbiAgICB2YXIgdGV4dE5vZGVzID0gW107XG5cbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZClcbiAgICAgICAgcmV0dXJuIHRleHROb2RlcztcblxuICAgIC8vIGNyZWF0ZSBUcmVlV2Fsa2VyIHRvIHRyYXZlcnNlIHRoZSB0cmVlIHRvIHNlbGVjdCBhbGwgdGV4dCBub2Rlc1xuICAgIHZhciBzZWxTdGFydCA9IHRoaXMucmFuZ2Uuc3RhcnRDb250YWluZXJcbiAgICAgICAgLCBzZWxFbmQgPSB0aGlzLnJhbmdlLmVuZENvbnRhaW5lclxuICAgICAgICAsIHJhbmdlQ29udGFpbmVyID0gdGhpcy5yYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgIHZhciB0cmVlV2Fsa2VyID0gdGhpcy53aW5kb3cuZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihyYW5nZUNvbnRhaW5lciwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuICAgIHZhciBub2RlID0gdHJlZVdhbGtlci5jdXJyZW50Tm9kZSA9IHNlbFN0YXJ0O1xuXG4gICAgLy8gdHJhdmVyc2UgRE9NIHRyZWUgdG8gY29sbGVjdCBhbGwgc2VsZWN0ZWQgdGV4dCBub2Rlc1xuICAgIHdoaWxlIChub2RlICYmICghIGluRW5kIHx8IHNlbEVuZC5jb250YWlucyhub2RlKSkpIHtcbiAgICAgICAgdGV4dE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIHZhciBpbkVuZCA9IGluRW5kIHx8IHNlbEVuZC5jb250YWlucyhub2RlKTtcbiAgICAgICAgbm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHROb2Rlcztcbn1cblxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgcmV0dXJucyBzdGFydC9lbmQgZWxlbWVudCBmcm9tIHNlbGVjdGlvbiBzYXZpbmcgdGhlbSBvbiBwcm9wZXJ0aWVzIG9mIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1RleHRTZWxlY3Rpb259IHRoaXNcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xuZnVuY3Rpb24gX2dldEVsZW1lbnQodGhpc1Byb3BOYW1lLCByYW5nZVByb3BOYW1lKSB7XG4gICAgaWYgKCEgdGhpcy5yYW5nZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgdGhpc1t0aGlzUHJvcE5hbWVdID09ICd1bmRlZmluZWQnKVxuICAgICAgICB0aGlzW3RoaXNQcm9wTmFtZV0gPSBjb250YWluaW5nRWxlbWVudCh0aGlzLnJhbmdlW3JhbmdlUHJvcE5hbWVdKTtcbiAgICByZXR1cm4gdGhpc1t0aGlzUHJvcE5hbWVdO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHN0YXJ0L2VuZCBjb21wb25lbnQgZnJvbSBzZWxlY3Rpb24gc2F2aW5nIHRoZW0gb24gcHJvcGVydGllcyBvZiBvYmplY3RcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtUZXh0U2VsZWN0aW9ufSB0aGlzXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIF9nZXRDb21wb25lbnQodGhpc1Byb3BOYW1lLCBlbE1ldGhvZE5hbWUpIHtcbiAgICBpZiAoISB0aGlzLnJhbmdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzW3RoaXNQcm9wTmFtZV0gPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRoaXNbdGhpc1Byb3BOYW1lXSA9IENvbXBvbmVudC5nZXRDb250YWluaW5nQ29tcG9uZW50KHRoaXNbZWxNZXRob2ROYW1lXSgpKTtcbiAgICByZXR1cm4gdGhpc1t0aGlzUHJvcE5hbWVdO1xufVxuXG5cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kY29udGFpbmVkQ29tcG9uZW50cygpIHtcbiAgICBpZiAodGhpcy5fY29udGFpbmVkQ29tcG9uZW50cylcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lZENvbXBvbmVudHM7XG5cbiAgICB2YXIgY29tcG9uZW50cyA9IHRoaXMuX2NvbnRhaW5lZENvbXBvbmVudHMgPSBbXTtcblxuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkIHx8ICEgdGhpcy5yYW5nZSkgcmV0dXJuIGNvbXBvbmVudHM7XG5cbiAgICByZXR1cm4gZ2V0Q29tcG9uZW50c0Zyb21SYW5nZSh0aGlzLnJhbmdlKTtcbn1cblxuXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGVhY2hDb250YWluZWRDb21wb25lbnQoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCB8fCAhIHRoaXMucmFuZ2UpIHJldHVybjtcblxuICAgIHZhciBjb21wb25lbnRzID0gdGhpcy5jb250YWluZWRDb21wb25lbnRzKCk7XG5cbiAgICBjb21wb25lbnRzLmZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpO1xufVxuXG5cbi8qKlxuICogVGV4dFNlbGVjdGlvbiBpbnN0YW5jZSBtZXRob2RcbiAqIERlbGV0ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBhbGwgY29tcG9uZW50cyBpbiBpdFxuICogXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHNlbGVjdEVuZENvbnRhaW5lciBzZXQgdG8gdHJ1ZSBpZiB0aGUgZW5kIGNvbnRhaW5lciBzaG91bGQgYmUgc2VsZWN0ZWQgYWZ0ZXIgZGVsZXRpb25cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiRkZWwoc2VsZWN0RW5kQ29udGFpbmVyKSB7XG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQgfHwgISB0aGlzLnJhbmdlKSByZXR1cm47XG5cbiAgICB2YXIgc2VsUG9pbnQgPSB0aGlzLl9nZXRQb3N0RGVsZXRlU2VsZWN0aW9uUG9pbnQoc2VsZWN0RW5kQ29udGFpbmVyKTtcblxuICAgIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHModGhpcy5yYW5nZSk7XG5cbiAgICB0aGlzLl9zZWxlY3RBZnRlckRlbGV0ZShzZWxQb2ludCk7XG4gICAgc2VsUG9pbnQubm9kZS5wYXJlbnROb2RlLm5vcm1hbGl6ZSgpO1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRQb3N0RGVsZXRlU2VsZWN0aW9uUG9pbnQoc2VsZWN0RW5kQ29udGFpbmVyKSB7XG4gICAgdmFyIHNlbE5vZGUgPSB0aGlzLnJhbmdlLnN0YXJ0Q29udGFpbmVyO1xuICAgIHZhciBzZWxPZmZzZXQgPSB0aGlzLnJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgIGlmIChzZWxlY3RFbmRDb250YWluZXIgJiYgdGhpcy5yYW5nZS5zdGFydENvbnRhaW5lciAhPSB0aGlzLnJhbmdlLmVuZENvbnRhaW5lcikge1xuICAgICAgICBzZWxOb2RlID0gdGhpcy5yYW5nZS5lbmRDb250YWluZXI7XG4gICAgICAgIHNlbE9mZnNldCA9IDA7XG4gICAgfVxuICAgIHJldHVybiB7IG5vZGU6IHNlbE5vZGUsIG9mZnNldDogc2VsT2Zmc2V0IH07XG59XG5cblxuZnVuY3Rpb24gX3NlbGVjdEFmdGVyRGVsZXRlKHNlbFBvaW50KSB7XG4gICAgdmFyIHNlbE5vZGUgPSBzZWxQb2ludC5ub2RlXG4gICAgICAgICwgc2VsT2Zmc2V0ID0gc2VsUG9pbnQub2Zmc2V0O1xuXG4gICAgaWYgKCFzZWxOb2RlKSByZXR1cm47XG4gICAgaWYgKHNlbE5vZGUubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpXG4gICAgICAgIHNlbE5vZGUudGV4dENvbnRlbnQgPSBzZWxOb2RlLnRleHRDb250ZW50LnRyaW1SaWdodCgpO1xuICAgIGlmICghc2VsTm9kZS5ub2RlVmFsdWUpXG4gICAgICAgIHNlbE5vZGUubm9kZVZhbHVlID0gJ1xcdTAwQTAnOyAvL25vbi1icmVha2luZyBzcGFjZSwgXFx1MjAwQiBmb3IgemVybyB3aWR0aCBzcGFjZTtcblxuICAgIHZhciBwb3NpdGlvbiA9IHNlbE9mZnNldCA+IHNlbE5vZGUubGVuZ3RoID8gc2VsTm9kZS5sZW5ndGggOiBzZWxPZmZzZXQ7XG4gICAgc2V0Q2FyZXRQb3NpdGlvbihzZWxOb2RlLCBwb3NpdGlvbik7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiByYW5nZVxuICpcbiAqIEByZXR1cm4ge1JhbmdlfVxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGdldFJhbmdlKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlO1xufVxuXG5cbi8qKlxuICogU3RvcmVzIHNlbGVjdGlvbiB3aW5kb3csIG5vZGVzIGFuZCBvZmZzZXRzIGluIG9iamVjdFxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGdldFN0YXRlKHJvb3RFbCkge1xuICAgIHZhciByID0gdGhpcy5yYW5nZTtcbiAgICB2YXIgZG9jID0gcm9vdEVsLm93bmVyRG9jdW1lbnRcbiAgICAgICAgLCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICBpZiAoIXIpIHJldHVybiB7IHdpbmRvdzogd2luIH07XG4gICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uY3JlYXRlU3RhdGVPYmplY3Qocm9vdEVsLCByLnN0YXJ0Q29udGFpbmVyLCByLnN0YXJ0T2Zmc2V0LCByLmVuZENvbnRhaW5lciwgci5lbmRPZmZzZXQpO1xufVxuXG5cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGNyZWF0ZVN0YXRlT2JqZWN0KHJvb3RFbCwgc3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0LCBlbmRDb250YWluZXIsIGVuZE9mZnNldCkge1xuICAgIGVuZENvbnRhaW5lciA9IGVuZENvbnRhaW5lciB8fCBzdGFydENvbnRhaW5lcjtcbiAgICBlbmRPZmZzZXQgPSBlbmRPZmZzZXQgfHwgc3RhcnRPZmZzZXQ7XG4gICAgdmFyIGRvYyA9IHJvb3RFbC5vd25lckRvY3VtZW50XG4gICAgICAgICwgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgd2luZG93OiB3aW4sXG4gICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICBzdGFydDogX2dldFNlbGVjdGlvblBvaW50U3RhdGUocm9vdEVsLCBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQpLFxuICAgICAgICBlbmQ6IF9nZXRTZWxlY3Rpb25Qb2ludFN0YXRlKHJvb3RFbCwgZW5kQ29udGFpbmVyLCBlbmRPZmZzZXQpXG4gICAgfTtcbn1cblxuXG5mdW5jdGlvbiBfZ2V0U2VsZWN0aW9uUG9pbnRTdGF0ZShyb290RWwsIG5vZGUsIG9mZnNldCkge1xuICAgIHZhciB0cmVlUGF0aCA9IGRvbVV0aWxzLnRyZWVQYXRoT2Yocm9vdEVsLCBub2RlKTtcbiAgICBpZiAoISB0cmVlUGF0aCkgbG9nZ2VyLmVycm9yKCdTZWxlY3Rpb24gcG9pbnQgaXMgb3V0c2lkZSBvZiByb290IGVsZW1lbnQnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0cmVlUGF0aDogdHJlZVBhdGgsXG4gICAgICAgIG9mZnNldDogb2Zmc2V0XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIFJlc3RvcmVzIGFjdHVhbCBzZWxlY3Rpb24gdG8gdGhlIHN0b3JlZCByYW5nZVxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tU3RhdGUoc3RhdGUpIHtcbiAgICB2YXIgZG9tVXRpbHMgPSBzdGF0ZS53aW5kb3cubWlsby51dGlsLmRvbTtcblxuICAgIGlmIChzdGF0ZS5yb290RWwgJiYgc3RhdGUuc3RhcnQgJiYgc3RhdGUuZW5kKSB7XG4gICAgICAgIHZhciBzdGFydE5vZGUgPSBfc2VsZWN0aW9uTm9kZUZyb21TdGF0ZShzdGF0ZS5yb290RWwsIHN0YXRlLnN0YXJ0KVxuICAgICAgICAgICAgLCBlbmROb2RlID0gX3NlbGVjdGlvbk5vZGVGcm9tU3RhdGUoc3RhdGUucm9vdEVsLCBzdGF0ZS5lbmQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkb21VdGlscy5zZXRTZWxlY3Rpb24oc3RhcnROb2RlLCBzdGF0ZS5zdGFydC5vZmZzZXQsIGVuZE5vZGUsIHN0YXRlLmVuZC5vZmZzZXQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKHN0YXRlLndpbmRvdyk7XG4gICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdUZXh0IHNlbGVjdGlvbjogY2FuXFwndCBjcmVhdGUgc2VsZWN0aW9uJywgZSwgZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbVV0aWxzLmNsZWFyU2VsZWN0aW9uKHN0YXRlLndpbmRvdyk7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbihzdGF0ZS53aW5kb3cpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfc2VsZWN0aW9uTm9kZUZyb21TdGF0ZShyb290RWwsIHBvaW50U3RhdGUpIHtcbiAgICB2YXIgbm9kZSA9IGRvbVV0aWxzLmdldE5vZGVBdFRyZWVQYXRoKHJvb3RFbCwgcG9pbnRTdGF0ZS50cmVlUGF0aCk7XG4gICAgaWYgKCEgbm9kZSkgbG9nZ2VyLmVycm9yKCdUZXh0U2VsZWN0aW9uIGNyZWF0ZUZyb21TdGF0ZTogbm8gbm9kZSBhdCB0cmVlUGF0aCcpO1xuICAgIHJldHVybiBub2RlO1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBzZWxlY3Rpb24gZnJvbSBwYXNzZWQgcmFuZ2VcbiAqIFxuICogQHBhcmFtIHtSYW5nZX0gcmFuZ2VcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYmFja3dhcmRcbiAqXG4gKiBAcmV0dXJuIHtUZXh0U2VsZWN0aW9ufVxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tUmFuZ2UocmFuZ2UsIGJhY2t3YXJkKSB7XG4gICAgdmFyIHdpbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXdcbiAgICAgICAgLCBzZWwgPSB3aW4uZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgLCBlbmRSYW5nZTtcblxuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcblxuICAgIGlmIChiYWNrd2FyZCl7XG4gICAgICAgIGVuZFJhbmdlID0gcmFuZ2UuY2xvbmVSYW5nZSgpO1xuICAgICAgICBlbmRSYW5nZS5jb2xsYXBzZShmYWxzZSk7XG5cbiAgICAgICAgc2VsLmFkZFJhbmdlKGVuZFJhbmdlKTtcbiAgICAgICAgc2VsLmV4dGVuZChyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQpICAgICAgICBcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKHdpbik7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG5vcm1hbGl6ZWQgY29weSBvZiB0aGUgcmFuZ2VcbiAqIElmIHlvdSB0cmlwbGUgY2xpY2sgYW4gaXRlbSwgdGhlIGVuZCBvZiB0aGUgcmFuZ2UgaXMgcG9zaXRpb25lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBORVhUIG5vZGUuXG4gKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSByYW5nZSB3aXRoIHRoZSBlbmQgcG9zaXRpb25lZCBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHRleHRub2RlIGNvbnRhaW5lZCBcbiAqIGluc2lkZSBhIGNvbXBvbmVudCB3aXRoIHRoZSBcImVkaXRhYmxlXCIgZmFjZXRcbiAqIFxuICogQHJldHVybiB7cmFuZ2V9XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGdldE5vcm1hbGl6ZWRSYW5nZSgpe1xuICAgIHZhciBkb2MgPSB0aGlzLnJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLm93bmVyRG9jdW1lbnRcbiAgICAgICAgLCB0dywgcHJldmlvdXNOb2RlXG4gICAgICAgICwgbmV3UmFuZ2UgPSB0aGlzLnJhbmdlLmNsb25lUmFuZ2UoKTtcblxuICAgIGlmIChuZXdSYW5nZS5lbmRDb250YWluZXIubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgIHR3ID0gZG9jLmNyZWF0ZVRyZWVXYWxrZXIoZG9jLmJvZHksIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICAgICAgdHcuY3VycmVudE5vZGUgPSBuZXdSYW5nZS5lbmRDb250YWluZXI7XG4gICAgICAgIHByZXZpb3VzTm9kZSA9IHR3LnByZXZpb3VzTm9kZSgpO1xuICAgICAgICBuZXdSYW5nZS5zZXRFbmQocHJldmlvdXNOb2RlLCBwcmV2aW91c05vZGUubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3UmFuZ2U7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBkaXJlY3Rpb24gb2YgYSBzZWxlY3Rpb25cbiAqXG4gKiAxIGZvcndhcmQsIC0xIGJhY2t3YXJkLCAwIG5vIGRpcmVjdGlvbiwgdW5kZWZpbmVkIG9uZSBvZiB0aGUgbm9kZSBpcyBkZXRhY2hlZCBvciBpbiBhIGRpZmZlcmVudCBmcmFtZVxuICpcbiAqIEByZXR1cm4gey0xfDB8MXx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGdldERpcmVjdGlvbigpe1xuICAgIHJldHVybiBkb21VdGlscy5nZXRTZWxlY3Rpb25EaXJlY3Rpb24odGhpcy5zZWxlY3Rpb24pOyAgICBcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIFN0b3JhZ2VNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi9tc2dfc3JjJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxucmVxdWlyZSgnLi9tb2RlbCcpXG5cbm1vZHVsZS5leHBvcnRzID0gRE9NU3RvcmFnZTtcblxuXG4vLyBzaGFyZWQga2V5cyBzdG9yZWQgYnkgYWxsIGluc3RhbmNlcywgaW5jbHVkZSBrZXkgcHJlZml4ZXNcbnZhciBfc3RvcmVkS2V5cyA9IHtcbiAgICB0cnVlOiB7fSwgLy8gc2Vzc2lvbiBzdG9yYWdlXG4gICAgZmFsc2U6IHt9IC8vIGxvY2FsIHN0b3JhZ2Vcbn07XG5cblxuLyoqXG4gKiBET01TdG9yYWdlIGNsYXNzIHRvIHNpbXBsaWZ5IHN0b3JhZ2UgYW5kIHJldHJpZXZhbCBvZiBtdWx0aXBsZSBpdGVtcyB3aXRoIHR5cGVzIHByZXNlcnZhdGlvbiB0byBET00gc3RvcmFnZSAobG9jYWxTdG9yYWdlIGFuZCBzZXNzaW9uU3RvcmFnZSkuXG4gKiBUeXBlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUga2V5IGNyZWF0ZWQgZnJvbSB2YWx1ZSBrZXlzIHdpdGggYXBwZW5kZWQgYG1pbG8uY29uZmlnLmRvbVN0b3JhZ2UudHlwZVN1ZmZpeGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5UHJlZml4IHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gYWxsIGtleXMgZm9sbG93ZWQgYnkgYG1pbG8uY29uZmlnLmRvbVN0b3JhZ2UucHJlZml4U2VwYXJhdG9yYCAoXCIvXCIgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHNlc3Npb25Pbmx5IHRydWUgdG8gdXNlIHNlc3Npb25TdG9yYWdlLiBsb2NhbFN0b3JhZ2Ugd2lsbCBiZSB1c2VkIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0ge1dpbmRvd30gd2luIHdpbmRvdyB0byB3b3JrIGluXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2Uoa2V5UHJlZml4LCBzZXNzaW9uT25seSwgd2luKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICB3aW4gPSB3aW4gfHwgd2luZG93O1xuXG4gICAga2V5UHJlZml4ID0gY29uZmlnLmRvbVN0b3JhZ2Uucm9vdCArXG4gICAgICAgICAgICAgICAgKGtleVByZWZpeFxuICAgICAgICAgICAgICAgICAgICA/IGtleVByZWZpeCArIGNvbmZpZy5kb21TdG9yYWdlLnByZWZpeFNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICA6ICcnKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIGtleVByZWZpeDoga2V5UHJlZml4LFxuICAgICAgICBzZXNzaW9uT25seTogISEgc2Vzc2lvbk9ubHksXG4gICAgICAgIHdpbmRvdzogd2luLFxuICAgICAgICBfc3RvcmFnZTogc2Vzc2lvbk9ubHkgPyB3aW4uc2Vzc2lvblN0b3JhZ2UgOiB3aW4ubG9jYWxTdG9yYWdlLFxuICAgICAgICBfdHlwZVN1ZmZpeDogY29uZmlnLmRvbVN0b3JhZ2UudHlwZVN1ZmZpeCxcbiAgICAgICAgX2tleXM6IHt9XG4gICAgfSwgXy5XUklUKTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKERPTVN0b3JhZ2UsIHtcbiAgICBnZXQ6IERPTVN0b3JhZ2UkZ2V0LFxuICAgIHNldDogRE9NU3RvcmFnZSRzZXQsXG4gICAgcmVtb3ZlOiBET01TdG9yYWdlJHJlbW92ZSxcbiAgICBoYXNJdGVtOiBET01TdG9yYWdlJGhhc0l0ZW0sXG4gICAgZ2V0SXRlbTogRE9NU3RvcmFnZSRnZXRJdGVtLFxuICAgIHNldEl0ZW06IERPTVN0b3JhZ2Ukc2V0SXRlbSxcbiAgICByZW1vdmVJdGVtOiBET01TdG9yYWdlJHJlbW92ZUl0ZW0sXG4gICAgX3N0b3JhZ2VLZXk6IERPTVN0b3JhZ2UkX3N0b3JhZ2VLZXksXG4gICAgX2RvbVN0b3JhZ2VLZXk6IERPTVN0b3JhZ2UkX2RvbVN0b3JhZ2VLZXksXG4gICAgZ2V0QWxsS2V5czogRE9NU3RvcmFnZSRnZXRBbGxLZXlzLFxuICAgIGdldEFsbEl0ZW1zOiBET01TdG9yYWdlJGdldEFsbEl0ZW1zLFxuICAgIGNyZWF0ZU1lc3NlbmdlcjogRE9NU3RvcmFnZSRjcmVhdGVNZXNzZW5nZXIsXG4gICAgZGVzdHJveTogRE9NU3RvcmFnZSRkZXN0cm95XG59KTtcblxuXG4vKipcbiAqIEV4cG9zZSBNZXNlbmdlciBhbmQgTWVzc2FnZVNvdXJjZSBtZXRob2RzIG9uIERPTVN0b3JhZ2VcbiAqL1xuTWVzc2VuZ2VyLnVzZVdpdGgoRE9NU3RvcmFnZSwgJ19tZXNzZW5nZXInLCBNZXNzZW5nZXIuZGVmYXVsdE1ldGhvZHMpO1xuU3RvcmFnZU1lc3NhZ2VTb3VyY2UudXNlV2l0aChET01TdG9yYWdlLCAnX21lc3NhZ2VTb3VyY2UnLCBbJ3RyaWdnZXInXSk7XG5cblxudmFyIF9zZXNzaW9uU3RvcmFnZSA9IG5ldyBET01TdG9yYWdlKCcnLCB0cnVlKVxuICAgICwgX2xvY2FsU3RvcmFnZSA9IG5ldyBET01TdG9yYWdlKCcnLCBmYWxzZSk7XG5cbnZhciBfZG9tU3RvcmFnZSA9IHtcbiAgICAgICAgdHJ1ZTogX3Nlc3Npb25TdG9yYWdlLFxuICAgICAgICBmYWxzZTogX2xvY2FsU3RvcmFnZVxuICAgIH07XG5cbl8uZXh0ZW5kKERPTVN0b3JhZ2UsIHtcbiAgICByZWdpc3RlckRhdGFUeXBlOiBET01TdG9yYWdlJCRyZWdpc3RlckRhdGFUeXBlLFxuICAgIGxvY2FsOiBfbG9jYWxTdG9yYWdlLFxuICAgIHNlc3Npb246IF9zZXNzaW9uU3RvcmFnZSxcbiAgICBzdG9yYWdlOiBfZG9tU3RvcmFnZSxcbiAgICBfc3RvcmVkS2V5czogX3N0b3JlZEtleXMgLy8gZXhwb3NlZCBmb3IgdGVzdGluZ1xufSk7XG5cblxuLyoqXG4gKiBTZXRzIGRhdGEgdG8gRE9NIHN0b3JhZ2UuIGB0aGlzLmtleVByZWZpeGAgaXMgcHJlcGVuZGVkIHRvIGtleXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgc2luZ2xlIG9iamVjdCBjYW4gYmUgcGFzc2VkIGluIHdoaWNoIGNhc2Uga2V5cyB3aWxsIGJlIHVzZWQgYXMga2V5cyBpbiBsb2NhbCBzdG9yYWdlLlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWx0ZXJuYXRpdmVseSBqdXN0IHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIHdoZXJlIGFyZ3VtZW50cyBjYW4gYmUgc2VxdWVudGlhbGx5IHVzZWQgYXMga2V5cyBhbmQgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJHNldChkYXRhKSB7IC8vIG9yIGFyZ3VtZW50c1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JylcbiAgICAgICAgXy5lYWNoS2V5KGRhdGEsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBhcmdzTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGFyZ3NMZW4gJSAyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IERvbVN0b3JhZ2VFcnJvcignRE9NU3RvcmFnZTogc2V0IHNob3VsZCBoYXZlIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cyBvciBvYmplY3QnKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3NMZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IGFyZ3VtZW50c1tpXVxuICAgICAgICAgICAgICAgICwgdmFsdWUgPSBhcmd1bWVudHNbKytpXTtcblxuICAgICAgICAgICAgdGhpcy5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8qKlxuICogR2V0cyBkYXRhIGZyb20gRE9NIHN0b3JhZ2UuIGB0aGlzLmtleVByZWZpeGAgaXMgcHJlcGVuZGVkIHRvIHBhc3NlZCBrZXlzLCBidXQgcmV0dXJuZWQgb2JqZWN0IHdpbGwgaGF2ZSBrZXlzIHdpdGhvdXQgcm9vdCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGtleXMgY2FuIGJlIHBhc3NlZCBhcyBzdHJpbmdzIG9yIGFycmF5cyBvZiBzdHJpbmdzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGdldCgpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGRhdGEgPSB7fTtcbiAgICBfLmRlZXBGb3JFYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGRhdGFba2V5XSA9IHRoaXMuZ2V0SXRlbShrZXkpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBkYXRhO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBrZXlzIGZyb20gRE9NIHN0b3JhZ2UuIGB0aGlzLmtleVByZWZpeGAgaXMgcHJlcGVuZGVkIHRvIHBhc3NlZCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGtleXMgY2FuIGJlIHBhc3NlZCBhcyBzdHJpbmdzIG9yIGFycmF5cyBvZiBzdHJpbmdzXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkcmVtb3ZlKCkgeyAvLywgLi4uIGFyZ3VtZW50c1xuICAgIF8uZGVlcEZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGtleSk7XG4gICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBDaGVjayBmb3IgcHJlc2VuY2Ugb2Ygc2luZ2xlIGl0ZW0gaW4gRE9NIHN0b3JhZ2UuIGB0aGlzLmtleVByZWZpeGAgaXMgcHJlcGVuZGVkIHRvIHBhc3NlZCBrZXkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRoYXNJdGVtKGtleSkge1xuICAgIHZhciBwS2V5ID0gdGhpcy5fc3RvcmFnZUtleShrZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLmdldEl0ZW0ocEtleSkgIT0gbnVsbDtcbn1cblxuXG4vKipcbiAqIEdldHMgc2luZ2xlIGl0ZW0gZnJvbSBET00gc3RvcmFnZSBwcmVwZW5kaW5nIGB0aGlzLmtleVByZWZpeGAgdG8gcGFzc2VkIGtleS5cbiAqIFJlYWRzIHR5cGUgb2YgdGhlIG9yaWdpbmFsbHkgc3RvcmVkIHZhbHVlIGZyb20gYGtleSArIHRoaXMuX3R5cGVTdWZmaXhgIGFuZCBjb252ZXJ0cyBkYXRhIHRvIHRoZSBvcmlnaW5hbCB0eXBlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRnZXRJdGVtKGtleSkge1xuICAgIHZhciBwS2V5ID0gdGhpcy5fc3RvcmFnZUtleShrZXkpO1xuICAgIHZhciBkYXRhVHlwZSA9IF9nZXRLZXlEYXRhVHlwZS5jYWxsKHRoaXMsIHBLZXkpO1xuICAgIHZhciB2YWx1ZVN0ciA9IHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbShwS2V5KTtcbiAgICB2YXIgdmFsdWUgPSBfcGFyc2VEYXRhKHZhbHVlU3RyLCBkYXRhVHlwZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5cbi8qKlxuICogU2V0cyBzaW5nbGUgaXRlbSB0byBET00gc3RvcmFnZSBwcmVwZW5kaW5nIGB0aGlzLmtleVByZWZpeGAgdG8gcGFzc2VkIGtleS5cbiAqIFN0b3JlcyB0eXBlIG9mIHRoZSBzdG9yZWQgdmFsdWUgdG8gYGtleSArIHRoaXMuX3R5cGVTdWZmaXhgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRzZXRJdGVtKGtleSwgdmFsdWUpIHtcbiAgICB2YXIgcEtleSA9IHRoaXMuX3N0b3JhZ2VLZXkoa2V5KTtcbiAgICB2YXIgZGF0YVR5cGUgPSBfc2V0S2V5RGF0YVR5cGUuY2FsbCh0aGlzLCBwS2V5LCB2YWx1ZSk7XG4gICAgdmFyIHZhbHVlU3RyID0gX3NlcmlhbGl6ZURhdGEodmFsdWUsIGRhdGFUeXBlKTtcbiAgICB0cnkge1xuICAgICAgICB0aGlzLl9zdG9yYWdlLnNldEl0ZW0ocEtleSwgdmFsdWVTdHIpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBpZiAoZS5uYW1lID09ICdRdW90YUV4Y2VlZGVkRXJyb3InKSB7XG4gICAgICAgICAgICB2YXIgY2ZnID0gY29uZmlnLmRvbVN0b3JhZ2UucXVvdGFFeGNlZWRlZDtcbiAgICAgICAgICAgIGlmIChjZmcubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBtaWxvLm1haWwucG9zdE1lc3NhZ2UoJ3F1b3RhZXhjZWVkZWRlcnJvcicsIHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChjZmcudGhyb3dFcnJvcilcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHRoaXMuX2tleXNba2V5XSA9IHRydWU7XG4gICAgX2RvbVN0b3JhZ2VbdGhpcy5zZXNzaW9uT25seV0uX2tleXNbcEtleV0gPSB0cnVlO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBzaW5nbGUgaXRlbSBmcm9tIERPTSBzdG9yYWdlIHByZXBlbmRpbmcgYHRoaXMua2V5UHJlZml4YCB0byBwYXNzZWQga2V5LlxuICogVHlwZSBvZiB0aGUgc3RvcmVkIHZhbHVlIChpbiBga2V5ICsgdGhpcy5fdHlwZVN1ZmZpeGAga2V5KSBpcyBhbHNvIHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgdmFyIHBLZXkgPSB0aGlzLl9zdG9yYWdlS2V5KGtleSk7XG4gICAgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKHBLZXkpO1xuICAgIF9yZW1vdmVLZXlEYXRhVHlwZS5jYWxsKHRoaXMsIHBLZXkpXG4gICAgZGVsZXRlIHRoaXMuX2tleXNba2V5XTtcbiAgICBkZWxldGUgX2RvbVN0b3JhZ2VbdGhpcy5zZXNzaW9uT25seV0uX2tleXNbcEtleV07XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBhbGwga2V5cyBzdG9yZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiBET01TdG9yYWdlXG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkZ2V0QWxsS2V5cygpIHtcbiAgICB2YXIgc3RvcmVkS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX2tleXMpO1xuICAgIHZhciBrZXlzSW5TdG9yYWdlID0gc3RvcmVkS2V5cy5maWx0ZXIoZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0l0ZW0oa2V5KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2UgZGVsZXRlIHRoaXMuX2tleXNba2V5XTtcbiAgICB9LCB0aGlzKTtcbiAgICByZXR1cm4ga2V5c0luU3RvcmFnZTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1hcCB3aXRoIGFsbCBrZXlzIGFuZCB2YWx1ZXMgKGRlc2VyaWFsaXplZCkgc3RvcmVkIHVzaW5nIHRoaXMgaW5zdGFuY2Ugb2YgRE9NU3RvcmFnZVxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRnZXRBbGxJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy5nZXRBbGxLZXlzKCkpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBwcmVmaXhlZCBrZXkgZm9yIERPTSBzdG9yYWdlIGZvciBnaXZlbiB1bnByZWZpeGVkIGtleS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkX3N0b3JhZ2VLZXkoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMua2V5UHJlZml4ICsga2V5O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB1bnByZWZpeGVkIGtleSB0byBiZSB1c2VkIHdpdGggdGhpcyBpbnN0YW5jZSBvZiBET01TdG9yYWdlIGZpciBnaXZlbiBhY3R1YWwga2V5IGluIHN0b3JhZ2VcbiAqIElmIGtleSBoYXMgZGlmZmVyZW50IHByZWZpeCBmcm9tIHRoZSBrZXlQcmVmaXggcmV0dXJucyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RvcmFnZUtleSBhY3R1YWwga2V5IGluIGxvY2FsL3Nlc3Npb24gc3RvcmFnZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJF9kb21TdG9yYWdlS2V5KHN0b3JhZ2VLZXkpIHtcbiAgICBpZiAoc3RvcmFnZUtleS5pbmRleE9mKHRoaXMuX3R5cGVTdWZmaXgpID49IDApIHJldHVybjtcbiAgICByZXR1cm4gXy51blByZWZpeChzdG9yYWdlS2V5LCB0aGlzLmtleVByZWZpeCk7XG59XG5cblxuLyoqXG4gKiBHZXRzIG9yaWdpbmFsbHkgc3RvcmVkIGRhdGEgdHlwZSBmb3IgZ2l2ZW4gKHByZWZpeGVkKSBga2V5YC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBfZ2V0S2V5RGF0YVR5cGUocEtleSkge1xuICAgIHBLZXkgPSBfZGF0YVR5cGVLZXkuY2FsbCh0aGlzLCBwS2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5nZXRJdGVtKHBLZXkpO1xufVxuXG5cbi8qKlxuICogU3RvcmVzIGRhdGEgdHlwZSBmb3IgZ2l2ZW4gKHByZWZpeGVkKSBga2V5YCBhbmQgYHZhbHVlYC5cbiAqIFJldHVybnMgZGF0YSB0eXBlIGZvciBgdmFsdWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwS2V5IHByZWZpeGVkIGtleSBvZiBzdG9yZWQgdmFsdWVcbiAqIEBwYXJhbSB7QW55fSB2YWx1ZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBfc2V0S2V5RGF0YVR5cGUocEtleSwgdmFsdWUpIHtcbiAgICB2YXIgZGF0YVR5cGUgPSBfZ2V0VmFsdWVUeXBlKHZhbHVlKTtcbiAgICBwS2V5ID0gX2RhdGFUeXBlS2V5LmNhbGwodGhpcywgcEtleSk7XG4gICAgdGhpcy5fc3RvcmFnZS5zZXRJdGVtKHBLZXksIGRhdGFUeXBlKTtcbiAgICByZXR1cm4gZGF0YVR5cGU7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIHN0b3JlZCBkYXRhIHR5cGUgZm9yIGdpdmVuIChwcmVmaXhlZCkgYGtleWAuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBwS2V5IHByZWZpeGVkIGtleSBvZiBzdG9yZWQgdmFsdWVcbiAqL1xuZnVuY3Rpb24gX3JlbW92ZUtleURhdGFUeXBlKHBLZXkpIHtcbiAgICBwS2V5ID0gX2RhdGFUeXBlS2V5LmNhbGwodGhpcywgcEtleSk7XG4gICAgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKHBLZXkpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUga2V5IHRvIHN0b3JlIGRhdGEgdHlwZSBmb3IgZ2l2ZW4gKHByZWZpeGVkKSBga2V5YC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBfZGF0YVR5cGVLZXkocEtleSkge1xuICAgIHJldHVybiBwS2V5ICsgdGhpcy5fdHlwZVN1ZmZpeDtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdHlwZSBvZiB2YWx1ZSBhcyBzdHJpbmcuIENsYXNzIG5hbWUgcmV0dXJuZWQgZm9yIG9iamVjdHMgKCdudWxsJyBmb3IgbnVsbCkuXG4gKiBAcGFyYW0gIHtBbnl9IHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9nZXRWYWx1ZVR5cGUodmFsdWUpIHtcbiAgICB2YXIgdmFsdWVUeXBlID0gdHlwZW9mIHZhbHVlXG4gICAgICAgICwgY2xhc3NOYW1lID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IubmFtZVxuICAgICAgICAsIGRhdGFUeXBlID0gdmFsdWVzRGF0YVR5cGVzW2NsYXNzTmFtZV07XG4gICAgcmV0dXJuIGRhdGFUeXBlIHx8IChcbiAgICAgICAgICAgIHZhbHVlVHlwZSAhPSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgID8gdmFsdWVUeXBlXG4gICAgICAgICAgICAgICAgOiB2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgID8gJ251bGwnXG4gICAgICAgICAgICAgICAgICAgIDogdmFsdWUuY29uc3RydWN0b3IubmFtZSk7XG59XG52YXIgdmFsdWVzRGF0YVR5cGVzID0ge1xuICAgIC8vIGNhbiBiZSByZWdpc3RlcmVkIHdpdGggYHJlZ2lzdGVyRGF0YVR5cGVgXG59XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiBET00gc3RvcmFnZS5cbiAqXG4gKiBAcGFyYW0gIHtBbnl9IHZhbHVlIHZhbHVlIHRvIGJlIHNlcmlhbGl6ZWRcbiAqIEBwYXJhbSAge1N0cmluZ30gdmFsdWVUeXBlIG9wdGlvbmFsIGRhdGEgdHlwZSB0byBkZWZpbmUgc2VyaWFsaXplciwgX2dldFZhbHVlVHlwZSBpcyB1c2VkIGlmIG5vdCBwYXNzZWQuXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9zZXJpYWxpemVEYXRhKHZhbHVlLCB2YWx1ZVR5cGUpIHtcbiAgICB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGUgfHwgX2dldFZhbHVlVHlwZSh2YWx1ZSk7XG4gICAgdmFyIHNlcmlhbGl6ZXIgPSBkYXRhU2VyaWFsaXplcnNbdmFsdWVUeXBlXTtcbiAgICByZXR1cm4gc2VyaWFsaXplclxuICAgICAgICAgICAgPyBzZXJpYWxpemVyKHZhbHVlLCB2YWx1ZVR5cGUpXG4gICAgICAgICAgICA6IHZhbHVlICYmIHZhbHVlLnRvU3RyaW5nID09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbiAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgICAgICAgICAgICAgIDogJycgKyB2YWx1ZTtcbn1cbnZhciBkYXRhU2VyaWFsaXplcnMgPSB7XG4gICAgJ0FycmF5JzogSlNPTi5zdHJpbmdpZnlcbn1cblxuXG4vKipcbiAqIFBhcnNlcyBzdHJpbmcgcmV0cmlldmVkIGZyb20gRE9NIHN0b3JhZ2UuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB2YWx1ZVN0clxuICogQHBhcmFtICB7U3RyaW5nfSB2YWx1ZVR5cGUgZGF0YSB0eXBlIHRoYXQgZGVmaW5lcyBwYXJzZXIuIE9yaWdpbmFsIHNyaW5nIHdpbGwgYmUgcmV0dXJuZWQgaWYgcGFyc2VyIGlzIG5vdCBkZWZpbmVkLlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBfcGFyc2VEYXRhKHZhbHVlU3RyLCB2YWx1ZVR5cGUpIHtcbiAgICB2YXIgcGFyc2VyID0gZGF0YVBhcnNlcnNbdmFsdWVUeXBlXTtcbiAgICByZXR1cm4gcGFyc2VyXG4gICAgICAgICAgICA/IHBhcnNlcih2YWx1ZVN0ciwgdmFsdWVUeXBlKVxuICAgICAgICAgICAgOiB2YWx1ZVN0cjtcbn1cbnZhciBkYXRhUGFyc2VycyA9IHtcbiAgICBPYmplY3Q6IF8uanNvblBhcnNlLFxuICAgIEFycmF5OiBfLmpzb25QYXJzZSxcbiAgICBEYXRlOiBmdW5jdGlvbih2YWxTdHIpIHsgcmV0dXJuIG5ldyBEYXRlKHZhbFN0cik7IH0sXG4gICAgYm9vbGVhbjogZnVuY3Rpb24odmFsU3RyKSB7IHJldHVybiB2YWxTdHIgPT0gJ3RydWUnOyB9LFxuICAgIG51bWJlcjogTnVtYmVyLFxuICAgIGZ1bmN0aW9uOiBfLnRvRnVuY3Rpb24sXG4gICAgUmVnRXhwOiBfLnRvUmVnRXhwXG59O1xuXG5cbi8qKlxuICogUmVnaXN0ZXJzIGRhdGEgdHlwZSB0byBiZSBzYXZlZCBpbiBET00gc3RvcmFnZS4gQ2xhc3MgbmFtZSBjYW4gYmUgdXNlZCBvciByZXN1bHQgb2YgYHR5cGVvZmAgb3BlcmF0b3IgZm9yIG5vbi1vYmplY3RzIHRvIG92ZXJyaWRlIGRlZmF1bHQgY29udmVyc2lvbnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlVHlwZSBjbGFzcyAoY29uc3RydWN0b3IpIG5hbWUgb3IgdGhlIHN0cmluZyByZXR1cm5lZCBieSB0eXBlb2YuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXJpYWxpemVyIG9wdGlvbmFsIHNlcmlhbGl6ZXIgZm9yIHRoaXMgdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyc2VyIG9wdGlvbmFsIHBhcnNlciBmb3IgdGhpcyB0eXBlXG4gKiBAcGFyYW0ge1tTdHJpbmddfSBzdG9yZUFzRGF0YVR5cGUgb3B0aW9uYWwgbmFtZSBvZiBzdG9yZWQgZGF0YSB0eXBlIGlmIGRpZmZlcmVudCBmcm9tIHZhbHVlVHlwZVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJCRyZWdpc3RlckRhdGFUeXBlKHZhbHVlVHlwZSwgc2VyaWFsaXplciwgcGFyc2VyLCBzdG9yZUFzRGF0YVR5cGUpIHtcbiAgICBpZiAoc2VyaWFsaXplcikgZGF0YVNlcmlhbGl6ZXJzW3ZhbHVlVHlwZV0gPSBzZXJpYWxpemVyO1xuICAgIGlmIChwYXJzZXIpIGRhdGFQYXJzZXJzW3ZhbHVlVHlwZV0gPSBwYXJzZXI7XG4gICAgdmFsdWVzRGF0YVR5cGVzW3ZhbHVlVHlwZV0gPSBzdG9yZUFzRGF0YVR5cGUgfHwgdmFsdWVUeXBlO1xufVxuXG5cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkY3JlYXRlTWVzc2VuZ2VyKCkge1xuICAgIHZhciBzdG9yYWdlTWVzc2FnZVNvdXJjZSA9IG5ldyBTdG9yYWdlTWVzc2FnZVNvdXJjZSh0aGlzKTtcbiAgICB2YXIgbWVzc2VuZ2VyID0gbmV3IE1lc3Nlbmdlcih0aGlzLCB1bmRlZmluZWQsIHN0b3JhZ2VNZXNzYWdlU291cmNlKTtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfbWVzc2VuZ2VyOiBtZXNzZW5nZXIsXG4gICAgICAgIF9tZXNzYWdlU291cmNlOiBzdG9yYWdlTWVzc2FnZVNvdXJjZVxuICAgIH0sIF8uV1JJVCk7XG59XG5cblxuZnVuY3Rpb24gRE9NU3RvcmFnZSRkZXN0cm95KCkge1xuICAgIHRoaXMuX3N0b3JhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy53aW5kb3cgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX21lc3NlbmdlcikgdGhpcy5fbWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTW9kZWwgPSBtaWxvQ29yZS5Nb2RlbFxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5Nb2RlbC5yZWdpc3RlcldpdGhET01TdG9yYWdlID0gTW9kZWwkJHJlZ2lzdGVyV2l0aERPTVN0b3JhZ2U7XG5cblxuZnVuY3Rpb24gTW9kZWwkJHJlZ2lzdGVyV2l0aERPTVN0b3JhZ2UoKSB7XG4gICAgdmFyIERPTVN0b3JhZ2UgPSByZXF1aXJlKCcuL2luZGV4Jyk7XG4gICAgRE9NU3RvcmFnZS5yZWdpc3RlckRhdGFUeXBlKCdNb2RlbCcsIE1vZGVsX2RvbVN0b3JhZ2VTZXJpYWxpemVyLCBNb2RlbF9kb21TdG9yYWdlUGFyc2VyKTtcbiAgICBET01TdG9yYWdlLnJlZ2lzdGVyRGF0YVR5cGUoJ01vZGVsUGF0aCcsIE1vZGVsX2RvbVN0b3JhZ2VTZXJpYWxpemVyLCBNb2RlbF9kb21TdG9yYWdlUGFyc2VyLCAnTW9kZWwnKTtcbn1cblxuXG5mdW5jdGlvbiBNb2RlbF9kb21TdG9yYWdlU2VyaWFsaXplcih2YWx1ZSkge1xuICAgIHZhciBkYXRhID0gdmFsdWUuZ2V0KCk7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsX2RvbVN0b3JhZ2VQYXJzZXIodmFsdWVTdHIpIHtcbiAgICB2YXIgZGF0YSA9IF8uanNvblBhcnNlKHZhbHVlU3RyKTtcbiAgICByZXR1cm4gbmV3IE1vZGVsKGRhdGEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzYWdlU291cmNlID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzYWdlU291cmNlXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpXG4gICAgLCB1bmlxdWVJZCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdW5pcXVlX2lkJyk7XG5cbnZhciBTdG9yYWdlTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2FnZVNvdXJjZSwgJ1N0b3JhZ2VNZXNzYWdlU291cmNlJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhTdG9yYWdlTWVzc2FnZVNvdXJjZSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGluaXQ6IGluaXQsXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogU3RvcmFnZU1lc3NhZ2VTb3VyY2UkYWRkU291cmNlU3Vic2NyaWJlcixcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRyZW1vdmVTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHBvc3RNZXNzYWdlOiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRwb3N0TWVzc2FnZSxcbiAgICB0cmlnZ2VyOiBTdG9yYWdlTWVzc2FnZVNvdXJjZSR0cmlnZ2VyLFxuXG4gICAgLy9jbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgaGFuZGxlRXZlbnQ6IGhhbmRsZUV2ZW50ICAvLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlTWVzc2FnZVNvdXJjZTtcblxuXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJT3JDbGFzcykge1xuICAgIGlmIChob3N0T2JqZWN0LmNvbnN0cnVjdG9yLm5hbWUgIT0gJ0RPTVN0b3JhZ2UnKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hvc3RPYmplY3Qgc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIERPTVN0b3JhZ2UnKTtcbiAgICB0aGlzLnN0b3JhZ2UgPSBob3N0T2JqZWN0O1xuICAgIHRoaXMubWVzc2FnZUtleSA9IGNvbmZpZy5kb21TdG9yYWdlLm1lc3NhZ2VLZXk7XG4gICAgdGhpcy53aW5kb3cgPSBob3N0T2JqZWN0LndpbmRvdztcbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gU3RvcmFnZU1lc3NhZ2VTb3VyY2UkYWRkU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMsIGZhbHNlKTtcbn1cblxuXG5mdW5jdGlvbiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRyZW1vdmVTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgdGhpcywgZmFsc2UpO1xufVxuXG5cbmZ1bmN0aW9uIFN0b3JhZ2VNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZVN5bmMobWVzc2FnZSwgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gU3RvcmFnZU1lc3NhZ2VTb3VyY2UkdHJpZ2dlcihtc2dUeXBlLCBkYXRhKSB7XG4gICAgdmFyIGtleSA9IHRoaXMubWVzc2FnZUtleSArIG1zZ1R5cGU7XG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YVtjb25maWcuZG9tU3RvcmFnZS5tZXNzYWdlVGltZXN0YW1wXSA9IHVuaXF1ZUlkKCk7XG4gICAgXy5kZWZlck1ldGhvZCh0aGlzLnN0b3JhZ2UsICdzZXRJdGVtJywga2V5LCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgIGlmIChldmVudC5zdG9yYWdlQXJlYSAhPSB0aGlzLnN0b3JhZ2UuX3N0b3JhZ2UpIHJldHVybjtcbiAgICB2YXIga2V5ID0gdGhpcy5zdG9yYWdlLl9kb21TdG9yYWdlS2V5KGV2ZW50LmtleSk7IGlmICghIGtleSkgcmV0dXJuO1xuICAgIHZhciBtc2dUeXBlID0gXy51blByZWZpeChrZXksIHRoaXMubWVzc2FnZUtleSk7IGlmICghIG1zZ1R5cGUpIHJldHVybjtcbiAgICB2YXIgZGF0YSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7IGlmICghIGRhdGEpIHJldHVybjtcbiAgICB0aGlzLmRpc3BhdGNoTWVzc2FnZShtc2dUeXBlLCBkYXRhKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRpbWVzdGFtcCA9IERhdGUubm93KClcbiAgICAsIGNvdW50ID0gJydcbiAgICAsIHVuaXF1ZUlEID0gJycgKyB0aW1lc3RhbXA7XG5cbmZ1bmN0aW9uIHVuaXF1ZUNvdW50KCkge1xuICAgIHZhciBuZXdUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIHVuaXF1ZUlEID0gJycgKyBuZXdUaW1lc3RhbXA7XG4gICAgaWYgKHRpbWVzdGFtcCA9PSBuZXdUaW1lc3RhbXApIHtcbiAgICAgICAgY291bnQgPSBjb3VudCA9PT0gJycgPyAwIDogY291bnQgKyAxO1xuICAgICAgICB1bmlxdWVJRCArPSAnXycgKyBjb3VudDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lc3RhbXAgPSBuZXdUaW1lc3RhbXA7XG4gICAgICAgIGNvdW50ID0gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZUlEO1xufVxuXG51bmlxdWVDb3VudC5nZXQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdW5pcXVlSUQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pcXVlQ291bnQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYG1pbG8udXRpbC53ZWJzb2NrZXRgIFxuKiovXG5cblxudmFyIE1lc3NlbmdlciA9IHJlcXVpcmUoJ21pbG8tY29yZScpLk1lc3NlbmdlclxuICAgICwgV1NNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi9tc2dfc3JjJylcbiAgICAsIFdTTXNnQVBJID0gcmVxdWlyZSgnLi9tc2dfYXBpJyk7XG5cblxuZnVuY3Rpb24gd2Vic29ja2V0KCkge1xuICAgIHZhciB3c01lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXI7XG4gICAgdmFyIHdzTXNnU291cmNlID0gbmV3IFdTTWVzc2FnZVNvdXJjZSh3c01lc3NlbmdlciwgeyBzZW5kOiAndHJpZ2dlcicsIGNvbm5lY3Q6ICdjb25uZWN0JyB9LCBuZXcgV1NNc2dBUEkpO1xuICAgIHdzTWVzc2VuZ2VyLl9zZXRNZXNzYWdlU291cmNlKHdzTXNnU291cmNlKTtcbiAgICByZXR1cm4gd3NNZXNzZW5nZXI7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB3ZWJzb2NrZXQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXJBUEkgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NlbmdlckFQSVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cblxudmFyIFdTTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJBUEksICdXU01zZ0FQSScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oV1NNc2dBUEksIHtcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBmaWx0ZXJTb3VyY2VNZXNzYWdlOiBmaWx0ZXJTb3VyY2VNZXNzYWdlLFxuICAgIGNyZWF0ZUludGVybmFsRGF0YTogY3JlYXRlSW50ZXJuYWxEYXRhXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBXU01zZ0FQSTtcblxuXG52YXIgU09DS0VUX01FU1NBR0VTID0gWydvcGVuJywgJ2Nsb3NlJywgJ2Vycm9yJywgJ21lc3NhZ2UnXTtcblxuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gU09DS0VUX01FU1NBR0VTLmluZGV4T2YobWVzc2FnZSkgPj0gMFxuICAgICAgICAgICAgPyBtZXNzYWdlXG4gICAgICAgICAgICA6ICdtZXNzYWdlJztcbn1cblxuXG5mdW5jdGlvbiBmaWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIG1zZ0RhdGEpIHtcbiAgICBpZiAoU09DS0VUX01FU1NBR0VTLmluZGV4T2YobWVzc2FnZSkgPj0gMCkgcmV0dXJuIHRydWU7IC8vIGludGVybmFsIG1lc3NhZ2UgaXMgb25lIG9mIGV4dGVybmFsIG1lc3NhZ2VzXG4gICAgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgIHZhciBtc2dUeXBlID0gbXNnRGF0YSAmJiBtc2dEYXRhLnR5cGU7XG4gICAgICAgIHJldHVybiBtc2dUeXBlID09IG1lc3NhZ2U7IC8vIHR5cGUgZXF1YWxzIGludGVybmFsIG1lc3NhZ2VcbiAgICB9XG59O1xuXG5cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBldmVudCkge1xuICAgIHZhciBpbnRlcm5hbERhdGEgPSBzb3VyY2VNZXNzYWdlID09ICdtZXNzYWdlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBfLmpzb25QYXJzZShldmVudC5kYXRhKSB8fCBldmVudC5kYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGV2ZW50O1xuICAgIHJldHVybiBpbnRlcm5hbERhdGE7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIHVuaXF1ZUlkID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91bmlxdWVfaWQnKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnJylcbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgV1NNZXNzYWdlU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnV1NNZXNzYWdlU291cmNlJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhXU01lc3NhZ2VTb3VyY2UsIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgXG4gICAgLy8gY2xhc3Mgc3BlY2lmaWMgbWV0aG9kc1xuICAgIGhhbmRsZUV2ZW50OiBXU01lc3NhZ2VTb3VyY2UkaGFuZGxlRXZlbnQsXG4gICAgY29ubmVjdDogV1NNZXNzYWdlU291cmNlJGNvbm5lY3QsXG4gICAgdHJpZ2dlcjogV1NNZXNzYWdlU291cmNlJHRyaWdnZXJcbn0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gV1NNZXNzYWdlU291cmNlO1xuXG5cbmZ1bmN0aW9uIFdTTWVzc2FnZVNvdXJjZSRjb25uZWN0KG9wdGlvbnMpIHtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICB2YXIgaG9zdCA9IG9wdGlvbnMuaG9zdCB8fCB3aW5kb3cubG9jYXRpb24uaG9zdC5yZXBsYWNlKC86LiovLCAnJylcbiAgICAgICAgLCBwb3J0ID0gb3B0aW9ucy5wb3J0IHx8ICc4MDgwJztcblxuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmICh0aGlzLl93cykge1xuICAgICAgICAvLyBUT0RPIHNob3VsZCB1bnN1YnNjcmliZSBkaWZmZXJlbnRseVxuICAgICAgICB0aGlzLl93cy5vbm9wZW4gPSB0aGlzLndzLm9ubWVzc2FnZSA9IHRoaXMud3Mub25jbG9zZSA9IHRoaXMud3Mub25lcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fd3MuY2xvc2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLl93cyA9IG5ldyBXZWJTb2NrZXQoJ3dzOi8vJyArIGhvc3QgKyAnOicgKyBwb3J0KTtcblxuICAgIC8vIFRPRE8gcmVjb25uZWN0XG59XG5cblxuXG5mdW5jdGlvbiBhZGRTb3VyY2VTdWJzY3JpYmVyIChzb3VyY2VNZXNzYWdlKSB7XG4gICAgX3dzU3Vic2NyaWJlck1ldGhvZC5jYWxsKHRoaXMsICdhZGRFdmVudExpc3RlbmVyJywgc291cmNlTWVzc2FnZSk7XG59XG5cblxuZnVuY3Rpb24gcmVtb3ZlU291cmNlU3Vic2NyaWJlciAoc291cmNlTWVzc2FnZSkge1xuICAgIF93c1N1YnNjcmliZXJNZXRob2QuY2FsbCh0aGlzLCAncmVtb3ZlRXZlbnRMaXN0ZW5lcicsIHNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIF93c1N1YnNjcmliZXJNZXRob2QgKG1ldGhvZCwgc291cmNlTWVzc2FnZSkgeyAgICBcbiAgICBpZiAoIXRoaXMuX3dzKSByZXR1cm4gbG9nZ2VyLmVycm9yKCd3ZWJzb2NrZXQgaXMgbm90IGNyZWF0ZWQnKTtcbiAgICB0aGlzLl93c1ttZXRob2RdKHNvdXJjZU1lc3NhZ2UsIHRoaXMpO1xufVxuXG5cbi8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbmZ1bmN0aW9uIFdTTWVzc2FnZVNvdXJjZSRoYW5kbGVFdmVudCAoZXZlbnQpIHtcbiAgICB0aGlzLmRpc3BhdGNoTWVzc2FnZShldmVudC50eXBlLCBldmVudCk7XG59XG5cblxuZnVuY3Rpb24gV1NNZXNzYWdlU291cmNlJHRyaWdnZXIgKG1zZywgZGF0YSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX3dzKSByZXR1cm4gbG9nZ2VyLmVycm9yKCd3ZWJzb2NrZXQgaXMgbm90IGNyZWF0ZWQnKTtcblxuICAgIGRhdGEgPSBkYXRhIHx8IHt9O1xuICAgIGRhdGEudHlwZSA9IG1zZztcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgZGF0YS5jYWxsYmFja0NvcnJJZCA9IHVuaXF1ZUlkKCk7XG4gICAgICAgIHZhciBpbnRlcnZhbCA9IF8uZGVsYXkob25UaW1lb3V0LCBjb25maWcud2Vic29ja2V0LnJwYy50aW1lb3V0KTtcbiAgICAgICAgdG9nZ2xlUnBjU3Vic2NyaXB0aW9uKCdvbmNlJywgZGF0YS5jYWxsYmFja0NvcnJJZCk7XG4gICAgfSAgICBcblxuICAgIHRoaXMuX3dzLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuXG5cbiAgICBmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICAgIHRvZ2dsZVJwY1N1YnNjcmlwdGlvbignb2ZmJywgZGF0YS5jYWxsYmFja0NvcnJJZCk7XG4gICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignd2Vic29ja2V0IHJwYzogdGltZW91dCcpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblJlc3BvbnNlKG1zZywgbXNnRGF0YSkge1xuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgaWYgKHR5cGVvZiBtc2dEYXRhID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gbXNnRGF0YS5lcnJvciA/IG5ldyBFcnJvcihtc2dEYXRhLmVycm9yKSA6IG51bGw7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIsIG1zZ0RhdGEuZGF0YSlcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ3dlYnNvY2tldCBycGM6IGludmFsaWQgcmVzcG9uc2UgZGF0YScpLCBtc2dEYXRhKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b2dnbGVScGNTdWJzY3JpcHRpb24ob25PZmYsIGNvcnJJZCkge1xuICAgICAgICBzZWxmLm1lc3Nlbmdlcltvbk9mZl0oY29uZmlnLndlYnNvY2tldC5ycGMucmVzcG9uc2VQcmVmaXggKyBjb3JySWQsIG9uUmVzcG9uc2UpO1xuICAgIH1cbn1cbiIsIjsoZnVuY3Rpb24oKXtcblxuLy8gVGhpcyB3b3VsZCBiZSB0aGUgcGxhY2UgdG8gZWRpdCBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudFxuLy8gQmFzZTMyIGltcGxlbWVudGF0aW9uXG5cbnZhciBhbHBoYWJldCA9ICcwMTIzNDU2Nzg5YWJjZGVmZ2hqa21ucHFydHV2d3h5eidcbnZhciBhbGlhcyA9IHsgbzowLCBpOjEsIGw6MSwgczo1IH1cblxuLyoqXG4gKiBCdWlsZCBhIGxvb2t1cCB0YWJsZSBhbmQgbWVtb2l6ZSBpdFxuICpcbiAqIFJldHVybiBhbiBvYmplY3QgdGhhdCBtYXBzIGEgY2hhcmFjdGVyIHRvIGl0c1xuICogYnl0ZSB2YWx1ZS5cbiAqL1xuXG52YXIgbG9va3VwID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRhYmxlID0ge31cbiAgICAvLyBJbnZlcnQgJ2FscGhhYmV0J1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxwaGFiZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGFibGVbYWxwaGFiZXRbaV1dID0gaVxuICAgIH1cbiAgICAvLyBTcGxpY2UgaW4gJ2FsaWFzJ1xuICAgIGZvciAodmFyIGtleSBpbiBhbGlhcykge1xuICAgICAgICBpZiAoIWFsaWFzLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlXG4gICAgICAgIHRhYmxlW2tleV0gPSB0YWJsZVsnJyArIGFsaWFzW2tleV1dXG4gICAgfVxuICAgIGxvb2t1cCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGFibGUgfVxuICAgIHJldHVybiB0YWJsZVxufVxuXG4vKipcbiAqIEEgc3RyZWFtaW5nIGVuY29kZXJcbiAqXG4gKiAgICAgdmFyIGVuY29kZXIgPSBuZXcgYmFzZTMyLkVuY29kZXIoKVxuICogICAgIHZhciBvdXRwdXQxID0gZW5jb2Rlci51cGRhdGUoaW5wdXQxKVxuICogICAgIHZhciBvdXRwdXQyID0gZW5jb2Rlci51cGRhdGUoaW5wdXQyKVxuICogICAgIHZhciBsYXN0b3V0cHV0ID0gZW5jb2RlLnVwZGF0ZShsYXN0aW5wdXQsIHRydWUpXG4gKi9cblxuZnVuY3Rpb24gRW5jb2RlcigpIHtcbiAgICB2YXIgc2tpcCA9IDAgLy8gaG93IG1hbnkgYml0cyB3ZSB3aWxsIHNraXAgZnJvbSB0aGUgZmlyc3QgYnl0ZVxuICAgIHZhciBiaXRzID0gMCAvLyA1IGhpZ2ggYml0cywgY2FycnkgZnJvbSBvbmUgYnl0ZSB0byB0aGUgbmV4dFxuXG4gICAgdGhpcy5vdXRwdXQgPSAnJ1xuXG4gICAgLy8gUmVhZCBvbmUgYnl0ZSBvZiBpbnB1dFxuICAgIC8vIFNob3VsZCBub3QgcmVhbGx5IGJlIHVzZWQgZXhjZXB0IGJ5IFwidXBkYXRlXCJcbiAgICB0aGlzLnJlYWRCeXRlID0gZnVuY3Rpb24oYnl0ZSkge1xuICAgICAgICAvLyBjb2VyY2UgdGhlIGJ5dGUgdG8gYW4gaW50XG4gICAgICAgIGlmICh0eXBlb2YgYnl0ZSA9PSAnc3RyaW5nJykgYnl0ZSA9IGJ5dGUuY2hhckNvZGVBdCgwKVxuXG4gICAgICAgIGlmIChza2lwIDwgMCkgeyAvLyB3ZSBoYXZlIGEgY2FycnkgZnJvbSB0aGUgcHJldmlvdXMgYnl0ZVxuICAgICAgICAgICAgYml0cyB8PSAoYnl0ZSA+PiAoLXNraXApKVxuICAgICAgICB9IGVsc2UgeyAvLyBubyBjYXJyeVxuICAgICAgICAgICAgYml0cyA9IChieXRlIDw8IHNraXApICYgMjQ4XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2tpcCA+IDMpIHtcbiAgICAgICAgICAgIC8vIG5vdCBlbm91Z2ggZGF0YSB0byBwcm9kdWNlIGEgY2hhcmFjdGVyLCBnZXQgdXMgYW5vdGhlciBvbmVcbiAgICAgICAgICAgIHNraXAgLT0gOFxuICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChza2lwIDwgNCkge1xuICAgICAgICAgICAgLy8gcHJvZHVjZSBhIGNoYXJhY3RlclxuICAgICAgICAgICAgdGhpcy5vdXRwdXQgKz0gYWxwaGFiZXRbYml0cyA+PiAzXVxuICAgICAgICAgICAgc2tpcCArPSA1XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIC8vIEZsdXNoIGFueSByZW1haW5pbmcgYml0cyBsZWZ0IGluIHRoZSBzdHJlYW1cbiAgICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uKGNoZWNrKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLm91dHB1dCArIChza2lwIDwgMCA/IGFscGhhYmV0W2JpdHMgPj4gM10gOiAnJykgKyAoY2hlY2sgPyAnJCcgOiAnJylcbiAgICAgICAgdGhpcy5vdXRwdXQgPSAnJ1xuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxufVxuXG4vKipcbiAqIFByb2Nlc3MgYWRkaXRpb25hbCBpbnB1dFxuICpcbiAqIGlucHV0OiBzdHJpbmcgb2YgYnl0ZXMgdG8gY29udmVydFxuICogZmx1c2g6IGJvb2xlYW4sIHNob3VsZCB3ZSBmbHVzaCBhbnkgdHJhaWxpbmcgYml0cyBsZWZ0XG4gKiAgICAgICAgaW4gdGhlIHN0cmVhbVxuICogcmV0dXJuczogYSBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXByZXNlbnRpbmcgJ2lucHV0JyBpbiBiYXNlMzJcbiAqL1xuXG5FbmNvZGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihpbnB1dCwgZmx1c2gpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgKSB7XG4gICAgICAgIGkgKz0gdGhpcy5yZWFkQnl0ZShpbnB1dFtpXSlcbiAgICB9XG4gICAgLy8gY29uc3VtZSBhbGwgb3V0cHV0XG4gICAgdmFyIG91dHB1dCA9IHRoaXMub3V0cHV0XG4gICAgdGhpcy5vdXRwdXQgPSAnJ1xuICAgIGlmIChmbHVzaCkge1xuICAgICAgb3V0cHV0ICs9IHRoaXMuZmluaXNoKClcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dFxufVxuXG4vLyBGdW5jdGlvbnMgYW5hbG9nb3VzbHkgdG8gRW5jb2RlclxuXG5mdW5jdGlvbiBEZWNvZGVyKCkge1xuICAgIHZhciBza2lwID0gMCAvLyBob3cgbWFueSBiaXRzIHdlIGhhdmUgZnJvbSB0aGUgcHJldmlvdXMgY2hhcmFjdGVyXG4gICAgdmFyIGJ5dGUgPSAwIC8vIGN1cnJlbnQgYnl0ZSB3ZSdyZSBwcm9kdWNpbmdcblxuICAgIHRoaXMub3V0cHV0ID0gJydcblxuICAgIC8vIENvbnN1bWUgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3RyZWFtLCBzdG9yZVxuICAgIC8vIHRoZSBvdXRwdXQgaW4gdGhpcy5vdXRwdXQuIEFzIGJlZm9yZSwgYmV0dGVyXG4gICAgLy8gdG8gdXNlIHVwZGF0ZSgpLlxuICAgIHRoaXMucmVhZENoYXIgPSBmdW5jdGlvbihjaGFyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2hhciAhPSAnc3RyaW5nJyl7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNoYXIgPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBjaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoYXIgPSBjaGFyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgdmFyIHZhbCA9IGxvb2t1cCgpW2NoYXJdXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBjaGFyYWN0ZXIgZG9lcyBub3QgZXhpc3QgaW4gb3VyIGxvb2t1cCB0YWJsZVxuICAgICAgICAgICAgcmV0dXJuIC8vIHNraXAgc2lsZW50bHkuIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlOlxuICAgICAgICAgICAgLy8gdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGNoYXJhY3RlciBcIicgKyBjaGFyICsgJ1wiIGluIGxvb2t1cCB0YWJsZS4nKVxuICAgICAgICB9XG4gICAgICAgIHZhbCA8PD0gMyAvLyBtb3ZlIHRvIHRoZSBoaWdoIGJpdHNcbiAgICAgICAgYnl0ZSB8PSB2YWwgPj4+IHNraXBcbiAgICAgICAgc2tpcCArPSA1XG4gICAgICAgIGlmIChza2lwID49IDgpIHtcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgZW5vdWdoIHRvIHByZWR1Y2Ugb3V0cHV0XG4gICAgICAgICAgICB0aGlzLm91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpXG4gICAgICAgICAgICBza2lwIC09IDhcbiAgICAgICAgICAgIGlmIChza2lwID4gMCkgYnl0ZSA9ICh2YWwgPDwgKDUgLSBza2lwKSkgJiAyNTVcbiAgICAgICAgICAgIGVsc2UgYnl0ZSA9IDBcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbihjaGVjaykge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5vdXRwdXQgKyAoc2tpcCA8IDAgPyBhbHBoYWJldFtiaXRzID4+IDNdIDogJycpICsgKGNoZWNrID8gJyQnIDogJycpXG4gICAgICAgIHRoaXMub3V0cHV0ID0gJydcbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cbn1cblxuRGVjb2Rlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oaW5wdXQsIGZsdXNoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnJlYWRDaGFyKGlucHV0W2ldKVxuICAgIH1cbiAgICB2YXIgb3V0cHV0ID0gdGhpcy5vdXRwdXRcbiAgICB0aGlzLm91dHB1dCA9ICcnXG4gICAgaWYgKGZsdXNoKSB7XG4gICAgICBvdXRwdXQgKz0gdGhpcy5maW5pc2goKVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0XG59XG5cbi8qKiBDb252ZW5pZW5jZSBmdW5jdGlvbnNcbiAqXG4gKiBUaGVzZSBhcmUgdGhlIG9uZXMgdG8gdXNlIGlmIHlvdSBqdXN0IGhhdmUgYSBzdHJpbmcgYW5kXG4gKiB3YW50IHRvIGNvbnZlcnQgaXQgd2l0aG91dCBkZWFsaW5nIHdpdGggc3RyZWFtcyBhbmQgd2hhdG5vdC5cbiAqL1xuXG4vLyBTdHJpbmcgb2YgZGF0YSBnb2VzIGluLCBCYXNlMzItZW5jb2RlZCBzdHJpbmcgY29tZXMgb3V0LlxuZnVuY3Rpb24gZW5jb2RlKGlucHV0KSB7XG4gIHZhciBlbmNvZGVyID0gbmV3IEVuY29kZXIoKVxuICB2YXIgb3V0cHV0ID0gZW5jb2Rlci51cGRhdGUoaW5wdXQsIHRydWUpXG4gIHJldHVybiBvdXRwdXRcbn1cblxuLy8gQmFzZTMyLWVuY29kZWQgc3RyaW5nIGdvZXMgaW4sIGRlY29kZWQgZGF0YSBjb21lcyBvdXQuXG5mdW5jdGlvbiBkZWNvZGUoaW5wdXQpIHtcbiAgICB2YXIgZGVjb2RlciA9IG5ldyBEZWNvZGVyKClcbiAgICB2YXIgb3V0cHV0ID0gZGVjb2Rlci51cGRhdGUoaW5wdXQsIHRydWUpXG4gICAgcmV0dXJuIG91dHB1dFxufVxuXG52YXIgYmFzZTMyID0ge1xuICAgIERlY29kZXI6IERlY29kZXIsXG4gICAgRW5jb2RlcjogRW5jb2RlcixcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICBkZWNvZGU6IGRlY29kZVxufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gd2UncmUgaW4gYSBicm93c2VyIC0gT01HIVxuICB3aW5kb3cuYmFzZTMyID0gYmFzZTMyXG59XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAvLyBub2RlanMvYnJvd3NlcmlmeVxuICBtb2R1bGUuZXhwb3J0cyA9IGJhc2UzMlxufVxufSkoKTtcbiIsIlxuLy8gbm90IGltcGxlbWVudGVkXG4vLyBUaGUgcmVhc29uIGZvciBoYXZpbmcgYW4gZW1wdHkgZmlsZSBhbmQgbm90IHRocm93aW5nIGlzIHRvIGFsbG93XG4vLyB1bnRyYWRpdGlvbmFsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kdWxlLlxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNaXhpbjtcblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLk1peGluYCAtIGFuIGFic3RyYWN0IE1peGluIGNsYXNzLlxuICogQ2FuIGJlIHN1YmNsYXNzZWQgdXNpbmc6XG4gKiBgYGBcbiAqIHZhciBNeU1peGluID0gXy5jcmVhdGVTdWJjbGFzcyhtaWxvLmNsYXNzZXMuTWl4aW4sICdNeU1peGluJyk7XG4gKiBgYGBcbiAqXG4gKiBNaXhpbiBwYXR0ZXJuIGlzIGFsc28gdXNlZCwgYnV0IE1peGluIGluIG1pbG8gaXMgaW1wbGVtZW50ZWQgYXMgYSBzZXBhcmF0ZSBvYmplY3QgdGhhdCBpcyBzdG9yZWQgb24gdGhlIHByb3BlcnR5IG9mIHRoZSBob3N0IG9iamVjdCBhbmQgY2FuIGNyZWF0ZSBwcm94eSBtZXRob2RzIG9uIHRoZSBob3N0IG9iamVjdCBpZiByZXF1aXJlZC5cbiAqIENsYXNzZXMgW01lc3Nlbmdlcl0oLi4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIGFuZCBbTWVzc2FnZVNvdXJjZV0oLi4vbWVzc2VuZ2VyL21fc291cmNlLmpzLmh0bWwpIGFyZSBzdWJjbGFzc2VzIG9mIE1peGluIGFic3RyYWN0IGNsYXNzLiBgdGhpc2AgaW4gcHJveHkgbWV0aG9kcyByZWZlcnMgdG8gTWl4aW4gaW5zdGFuY2UsIHRoZSByZWZlcmVuY2UgdG8gdGhlIGhvc3Qgb2JqZWN0IGlzIGB0aGlzLl9ob3N0T2JqZWN0YC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBPcHRpb25hbCBvYmplY3Qgd2hlcmUgYSBNaXhpbiBpbnN0YW5jZSB3aWxsIGJlIHN0b3JlZCBvbi4gSXQgaXMgdXNlZCB0byBwcm94eSBtZXRob2RzIGFuZCBhbHNvIHRvIGZpbmQgdGhlIHJlZmVyZW5jZSB3aGVuIGl0IGlzIG5lZWRlZCBmb3IgaG9zdCBvYmplY3QgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0ge09iamVjdH0gcHJveHlNZXRob2RzIE9wdGlvbmFsIG1hcCBvZiBwcm94eSBtZXRob2QgbmFtZXMgYXMga2V5cyBhbmQgTWl4aW4gbWV0aG9kcyBuYW1lcyBhcyB2YWx1ZXMsIHNvIHByb3hpZWQgbWV0aG9kcyBjYW4gYmUgcmVuYW1lZCB0byBhdm9pZCBuYW1lLXNwYWNlIGNvbmZsaWN0cyBpZiB0d28gZGlmZmVyZW50IE1peGluIGluc3RhbmNlcyB3aXRoIHRoZSBzYW1lIG1ldGhvZCBuYW1lcyBhcmUgcHV0IG9uIHRoZSBvYmplY3RcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGFsbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gaW5pdCBtZXRob2Qgb2YgTWl4aW4gc3ViY2xhc3MgdG9nZXRoZXIgd2l0aCBob3N0T2JqZWN0IGFuZCBwcm94eU1ldGhvZHNcbiAqIEByZXR1cm4ge01peGlufVxuICovXG5mdW5jdGlvbiBNaXhpbihob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMpIHsgLy8gLCBvdGhlciBhcmdzIC0gcGFzc2VkIHRvIGluaXQgbWV0aG9kXG4gICAgY2hlY2soaG9zdE9iamVjdCwgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoT2JqZWN0LCBGdW5jdGlvbikpKTtcblxuICAgIC8vIHN0b3JlIGhvc3RPYmplY3RcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfaG9zdE9iamVjdCcsIGhvc3RPYmplY3QpO1xuXG4gICAgLy8gcHJveHkgbWV0aG9kcyB0byBob3N0T2JqZWN0XG4gICAgaWYgKHByb3h5TWV0aG9kcylcbiAgICAgICAgdGhpcy5fY3JlYXRlUHJveHlNZXRob2RzKHByb3h5TWV0aG9kcyk7XG5cbiAgICAvLyBjYWxsaW5nIGluaXQgaWYgaXQgaXMgZGVmaW5lZCBpbiB0aGUgY2xhc3NcbiAgICBpZiAodGhpcy5pbml0KVxuICAgICAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG4vKipcbiAqICMjIyNNaXhpbiBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICogVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IGNvbnN0cnVjdG9yLCB0aGV5IGFyZSBub3QgdG8gYmUgY2FsbGVkIGZyb20gc3ViY2xhc3Nlcy5cbiAqXG4gKiAtIFtfY3JlYXRlUHJveHlNZXRob2RdKCNfY3JlYXRlUHJveHlNZXRob2QpXG4gKiAtIFtfY3JlYXRlUHJveHlNZXRob2RzXSgjX2NyZWF0ZVByb3h5TWV0aG9kcylcbiAqL1xuXy5leHRlbmRQcm90byhNaXhpbiwge1xuICAgIF9jcmVhdGVQcm94eU1ldGhvZDogX2NyZWF0ZVByb3h5TWV0aG9kLCAgLy8gZGVwcmVjYXRlZCwgc2hvdWxkIG5vdCBiZSB1c2VkXG4gICAgX2NyZWF0ZVByb3h5TWV0aG9kczogX2NyZWF0ZVByb3h5TWV0aG9kcyAgLy8gZGVwcmVjYXRlZCwgc2hvdWxkIG5vdCBiZSB1c2VkXG59KTtcblxuXG4vKipcbiAqICMjIyNNaXhpbiBjbGFzcyBtZXRob2RzIyMjI1xuICogVGhlc2UgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW4gaG9zdCBjbGFzcyBkZWNsYXJhdGlvbi5cbiAqXG4gKiAtIFt1c2VXaXRoXSgjTWl4aW4kJHVzZVdpdGgpXG4gKi9cbl8uZXh0ZW5kKE1peGluLCB7XG4gICAgdXNlV2l0aDogTWl4aW4kJHVzZVdpdGhcbn0pO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhIHByb3hpZWQgbWV0aG9kIG9mIE1peGluIHN1YmNsYXNzIG9uIGhvc3Qgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaXhpbk1ldGhvZE5hbWUgbmFtZSBvZiBtZXRob2QgaW4gTWl4aW4gc3ViY2xhc3NcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm94eU1ldGhvZE5hbWUgbmFtZSBvZiBjcmVhdGVkIHByb3h5IG1ldGhvZCBvbiBob3N0IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IGhvc3RPYmplY3QgT3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBob3N0IG9iamVjdDsgaWYgbm90IHNwZWNpZmllZCB0aGUgaG9zdCBvYmplY3QgcGFzc2VkIHRvIGNvbnN0cnVjdG9yIHdpbCBiZSB1c2VkLiBJdCBhbGxvd3MgdG8gdXNlIHRoZSBzYW1lIGluc3RhbmNlIG9mIE1peGluIG9uIHR3byBob3N0IG9iamVjdHMuXG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVQcm94eU1ldGhvZChwcm94eU1ldGhvZE5hbWUsIG1peGluTWV0aG9kTmFtZSwgaG9zdE9iamVjdCkge1xuICAgIGhvc3RPYmplY3QgPSBob3N0T2JqZWN0IHx8IHRoaXMuX2hvc3RPYmplY3Q7XG5cbiAgICAvLyBNaXhpbiBjbGFzcyBkb2VzIG5vdCBhbGxvdyBzaGFkb3dpbmcgbWV0aG9kcyB0aGF0IGV4aXN0IG9uIHRoZSBob3N0IG9iamVjdFxuICAgIGlmIChob3N0T2JqZWN0W3Byb3h5TWV0aG9kTmFtZV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbWV0aG9kICcgKyBwcm94eU1ldGhvZE5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyBhbHJlYWR5IGRlZmluZWQgaW4gaG9zdCBvYmplY3QnKTtcblxuICAgIHZhciBtZXRob2QgPSB0aGlzW21peGluTWV0aG9kTmFtZV1cbiAgICBjaGVjayhtZXRob2QsIEZ1bmN0aW9uKTtcblxuICAgIC8vIEJpbmQgcHJveGllZCBNaXhpbidzIG1ldGhvZCB0byBNaXhpbiBpbnN0YW5jZVxuICAgIHZhciBib3VuZE1ldGhvZCA9IG1ldGhvZC5iaW5kKHRoaXMpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eShob3N0T2JqZWN0LCBwcm94eU1ldGhvZE5hbWUsIGJvdW5kTWV0aG9kLCBfLldSSVQpO1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBwcm94aWVkIG1ldGhvZHMgb2YgTWl4aW4gc3ViY2xhc3Mgb24gaG9zdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtIYXNoW1N0cmluZ118QXJyYXlbU3RyaW5nXX0gcHJveHlNZXRob2RzIG1hcCBvZiBuYW1lcyBvZiBtZXRob2RzLCBrZXkgLSBwcm94eSBtZXRob2QgbmFtZSwgdmFsdWUgLSBtaXhpbiBtZXRob2QgbmFtZS4gQ2FuIGJlIGFycmF5LlxuICogQHBhcmFtIHtPYmplY3R9IGhvc3RPYmplY3QgYW4gb3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBob3N0IG9iamVjdDsgaWYgbm90IHNwZWNpZmllZCB0aGUgaG9zdCBvYmplY3QgcGFzc2VkIHRvIGNvbnN0cnVjdG9yIHdpbCBiZSB1c2VkLiBJdCBhbGxvd3MgdG8gdXNlIHRoZSBzYW1lIGluc3RhbmNlIG9mIE1peGluIG9uIHR3byBob3N0IG9iamVjdHMuXG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVQcm94eU1ldGhvZHMocHJveHlNZXRob2RzLCBob3N0T2JqZWN0KSB7XG4gICAgY2hlY2socHJveHlNZXRob2RzLCBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihbU3RyaW5nXSwgTWF0Y2guT2JqZWN0SGFzaChTdHJpbmcpKSkpO1xuXG4gICAgLy8gY3JlYXRpbmcgYW5kIGJpbmRpbmcgcHJveHkgbWV0aG9kcyBvbiB0aGUgaG9zdCBvYmplY3RcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm94eU1ldGhvZHMpKVxuICAgICAgICBwcm94eU1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgICAgICAvLyBtZXRob2QgY2FsbGVkIHRoaXMgd2F5IHRvIGFsbG93IHVzaW5nIF9jcmVhdGVQcm94eU1ldGhvZHMgd2l0aCBvYmplY3RzXG4gICAgICAgICAgICAvLyB0aGF0IGFyZSBub3QgaW5oZXJpdGluZyBmcm9tIE1peGluXG4gICAgICAgICAgICBfY3JlYXRlUHJveHlNZXRob2QuY2FsbCh0aGlzLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBob3N0T2JqZWN0KTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgZWxzZVxuICAgICAgICBfLmVhY2hLZXkocHJveHlNZXRob2RzLCBmdW5jdGlvbihtaXhpbk1ldGhvZE5hbWUsIHByb3h5TWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgLy8gbWV0aG9kIGNhbGxlZCB0aGlzIHdheSB0byBhbGxvdyB1c2luZyBfY3JlYXRlUHJveHlNZXRob2RzIHdpdGggb2JqZWN0c1xuICAgICAgICAgICAgLy8gdGhhdCBhcmUgbm90IGluaGVyaXRpbmcgZnJvbSBNaXhpblxuICAgICAgICAgICAgX2NyZWF0ZVByb3h5TWV0aG9kLmNhbGwodGhpcywgcHJveHlNZXRob2ROYW1lLCBtaXhpbk1ldGhvZE5hbWUsIGhvc3RPYmplY3QpO1xuICAgICAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIFNldHMgbWl4aW4gaW5zdGFuY2UgcHJvcGVydHkgbmFtZSBvbiB0aGUgaG9zdCBjbGFzc1xuICogQ2FuIGJlIGNhbGxlZCBvbmx5IG9uY2VcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGhpcyBNaXhpbiBzdWJjbGFzcyAobm90IGluc3RhbmNlKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gaG9zdENsYXNzXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5zdGFuY2VLZXlcbiAqL1xuZnVuY3Rpb24gTWl4aW5fc2V0SW5zdGFuY2VLZXkoaG9zdENsYXNzLCBtZXRob2QsIGluc3RhbmNlS2V5KSB7XG4gICAgY2hlY2soaG9zdENsYXNzLCBGdW5jdGlvbik7XG4gICAgY2hlY2soaW5zdGFuY2VLZXksIE1hdGNoLklkZW50aWZpZXJTdHJpbmcpO1xuXG4gICAgdmFyIHByb3AgPSBjb25maWcubWl4aW4uaW5zdGFuY2VQcm9wZXJ0aWVzTWFwXG4gICAgICAgICwgaW5zdGFuY2VLZXlzID0gaG9zdENsYXNzW3Byb3BdID0gaG9zdENsYXNzW3Byb3BdIHx8IHt9O1xuXG4gICAgaWYgKGluc3RhbmNlS2V5c1ttZXRob2QubmFtZV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWl4aW46IGluc3RhbmNlIHByb3BlcnR5IGZvciBtZXRob2Qgd2l0aCBuYW1lICdcbiAgICAgICAgICAgICsgbWV0aG9kLm5hbWUgKyAnIGlzIGFscmVhZHkgc2V0Jyk7XG5cbiAgICBpbnN0YW5jZUtleXNbbWV0aG9kLm5hbWVdID0gaW5zdGFuY2VLZXk7XG59XG5cblxuLyoqXG4gKiBBZGRzIG1ldGhvZCBvZiBNaXhpbiBzdWJjbGFzcyB0byBob3N0IGNsYXNzIHByb3RvdHlwZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGhpcyBNaXhpbiBzdWJjbGFzcyAobm90IGluc3RhbmNlKVxuICogQHBhcmFtIHtTdHJpbmd9IG1peGluTWV0aG9kTmFtZSBuYW1lIG9mIG1ldGhvZCBpbiBNaXhpbiBzdWJjbGFzc1xuICogQHBhcmFtIHtTdHJpbmd9IGhvc3RNZXRob2ROYW1lIChvcHRpb25hbCkgbmFtZSBvZiBjcmVhdGVkIHByb3h5IG1ldGhvZCBvbiBob3N0IG9iamVjdCwgc2FtZSBpZiBub3Qgc3BlY2lmaWVkXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBvYmplY3QgY2xhc3MsIG11c3QgYmUgc3BlY2lmaWVkIGFzIHRoZSBsYXN0IHBhcmFtZXRlciAoMm5kIG9yIDNyZClcbiAqL1xuZnVuY3Rpb24gTWl4aW5fYWRkTWV0aG9kKGhvc3RDbGFzcywgaW5zdGFuY2VLZXksIG1peGluTWV0aG9kTmFtZSwgaG9zdE1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gdGhpcy5wcm90b3R5cGVbbWl4aW5NZXRob2ROYW1lXTtcbiAgICBjaGVjayhtZXRob2QsIEZ1bmN0aW9uKTtcblxuICAgIHZhciB3cmFwcGVkTWV0aG9kID0gX3dyYXBNaXhpbk1ldGhvZC5jYWxsKHRoaXMsIG1ldGhvZCk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KGhvc3RDbGFzcy5wcm90b3R5cGUsIGhvc3RNZXRob2ROYW1lLCB3cmFwcGVkTWV0aG9kLCBfLldSSVQpO1xuXG4gICAgTWl4aW5fc2V0SW5zdGFuY2VLZXkoaG9zdENsYXNzLCBtZXRob2QsIGluc3RhbmNlS2V5KVxufVxuXG5cbi8qKlxuICogUmV0dXJucyBtZXRob2QgdGhhdCB3aWxsIGJlIGV4cG9zZWQgb24gdGhlIGhvc3QgY2xhc3MgcHJvdG90eXBlXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRoaXMgTWl4aW4gc3ViY2xhc3MgKG5vdCBpbnN0YW5jZSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBfd3JhcE1peGluTWV0aG9kKG1ldGhvZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHsgLy8gLC4uLiBhcmd1bWVudHNcbiAgICAgICAgdmFyIG1peGluSW5zdGFuY2UgPSBfZ2V0TWl4aW5JbnN0YW5jZS5jYWxsKHRoaXMsIG1ldGhvZC5uYW1lKTtcbiAgICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseShtaXhpbkluc3RhbmNlLCBhcmd1bWVudHMpO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW5zdGFuY2Ugb2YgbWl4aW4gc3ViY2xhc3MuXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gbWV0aG9kcyBhcmUgZXhwb3NlZCBvbiB0aGUgaG9zdCBjbGFzcyBwcm90b3R5cGUgKHVzaW5nIGFkZE1laHRvZHMpIHJhdGhlciB0aGFuIG9uIGhvc3QgaW5zdGFuY2UuXG4gKiBTdWJjbGFzc2VzIHNob3VsZCBub3QgdXNlIHRoaXMgbWV0aG9kcyAtIHdoZW5ldmVyIHN1YmNsYXNzIG1ldGhvZCBpcyBleHBvc2VkIG9uIHRoZSBwcm90b3R5cGUgaXQgd2lsbCBiZSB3cmFwcGVkIHRvIHNldCBjb3JyZWN0IGNvbnRleHQgZm9yIHRoZSBzdWJjbGFzcyBtZXRob2QuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gX2dldE1peGluSW5zdGFuY2UobWV0aG9kTmFtZSkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgTWl4aW4pIHJldHVybiB0aGlzO1xuICAgIHZhciBpbnN0YW5jZUtleXMgPSB0aGlzLmNvbnN0cnVjdG9yW2NvbmZpZy5taXhpbi5pbnN0YW5jZVByb3BlcnRpZXNNYXBdXG4gICAgICAgICwgbWl4aW5Qcm9wID0gaW5zdGFuY2VLZXlzW21ldGhvZE5hbWVdXG4gICAgICAgICwgbWl4aW4gPSB0aGlzW21peGluUHJvcF07XG4gICAgaWYgKCFtaXhpbikgdGhyb3cgbmV3IEVycm9yKCdNaXhpbiAnICsgbWl4aW5Qcm9wICsgJyBkb2VzIG5vdCBleGlzdCcpO1xuICAgIHJldHVybiBtaXhpbjtcbn1cblxuXG4vKipcbiAqIEFkZHMgbWV0aG9kcyBvZiBNaXhpbiBzdWJjbGFzcyB0byBob3N0IGNsYXNzIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzIE1peGluIHN1YmNsYXNzIChub3QgaW5zdGFuY2UpXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdENsYXNzIGhvc3Qgb2JqZWN0IGNsYXNzOyBtdXN0IGJlIHNwZWNpZmllZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnN0YW5jZUtleSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhlIGhvc3QgY2xhc3MgaW5zdGFuY2Ugd2lsbCBzdG9yZSBtaXhpbiBpbnN0YW5jZSBvblxuICogQHBhcmFtIHtIYXNoW1N0cmluZ118QXJyYXlbU3RyaW5nXX0gbWl4aW5NZXRob2RzIG1hcCBvZiBuYW1lcyBvZiBtZXRob2RzLCBrZXkgLSBob3N0IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIG1peGluIG1ldGhvZCBuYW1lLiBDYW4gYmUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIE1peGluJCR1c2VXaXRoKGhvc3RDbGFzcywgaW5zdGFuY2VLZXksIG1peGluTWV0aG9kcykge1xuICAgIGNoZWNrKG1peGluTWV0aG9kcywgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoW1N0cmluZ10sIE1hdGNoLk9iamVjdEhhc2goU3RyaW5nKSkpKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG1peGluTWV0aG9kcykpXG4gICAgICAgIG1peGluTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIE1peGluX2FkZE1ldGhvZC5jYWxsKHRoaXMsIGhvc3RDbGFzcywgaW5zdGFuY2VLZXksIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZWFjaEtleShtaXhpbk1ldGhvZHMsIGZ1bmN0aW9uKG1peGluTWV0aG9kTmFtZSwgaG9zdE1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIE1peGluX2FkZE1ldGhvZC5jYWxsKHRoaXMsIGhvc3RDbGFzcywgaW5zdGFuY2VLZXksIG1peGluTWV0aG9kTmFtZSwgaG9zdE1ldGhvZE5hbWUpO1xuICAgICAgICB9LCB0aGlzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNsYXNzZXNcIj48L2E+XG4vLyBtaWxvLmNsYXNzZXNcbi8vIC0tLS0tLS0tLS0tXG5cbi8vIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGZvdW5kYXRpb24gY2xhc3Nlc1xuXG52YXIgY2xhc3NlcyA9IHtcbiAgICBNaXhpbjogcmVxdWlyZSgnLi9hYnN0cmFjdC9taXhpbicpLFxuICAgIE1lc3NhZ2VTb3VyY2U6IHJlcXVpcmUoJy4vbWVzc2VuZ2VyL21fc291cmNlJyksXG4gICAgTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZTogcmVxdWlyZSgnLi9tZXNzZW5nZXIvbXNuZ3Jfc291cmNlJyksXG4gICAgTWVzc2VuZ2VyQVBJOiByZXF1aXJlKCcuL21lc3Nlbmdlci9tX2FwaScpLFxuICAgIE1lc3NlbmdlclJlZ2V4cEFQSTogcmVxdWlyZSgnLi9tZXNzZW5nZXIvbV9hcGlfcngnKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc2VzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb25maWc7XG5cbmZ1bmN0aW9uIGNvbmZpZyhvcHRpb25zKSB7XG4gICAgXy5kZWVwRXh0ZW5kKGNvbmZpZywgb3B0aW9ucyk7XG59XG5cbmNvbmZpZyh7XG4gICAgbWl4aW46IHtcbiAgICAgICAgaW5zdGFuY2VQcm9wZXJ0aWVzTWFwOiAnX19fbWl4aW5faW5zdGFuY2VzJ1xuICAgIH0sXG4gICAgY2hlY2s6IHRydWUsXG4gICAgZGVidWc6IGZhbHNlXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1peGluID0gcmVxdWlyZSgnLi4vYWJzdHJhY3QvbWl4aW4nKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IHJlcXVpcmUoJy4vbV9zb3VyY2UnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG4vKipcbiAqIGBtaWxvLk1lc3NlbmdlcmBcbiAqIEEgZ2VuZXJpYyBNZXNzZW5nZXIgY2xhc3MgdGhhdCBpcyB1c2VkIGZvciBhbGwga2luZHMgb2YgbWVzc2FnaW5nIGluIG1pbG8uIEl0IGlzIHN1YmNsYXNzZWQgZnJvbSBbTWl4aW5dKC4uL2Fic3RyYWN0L21peGluLmpzLmh0bWwpIGFuZCBpdCBwcm94aWVzIGl0cyBtZXRob2RzIHRvIHRoZSBob3N0IG9iamVjdCBmb3IgY29udmVuaWVuY2UuXG4gKiBBbGwgZmFjZXRzIGFuZCBjb21wb25lbnRzIGhhdmUgbWVzc2VuZ2VyIGF0dGFjaGVkIHRvIHRoZW0uIE1lc3NlbmdlciBjbGFzcyBpbnRlcm9wZXJhdGVzIHdpdGggW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgY2xhc3MgdGhhdCBjb25uZWN0cyB0aGUgbWVzc2VuZ2VyIHRvIHNvbWUgZXh0ZXJuYWwgc291cmNlIG9mIG1lc3NhZ2VzIChlLmcuLCBET00gZXZlbnRzKSBhbmQgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSBjbGFzcyB0aGF0IGFsbG93cyB0byBkZWZpbmUgaGlnaGVyIGxldmVsIG1lc3NhZ2VzIHRoYW4gbWVzc2FnZXMgdGhhdCBleGlzdCBvbiB0aGUgc291cmNlLlxuICogTWVzc2VuZ2VyIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBpbiBtaWxvIGFuZCBjYW4gYmUgdXNlZCB0b2dldGhlciB3aXRoIGFueSBvYmplY3RzL2NsYXNzZXMgaW4gdGhlIGFwcGxpY2F0aW9uLlxuICogbWlsbyBhbHNvIGRlZmluZXMgYSBnbG9iYWwgbWVzc2VuZ2VyIFttaWxvLm1haWxdKC4uL21haWwvaW5kZXguanMuaHRtbCkgdGhhdCBkaXNwYXRjaGVzIGBkb21yZWFkeWAgZXZlbnQgYW5kIGNhbiBiZSB1c2VkIGZvciBhbnkgYXBwbGljYXRpb24gd2lkZSBtZXNzYWdpbmcuXG4gKiBUbyBpbml0aWFsaXplIHlvdXIgYXBwIGFmdGVyIERPTSBpcyByZWFkeSB1c2U6XG4gKiBgYGBcbiAqIG1pbG8ubWFpbC5vbignZG9tcmVhZHknLCBmdW5jdGlvbigpIHtcbiAqICAgICAvLyBhcHBsaWNhdGlvbiBzdGFydHNcbiAqIH0pO1xuICogYGBgXG4gKiBvciB0aGUgZm9sbG93aW5nIHNob3J0ZXIgZm9ybSBvZiB0aGUgc2FtZTpcbiAqIGBgYFxuICogbWlsbyhmdW5jdGlvbigpIHtcbiAqICAgICAvLyBhcHBsaWNhdGlvbiBzdGFydHNcbiAqIH0pO1xuICogYGBgXG4gKi9cbnZhciBNZXNzZW5nZXIgPSBfLmNyZWF0ZVN1YmNsYXNzKE1peGluLCAnTWVzc2VuZ2VyJyk7XG5cbnZhciBtZXNzYWdlc1NwbGl0UmVnRXhwID0gTWVzc2VuZ2VyLm1lc3NhZ2VzU3BsaXRSZWdFeHAgPSAvXFxzKig/OlxcLHxcXHMpXFxzKi87XG5cblxuLyoqXG4gKiAjIyMjTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI2luaXQpXG4gKiAtIFtvbl0oI01lc3NlbmdlciRvbikgKGFsaWFzIC0gb25NZXNzYWdlLCBkZXByZWNhdGVkKVxuICogLSBbb2ZmXSgjTWVzc2VuZ2VyJG9mZikgKGFsaWFzIC0gb2ZmTWVzc2FnZSwgZGVwcmVjYXRlZClcbiAqIC0gW29uTWVzc2FnZXNdKCNvbk1lc3NhZ2VzKVxuICogLSBbb2ZmTWVzc2FnZXNdKCNvZmZNZXNzYWdlcylcbiAqIC0gW29uY2VdKCNvbmNlKVxuICogLSBbb25jZVN5bmNdKCNvbmNlU3luYylcbiAqIC0gW3Bvc3RNZXNzYWdlXSgjcG9zdE1lc3NhZ2UpXG4gKiAtIFtnZXRTdWJzY3JpYmVyc10oI2dldFN1YnNjcmliZXJzKVxuICpcbiAqIFwiUHJpdmF0ZVwiIG1ldGhvZHNcbiAqXG4gKiAtIFtfY2hvb3NlU3Vic2NyaWJlcnNIYXNoXSgjX2Nob29zZVN1YnNjcmliZXJzSGFzaClcbiAqIC0gW19yZWdpc3RlclN1YnNjcmliZXJdKCNfcmVnaXN0ZXJTdWJzY3JpYmVyKVxuICogLSBbX3JlbW92ZVN1YnNjcmliZXJdKCNfcmVtb3ZlU3Vic2NyaWJlcilcbiAqIC0gW19yZW1vdmVBbGxTdWJzY3JpYmVyc10oI19yZW1vdmVBbGxTdWJzY3JpYmVycylcbiAqIC0gW19jYWxsUGF0dGVyblN1YnNjcmliZXJzXSgjX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnMpXG4gKiAtIFtfY2FsbFN1YnNjcmliZXJzXSgjX2NhbGxTdWJzY3JpYmVycylcbiAqIC0gW19zZXRNZXNzYWdlU291cmNlXSgjX3NldE1lc3NhZ2VTb3VyY2UpXG4gKiAtIFtnZXRNZXNzYWdlU291cmNlXSgjZ2V0TWVzc2FnZVNvdXJjZSlcbiAqL1xuXy5leHRlbmRQcm90byhNZXNzZW5nZXIsIHtcbiAgICBpbml0OiBpbml0LCAvLyBjYWxsZWQgYnkgTWl4aW4gKHN1cGVyY2xhc3MpXG4gICAgZGVzdHJveTogTWVzc2VuZ2VyJGRlc3Ryb3ksXG4gICAgb246IE1lc3NlbmdlciRvbixcbiAgICBvbmNlOiBNZXNzZW5nZXIkb25jZSxcbiAgICBvbmNlU3luYzogTWVzc2VuZ2VyJG9uY2VTeW5jLFxuICAgIG9uU3luYzogTWVzc2VuZ2VyJG9uU3luYyxcbiAgICBvbkFzeW5jOiBNZXNzZW5nZXIkb25Bc3luYyxcbiAgICBvbk1lc3NhZ2U6IE1lc3NlbmdlciRvbiwgLy8gZGVwcmVjYXRlZFxuICAgIG9mZjogTWVzc2VuZ2VyJG9mZixcbiAgICBvZmZNZXNzYWdlOiBNZXNzZW5nZXIkb2ZmLCAvLyBkZXByZWNhdGVkXG4gICAgb25NZXNzYWdlczogb25NZXNzYWdlcyxcbiAgICBvZmZNZXNzYWdlczogb2ZmTWVzc2FnZXMsXG4gICAgb2ZmQWxsOiBNZXNzZW5nZXIkb2ZmQWxsLFxuICAgIHBvc3RNZXNzYWdlOiBwb3N0TWVzc2FnZSxcbiAgICBwb3N0TWVzc2FnZVN5bmM6IHBvc3RNZXNzYWdlU3luYyxcbiAgICBnZXRTdWJzY3JpYmVyczogZ2V0U3Vic2NyaWJlcnMsXG4gICAgZ2V0TWVzc2FnZVNvdXJjZTogZ2V0TWVzc2FnZVNvdXJjZSxcbiAgICBfY2hvb3NlU3Vic2NyaWJlcnNIYXNoOiBfY2hvb3NlU3Vic2NyaWJlcnNIYXNoLFxuICAgIF9yZWdpc3RlclN1YnNjcmliZXI6IF9yZWdpc3RlclN1YnNjcmliZXIsXG4gICAgX3JlbW92ZVN1YnNjcmliZXI6IF9yZW1vdmVTdWJzY3JpYmVyLFxuICAgIF9yZW1vdmVBbGxTdWJzY3JpYmVyczogX3JlbW92ZUFsbFN1YnNjcmliZXJzLFxuICAgIF9jYWxsUGF0dGVyblN1YnNjcmliZXJzOiBfY2FsbFBhdHRlcm5TdWJzY3JpYmVycyxcbiAgICBfY2FsbFN1YnNjcmliZXJzOiBfY2FsbFN1YnNjcmliZXJzLFxuICAgIF9jYWxsU3Vic2NyaWJlcjogX2NhbGxTdWJzY3JpYmVyLFxuICAgIF9zZXRNZXNzYWdlU291cmNlOiBfc2V0TWVzc2FnZVNvdXJjZVxufSk7XG5cblxuLyoqXG4gKiBBIGRlZmF1bHQgbWFwIG9mIHByb3h5IG1ldGhvZHMgdXNlZCBieSBDb21wb25lbnRGYWNldCBhbmQgQ29tcG9uZW50IGNsYXNzZXMgdG8gcGFzcyB0byBNZXNzZW5nZXIgd2hlbiBpdCBpcyBpbnN0YW50aWF0ZWQuXG4gKiBUaGlzIG1hcCBpcyBmb3IgY29udmVuaWVuY2Ugb25seSwgaXQgaXMgTk9UIHVzZWQgaW50ZXJuYWxseSBieSBNZXNzZW5nZXIsIGEgaG9zdCBjbGFzcyBzaG91bGQgcGFzcyBpdCBmb3IgbWV0aG9kcyB0byBiZSBwcm94aWVkIHRoaXMgd2F5LlxuICovXG5NZXNzZW5nZXIuZGVmYXVsdE1ldGhvZHMgPSB7XG4gICAgb246ICdvbicsXG4gICAgb25TeW5jOiAnb25TeW5jJyxcbiAgICBvbmNlOiAnb25jZScsXG4gICAgb25jZVN5bmM6ICdvbmNlU3luYycsXG4gICAgb2ZmOiAnb2ZmJyxcbiAgICBvbk1lc3NhZ2VzOiAnb25NZXNzYWdlcycsXG4gICAgb2ZmTWVzc2FnZXM6ICdvZmZNZXNzYWdlcycsXG4gICAgcG9zdE1lc3NhZ2U6ICdwb3N0TWVzc2FnZScsXG4gICAgcG9zdE1lc3NhZ2VTeW5jOiAncG9zdE1lc3NhZ2VTeW5jJyxcbiAgICBnZXRTdWJzY3JpYmVyczogJ2dldFN1YnNjcmliZXJzJ1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1lc3NlbmdlcjtcblxuXG5NZXNzZW5nZXIuc3Vic2NyaXB0aW9ucyA9IFtdO1xuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbGl6ZXMgTWVzc2VuZ2VyLiBNZXRob2QgaXMgY2FsbGVkIGJ5IE1peGluIGNsYXNzIGNvbnN0cnVjdG9yLlxuICogU2VlIFtvbl0oI01lc3NlbmdlciRvbikgbWV0aG9kLCBbTWVzc2VuZ2VyXSgjTWVzc2VuZ2VyKSBjbGFzcyBhYm92ZSBhbmQgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGhvc3RPYmplY3QgT3B0aW9uYWwgb2JqZWN0IHRoYXQgc3RvcmVzIHRoZSBtZXNzZW5nZXIgb24gb25lIG9mIGl0cyBwcm9wZXJ0aWVzLiBJdCBpcyB1c2VkIHRvIHByb3h5IG1ldGhvZHMgb2YgbWVzc2VuZ2VyIGFuZCBhbHNvIGFzIGEgY29udGV4dCBmb3Igc3Vic2NyaWJlcnMgd2hlbiB0aGV5IGFyZSBjYWxsZWQgYnkgdGhlIE1lc3Nlbmdlci4gU2VlIGBvbmAgbWV0aG9kLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3h5TWV0aG9kcyBPcHRpb25hbCBtYXAgb2YgbWV0aG9kIG5hbWVzOyBrZXkgLSBwcm94eSBtZXRob2QgbmFtZSwgdmFsdWUgLSBtZXNzZW5nZXIncyBtZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7TWVzc2FnZVNvdXJjZX0gbWVzc2FnZVNvdXJjZSBPcHRpb25hbCBtZXNzYWdlU291cmNlIGxpbmtlZCB0byB0aGUgbWVzc2VuZ2VyLiBJZiBtZXNzYWdlU291cmNlIGlzIHN1cHBsaWVkLCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBtZXNzZW5nZXIgd2lsbCBzdG9yZWQgb24gaXRzICdtZXNzZW5nZXInIHByb3BlcnR5XG4gKi9cbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzYWdlU291cmNlKSB7XG4gICAgLy8gaG9zdE9iamVjdCBhbmQgcHJveHlNZXRob2RzIGFyZSB1c2VkIGluIE1peGluIGFuZCBjaGVja2VkIHRoZXJlXG4gICAgaWYgKG1lc3NhZ2VTb3VyY2UpXG4gICAgICAgIHRoaXMuX3NldE1lc3NhZ2VTb3VyY2UobWVzc2FnZVNvdXJjZSk7XG5cbiAgICBfaW5pdGlhbGl6ZVN1YnNjcmliZXJzLmNhbGwodGhpcyk7XG59XG5cblxuZnVuY3Rpb24gX2luaXRpYWxpemVTdWJzY3JpYmVycygpIHtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfbWVzc2FnZVN1YnNjcmliZXJzOiB7fSxcbiAgICAgICAgX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnM6IHt9LFxuICAgIH0sIF8uQ09ORik7XG59XG5cblxuLyoqXG4gKiBEZXN0cm95cyBtZXNzZW5nZXIuIE1heWJlIG5lZWRzIHRvIHVuc3Vic2NyaWJlIGFsbCBzdWJzY3JpYmVyc1xuICovXG5mdW5jdGlvbiBNZXNzZW5nZXIkZGVzdHJveSgpIHtcbiAgICB0aGlzLm9mZkFsbCgpO1xuICAgIHZhciBtZXNzYWdlU291cmNlID0gdGhpcy5nZXRNZXNzYWdlU291cmNlKCk7XG4gICAgaWYgKG1lc3NhZ2VTb3VyY2UpXG4gICAgICAgIG1lc3NhZ2VTb3VyY2UuZGVzdHJveSgpO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZC5cbiAqIFJlZ2lzdGVycyBhIHN1YnNjcmliZXIgZnVuY3Rpb24gZm9yIGEgY2VydGFpbiBtZXNzYWdlKHMpLlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN1YnNjcmlwdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gSXQgY2FuIGJlIHVuc3VjY2Vzc2Z1bCBpZiB0aGUgcGFzc2VkIHN1YnNjcmliZXIgaGFzIGFscmVhZHkgYmVlbiBzdWJzY3JpYmVkIHRvIHRoaXMgbWVzc2FnZSB0eXBlIC0gZG91YmxlIHN1YnNjcmlwdGlvbiBuZXZlciBoYXBwZW5zIGFuZCBpdCBpcyBzYWZlIHRvIHN1YnNjcmliZSBhZ2FpbiAtIG5vIGVycm9yIG9yIHdhcm5pbmcgaXMgdGhyb3duIG9yIGxvZ2dlZC5cbiAqIFN1YnNjcmliZXIgaXMgcGFzc2VkIHR3byBwYXJhbWV0ZXJzOiBgbWVzc2FnZWAgKHN0cmluZykgYW5kIGBkYXRhYCAob2JqZWN0KS4gRGF0YSBvYmplY3QgaXMgc3VwcGxpZWQgd2hlbiBtZXNzYWdlIGlzIGRpc3BhdGNoZWQsIE1lc3NlbmdlciBpdHNlbGYgYWRkcyBub3RoaW5nIHRvIGl0LiBGb3IgZXhhbXBsZSwgW2V2ZW50cyBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9FdmVudHMuanMuaHRtbCkgc2VuZHMgYWN0dWFsIERPTSBldmVudCB3aGVuIGl0IHBvc3RzIG1lc3NhZ2UuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogLy8gc3Vic2NyaWJlcyBvbk1vdXNlVXBEb3duIHRvIHR3byBET00gZXZlbnRzIG9uIGNvbXBvbmVudCB2aWEgZXZlbnRzIGZhY2V0LlxuICogbXlDb21wLmV2ZW50cy5vbignbW91c2Vkb3duIG1vdXNldXAnLCBvbk1vdXNlVXBEb3duKTtcbiAqIGZ1bmN0aW9uIG9uTW91c2VVcERvd24oZXZlbnRUeXBlLCBldmVudCkge1xuICogICAgIC8vIC4uLlxuICogfVxuICpcbiAqIG15Q29tcC5kYXRhLm9uKC8uKy8sIGZ1bmN0aW9uKG1zZywgZGF0YSkge1xuICogICAgIGxvZ2dlci5kZWJ1Zyhtc2csIGRhdGEpO1xuICogfSk7IC8vIHN1YnNjcmliZXMgYW5vbnltb3VzIGZ1bmN0aW9uIHRvIGFsbCBub24tZW1wdHkgbWVzc2FnZXMgb24gZGF0YSBmYWNldFxuICogLy8gaXQgd2lsbCBub3QgYmUgcG9zc2libGUgdG8gdW5zdWJzY3JpYmUgYW5vbnltb3VzIHN1YnNjcmliZXIgc2VwYXJhdGVseSxcbiAqIC8vIGJ1dCBteUNvbXAuZGF0YS5vZmYoLy4rLykgd2lsbCB1bnN1YnNjcmliZSBpdFxuICogYGBgXG4gKiBJZiBtZXNzZW5nZXIgaGFzIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGF0dGFjaGVkIHRvIGl0LCBNZXNzYWdlU291cmNlIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgZmlyc3Qgc3Vic2NyaWJlciBmb3IgYSBnaXZlbiBtZXNzYWdlIGlzIGFkZGVkLCBzbyBpdCBjYW4gc3Vic2NyaWJlIHRvIHRoZSBzb3VyY2UuXG4gKiBbQ29tcG9uZW50c10oLi4vY29tcG9uZW50cy9jX2NsYXNzLmpzLmh0bWwpIGFuZCBbZmFjZXRzXSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgY2hhbmdlIHRoaXMgbWV0aG9kIG5hbWUgdG8gYG9uYCB3aGVuIHRoZXkgcHJveHkgaXQuXG4gKiBTZWUgW3Bvc3RNZXNzYWdlXSgjcG9zdE1lc3NhZ2UpLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5W1N0cmluZ118UmVnRXhwfSBtZXNzYWdlcyBNZXNzYWdlIHR5cGVzIHRoYXQgc2hvdWxkIGVudm9rZSB0aGUgc3Vic2NyaWJlci5cbiAqICBJZiBzdHJpbmcgaXMgcGFzc2VkLCBpdCBjYW4gYmUgYSBzaWdsZSBtZXNzYWdlIG9yIG11bHRpcGxlIG1lc3NhZ2UgdHlwZXMgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2Ugd2l0aCBvcHRpb25hbCBjb21tYXMuXG4gKiAgSWYgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpcyBwYXNzZWQsIGVhY2ggc3RyaW5nIGlzIGEgbWVzc2FnZSB0eXBlIHRvIHN1YnNjcmliZSBmb3IuXG4gKiAgSWYgYSBSZWdFeHAgaXMgcGFzc2VkLCB0aGUgc3Vic2NyaWJlciB3aWxsIGJlIGVudm9rZWQgd2hlbiB0aGUgbWVzc2FnZSBkaXNwYXRjaGVkIG9uIHRoZSBtZXNzZW5nZXIgbWF0Y2hlcyB0aGUgcGF0dGVybiAob3IgSVMgdGhlIFJlZ0V4cCB3aXRoIGlkZW50aWNhbCBwYXR0ZXJuKS5cbiAqICBQYXR0ZXJuIHN1YnNjcmliZXIgZG9lcyBOT1QgY2F1c2UgYW55IHN1YnNjcmlwdGlvbiB0byBNZXNzYWdlU291cmNlLCBpdCBvbmx5IGNhcHR1cmVzIG1lc3NhZ2VzIHRoYXQgYXJlIGFscmVhZHkgc3Vic2NyaWJlZCB0byB3aXRoIHByZWNpc2UgbWVzc2FnZSB0eXBlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBzdWJzY3JpYmVyIE1lc3NhZ2Ugc3Vic2NyaWJlciAtIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRpc3BhdGNoZWQgb24gdGhlIG1lc3NlbmdlciAodXN1YWxseSB2aWEgcHJveGllZCBwb3N0TWVzc2FnZSBtZXRob2Qgb2YgaG9zdCBvYmplY3QpLlxuICogIElmIGhvc3RPYmplY3Qgd2FzIHN1cHBsaWVkIHRvIE1lc3NlbmdlciBjb25zdHJ1Y3RvciwgaG9zdE9iamVjdCB3aWxsIGJlIHRoZSBjb250ZXh0ICh0aGUgdmFsdWUgb2YgdGhpcykgZm9yIHRoZSBzdWJzY3JpYmVyIGVudm9jYXRpb24uXG4gKiAgU3Vic2NyaWJlciBjYW4gYWxzbyBiZSBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGBzdWJzY3JpYmVyYCAoZnVuY3Rpb24pIGFuZCBgY29udGV4dGAgKFwidGhpc1wiIHZhbHVlIHdoZW4gc3Vic2NyaWJlciBpcyBjYWxsZWQpXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBNZXNzZW5nZXIkb24obWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICByZXR1cm4gX01lc3Nlbmdlcl9vbldpdGhPcHRpb25zLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xufVxuXG5cbmZ1bmN0aW9uIE1lc3NlbmdlciRvbmNlKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucy5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyLCB7IGRpc3BhdGNoVGltZXM6IDEgfSk7XG59XG5cbmZ1bmN0aW9uIE1lc3NlbmdlciRvbmNlU3luYyhtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlciwgeyBkaXNwYXRjaFRpbWVzOiAxLCBzeW5jOiB0cnVlIH0pO1xufVxuXG5cbmZ1bmN0aW9uIE1lc3NlbmdlciRvblN5bmMobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICByZXR1cm4gX01lc3Nlbmdlcl9vbldpdGhPcHRpb25zLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIsIHsgc3luYzogdHJ1ZSB9KTtcbn1cblxuXG5mdW5jdGlvbiBNZXNzZW5nZXIkb25Bc3luYyhtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlciwgeyBzeW5jOiBmYWxzZSB9KTtcbn1cblxuXG5mdW5jdGlvbiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMobWVzc2FnZXMsIHN1YnNjcmliZXIsIG9wdGlvbnMpIHtcbiAgICBjaGVjayhtZXNzYWdlcywgTWF0Y2guT25lT2YoU3RyaW5nLCBbU3RyaW5nXSwgUmVnRXhwKSk7XG4gICAgY2hlY2soc3Vic2NyaWJlciwgTWF0Y2guT25lT2YoRnVuY3Rpb24sIHtcbiAgICAgICAgc3Vic2NyaWJlcjogRnVuY3Rpb24sXG4gICAgICAgIGNvbnRleHQ6IE1hdGNoLkFueSxcbiAgICAgICAgb3B0aW9uczogTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSxcbiAgICB9KSk7XG5cbiAgICBpZiAodHlwZW9mIHN1YnNjcmliZXIgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlcixcbiAgICAgICAgICAgIGNvbnRleHQ6IHRoaXMuX2hvc3RPYmplY3QsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgc3Vic2NyaWJlci5vcHRpb25zID0gc3Vic2NyaWJlci5vcHRpb25zIHx8IHt9O1xuICAgICAgICBfLmV4dGVuZChzdWJzY3JpYmVyLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9NZXNzZW5nZXJfb24obWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KHN1YnNjcmliZXIsICdfX21lc3NhZ2VzJywgbWVzc2FnZXMpO1xuICAgIHJldHVybiBfZWFjaE1lc3NhZ2UuY2FsbCh0aGlzLCAnX3JlZ2lzdGVyU3Vic2NyaWJlcicsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbn1cblxuXG5mdW5jdGlvbiBfZWFjaE1lc3NhZ2UobWV0aG9kTmFtZSwgbWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2VzID09ICdzdHJpbmcnKVxuICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNwbGl0KG1lc3NhZ2VzU3BsaXRSZWdFeHApO1xuXG4gICAgdmFyIHN1YnNjcmliZXJzSGFzaCA9IHRoaXMuX2Nob29zZVN1YnNjcmliZXJzSGFzaChtZXNzYWdlcyk7XG5cbiAgICBpZiAobWVzc2FnZXMgaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgICAgIHJldHVybiB0aGlzW21ldGhvZE5hbWVdKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xuXG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICAgICAgICB2YXIgc3Vic2NyaXB0aW9uQ2hhbmdlZCA9IHRoaXNbbWV0aG9kTmFtZV0oc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHx8IHN1YnNjcmlwdGlvbkNoYW5nZWQ7XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIEl0IGlzIGNhbGxlZCBieSBbb25dKCNNZXNzZW5nZXIkb24pIHRvIHJlZ2lzdGVyIHN1YnNjcmliZXIgZm9yIG9uZSBtZXNzYWdlIHR5cGUuXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHN1YnNjcmliZXIgaXMgbm90IHlldCByZWdpc3RlcmVkIGZvciB0aGlzIHR5cGUgb2YgbWVzc2FnZS5cbiAqIElmIG1lc3NlbmdlciBoYXMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgYXR0YWNoZWQgdG8gaXQsIE1lc3NhZ2VTb3VyY2Ugd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBmaXJzdCBzdWJzY3JpYmVyIGZvciBhIGdpdmVuIG1lc3NhZ2UgaXMgYWRkZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdWJzY3JpYmVyc0hhc2ggVGhlIG1hcCBvZiBzdWJzY3JpYmVycyBkZXRlcm1pbmVkIGJ5IFtvbl0oI01lc3NlbmdlciRvbikgYmFzZWQgb24gTWVzc2FnZSB0eXBlLCBjYW4gYmUgYHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnNgIG9yIGB0aGlzLl9tZXNzYWdlU3Vic2NyaWJlcnNgXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBNZXNzYWdlIHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBzdWJzY3JpYmVyIFN1YnNjcmliZXIgZnVuY3Rpb24gdG8gYmUgYWRkZWQgb3Igb2JqZWN0IHdpdGggcHJvcGVydGllcyBgc3Vic2NyaWJlcmAgKGZ1bmN0aW9uKSBhbmQgYGNvbnRleHRgICh2YWx1ZSBvZiBcInRoaXNcIiB3aGVuIHN1YnNjcmliZXIgaXMgY2FsbGVkKVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gX3JlZ2lzdGVyU3Vic2NyaWJlcihzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UsIHN1YnNjcmliZXIpIHtcbiAgICBpZiAoISAoc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdICYmIHN1YnNjcmliZXJzSGFzaFttZXNzYWdlXS5sZW5ndGgpKSB7XG4gICAgICAgIHN1YnNjcmliZXJzSGFzaFttZXNzYWdlXSA9IFtdO1xuICAgICAgICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAgICAgICAgIHN1YnNjcmliZXJzSGFzaFttZXNzYWdlXS5wYXR0ZXJuID0gbWVzc2FnZTtcbiAgICAgICAgaWYgKHRoaXMuX21lc3NhZ2VTb3VyY2UpXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU291cmNlLm9uU3Vic2NyaWJlckFkZGVkKG1lc3NhZ2UpO1xuICAgICAgICB2YXIgbm9TdWJzY3JpYmVycyA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIG1zZ1N1YnNjcmliZXJzID0gc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdO1xuICAgIHZhciBub3RZZXRSZWdpc3RlcmVkID0gbm9TdWJzY3JpYmVycyB8fCBfaW5kZXhPZlN1YnNjcmliZXIuY2FsbCh0aGlzLCBtc2dTdWJzY3JpYmVycywgc3Vic2NyaWJlcikgPT0gLTE7XG5cbiAgICBpZiAobm90WWV0UmVnaXN0ZXJlZClcbiAgICAgICAgbXNnU3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcblxuICAgIHJldHVybiBub3RZZXRSZWdpc3RlcmVkO1xufVxuXG5cbi8qKlxuICogRmluZHMgc3Vic2NyaWJlciBpbmRleCBpbiB0aGUgbGlzdFxuICpcbiAqIEBwYXJhbSB7QXJyYXlbRnVuY3Rpb258T2JqZWN0XX0gbGlzdCBsaXN0IG9mIHN1YnNjcmliZXJzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gc3Vic2NyaWJlciBzdWJzY3JpYmVyIGZ1bmN0aW9uIG9yIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgYHN1YnNjcmliZXJgIChmdW5jdGlvbikgYW5kIGBjb250ZXh0YCAoXCJ0aGlzXCIgb2JqZWN0KVxuICovXG5mdW5jdGlvbiBfaW5kZXhPZlN1YnNjcmliZXIobGlzdCwgc3Vic2NyaWJlcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gXy5maW5kSW5kZXgobGlzdCwgZnVuY3Rpb24oc3Vic2NyKXtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlciA9PSBzdWJzY3Iuc3Vic2NyaWJlclxuICAgICAgICAgICAgICAgICYmIHN1YnNjcmliZXIuY29udGV4dCA9PSBzdWJzY3IuY29udGV4dFxuICAgIH0pO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZC5cbiAqIFN1YnNjcmliZXMgdG8gbXVsdGlwbGUgbWVzc2FnZXMgcGFzc2VkIGFzIG1hcCB0b2dldGhlciB3aXRoIHN1YnNjcmliZXJzLlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIG15Q29tcC5ldmVudHMub25NZXNzYWdlcyh7XG4gKiAgICAgJ21vdXNlZG93bic6IG9uTW91c2VEb3duLFxuICogICAgICdtb3VzZXVwJzogb25Nb3VzZVVwXG4gKiB9KTtcbiAqIGZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50VHlwZSwgZXZlbnQpIHt9XG4gKiBmdW5jdGlvbiBvbk1vdXNlVXAoZXZlbnRUeXBlLCBldmVudCkge31cbiAqIGBgYFxuICogUmV0dXJucyBtYXAgd2l0aCB0aGUgc2FtZSBrZXlzIChtZXNzYWdlIHR5cGVzKSBhbmQgYm9vbGVhbiB2YWx1ZXMgaW5kaWNhdGluZyB3aGV0aGVyIHBhcnRpY3VsYXIgc3Vic2NyaWJlciB3YXMgYWRkZWQuXG4gKiBJdCBpcyBOT1QgcG9zc2libGUgdG8gYWRkIHBhdHRlcm4gc3Vic2NyaWJlciB1c2luZyB0aGlzIG1ldGhvZCwgYXMgYWx0aG91Z2ggeW91IGNhbiB1c2UgUmVnRXhwIGFzIHRoZSBrZXksIEphdmFTY3JpcHQgd2lsbCBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgaXQgdG8gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0W0Z1bmN0aW9uXX0gbWVzc2FnZVN1YnNjcmliZXJzIE1hcCBvZiBtZXNzYWdlIHN1YnNjcmliZXJzIHRvIGJlIGFkZGVkXG4gKiBAcmV0dXJuIHtPYmplY3RbQm9vbGVhbl19XG4gKi9cbmZ1bmN0aW9uIG9uTWVzc2FnZXMobWVzc2FnZVN1YnNjcmliZXJzKSB7XG4gICAgY2hlY2sobWVzc2FnZVN1YnNjcmliZXJzLCBNYXRjaC5PYmplY3RIYXNoKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCB7IHN1YnNjcmliZXI6IEZ1bmN0aW9uLCBjb250ZXh0OiBNYXRjaC5BbnkgfSkpKTtcblxuICAgIHZhciBub3RZZXRSZWdpc3RlcmVkTWFwID0gXy5tYXBLZXlzKG1lc3NhZ2VTdWJzY3JpYmVycywgZnVuY3Rpb24oc3Vic2NyaWJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub24obWVzc2FnZXMsIHN1YnNjcmliZXIpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIG5vdFlldFJlZ2lzdGVyZWRNYXA7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogUmVtb3ZlcyBhIHN1YnNjcmliZXIgZm9yIG1lc3NhZ2UocykuIFJlbW92ZXMgYWxsIHN1YnNjcmliZXJzIGZvciB0aGUgbWVzc2FnZSBpZiBzdWJzY3JpYmVyIGlzbid0IHBhc3NlZC5cbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGlmIHRoZSBzdWJzY3JpYmVyIHdhcyByZWdpc3RlcmVkLiBObyBlcnJvciBvciB3YXJuaW5nIGlzIHRocm93biBvciBsb2dnZWQgaWYgeW91IHJlbW92ZSBzdWJzY3JpYmVyIHRoYXQgd2FzIG5vdCByZWdpc3RlcmVkLlxuICogW0NvbXBvbmVudHNdKC4uL2NvbXBvbmVudHMvY19jbGFzcy5qcy5odG1sKSBhbmQgW2ZhY2V0c10oLi4vY29tcG9uZW50cy9jX2ZhY2V0LmpzLmh0bWwpIGNoYW5nZSB0aGlzIG1ldGhvZCBuYW1lIHRvIGBvZmZgIHdoZW4gdGhleSBwcm94eSBpdC5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiAvLyB1bnN1YnNjcmliZXMgb25Nb3VzZVVwRG93biBmcm9tIHR3byBET00gZXZlbnRzLlxuICogbXlDb21wLmV2ZW50cy5vZmYoJ21vdXNlZG93biBtb3VzZXVwJywgb25Nb3VzZVVwRG93bik7XG4gKiBgYGBcbiAqIElmIG1lc3NlbmdlciBoYXMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgYXR0YWNoZWQgdG8gaXQsIE1lc3NhZ2VTb3VyY2Ugd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBsYXN0IHN1YnNjcmliZXIgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBpcyByZW1vdmVkIGFuZCB0aGVyZSBpcyBubyBtb3JlIHN1YnNjcmliZXJzIGZvciB0aGlzIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlbU3RyaW5nXXxSZWdFeHB9IG1lc3NhZ2VzIE1lc3NhZ2UgdHlwZXMgdGhhdCBhIHN1YnNjcmliZXIgc2hvdWxkIGJlIHJlbW92ZWQgZm9yLlxuICogIElmIHN0cmluZyBpcyBwYXNzZWQsIGl0IGNhbiBiZSBhIHNpZ2xlIG1lc3NhZ2Ugb3IgbXVsdGlwbGUgbWVzc2FnZSB0eXBlcyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB3aXRoIG9wdGlvbmFsIGNvbW1hcy5cbiAqICBJZiBhbiBhcnJheSBvZiBzdHJpbmdzIGlzIHBhc3NlZCwgZWFjaCBzdHJpbmcgaXMgYSBtZXNzYWdlIHR5cGUgdG8gcmVtb3ZlIGEgc3Vic2NyaWJlciBmb3IuXG4gKiAgSWYgYSBSZWdFeHAgaXMgcGFzc2VkLCB0aGUgcGF0dGVybiBzdWJzY3JpYmVyIHdpbGwgYmUgcmVtb3ZlZC5cbiAqICBSZWdFeHAgc3Vic2NyaWJlciBkb2VzIE5PVCBjYXVzZSBhbnkgc3Vic2NyaXB0aW9uIHRvIE1lc3NhZ2VTb3VyY2UsIGl0IG9ubHkgY2FwdHVyZXMgbWVzc2FnZXMgdGhhdCBhcmUgYWxyZWFkeSBzdWJzY3JpYmVkIHRvIHdpdGggcHJlY2lzZSBtZXNzYWdlIHR5cGVzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3Vic2NyaWJlciBNZXNzYWdlIHN1YnNjcmliZXIgLSBPcHRpb25hbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHN1YnNjcmliZXJzIGZvciB0aGUgbWVzc2FnZShzKS4gSWYgc3Vic2NyaWJlciBpcyBub3Qgc3VwcGxpZWQsIGFsbCBzdWJzY3JpYmVycyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGlzIG1lc3NhZ2UocykuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBNZXNzZW5nZXIkb2ZmKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgY2hlY2sobWVzc2FnZXMsIE1hdGNoLk9uZU9mKFN0cmluZywgW1N0cmluZ10sIFJlZ0V4cCkpO1xuICAgIGNoZWNrKHN1YnNjcmliZXIsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCB7XG4gICAgICAgIHN1YnNjcmliZXI6IEZ1bmN0aW9uLFxuICAgICAgICBjb250ZXh0OiBNYXRjaC5BbnksXG4gICAgICAgIG9wdGlvbnM6IE1hdGNoLk9wdGlvbmFsKE9iamVjdCksXG4gICAgICAgIC8vIF9fbWVzc2FnZXM6IE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKFN0cmluZywgW1N0cmluZ10sIFJlZ0V4cCkpXG4gICAgfSkpKTtcblxuICAgIHJldHVybiBfTWVzc2VuZ2VyX29mZi5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbn1cblxuXG5mdW5jdGlvbiBfTWVzc2VuZ2VyX29mZihtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfZWFjaE1lc3NhZ2UuY2FsbCh0aGlzLCAnX3JlbW92ZVN1YnNjcmliZXInLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG59XG5cblxuLyoqXG4gKiBcIlByaXZhdGVcIiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBJdCBpcyBjYWxsZWQgYnkgW29mZl0oI01lc3NlbmdlciRvZmYpIHRvIHJlbW92ZSBzdWJzY3JpYmVyIGZvciBvbmUgbWVzc2FnZSB0eXBlLlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBzdWJzY3JpYmVyIHdhcyByZWdpc3RlcmVkIGZvciB0aGlzIHR5cGUgb2YgbWVzc2FnZS5cbiAqIElmIG1lc3NlbmdlciBoYXMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgYXR0YWNoZWQgdG8gaXQsIE1lc3NhZ2VTb3VyY2Ugd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBsYXN0IHN1YnNjcmliZXIgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBpcyByZW1vdmVkIGFuZCB0aGVyZSBpcyBubyBtb3JlIHN1YnNjcmliZXJzIGZvciB0aGlzIG1lc3NhZ2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdWJzY3JpYmVyc0hhc2ggVGhlIG1hcCBvZiBzdWJzY3JpYmVycyBkZXRlcm1pbmVkIGJ5IFtvZmZdKCNNZXNzZW5nZXIkb2ZmKSBiYXNlZCBvbiBtZXNzYWdlIHR5cGUsIGNhbiBiZSBgdGhpcy5fcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVyc2Agb3IgYHRoaXMuX21lc3NhZ2VTdWJzY3JpYmVyc2BcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2UgdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3Vic2NyaWJlciBTdWJzY3JpYmVyIGZ1bmN0aW9uIHRvIGJlIHJlbW92ZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIF9yZW1vdmVTdWJzY3JpYmVyKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBtc2dTdWJzY3JpYmVycyA9IHN1YnNjcmliZXJzSGFzaFttZXNzYWdlXTtcbiAgICBpZiAoISBtc2dTdWJzY3JpYmVycyB8fCAhIG1zZ1N1YnNjcmliZXJzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub3RoaW5nIHJlbW92ZWRcblxuICAgIGlmIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlciA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgc3Vic2NyaWJlciA9IHsgc3Vic2NyaWJlcjogc3Vic2NyaWJlciwgY29udGV4dDogdGhpcy5faG9zdE9iamVjdCB9O1xuXG4gICAgICAgIHZhciBzdWJzY3JpYmVySW5kZXggPSBfaW5kZXhPZlN1YnNjcmliZXIuY2FsbCh0aGlzLCBtc2dTdWJzY3JpYmVycywgc3Vic2NyaWJlcik7XG4gICAgICAgIGlmIChzdWJzY3JpYmVySW5kZXggPT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdGhpbmcgcmVtb3ZlZFxuICAgICAgICBtc2dTdWJzY3JpYmVycy5zcGxpY2Uoc3Vic2NyaWJlckluZGV4LCAxKTtcbiAgICAgICAgaWYgKCEgbXNnU3Vic2NyaWJlcnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQWxsU3Vic2NyaWJlcnMoc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlKTtcblxuICAgIH0gZWxzZVxuICAgICAgICB0aGlzLl9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpO1xuXG4gICAgcmV0dXJuIHRydWU7IC8vIHN1YnNjcmliZXIocykgcmVtb3ZlZFxufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogSXQgaXMgY2FsbGVkIGJ5IFtfcmVtb3ZlU3Vic2NyaWJlcl0oI19yZW1vdmVTdWJzY3JpYmVyKSB0byByZW1vdmUgYWxsIHN1YnNjcmliZXJzIGZvciBvbmUgbWVzc2FnZSB0eXBlLlxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHRoYXQgYWxsIG1lc3NhZ2Ugc3Vic2NyaWJlcnMgd2VyZSByZW1vdmVkIHNvIGl0IGNhbiB1bnN1YnNjcmliZSBmcm9tIHRoZSBzb3VyY2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdWJzY3JpYmVyc0hhc2ggVGhlIG1hcCBvZiBzdWJzY3JpYmVycyBkZXRlcm1pbmVkIGJ5IFtvZmZdKCNNZXNzZW5nZXIkb2ZmKSBiYXNlZCBvbiBtZXNzYWdlIHR5cGUsIGNhbiBiZSBgdGhpcy5fcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVyc2Agb3IgYHRoaXMuX21lc3NhZ2VTdWJzY3JpYmVyc2BcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2UgdHlwZVxuICovXG5mdW5jdGlvbiBfcmVtb3ZlQWxsU3Vic2NyaWJlcnMoc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlKSB7XG4gICAgZGVsZXRlIHN1YnNjcmliZXJzSGFzaFttZXNzYWdlXTtcbiAgICBpZiAodGhpcy5fbWVzc2FnZVNvdXJjZSAmJiB0eXBlb2YgbWVzc2FnZSA9PSAnc3RyaW5nJylcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNvdXJjZS5vblN1YnNjcmliZXJSZW1vdmVkKG1lc3NhZ2UpO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZC5cbiAqIFVuc3Vic2NyaWJlcyBmcm9tIG11bHRpcGxlIG1lc3NhZ2VzIHBhc3NlZCBhcyBtYXAgdG9nZXRoZXIgd2l0aCBzdWJzY3JpYmVycy5cbiAqIFJldHVybnMgbWFwIHdpdGggdGhlIHNhbWUga2V5cyAobWVzc2FnZSB0eXBlcykgYW5kIGJvb2xlYW4gdmFsdWVzIGluZGljYXRpbmcgd2hldGhlciBwYXJ0aWN1bGFyIHN1YnNjcmliZXIgd2FzIHJlbW92ZWQuXG4gKiBJZiBhIHN1YnNjcmliZXIgZm9yIG9uZSBvZiB0aGUgbWVzc2FnZXMgaXMgbm90IHN1cHBsaWVkLCBhbGwgc3Vic2NyaWJlcnMgZm9yIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHJlbW92ZWQuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogbXlDb21wLmV2ZW50cy5vZmZNZXNzYWdlcyh7XG4gKiAgICAgJ21vdXNlZG93bic6IG9uTW91c2VEb3duLFxuICogICAgICdtb3VzZXVwJzogb25Nb3VzZVVwLFxuICogICAgICdjbGljayc6IHVuZGVmaW5lZCAvLyBhbGwgc3Vic2NyaWJlcnMgdG8gdGhpcyBtZXNzYWdlIHdpbGwgYmUgcmVtb3ZlZFxuICogfSk7XG4gKiBgYGBcbiAqIEl0IGlzIE5PVCBwb3NzaWJsZSB0byByZW1vdmUgcGF0dGVybiBzdWJzY3JpYmVyKHMpIHVzaW5nIHRoaXMgbWV0aG9kLCBhcyBhbHRob3VnaCB5b3UgY2FuIHVzZSBSZWdFeHAgYXMgdGhlIGtleSwgSmF2YVNjcmlwdCB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCBpdCB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtPYmplY3RbRnVuY3Rpb25dfSBtZXNzYWdlU3Vic2NyaWJlcnMgTWFwIG9mIG1lc3NhZ2Ugc3Vic2NyaWJlcnMgdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybiB7T2JqZWN0W0Jvb2xlYW5dfVxuICovXG5mdW5jdGlvbiBvZmZNZXNzYWdlcyhtZXNzYWdlU3Vic2NyaWJlcnMpIHtcbiAgICBjaGVjayhtZXNzYWdlU3Vic2NyaWJlcnMsIE1hdGNoLk9iamVjdEhhc2goTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoRnVuY3Rpb24sIHsgc3Vic2NyaWJlcjogRnVuY3Rpb24sIGNvbnRleHQ6IE1hdGNoLkFueSB9KSkpKTtcblxuICAgIHZhciBzdWJzY3JpYmVyUmVtb3ZlZE1hcCA9IF8ubWFwS2V5cyhtZXNzYWdlU3Vic2NyaWJlcnMsIGZ1bmN0aW9uKHN1YnNjcmliZXIsIG1lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gc3Vic2NyaWJlclJlbW92ZWRNYXA7XG59XG5cblxuLyoqXG4gKiBVbnN1YnNjcmliZXMgYWxsIHN1YnNjcmliZXJzXG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRvZmZBbGwoKSB7XG4gICAgX29mZkFsbFN1YnNjcmliZXJzLmNhbGwodGhpcywgdGhpcy5fcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVycyk7XG4gICAgX29mZkFsbFN1YnNjcmliZXJzLmNhbGwodGhpcywgdGhpcy5fbWVzc2FnZVN1YnNjcmliZXJzKTtcbn1cblxuXG5mdW5jdGlvbiBfb2ZmQWxsU3Vic2NyaWJlcnMoc3Vic2NyaWJlcnNIYXNoKSB7XG4gICAgXy5lYWNoS2V5KHN1YnNjcmliZXJzSGFzaCwgZnVuY3Rpb24oc3Vic2NyaWJlcnMsIG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fcmVtb3ZlQWxsU3Vic2NyaWJlcnMoc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlKTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vLyBUT0RPIC0gc2VuZCBldmVudCB0byBtZXNzYWdlU291cmNlXG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogRGlzcGF0Y2hlcyB0aGUgbWVzc2FnZSBjYWxsaW5nIGFsbCBzdWJzY3JpYmVycyByZWdpc3RlcmVkIGZvciB0aGlzIG1lc3NhZ2UgYW5kLCBpZiB0aGUgbWVzc2FnZSBpcyBhIHN0cmluZywgY2FsbGluZyBhbGwgcGF0dGVybiBzdWJzY3JpYmVycyB3aGVuIG1lc3NhZ2UgbWF0Y2hlcyB0aGUgcGF0dGVybi5cbiAqIEVhY2ggc3Vic2NyaWJlciBpcyBwYXNzZWQgdGhlIHNhbWUgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlaXMgbWV0aG9kLlxuICogVGhlIGNvbnRleHQgb2YgdGhlIHN1YnNjcmliZXIgZW52b2NhdGlvbiBpcyBzZXQgdG8gdGhlIGhvc3Qgb2JqZWN0IChgdGhpcy5faG9zdE9iamVjdGApIHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgbWVzc2VuZ2VyIGNvbnN0cnVjdG9yLlxuICogU3Vic2NyaWJlcnMgYXJlIGNhbGxlZCBpbiB0aGUgbmV4dCB0aWNrIChcImFzeW5jaHJvbm91c2x5XCIpIGFwYXJ0IGZyb20gdGhvc2UgdGhhdCB3ZXJlIHN1YnNjcmliZWQgd2l0aCBgb25TeW5jYCAob3IgdGhhdCBoYXZlIGBvcHRpb25zLnN5bmMgPT0gdHJ1ZWApLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbWVzc2FnZSBtZXNzYWdlIHRvIGJlIGRpc3BhdGNoZWRcbiAqICBJZiB0aGUgbWVzc2FnZSBpcyBhIHN0cmluZywgdGhlIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCBleGFjdGx5IHRoaXMgbWVzc2FnZSB3aWxsIGJlIGNhbGxlZCBhbmQgYWxzbyBwYXR0ZXJuIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcGF0dGVybiB0aGF0IG1hdGNoZXMgdGhlIGRpc3BhdGNoZWQgbWVzc2FnZS5cbiAqICBJZiB0aGUgbWVzc2FnZSBpcyBSZWdFeHAsIG9ubHkgdGhlIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCBleGFjdGx5IHRoaXMgcGF0dGVybiB3aWxsIGJlIGNhbGxlZC5cbiAqIEBwYXJhbSB7QW55fSBkYXRhIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc3Vic2NyaWJlciBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4gTWVzc2VuZ2VyIGRvZXMgbm90IG1vZGlmeSB0aGlzIGRhdGEgaW4gYW55IHdheS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIG9wdGlvbmFsIGNhbGxiYWNrIHRvIHBhc3MgdG8gc3Vic2NyaWJlclxuICogQHBhcmFtIHtCb29sZWFufSBfc3luY2hyb25vdXMgaWYgdHJ1ZSBwYXNzZWQsIHN1YnNjcmliZXJzIHdpbGwgYmUgZW52b2tlZCBzeW5jaHJvbm91c2x5IGFwYXJ0IGZyb20gdGhvc2UgdGhhdCBoYXZlIGBvcHRpb25zLnN5bmMgPT0gZmFsc2VgLiBUaGlzIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIHVzZWQsIGluc3RlYWQgcG9zdE1lc3NhZ2VTeW5jIHNob3VsZCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiBwb3N0TWVzc2FnZShtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgX3N5bmNocm9ub3VzKSB7XG4gICAgY2hlY2sobWVzc2FnZSwgTWF0Y2guT25lT2YoU3RyaW5nLCBSZWdFeHApKTtcbiAgICBjaGVjayhjYWxsYmFjaywgTWF0Y2guT3B0aW9uYWwoRnVuY3Rpb24pKTtcblxuICAgIHZhciBzdWJzY3JpYmVyc0hhc2ggPSB0aGlzLl9jaG9vc2VTdWJzY3JpYmVyc0hhc2gobWVzc2FnZSk7XG4gICAgdmFyIG1zZ1N1YnNjcmliZXJzID0gc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdO1xuXG4gICAgdGhpcy5fY2FsbFN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBtc2dTdWJzY3JpYmVycywgX3N5bmNocm9ub3VzKTtcblxuICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PSAnc3RyaW5nJylcbiAgICAgICAgdGhpcy5fY2FsbFBhdHRlcm5TdWJzY3JpYmVycyhtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgbXNnU3Vic2NyaWJlcnMsIF9zeW5jaHJvbm91cyk7XG59XG5cblxuLyoqXG4gKiBTYW1lIGFzIHBvc3RNZXNzYWdlIGFwYXJ0IGZyb20gZW52b2tpbmcgc3Vic2NyaWJlcnMgc3luY2hyb25vdXNseSwgYXBhcnQgZnJvbSB0aG9zZSBzdWJzY3JpYmVkIHdpdGggYG9uQXN5bmNgIChvciB3aXRoIGBvcHRpb25zLnN5bmMgPT0gZmFsc2VgKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7QW55fSBkYXRhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICovXG5mdW5jdGlvbiBwb3N0TWVzc2FnZVN5bmMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2spIHtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCB0cnVlKTtcbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIEVudm9rZXMgcGF0dGVybiBzdWJzY3JpYmVycyB3aXRoIHRoZSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgbWVzc2FnZS5cbiAqIFRoZSBtZXRob2QgaXMgY2FsbGVkIGJ5IFtwb3N0TWVzc2FnZV0oI3Bvc3RNZXNzYWdlKSAtIHNlZSBtb3JlIGluZm9ybWF0aW9uIHRoZXJlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBtZXNzYWdlIHRvIGJlIGRpc3BhdGNoZWQuIFBhdHRlcm4gc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgZGlzcGF0Y2hlZCBtZXNzYWdlIHdpbGwgYmUgY2FsbGVkLlxuICogQHBhcmFtIHtBbnl9IGRhdGEgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzdWJzY3JpYmVyIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBNZXNzZW5nZXIgZG9lcyBub3QgbW9kaWZ5IHRoaXMgZGF0YSBpbiBhbnkgd2F5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2sgdG8gcGFzcyB0byBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0FycmF5W0Z1bmN0aW9ufE9iamVjdF19IGNhbGxlZE1zZ1N1YnNjcmliZXJzIGFycmF5IG9mIHN1YnNjcmliZXJzIGFscmVhZHkgY2FsbGVkLCB0aGV5IHdvbid0IGJlIGNhbGxlZCBhZ2FpbiBpZiB0aGV5IGFyZSBhbW9uZyBwYXR0ZXJuIHN1YnNjcmliZXJzLlxuICovXG5mdW5jdGlvbiBfY2FsbFBhdHRlcm5TdWJzY3JpYmVycyhtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgY2FsbGVkTXNnU3Vic2NyaWJlcnMsIF9zeW5jaHJvbm91cykge1xuICAgIF8uZWFjaEtleSh0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzLFxuICAgICAgICBmdW5jdGlvbihwYXR0ZXJuU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gcGF0dGVyblN1YnNjcmliZXJzLnBhdHRlcm47XG4gICAgICAgICAgICBpZiAocGF0dGVybi50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxlZE1zZ1N1YnNjcmliZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXR0ZXJuU3Vic2NyaWJlcnMgPSBwYXR0ZXJuU3Vic2NyaWJlcnMuZmlsdGVyKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IF9pbmRleE9mU3Vic2NyaWJlci5jYWxsKHRoaXMsIGNhbGxlZE1zZ1N1YnNjcmliZXJzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCA9PSAtMTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxTdWJzY3JpYmVycyhtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgcGF0dGVyblN1YnNjcmliZXJzLCBfc3luY2hyb25vdXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgLCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIEVudm9rZXMgc3Vic2NyaWJlcnMgZnJvbSB0aGUgcGFzc2VkIGxpc3QuXG4gKiBUaGUgbWV0aG9kIGlzIGNhbGxlZCBieSBbcG9zdE1lc3NhZ2VdKCNwb3N0TWVzc2FnZSkgYW5kIFtfY2FsbFBhdHRlcm5TdWJzY3JpYmVyc10oI19jYWxsUGF0dGVyblN1YnNjcmliZXJzKS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgbWVzc2FnZSB0byBiZSBkaXNwYXRjaGVkLCBwYXNzZWQgdG8gc3Vic2NyaWJlcnMgYXMgdGhlIGZpcnN0IHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7QW55fSBkYXRhIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc3Vic2NyaWJlciBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4gTWVzc2VuZ2VyIGRvZXMgbm90IG1vZGlmeSB0aGlzIGRhdGEgaW4gYW55IHdheS5cbiAqIEBwYXJhbSB7QXJyYXlbRnVuY3Rpb258T2JqZWN0XX0gbXNnU3Vic2NyaWJlcnMgdGhlIGFycmF5IG9mIG1lc3NhZ2Ugc3Vic2NyaWJlcnMgdG8gYmUgY2FsbGVkLiBFYWNoIHN1YnNjcmliZXIgaXMgY2FsbGVkIHdpdGggdGhlIGhvc3Qgb2JqZWN0IChzZWUgTWVzc2VuZ2VyIGNvbnN0cnVjdG9yKSBhcyB0aGUgY29udGV4dC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIG9wdGlvbmFsIGNhbGxiYWNrIHRvIHBhc3MgdG8gc3Vic2NyaWJlclxuICovXG5mdW5jdGlvbiBfY2FsbFN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBtc2dTdWJzY3JpYmVycywgX3N5bmNocm9ub3VzKSB7XG4gICAgaWYgKG1zZ1N1YnNjcmliZXJzICYmIG1zZ1N1YnNjcmliZXJzLmxlbmd0aCkge1xuICAgICAgICAvLyBjbG9uaW5nIGlzIG5lY2Vzc2FyeSBhcyBzb21lIG9mIHRoZSBzdWJzY3JpYmVyc1xuICAgICAgICAvLyBjYW4gYmUgdW5zdWJzY3JpYmVkIGR1cmluZyB0aGUgZGlzcGF0Y2hcbiAgICAgICAgLy8gc28gdGhpcyBhcnJheSB3b3VsZCBjaGFuZ2UgaW4gdGhlIHByb2Nlc3NcbiAgICAgICAgbXNnU3Vic2NyaWJlcnMgPSBtc2dTdWJzY3JpYmVycy5zbGljZSgpO1xuXG4gICAgICAgIG1zZ1N1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgdGhpcy5fY2FsbFN1YnNjcmliZXIoc3Vic2NyaWJlciwgbWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIF9zeW5jaHJvbm91cyk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfY2FsbFN1YnNjcmliZXIoc3Vic2NyaWJlciwgbWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIF9zeW5jaHJvbm91cykge1xuICAgIHZhciBzeW5jU3Vic2NyaWJlciA9IHN1YnNjcmliZXIub3B0aW9ucyAmJiBzdWJzY3JpYmVyLm9wdGlvbnMuc3luY1xuICAgICAgICAsIHN5bmNocm8gPSAoX3N5bmNocm9ub3VzICYmIHN5bmNTdWJzY3JpYmVyICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgIHx8IHN5bmNTdWJzY3JpYmVyO1xuXG4gICAgdmFyIGRpc3BhdGNoVGltZXMgPSBzdWJzY3JpYmVyLm9wdGlvbnMgJiYgc3Vic2NyaWJlci5vcHRpb25zLmRpc3BhdGNoVGltZXM7XG4gICAgaWYgKGRpc3BhdGNoVGltZXMpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoVGltZXMgPD0gMSkge1xuICAgICAgICAgICAgdmFyIG1lc3NhZ2VzID0gc3Vic2NyaWJlci5fX21lc3NhZ2VzO1xuICAgICAgICAgICAgdGhpcy5vZmYobWVzc2FnZXMsIHN1YnNjcmliZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGRpc3BhdGNoVGltZXMgPiAxKVxuICAgICAgICAgICAgc3Vic2NyaWJlci5vcHRpb25zLmRpc3BhdGNoVGltZXMtLTtcbiAgICB9XG5cbiAgICBpZiAoc3luY2hybylcbiAgICAgICAgc3Vic2NyaWJlci5zdWJzY3JpYmVyLmNhbGwoc3Vic2NyaWJlci5jb250ZXh0LCBtZXNzYWdlLCBkYXRhLCBjYWxsYmFjayk7XG4gICAgZWxzZVxuICAgICAgICBfLmRlZmVyTWV0aG9kKHN1YnNjcmliZXIuc3Vic2NyaWJlciwgJ2NhbGwnLCBzdWJzY3JpYmVyLmNvbnRleHQsIG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrKTtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBzdWJzY3JpYmVycyB0aGF0IHdvdWxkIGJlIGNhbGxlZCBpZiB0aGUgbWVzc2FnZSB3ZXJlIGRpc3BhdGNoZWQuXG4gKiBJZiBgaW5jbHVkZVBhdHRlcm5TdWJzY3JpYmVycyA9PT0gZmFsc2VgLCBwYXR0ZXJuIHN1YnNjcmliZXJzIHdpdGggbWF0Y2hpbmcgcGF0dGVycyB3aWxsIG5vdCBiZSBpbmNsdWRlZCAoYnkgZGVmYXVsdCB0aGV5IGFyZSBpbmNsdWRlZCkuXG4gKiBJZiB0aGVyZSBhcmUgbm8gc3Vic2NyaWJlcnMgdG8gdGhlIG1lc3NhZ2UsIGB1bmRlZmluZWRgIHdpbGwgYmUgcmV0dXJuZWQsIG5vdCBhbiBlbXB0eSBhcnJheSwgc28gaXQgaXMgc2FmZSB0byB1c2UgdGhlIHJlc3VsdCBpbiBib29sZWFuIHRlc3RzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbWVzc2FnZSBNZXNzYWdlIHRvIGdldCBzdWJzY3JpYmVycyBmb3IuXG4gKiAgSWYgdGhlIG1lc3NhZ2UgaXMgUmVnRXhwLCBvbmx5IHBhdHRlcm4gc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIGV4YWN0bHkgdGhpcyBwYXR0ZXJuIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiAgSWYgdGhlIG1lc3NhZ2UgaXMgU3RyaW5nLCBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggdGhlIHN0cmluZyBtZXNzYWdlcyBhbmQgcGF0dGVybiBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggbWF0Y2hpbmcgcGF0dGVybiB3aWxsIGJlIHJldHVybmVkICh1bmxlc3MgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgZmFsc2UpLlxuICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlUGF0dGVyblN1YnNjcmliZXJzIE9wdGlvbmFsIGZhbHNlIHRvIHByZXZlbnQgaW5jbHVzaW9uIG9mIHBhdHRlciBzdWJzY3JpYmVycywgYnkgZGVmYXVsdCB0aGV5IGFyZSBpbmNsdWRlZC5cbiAqIEByZXR1cm4ge0FycmF5fHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZ2V0U3Vic2NyaWJlcnMobWVzc2FnZSwgaW5jbHVkZVBhdHRlcm5TdWJzY3JpYmVycykge1xuICAgIGNoZWNrKG1lc3NhZ2UsIE1hdGNoLk9uZU9mKFN0cmluZywgUmVnRXhwKSk7XG5cbiAgICB2YXIgc3Vic2NyaWJlcnNIYXNoID0gdGhpcy5fY2hvb3NlU3Vic2NyaWJlcnNIYXNoKG1lc3NhZ2UpO1xuICAgIHZhciBtc2dTdWJzY3JpYmVycyA9IHN1YnNjcmliZXJzSGFzaFttZXNzYWdlXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gW10uY29uY2F0KHN1YnNjcmliZXJzSGFzaFttZXNzYWdlXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdO1xuXG4gICAgLy8gcGF0dGVybiBzdWJzY3JpYmVycyBhcmUgaW5jdWRlZCBieSBkZWZhdWx0XG4gICAgaWYgKGluY2x1ZGVQYXR0ZXJuU3Vic2NyaWJlcnMgIT09IGZhbHNlICYmIHR5cGVvZiBtZXNzYWdlID09ICdzdHJpbmcnKSB7XG4gICAgICAgIF8uZWFjaEtleSh0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzLFxuICAgICAgICAgICAgZnVuY3Rpb24ocGF0dGVyblN1YnNjcmliZXJzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSBwYXR0ZXJuU3Vic2NyaWJlcnMucGF0dGVybjtcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVyblN1YnNjcmliZXJzICYmIHBhdHRlcm5TdWJzY3JpYmVycy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHBhdHRlcm4udGVzdChtZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgXy5hcHBlbmRBcnJheShtc2dTdWJzY3JpYmVycywgcGF0dGVyblN1YnNjcmliZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBzdWJzY3JpYmVyc1xuICAgIHJldHVybiBtc2dTdWJzY3JpYmVycy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IG1zZ1N1YnNjcmliZXJzXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG59XG5cblxuLyoqXG4gKiBcIlByaXZhdGVcIiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRoZSBtYXAgb2Ygc3Vic2NyaWJlcnMgZm9yIGEgZ2l2ZW4gbWVzc2FnZSB0eXBlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IG1lc3NhZ2UgTWVzc2FnZSB0byBjaG9vc2UgdGhlIG1hcCBvZiBzdWJzY3JpYmVycyBmb3JcbiAqIEByZXR1cm4ge09iamVjdFtGdW5jdGlvbl19XG4gKi9cbmZ1bmN0aW9uIF9jaG9vc2VTdWJzY3JpYmVyc0hhc2gobWVzc2FnZSkge1xuICAgIHJldHVybiBtZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzXG4gICAgICAgICAgICAgICAgOiB0aGlzLl9tZXNzYWdlU3Vic2NyaWJlcnM7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGZvciB0aGUgbWVzc2VuZ2VyIGFsc28gc2V0dGluZyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBtZXNzZW5nZXIgaW4gdGhlIE1lc3NhZ2VTb3VyY2UuXG4gKiBNZXNzYWdlU291cmNlIGNhbiBiZSBwYXNzZWQgdG8gbWVzc2FnZSBjb25zdHJ1Y3RvcjsgdGhpcyBtZXRob2QgYWxsb3dzIHRvIHNldCBpdCBhdCBhIGxhdGVyIHRpbWUuIEZvciBleGFtcGxlLCB0aGUgc3ViY2xhc3NlcyBvZiBbQ29tcG9uZW50RmFjZXRdKC4uL2NvbXBvbmVudHMvY19mYWNldC5qcy5odG1sKSB1c2UgdGhpcyBtZXRob2QgdG8gc2V0IGRpZmZlcmVudCBNZXNzYWdlU291cmNlJ2VzIGluIHRoZSBtZXNzZW5nZXIgdGhhdCBpcyBjcmVhdGVkIGJ5IENvbXBvbmVudEZhY2V0LlxuICogQ3VycmVudGx5IHRoZSBtZXRob2QgaXMgaW1wbGVtZW50ZWQgaW4gc3VjaCB3YXkgdGhhdCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSAtIE1lc3NhZ2VTb3VyY2UgY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgdGhpcyBtZXRob2QgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSB7TWVzc2FnZVNvdXJjZX0gbWVzc2FnZVNvdXJjZSBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlU291cmNlIGNsYXNzIHRvIGF0dGFjaCB0byB0aGlzIG1lc3NlbmdlciAoYW5kIHRvIGhhdmUgdGhpcyBtZXNzZW5nZXIgYXR0YWNoZWQgdG8gaXQgdG9vKVxuICovXG5mdW5jdGlvbiBfc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKSB7XG4gICAgY2hlY2sobWVzc2FnZVNvdXJjZSwgTWVzc2FnZVNvdXJjZSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfbWVzc2FnZVNvdXJjZScsIG1lc3NhZ2VTb3VyY2UpO1xuICAgIG1lc3NhZ2VTb3VyY2UubWVzc2VuZ2VyID0gdGhpcztcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgbWVzc2VuZ2VyIE1lc3NhZ2VTb3VyY2VcbiAqXG4gKiBAcmV0dXJuIHtNZXNzYWdlU291cmNlfVxuICovXG5mdW5jdGlvbiBnZXRNZXNzYWdlU291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlU291cmNlXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGxvZ2dlciA9IHJlcXVpcmUoJy4uL3V0aWwvbG9nZ2VyJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNZXNzZW5nZXJBUEk7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLk1lc3NlbmdlckFQSWBcbiAqIEJhc2UgY2xhc3MsIHN1YmNsYXNzZXMgb2Ygd2hpY2ggY2FuIHN1cHBsZW1lbnQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgYnkgaW1wbGVtZW50aW5nIHRocmVlIG1ldGhvZHM6XG4gKlxuICogLSBgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlYCB0byB0cmFuc2xhdGUgc291cmNlIG1lc3NhZ2VzIChyZWNpZXZlZCBmcm9tIGV4dGVybmFsIHNvdXJjZSB2aWEgYE1lc3NhZ2VTT3VyY2VgKSB0byBpbnRlcm5hbCBtZXNzYWdlcyAodGhhdCBhcmUgZGlzcGF0Y2hlZCBvbiBNZXNzZW5nZXIpLCBhbGxvd2luZyB0byBtYWtlIGludGVybmFsIG1lc3NhZ2VzIG1vcmUgZGV0YWlsZWQgdGhhbiBzb3VyY2UgbWVzc2FnZXMuIEZvciBleGFtcGxlLCBbRGF0YSBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzLmh0bWwpIHVzZXMgW0RhdGFNc2dBUEldKC4uL2NvbXBvbmVudHMvbXNnX2FwaS9kYXRhLmpzLmh0bWwpIHRvIGRlZmluZSBzZXZlcmFsIGludGVybmFsIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gdGhlIGNoYW5nZSBvZiBzdGF0ZSBpbiBjb250ZW50ZWRpdGFibGUgRE9NIGVsZW1lbnQuXG4gKiAtIGBjcmVhdGVJbnRlcm5hbERhdGFgIHRvIG1vZGlmeSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgZnJvbSBzb3VyY2UgdG8gc29tZSBtb3JlIG1lYW5pbmdmdWwgb3IgbW9yZSBkZXRhaWxlZCBtZXNzYWdlIGRhdGEgdGhhdCB3aWxsIGJlIGRpc3BhdGNoZWQgb24gTWVzc2VuZ2VyLiBGb3IgZXhhbXBsZSwgW0RhdGEgZmFjZXRdKC4uL2NvbXBvbmVudHMvY19mYWNldHMvRGF0YS5qcy5odG1sKSB1c2VzIFtEYXRhTXNnQVBJXSguLi9jb21wb25lbnRzL21zZ19hcGkvZGF0YS5qcy5odG1sKSAoc3ViY2xhc3Mgb2YgTWVzc2VuZ2VyQVBJKSB0byB0cmFuc2xhdGUgRE9NIG1lc3NhZ2VzIHRvIGRhdGEgY2hhbmdlIG1lc3NhZ2VzLlxuICogLSBgZmlsdGVyU291cmNlTWVzc2FnZWAgdG8gZW5hYmxlL2Rpc2FibGUgbWVzc2FnZSBkaXNwYXRjaCBiYXNlZCBvbiBzb21lIGNvbmRpdGlvbnMgaW4gZGF0YS5cbiAqXG4gKiBJZiBgTWVzc2FnZVNvdXJjZWAgY29uc3RydWN0b3IgaXMgbm90IHBhc3NlZCBhbiBpbnN0YW5jZSBvZiBzb21lIHN1YmNsYXNzIG9mIGBNZXNzZW5nZXJBUElgLCBpdCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTWVzc2VuZ2VyQVBJIHRoYXQgZGVmaW5lcyBhbGwgMyBvZiB0aG9zZSBtZXRob2RzIGluIGEgdHJpdmlhbCB3YXkuIFNlZSB0aGVzZSBtZXRob2RzIGJlbG93IGZvciB0aGVpciBzaWduYXR1cmVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHRoaXMge01lc3NlbmdlckFQSX1cbiAqIEByZXR1cm4ge01lc3NlbmdlckFQSX1cbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyQVBJKCkge1xuICAgIGlmICh0aGlzLmluaXQpXG4gICAgICAgIHRoaXMuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogIyMjI01lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNpbml0KSAtIGluaXRpYWxpemVzIE1lc3NlbmdlckFQSVxuICogLSBbYWRkSW50ZXJuYWxNZXNzYWdlXSgjYWRkSW50ZXJuYWxNZXNzYWdlKSAtIGFkZHMgaW50ZXJuYWwgbWVzc2FnZVxuICogLSBbcmVtb3ZlSW50ZXJuYWxNZXNzYWdlXSgjcmVtb3ZlSW50ZXJuYWxNZXNzYWdlKSAtIHJlbW92ZXMgaW50ZXJuYWwgbWVzc2FnZVxuICogLSBbZ2V0SW50ZXJuYWxNZXNzYWdlc10oI2dldEludGVybmFsTWVzc2FnZXMpIC0gcmV0dXJucyB0aGUgbGlzdCBvZiBpbnRlcm5hbCBtZXNzYWdlcyBmb3IgZ2l2ZW4gc291cmNlIG1lc3NhZ2VcbiAqXG4gKiBUaGVzZSBtZXRob2RzIHNob3VsZCBiZSByZWRlZmluZWQgYnkgc3ViY2xhc3M6XG4gKlxuICogLSBbdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlXSgjdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKSAtIGNvbnZlcnRzIGludGVybmFsIG1lc3NhZ2UgdHlwZSB0byBzb3VyY2UgKGV4dGVybmFsKSBtZXNzYWdlIHR5cGVcbiAqIC0gW2NyZWF0ZUludGVybmFsRGF0YV0oI2NyZWF0ZUludGVybmFsRGF0YSkgLSBjb252ZXJ0cyBzb3VyY2UgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIHZpYSBNZXNzYWdlU291cmNlIHRvIGludGVybmFsIG1lc3NhZ2UgZGF0YVxuICogLSBbZmlsdGVyU291cmNlTWVzc2FnZV0oI2ZpbHRlclNvdXJjZU1lc3NhZ2UpIC0gZmlsdGVycyBzb3VyY2UgbWVzc2FnZSBiYXNlZCBvbiB0aGUgZGF0YSBvZiB0aGUgbWVzc2FnZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJuYWwgbWVzc2FnZSB0aGF0IGlzIGFib3V0IHRvIGJlIHNlbnQgb24gTWVzc2VuZ2VyXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTWVzc2VuZ2VyQVBJLCB7XG4gICAgaW5pdDogaW5pdCxcbiAgICBkZXN0cm95OiBNZXNzZW5nZXJBUEkkZGVzdHJveSxcbiAgICBhZGRJbnRlcm5hbE1lc3NhZ2U6IGFkZEludGVybmFsTWVzc2FnZSxcbiAgICByZW1vdmVJbnRlcm5hbE1lc3NhZ2U6IHJlbW92ZUludGVybmFsTWVzc2FnZSxcbiAgICBnZXRJbnRlcm5hbE1lc3NhZ2VzOiBnZXRJbnRlcm5hbE1lc3NhZ2VzLFxuXG4gICAgLy8gc2hvdWxkIGJlIHJlZGVmaW5lZCBieSBzdWJjbGFzc1xuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxuICAgIGNyZWF0ZUludGVybmFsRGF0YTogY3JlYXRlSW50ZXJuYWxEYXRhLFxuICAgIGZpbHRlclNvdXJjZU1lc3NhZ2U6IGZpbHRlclNvdXJjZU1lc3NhZ2Vcbn0pO1xuXG5cbi8qKlxuICogTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IE1lc3NlbmdlckFQSSBjb25zdHJ1Y3Rvci4gU3ViY2xhc3NlcyB0aGF0IHJlLWltcGxlbWVudCBgaW5pdGAgbWV0aG9kIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHVzaW5nOiBgTWVzc2VuZ2VyQVBJLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylgXG4gKi9cbmZ1bmN0aW9uIGluaXQoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2ludGVybmFsTWVzc2FnZXMnLCB7fSk7XG59XG5cblxuLyoqXG4gKiBEZXN0cm95cyBtZXNzZW5nZXIgQVBJXG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlckFQSSRkZXN0cm95KCkge1xuXG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBUcmFuc2xhdGVzIGludGVybmFsIGBtZXNzYWdlYCB0byBzb3VyY2UgbWVzc2FnZSwgYWRkcyBpbnRlcm5hbCBgbWVzc2FnZWAgdG8gdGhlIGxpc3QsIG1ha2luZyBzdXJlIHRoZSBzYW1lIGBtZXNzYWdlYCB3YXNuJ3QgcGFzc2VkIGJlZm9yZSAoaXQgd291bGQgaW5kaWNhdGUgTWVzc2VuZ2VyIGVycm9yKS5cbiAqIFJldHVybnMgc291cmNlIG1lc3NhZ2UgaWYgaXQgaXMgdXNlZCBmaXJzdCB0aW1lIChzbyB0aGF0IGBNZXNzYWdlU291cmNlYCBzdWJjcmliZXMgdG8gdGhpcyBzb3VyY2UgbWVzc2FnZSkgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCBhZGRlZFxuICogQHJldHVybiB7U3RyaW5nfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gYWRkSW50ZXJuYWxNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB2YXIgaW50ZXJuYWxNc2dzXG4gICAgICAgICwgc291cmNlTWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpO1xuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2VNZXNzYWdlID09ICd1bmRlZmluZWQnKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5faW50ZXJuYWxNZXNzYWdlcy5oYXNPd25Qcm9wZXJ0eShzb3VyY2VNZXNzYWdlKSkge1xuICAgICAgICBpbnRlcm5hbE1zZ3MgPSB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdO1xuICAgICAgICBpZiAoaW50ZXJuYWxNc2dzLmluZGV4T2YobWVzc2FnZSkgPT0gLTEpXG4gICAgICAgICAgICBpbnRlcm5hbE1zZ3MucHVzaChtZXNzYWdlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0R1cGxpY2F0ZSBhZGRJbnRlcm5hbE1lc3NhZ2UgY2FsbCBmb3IgaW50ZXJuYWwgbWVzc2FnZSAnICsgbWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJuYWxNc2dzID0gdGhpcy5faW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXSA9IFtdO1xuICAgICAgICBpbnRlcm5hbE1zZ3MucHVzaChtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2U7XG4gICAgfVxufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyBpbnRlcm5hbCBgbWVzc2FnZWAgZnJvbSB0aGUgbGlzdCBjb25uZWN0ZWQgdG8gY29ycmVzcG9uZGluZyBzb3VyY2UgbWVzc2FnZSAoYHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZWAgaXMgdXNlZCBmb3IgdHJhbnNsYXRpb24pLlxuICogUmV0dXJucyBzb3VyY2UgbWVzc2FnZSwgaWYgdGhlIGxhc3QgaW50ZXJuYWwgbWVzc2FnZSB3YXMgcmVtb3ZlZCAoc28gdGhhdCBgTWVzc2FnZVNvdXJjZWAgY2FuIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBzb3VyY2UgbWVzc2FnZSksIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UgdG8gYmUgdHJhbnNsYXRlZCBhbmQgcmVtb3ZlZFxuICogQHJldHVybiB7U3RyaW5nfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlSW50ZXJuYWxNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB2YXIgc291cmNlTWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpO1xuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2VNZXNzYWdlID09ICd1bmRlZmluZWQnKSByZXR1cm47XG5cbiAgICB2YXIgaW50ZXJuYWxNc2dzID0gdGhpcy5faW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXTtcblxuICAgIGlmIChpbnRlcm5hbE1zZ3MgJiYgaW50ZXJuYWxNc2dzLmxlbmd0aCkge1xuICAgICAgICB2YXIgbWVzc2FnZUluZGV4ID0gaW50ZXJuYWxNc2dzLmluZGV4T2YobWVzc2FnZSk7XG4gICAgICAgIGlmIChtZXNzYWdlSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgaW50ZXJuYWxNc2dzLnNwbGljZShtZXNzYWdlSW5kZXgsIDEpO1xuICAgICAgICAgICAgaWYgKGludGVybmFsTXNncy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdO1xuICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VNZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHVuZXhwZWN0ZWROb3RpZmljYXRpb25XYXJuaW5nKCk7XG4gICAgfSBlbHNlXG4gICAgICAgIHVuZXhwZWN0ZWROb3RpZmljYXRpb25XYXJuaW5nKCk7XG5cblxuICAgIGZ1bmN0aW9uIHVuZXhwZWN0ZWROb3RpZmljYXRpb25XYXJuaW5nKCkge1xuICAgICAgICBsb2dnZXIud2Fybignbm90aWZpY2F0aW9uIHJlY2VpdmVkOiB1bi1zdWJzY3JpYmUgZnJvbSBpbnRlcm5hbCBtZXNzYWdlICcgKyBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICArICcgd2l0aG91dCBwcmV2aW91cyBzdWJzY3JpcHRpb24gbm90aWZpY2F0aW9uJyk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0aGUgYXJyYXkgb2YgaW50ZXJuYWwgbWVzc2FnZXMgdGhhdCB3ZXJlIHRyYW5zbGF0ZWQgdG8gZ2l2ZW4gYHNvdXJjZU1lc3NhZ2VgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBgTWVzc2FnZVNvdXJjZWAgdG8gZGlzcGF0Y2ggc291cmNlIG1lc3NhZ2Ugb24gdGhlIGBNZXNlbmdlcmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2VcbiAqIEByZXR1cm4ge0FycmF5W1N0cmluZ119XG4gKi9cbmZ1bmN0aW9uIGdldEludGVybmFsTWVzc2FnZXMoc291cmNlTWVzc2FnZSkge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZFxuICogU3ViY2xhc3NlcyBzaG91bGQgcmUtaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGRlZmluZSB0aGUgcnVsZSBmb3IgdHJhbnNsYXRpb24gb2YgaW50ZXJuYWwgYG1lc3NhZ2VgIHRvIHNvdXJjZSBtZXNzYWdlLiBUaGlzIGNsYXNzIHNpbXBseSByZXR1cm5zIHRoZSBzYW1lIGBtZXNzYWdlYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBtZXNzYWdlIHRvIGJlIHRyYW5zbGF0ZWRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gbWVzc2FnZVxufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZFxuICogU3ViY2xhc3NlcyBzaG91bGQgcmUtaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGRlZmluZSB0aGUgcnVsZSBmb3IgdHJhbnNsYXRpb24gb2Ygc291cmNlIG1lc3NhZ2UgZGF0YSB0byBpbnRlcm5hbCBtZXNzYWdlIGRhdGEuIFRoaXMgY2xhc3Mgc2ltcGx5IHJldHVybnMgdGhlIHNhbWUgYHNvdXJjZURhdGFgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiBbZGlzcGF0Y2hNZXNzYWdlXSguL21fc291cmNlLmpzLmh0bWwjZGlzcGF0Y2hNZXNzYWdlKSBtZXRob2Qgb2YgYE1lc3NhZ2VTb3VyY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlLCBjYW4gYmUgdXNlZCBpbiB0cmFuc2xhdGlvbiBydWxlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBtZXNzYWdlLCBjYW4gYmUgdXNlZCBpbiB0cmFuc2xhdGlvbiBydWxlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlRGF0YSBkYXRhIHJlY2VpdmVkIGZyb20gc291cmNlIHRoYXQgaGFzIHRvIGJlIHRyYW5zbGF0ZWQgdG8gZGF0YSB0aGF0IHdpbGwgYmUgc2VudCB0byBpbnRlcm5hbCBNZXNzZW5nZXIgc3Vic2NyaWJlclxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnRlcm5hbERhdGEoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgc291cmNlRGF0YSkge1xuICAgIHJldHVybiBzb3VyY2VEYXRhO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZFxuICogU3ViY2xhc3NlcyBzaG91bGQgcmUtaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGRlZmluZSB0aGUgZGlzcGF0Y2ggZmlsdGVyIGZvciBpbnRlcm5hbCBtZXNzYWdlcy4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBgdHJ1ZWAgdG8gYWxsb3cgYW5kIGBmYWxzZWAgdG8gcHJldmVudCBpbnRlcm5hbCBtZXNzYWdlIGRpc3BhdGNoLiBUaGlzIGNsYXNzIGFsd2F5cyByZXR1cm5zIGB0cnVlYC5cbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gW2Rpc3BhdGNoTWVzc2FnZV0oLi9tX3NvdXJjZS5qcy5odG1sI2Rpc3BhdGNoTWVzc2FnZSkgbWV0aG9kIG9mIGBNZXNzYWdlU291cmNlYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc291cmNlTWVzc2FnZSBzb3VyY2UgbWVzc2FnZSwgY2FuIGJlIHVzZWQgaW4gZmlsdGVyIHJ1bGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UsIGNhbiBiZSB1c2VkIGluIGZpbHRlciBydWxlXG4gKiBAcGFyYW0ge09iamVjdH0gaW50ZXJuYWxEYXRhIGRhdGEgdHJhbnNsYXRlZCBieSBgY3JlYXRlSW50ZXJuYWxEYXRhYCBtZXRob2QgZnJvbSBzb3VyY2UgZGF0YSwgY2FuIGJlIHVzZWQgaW4gZmlsdGVyIHJ1bGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGZpbHRlclNvdXJjZU1lc3NhZ2Uoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgaW50ZXJuYWxEYXRhKSB7XG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBNZXNzZW5nZXJBUEkgPSByZXF1aXJlKCcuL21fYXBpJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuXG4vKipcbiAqIEEgZ2VuZXJpYyBzdWJzY2xhc3Mgb2YgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSB0aGF0IHN1cHBvcnRzIHBhdHRlcm4gc3Vic2NyaXB0aW9ucyB0byBzb3VyY2UuXG4gKiBDYW4gYmUgdXNlZnVsIGlmIHRoZSBzb3VyY2UgaXMgYW5vdGhlciBNZXNzZW5nZXIuXG4gKi9cbiB2YXIgTWVzc2VuZ2VyUmVnZXhwQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJBUEksICdNZXNzZW5nZXJSZWdleHBBUEknKTtcblxuIG1vZHVsZS5leHBvcnRzID0gTWVzc2VuZ2VyUmVnZXhwQVBJO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTWVzc2VuZ2VyUmVnZXhwQVBJLCB7XG4gICAgaW5pdDogaW5pdCxcbiAgICBhZGRJbnRlcm5hbE1lc3NhZ2U6IGFkZEludGVybmFsTWVzc2FnZSxcbiAgICByZW1vdmVJbnRlcm5hbE1lc3NhZ2U6IHJlbW92ZUludGVybmFsTWVzc2FnZSxcbiAgICBnZXRJbnRlcm5hbE1lc3NhZ2VzOiBnZXRJbnRlcm5hbE1lc3NhZ2VzXG59KTtcblxuXG4vKipcbiAqIE1lc3NlbmdlclJlZ2V4cEFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBNZXNzZW5nZXJSZWdleHBBUEkgY29uc3RydWN0b3IuXG4gKi9cbmZ1bmN0aW9uIGluaXQoKSB7XG4gICAgTWVzc2VuZ2VyQVBJLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX3BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzOiB7fVxuICAgIH0pO1xuICAgIHRoaXMuX2NhdGNoQWxsU3Vic2NyaWJlZCA9IGZhbHNlO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyUmVnZXhwQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQXVnbWVudHMgTWVzc2VuZ2VyQVBJIG1ldGhvZCBieSBzdG9yaW5nIHJlZ2V4cFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UgdG8gYmUgdHJhbnNsYXRlZCBhbmQgYWRkZWRcbiAqIEByZXR1cm4ge1N0cmluZ3xSZWdFeHB8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBhZGRJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBzb3VyY2VNZXNzYWdlID0gTWVzc2VuZ2VyQVBJLnByb3RvdHlwZS5hZGRJbnRlcm5hbE1lc3NhZ2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBcbiAgICAvLyBzdG9yZSByZWdleHAgaXRzZWxmIGlmIHNvdXJjZU1lc3NhZ2UgaXMgcmVnZXhwXG4gICAgaWYgKHNvdXJjZU1lc3NhZ2UgJiYgc291cmNlTWVzc2FnZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdLnBhdHRlcm4gPSBzb3VyY2VNZXNzYWdlO1xuICAgICAgICB0aGlzLl9wYXR0ZXJuSW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXSA9IHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgIGlmICh0aGlzLl9jYXRjaEFsbFN1YnNjcmliZWQpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuX2NhdGNoQWxsU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiAvLiovO1xuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2VNZXNzYWdlO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyUmVnZXhwQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQXVnbWVudHMgTWVzc2VuZ2VyQVBJIG1ldGhvZCBieSByZW1vdmluZyByZWdleHAgc3Vic2NpcnB0aW9uXG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UgdG8gYmUgdHJhbnNsYXRlZCBhbmQgYWRkZWRcbiAqIEByZXR1cm4ge1N0cmluZ3xSZWdFeHB8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiByZW1vdmVJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBzb3VyY2VNZXNzYWdlID0gTWVzc2VuZ2VyQVBJLnByb3RvdHlwZS5yZW1vdmVJbnRlcm5hbE1lc3NhZ2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIGlmIChzb3VyY2VNZXNzYWdlICYmIHNvdXJjZU1lc3NhZ2UgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdO1xuICAgICAgICB2YXIgbm9QYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcyA9ICEgT2JqZWN0LmtleXModGhpcy5fcGF0dGVybkludGVybmFsTWVzc2FnZXMpLmxlbmd0aDtcbiAgICAgICAgaWYgKG5vUGF0dGVybkludGVybmFsTWVzc2FnZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhdGNoQWxsU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIC8uKi87XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlTWVzc2FnZTtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIEF1Z21lbnRzIE1lc3NlbmdlckFQSSBtZXRob2QgYnkgcmV0dXJuaW5nIG1lc3NhZ2VzIHN1YnNjcmliZWQgd2l0aCByZWdleHBcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgYE1lc3NhZ2VTb3VyY2VgIHRvIGRpc3BhdGNoIHNvdXJjZSBtZXNzYWdlIG9uIHRoZSBgTWVzZW5nZXJgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gc291cmNlTWVzc2FnZSBzb3VyY2UgbWVzc2FnZVxuICogQHJldHVybiB7QXJyYXlbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gZ2V0SW50ZXJuYWxNZXNzYWdlcyhzb3VyY2VNZXNzYWdlKSB7XG4gICAgdmFyIGludGVybmFsTWVzc2FnZXMgPSBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmdldEludGVybmFsTWVzc2FnZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIGFkZCBpbnRlcm5hbCBtZXNzYWdlcyBmb3IgcmVnZXhwIHNvdXJjZSBzdWJzY3JpcHRpb25zXG4gICAgaWYgKHR5cGVvZiBzb3VyY2VNZXNzYWdlID09ICdzdHJpbmcnKSB7XG4gICAgICAgIGludGVybmFsTWVzc2FnZXMgPSBpbnRlcm5hbE1lc3NhZ2VzIHx8IFtdO1xuICAgICAgICB2YXIgaW50ZXJuYWxNZXNzYWdlc0hhc2ggPSBfLm9iamVjdChpbnRlcm5hbE1lc3NhZ2VzLCB0cnVlKTtcblxuICAgICAgICBfLmVhY2hLZXkodGhpcy5fcGF0dGVybkludGVybmFsTWVzc2FnZXMsIGZ1bmN0aW9uKHBhdHRlcm5NZXNzYWdlcykge1xuICAgICAgICAgICAgdmFyIHNvdXJjZVBhdHRlcm4gPSBwYXR0ZXJuTWVzc2FnZXMucGF0dGVybjtcblxuICAgICAgICAgICAgaWYgKHNvdXJjZVBhdHRlcm4udGVzdChzb3VyY2VNZXNzYWdlKSlcbiAgICAgICAgICAgICAgICBwYXR0ZXJuTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbE1lc3NhZ2VzSGFzaFttZXNzYWdlXSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbE1lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsTWVzc2FnZXNIYXNoW21lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSBcblxuICAgIHJldHVybiBpbnRlcm5hbE1lc3NhZ2VzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWl4aW4gPSByZXF1aXJlKCcuLi9hYnN0cmFjdC9taXhpbicpXG4gICAgLCBNZXNzZW5nZXJBUEkgPSByZXF1aXJlKCcuL21fYXBpJylcbiAgICAsIGxvZ2dlciA9IHJlcXVpcmUoJy4uL3V0aWwvbG9nZ2VyJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgY2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrJylcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VgXG4gKiBBbiBhYnN0cmFjdCBjbGFzcyAoc3ViY2xhc3Mgb2YgW01peGluXSguLi9hYnN0cmFjdC9taXhpbi5qcy5odG1sKSkgZm9yIGNvbm5lY3RpbmcgW01lc3Nlbmdlcl0oLi9pbmRleC5qcy5odG1sKSB0byBleHRlcm5hbCBzb3VyY2VzIG9mIG1lc3NhZ2VzIChsaWtlIERPTSBldmVudHMpIGFuZCBkZWZpbmluZyBoaWdoZXIgbGV2ZWwgbWVzc2FnZXMuXG4gKiBBbiBpbnN0YW5jZSBvZiBNZXNzYWdlU291cmNlIGNhbiBlaXRoZXIgYmUgcGFzc2VkIHRvIE1lc3NlbmdlciBjb25zdHJ1Y3RvciBvciBsYXRlciB1c2luZyBgX3NldE1lc3NhZ2VTb3VyY2VgIG1ldGhvZCBvZiBNZXNzZW5nZXIuIE9uY2Ugc2V0LCBNZXNzYWdlU291cmNlIG9mIE1lc3NlbmdlciBjYW5ub3QgYmUgY2hhbmdlZC5cbiAqL1xudmFyIE1lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1peGluLCAnTWVzc2FnZVNvdXJjZScsIHRydWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1lc3NhZ2VTb3VyY2U7XG5cblxuLyoqXG4gKiAjIyMjTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNpbml0KSAtIGluaXRpYWxpemVzIG1lc3NhZ2VTb3VyY2UgLSBjYWxsZWQgYnkgTWl4aW4gc3VwZXJjbGFzc1xuICogLSBbc2V0TWVzc2VuZ2VyXSgjc2V0TWVzc2VuZ2VyKSAtIGNvbm5lY3RzIE1lc3NlbmdlciB0byBNZXNzYWdlU291cmNlLCBpcyBjYWxsZWQgZnJvbSBgaW5pdGAgb3IgYF9zZXRNZXNzYWdlU291cmNlYCBtZXRob2RzIG9mIFtNZXNzZW5nZXJdKC4vaW5kZXguanMuaHRtbCkuXG4gKiAtIFtvblN1YnNjcmliZXJBZGRlZF0oI29uU3Vic2NyaWJlckFkZGVkKSAtIGNhbGxlZCBieSBNZXNzZW5nZXIgdG8gbm90aWZ5IHdoZW4gdGhlIGZpcnN0IHN1YnNjcmliZXIgZm9yIGFuIGludGVybmFsIG1lc3NhZ2Ugd2FzIGFkZGVkLCBzbyBNZXNzYWdlU291cmNlIGNhbiBzdWJzY3JpYmUgdG8gc291cmNlXG4gKiAtIFtvblN1YnNjcmliZXJSZW1vdmVkXSgjb25TdWJzY3JpYmVyUmVtb3ZlZCkgLSBjYWxsZWQgYnkgTWVzc2VuZ2VyIHRvIG5vdGlmeSB3aGVuIHRoZSBsYXN0IHN1YnNjcmliZXIgZm9yIGFuIGludGVybmFsIG1lc3NhZ2Ugd2FzIHJlbW92ZWQsIHNvIE1lc3NhZ2VTb3VyY2UgY2FuIHVuc3Vic2NyaWJlIGZyb20gc291cmNlXG4gKiAtIFtkaXNwYXRjaE1lc3NhZ2VdKCNkaXNwYXRjaE1lc3NhZ2UpIC0gZGlzcGF0Y2hlcyBzb3VyY2UgbWVzc2FnZS4gTWVzc2FnZVNvdXJjZSBzdWJjbGFzcyBzaG91bGQgaW1wbGVtZW50IG1lY2hhbmlzbSB3aGVuIG9uIGFjdHVhbCBzb3VyY2UgbWVzc2FnZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogTWV0aG9kcyBiZWxvdyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3M6XG4gKlxuICogLSBbdHJpZ2dlcl0oI3RyaWdnZXIpIC0gdHJpZ2dlcnMgbWVzc2FnZXMgb24gdGhlIHNvdXJjZSAoYW4gb3B0aW9uYWwgbWV0aG9kKVxuICogLSBbYWRkU291cmNlU3Vic2NyaWJlcl0oI2FkZFNvdXJjZVN1YnNjcmliZXIpIC0gYWRkcyBsaXN0ZW5lci9zdWJzY3JpYmVyIHRvIGV4dGVybmFsIG1lc3NhZ2VcbiAqIC0gW3JlbW92ZVNvdXJjZVN1YnNjcmliZXJdKCNyZW1vdmVTb3VyY2VTdWJzY3JpYmVyKSAtIHJlbW92ZXMgbGlzdGVuZXIvc3Vic2NyaWJlciBmcm9tIGV4dGVybmFsIG1lc3NhZ2VcbiAqL1xuXy5leHRlbmRQcm90byhNZXNzYWdlU291cmNlLCB7XG4gICAgaW5pdDogaW5pdCxcbiAgICBkZXN0cm95OiBNZXNzYWdlU291cmNlJGRlc3Ryb3ksXG4gICAgc2V0TWVzc2VuZ2VyOiBzZXRNZXNzZW5nZXIsXG4gICAgb25TdWJzY3JpYmVyQWRkZWQ6IG9uU3Vic2NyaWJlckFkZGVkLFxuICAgIG9uU3Vic2NyaWJlclJlbW92ZWQ6IG9uU3Vic2NyaWJlclJlbW92ZWQsIFxuICAgIGRpc3BhdGNoTWVzc2FnZTogZGlzcGF0Y2hNZXNzYWdlLFxuICAgIHBvc3RNZXNzYWdlOiBwb3N0TWVzc2FnZSxcbiAgICBfcHJlcGFyZU1lc3NlbmdlckFQSTogX3ByZXBhcmVNZXNzZW5nZXJBUEksXG5cbiAgICAvLyBNZXRob2RzIGJlbG93IG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3NcbiAgICB0cmlnZ2VyOiB0b0JlSW1wbGVtZW50ZWQsXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogdG9CZUltcGxlbWVudGVkLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IHRvQmVJbXBsZW1lbnRlZFxufSk7XG5cblxuLyoqXG4gKiBNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZC5cbiAqIENhbGxlZCBieSBNaXhpbiBjb25zdHJ1Y3Rvci5cbiAqIE1lc3NhZ2VTb3VyY2UgY29uc3RydWN0b3Igc2hvdWxkIGJlIHBhc3NlZCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoaXMgbWV0aG9kIHNpZ25hdHVyZS5cbiAqIElmIGFuIGluc3RhbmNlIG9mIFtNZXNzZW5nZXJBUEldKC4vbV9hcGkuanMuaHRtbCkgaXMgcGFzc2VkIGFzIHRoZSB0aGlyZCBwYXJhbWV0ZXIsIGl0IGV4dGVuZHMgTWVzc2FnZVNvdXJjZSBmdW5jdGlvbmFsaXR5IHRvIGFsbG93IGl0IHRvIGRlZmluZSBuZXcgbWVzc2FnZXMsIHRvIGZpbHRlciBtZXNzYWdlcyBiYXNlZCBvbiB0aGVpciBkYXRhIGFuZCB0byBjaGFuZ2UgbWVzc2FnZSBkYXRhLiBTZWUgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBPcHRpb25hbCBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIE1lc3NhZ2VTb3VyY2Ugb24gb25lIG9mIGl0cyBwcm9wZXJ0aWVzLiBJdCBpcyB1c2VkIHRvIHByb3h5IG1ldGhvZHMgb2YgTWVzc2FnZVNvdXJjZS5cbiAqIEBwYXJhbSB7T2JqZWN0W1N0cmluZ119IHByb3h5TWV0aG9kcyBPcHRpb25hbCBtYXAgb2YgbWV0aG9kIG5hbWVzOyBrZXkgLSBwcm94eSBtZXRob2QgbmFtZSwgdmFsdWUgLSBNZXNzYWdlU291cmNlJ3MgbWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge01lc3NlbmdlckFQSX0gbWVzc2VuZ2VyQVBJIE9wdGlvbmFsIGluc3RhbmNlIG9mIE1lc3NlbmdlckFQSS5cbiAqL1xuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NlbmdlckFQSSkge1xuICAgIHRoaXMuX3ByZXBhcmVNZXNzZW5nZXJBUEkobWVzc2VuZ2VyQVBJKTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3lzIG1lc3NhZ2Ugc291cmNlXG4gKi9cbmZ1bmN0aW9uIE1lc3NhZ2VTb3VyY2UkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5tZXNzZW5nZXJBUEkpXG4gICAgICAgIHRoaXMubWVzc2VuZ2VyQVBJLmRlc3Ryb3koKTtcbn1cblxuXG4vKipcbiAqIE1lc3NhZ2VTb3VyY2UgaW5zdGFuY2UgbWV0aG9kLlxuICogU2V0cyByZWZlcmVuY2UgdG8gTWVzc2VuZ2VyIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7TWVzc2VuZ2VyfSBtZXNzZW5nZXIgcmVmZXJlbmNlIHRvIE1lc3NlbmdlciBpbnN0YW5jZSBsaW5rZWQgdG8gdGhpcyBNZXNzYWdlU291cmNlXG4gKi9cbmZ1bmN0aW9uIHNldE1lc3NlbmdlcihtZXNzZW5nZXIpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdtZXNzZW5nZXInLCBtZXNzZW5nZXIpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBQcmVwYXJlcyBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIHBhc3NlZCB0byBjb25zdHJ1Y3RvciBieSBwcm94eWluZyBpdHMgbWV0aG9kcyB0byBpdHNlbGYgb3IgaWYgTWVzc2VuZ2VyQVBJIHdhc24ndCBwYXNzZWQgZGVmaW5lcyB0d28gbWV0aG9kcyB0byBhdm9pZCBjaGVja2luZyB0aGVpciBhdmFpbGFiaWxpdHkgZXZlcnkgdGltZSB0aGUgbWVzc2FnZSBpcyBkaXNwYXRjaGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge01lc3NlbmdlckFQSX0gbWVzc2VuZ2VyQVBJIE9wdGlvbmFsIGluc3RhbmNlIG9mIE1lc3NlbmdlckFQSVxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlckFQSShtZXNzZW5nZXJBUEkpIHtcbiAgICBjaGVjayhtZXNzZW5nZXJBUEksIE1hdGNoLk9wdGlvbmFsKE1lc3NlbmdlckFQSSkpO1xuXG4gICAgaWYgKCEgbWVzc2VuZ2VyQVBJKVxuICAgICAgICBtZXNzZW5nZXJBUEkgPSBuZXcgTWVzc2VuZ2VyQVBJO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbWVzc2VuZ2VyQVBJJywgbWVzc2VuZ2VyQVBJKTtcbn1cblxuXG4vKipcbiAqIE1lc3NhZ2VTb3VyY2UgaW5zdGFuY2UgbWV0aG9kLlxuICogU3Vic2NyaWJlcyB0byBleHRlcm5hbCBzb3VyY2UgdXNpbmcgYGFkZFNvdXJjZVN1YnNjcmliZXJgIG1ldGhvZCB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBbTWVzc2VuZ2VyXSguL2luZGV4LmpzLmh0bWwpIHdoZW4gdGhlIGZpcnN0IHN1YnNjcmliZXIgdG8gdGhlIGBtZXNzYWdlYCBpcyBhZGRlZC5cbiAqIERlbGVnYXRlcyB0byBzdXBwbGllZCBvciBkZWZhdWx0IFtNZXNzZW5nZXJBUEldKC4vbV9hcGkuanMuaHRtbCkgZm9yIHRyYW5zbGF0aW9uIG9mIGBtZXNzYWdlYCB0byBgc291cmNlTWVzc2FnZWAuIGBNZXNzYWdlQVBJLnByb3RvdHlwZS5hZGRJbnRlcm5hbE1lc3NhZ2VgIHdpbGwgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGlzIGBzb3VyY2VNZXNzYWdlYCB3YXMgYWxyZWFkeSBzdWJzY3JpYmVkIHRvIHRvIHByZXZlbnQgZHVwbGljYXRlIHN1YnNjcmlwdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBNZXNzZW5nZXIgbWVzc2FnZSB0aGF0IGhhcyB0byBiZSBzdWJzY3JpYmVkIHRvIGF0IHRoZSBleHRlcm5hbCBzb3VyY2Ugb2YgbWVzc2FnZXMuXG4gKi9cbmZ1bmN0aW9uIG9uU3Vic2NyaWJlckFkZGVkKG1lc3NhZ2UpIHtcbiAgICB2YXIgbmV3U291cmNlTWVzc2FnZSA9IHRoaXMubWVzc2VuZ2VyQVBJLmFkZEludGVybmFsTWVzc2FnZShtZXNzYWdlKTtcbiAgICBpZiAodHlwZW9mIG5ld1NvdXJjZU1lc3NhZ2UgIT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRoaXMuYWRkU291cmNlU3Vic2NyaWJlcihuZXdTb3VyY2VNZXNzYWdlKTtcbn1cblxuXG4vKipcbiAqIE1lc3NhZ2VTb3VyY2UgaW5zdGFuY2UgbWV0aG9kLlxuICogVW5zdWJzY3JpYmVzIGZyb20gZXh0ZXJuYWwgc291cmNlIHVzaW5nIGByZW1vdmVTb3VyY2VTdWJzY3JpYmVyYCBtZXRob2QgdGhhdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MuXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgW01lc3Nlbmdlcl0oLi9pbmRleC5qcy5odG1sKSB3aGVuIHRoZSBsYXN0IHN1YnNjcmliZXIgdG8gdGhlIGBtZXNzYWdlYCBpcyByZW1vdmVkLlxuICogRGVsZWdhdGVzIHRvIHN1cHBsaWVkIG9yIGRlZmF1bHQgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSBmb3IgdHJhbnNsYXRpb24gb2YgYG1lc3NhZ2VgIHRvIGBzb3VyY2VNZXNzYWdlYC4gYE1lc3NhZ2VBUEkucHJvdG90eXBlLnJlbW92ZUludGVybmFsTWVzc2FnZWAgd2lsbCByZXR1cm4gdW5kZWZpbmVkIGlmIHRoaXMgYHNvdXJjZU1lc3NhZ2VgIHdhcyBub3QgeWV0IHN1YnNjcmliZWQgdG8gdG8gcHJldmVudCB1bnN1YnNjcmlwdGlvbiB3aXRob3V0IHByZXZpb3VzIHN1YnNjcmlwdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBNZXNzZW5nZXIgbWVzc2FnZSB0aGF0IGhhcyB0byBiZSB1bnN1YnNjcmliZWQgZnJvbSBhdCB0aGUgZXh0ZXJuYWwgc291cmNlIG9mIG1lc3NhZ2VzLlxuICovXG5mdW5jdGlvbiBvblN1YnNjcmliZXJSZW1vdmVkKG1lc3NhZ2UpIHtcbiAgICB2YXIgcmVtb3ZlZFNvdXJjZU1lc3NhZ2UgPSB0aGlzLm1lc3NlbmdlckFQSS5yZW1vdmVJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgaWYgKHR5cGVvZiByZW1vdmVkU291cmNlTWVzc2FnZSAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhpcy5yZW1vdmVTb3VyY2VTdWJzY3JpYmVyKHJlbW92ZWRTb3VyY2VNZXNzYWdlKTtcbn1cblxuXG4vKipcbiAqIE1lc3NhZ2VTb3VyY2UgaW5zdGFuY2UgbWV0aG9kLlxuICogRGlzcGF0Y2hlcyBzb3VyY2VNZXNzYWdlIHRvIE1lc3Nlbmdlci5cbiAqIE1lY2hhbmlzbSB0aGF0IGNhbGxzIHRoaXMgbWV0aG9kIHdoZW4gdGhlIHNvdXJjZSBtZXNzYWdlIGlzIHJlY2VpdmVkIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcyAoc2VlIFtET01FdmVudHNTb3VyY2VdKC4uL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzLmpzLmh0bWwpIGZvciBleGFtcGxlKS5cbiAqIERlbGVnYXRlcyB0byBzdXBwbGllZCBvciBkZWZhdWx0IFtNZXNzZW5nZXJBUEldKC4vbV9hcGkuanMuaHRtbCkgdG8gY3JlYXRlIGludGVybmFsIG1lc3NhZ2UgZGF0YSAoYGNyZWF0ZUludGVybmFsRGF0YWApIGFuZCB0byBmaWx0ZXIgdGhlIG1lc3NhZ2UgYmFzZWQgb24gaXRzIGRhdGEgYW5kL29yIG1lc3NhZ2UgKGBmaWx0ZXJTb3VyY2VNZXNzYWdlYCkuXG4gKiBCYXNlIE1lc3NlbmdlckFQSSBjbGFzcyBpbXBsZW1lbnRzIHRoZXNlIHR3byBtZXRob2RzIGluIGEgdHJpdmlhbCB3YXkgKGBjcmVhdGVJbnRlcm5hbERhdGFgIHNpbXBseSByZXR1cm5zIGV4dGVybmFsIGRhdGEsIGBmaWx0ZXJTb3VyY2VNZXNzYWdlYCByZXR1cm5zIGB0cnVlYCksIHRoZXkgYXJlIG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gZXh0ZXJuYWwgc291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlRGF0YSBkYXRhIHJlY2VpdmVkIGZyb20gZXh0ZXJuYWwgc291cmNlXG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBzb3VyY2VEYXRhKSB7XG4gICAgdmFyIGFwaSA9IHRoaXMubWVzc2VuZ2VyQVBJXG4gICAgICAgICwgaW50ZXJuYWxNZXNzYWdlcyA9IGFwaS5nZXRJbnRlcm5hbE1lc3NhZ2VzKHNvdXJjZU1lc3NhZ2UpO1xuXG4gICAgaWYgKGludGVybmFsTWVzc2FnZXMpIFxuICAgICAgICBpbnRlcm5hbE1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHZhciBpbnRlcm5hbERhdGEgPSBhcGkuY3JlYXRlSW50ZXJuYWxEYXRhKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIHNvdXJjZURhdGEpO1xuXG4gICAgICAgICAgICB2YXIgc2hvdWxkRGlzcGF0Y2ggPSBhcGkuZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBpbnRlcm5hbERhdGEpO1xuICAgICAgICAgICAgaWYgKHNob3VsZERpc3BhdGNoKSBcbiAgICAgICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIGludGVybmFsRGF0YSk7ICAgICAgXG4gICAgICAgICAgICBcbiAgICAgICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBQb3N0cyBtZXNzYWdlIG9uIHRoZSBtZXNzZW5nZXIuIFRoaXMgbWV0aG9kIGlzIHNlcGFyYXRlZCBzbyBzcGVjaWZpYyBtZXNzYWdlIHNvdXJjZXMgY2FuIG1ha2UgbWVzc2FnZSBkaXNwYXRjaCBzeW5jaHJvbm91cyBieSB1c2luZyBgcG9zdE1lc3NhZ2VTeW5jYFxuICogXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSAge09iamVjdH0gZGF0YVxuICovXG5mdW5jdGlvbiBwb3N0TWVzc2FnZShtZXNzYWdlLCBkYXRhKSB7XG4gICAgdGhpcy5tZXNzZW5nZXIucG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gdG9CZUltcGxlbWVudGVkKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0aGUgbWV0aG9kIG9mIGFuIGFic2N0cmFjdCBjbGFzcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi9tX3NvdXJjZScpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpO1xuXG5cbi8qKlxuICogU3ViY2xhc3Mgb2YgTWVzc2FnZVNvdXJjZSB0aGF0IGFsbG93cyB0byBjb25uZWN0IE1lc3NlbmdlciB0byBhbm90aGVyIE1lc3NlbmdlciB1c2luZyBpdCBhcyBleHRlcm5hbCBzb3VyY2UuXG4gKi9cbnZhciBNZXNzZW5nZXJNZXNzYWdlU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2U7XG5cblxuLyoqXG4gKiAjIyMjTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICovXG5fLmV4dGVuZFByb3RvKE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UsIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IGFkZFNvdXJjZVN1YnNjcmliZXIsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogcmVtb3ZlU291cmNlU3Vic2NyaWJlcixcbiAgICBwb3N0TWVzc2FnZTogTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSRwb3N0TWVzc2FnZVxufSk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZVxuICogRGVmaW5lcyBvbmUgcGFyYW1ldGVyIGluIGFkZGl0aW9uIHRvIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIHBhcmFtZXRlcnNcbiAqXG4gKiBAcGFyYW0ge01lc3Nlbmdlcn0gc291cmNlTWVzc2VuZ2VyIG1lc3NlbmdlciB0aGlzIG1lc3NhZ2Ugc291cmNlIGNvbm5lY3RzIHRvXG4gKi9cbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUEksIHNvdXJjZU1lc3Nlbmdlcikge1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnNvdXJjZU1lc3NlbmdlciA9IHNvdXJjZU1lc3Nlbmdlcjtcbn1cblxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gc291cmNlIG1lc3NhZ2UuIFNlZSBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBkb2NzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ2V4fSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlIHRvIHN1YnNjcmliZSB0b1xuICovXG5mdW5jdGlvbiBhZGRTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB0aGlzLnNvdXJjZU1lc3Nlbmdlci5vblN5bmMoc291cmNlTWVzc2FnZSwgeyBjb250ZXh0OiB0aGlzLCBzdWJzY3JpYmVyOiB0aGlzLmRpc3BhdGNoTWVzc2FnZSB9KTtcbn1cblxuXG4vKipcbiAqIFVuc3Vic2NyaWJlcyBmcm9tIHNvdXJjZSBtZXNzYWdlLiBTZWUgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgZG9jcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xSZWdleH0gc291cmNlTWVzc2FnZSBzb3VyY2UgbWVzc2FnZSB0byB1bnN1YnNjcmliZSBmcm9tXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHRoaXMuc291cmNlTWVzc2VuZ2VyLm9mZihzb3VyY2VNZXNzYWdlLCB7IGNvbnRleHQ6IHRoaXMsIHN1YnNjcmliZXI6IHRoaXMuZGlzcGF0Y2hNZXNzYWdlIH0pO1xufVxuXG5cbi8qKlxuICogT3ZlcnJpZGVzIGRlZmFsdXQgbWVzc2FnZSBzb3VyY2UgdG8gZGlzcGF0Y2ggbWVzc2FnZXMgc3luY2hyb25vdXNseVxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSRwb3N0TWVzc2FnZShtZXNzYWdlLCBkYXRhKSB7XG4gICAgdGhpcy5tZXNzZW5nZXIucG9zdE1lc3NhZ2VTeW5jKG1lc3NhZ2UsIGRhdGEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogIyMjI01pbG8gcGFja2FnZXMjIyMjXG4gKlxuICogLSBbbWluZGVyXSguL21pbmRlci5qcy5odG1sKSAtIGRhdGEgcmVhY3Rpdml0eSwgb25lIG9yIHR3byB3YXksIHNoYWxsb3cgb3IgZGVlcCwgYXMgeW91IGxpa2UgaXRcbiAqIC0gW2NvbmZpZ10oLi9jb25maWcuanMuaHRtbCkgLSBtaWxvIGNvbmZpZ3VyYXRpb25cbiAqIC0gW3V0aWxdKC4vdXRpbC9pbmRleC5qcy5odG1sKSAtIGxvZ2dlciwgcmVxdWVzdCwgZG9tLCBjaGVjaywgZXJyb3IsIGV0Yy5cbiAqIC0gW2NsYXNzZXNdKC4vY2xhc3Nlcy5qcy5odG1sKSAtIGFic3RyYWN0IGFuZCBiYXNlIGNsYXNzZXNcbiAqIC0gW01lc3Nlbmdlcl0oLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkgLSBnZW5lcmljIE1lc3NlbmdlciB1c2VkIGluIG1vc3Qgb3RoZXIgbWlsbyBjbGFzc2VzLCBjYW4gYmUgbWl4ZWQgaW50byBhcHAgY2xhc3NlcyB0b28uXG4gKiAtIFtNb2RlbF0oLi9tb2RlbC9pbmRleC5qcy5odG1sKSAtIE1vZGVsIGNsYXNzIHRoYXQgZW1pdHMgbWVzc2FnZXMgb24gY2hhbmdlcyB0byBhbnkgZGVwdGggd2l0aG91dCB0aW1lciBiYXNlZCB3YXRjaGluZ1xuICovXG52YXIgbWlsbyA9IHtcbiAgICBtaW5kZXI6IHJlcXVpcmUoJy4vbWluZGVyJyksXG4gICAgY29uZmlnOiByZXF1aXJlKCcuL2NvbmZpZycpLFxuICAgIHV0aWw6IHJlcXVpcmUoJy4vdXRpbCcpLFxuICAgIGNsYXNzZXM6IHJlcXVpcmUoJy4vY2xhc3NlcycpLFxuICAgIE1lc3NlbmdlcjogcmVxdWlyZSgnLi9tZXNzZW5nZXInKSxcbiAgICBNb2RlbDogcmVxdWlyZSgnLi9tb2RlbCcpLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgcHJvdG86IF9cbn07XG5cblxuLy8gZXhwb3J0IGZvciBub2RlL2Jyb3dzZXJpZnlcbmlmICh0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSAgICBcbiAgICBtb2R1bGUuZXhwb3J0cyA9IG1pbG87XG5cbi8vIGdsb2JhbCBtaWxvIGZvciBicm93c2VyXG5pZiAodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JylcbiAgICB3aW5kb3cubWlsbyA9IG1pbG87XG5cblxuZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBtaWxvLm1pbmRlci5kZXN0cm95KCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb25uZWN0b3IgPSByZXF1aXJlKCcuL21vZGVsL2Nvbm5lY3RvcicpXG4gICAgLCBNZXNzZW5nZXIgPSByZXF1aXJlKCcuL21lc3NlbmdlcicpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGxvZ2dlciA9IHJlcXVpcmUoJy4vdXRpbC9sb2dnZXInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbmRlcjtcblxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBvbmUgb3IgbWFueSBDb25uZWN0b3Igb2JqZWN0cyB0aGF0XG4gKiBjcmVhdGUgbGl2ZSByZWFjdGl2ZSBjb25uZWN0aW9uIGJldHdlZW4gb2JqZWN0cyBpbXBsZW1lbnRpbmdcbiAqIGRhdGFTb3VyY2UgaW50ZXJmYWNlOlxuICogT2JqZWN0cyBzaG91bGQgZW1pdCBtZXNzYWdlcyB3aGVuIGFueSBwYXJ0IG9mIHRoZWlyIGRhdGEgY2hhbmdlcyxcbiAqIG1ldGhvZHMgYG9uYCBhbmQgYG9mZmAgc2hvdWxkIGJlIGltcGxlbWVudGVkIHRvIHN1YnNjcmliZS91bnN1YnNjcmliZVxuICogdG8gY2hhbmdlIG5vdGlmaWNhdGlvbiBtZXNzYWdlcywgbWV0aG9kcyBgc2V0YCBhbmQgYGdldGAgc2hvdWxkIGJlIGltcGxlbWVudGVkIHRvIGdldC9zZXQgZGF0YVxuICogb24gcGF0aCBvYmplY3RzLCBwb2ludGluZyB0byBwYXJ0aWN1bGFyIHBhcnRzIG9mIHRoZSBvYmplY3QsIG1ldGhvZCBgcGF0aGBcbiAqIHNob3VsZCByZXR1cm4gcGF0aCBvYmplY3QgZm9yIGEgZ2l2ZW4gcGF0aCBzdHJpbmcgKHNlZSBwYXRoIHV0aWxzIGZvciBwYXRoIHN0cmluZyBzeW50YXgpLlxuICogQm90aCBNb2RlbCBhbmQgRGF0YSBmYWNldCBhcmUgc3VjaCBkYXRhIHNvdXJjZXMsIHRoZXkgY2FuIGJlIGxpbmtlZCBieSBDb25uZWN0b3Igb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkczEgdGhlIGZpcnN0IGRhdGEgc291cmNlLiBJbnN0ZWFkIG9mIHRoZSBmaXJzdCBkYXRhIHNvdXJjZSBhbiBhcnJheSBjYW4gYmUgcGFzc2VkIHdpdGggYXJyYXlzIG9mIENvbm5lY3Rpb24gb2JqZWN0cyBwYXJhbWV0ZXJzIGluIGVhY2ggYXJyYXkgZWxlbWVudC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBtb2RlIHRoZSBjb25uZWN0aW9uIG1vZGUgdGhhdCBkZWZpbmVzIHRoZSBkaXJlY3Rpb24gYW5kIHRoZSBkZXB0aCBvZiBjb25uZWN0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICctPicsICc8PC0nLCAnPDw8LT4+PicsIGV0Yy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBkczIgdGhlIHNlY29uZCBkYXRhIHNvdXJjZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgbm90IGltcGxlbWVudGVkIHlldFxuICovXG5mdW5jdGlvbiBtaW5kZXIoZHMxLCBtb2RlLCBkczIsIG9wdGlvbnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkczEpKSB7XG4gICAgICAgIHZhciBjb25uRGVzY3JpcHRpb25zID0gZHMxO1xuICAgICAgICB2YXIgY29ubmVjdG9ycyA9IGNvbm5EZXNjcmlwdGlvbnMubWFwKGZ1bmN0aW9uKGRlc2NyKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RvcihkZXNjclswXSwgZGVzY3JbMV0sIGRlc2NyWzJdLCBkZXNjclszXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25uZWN0b3JzLmZvckVhY2goX2FkZENvbm5lY3Rvcik7XG4gICAgICAgIHJldHVybiBjb25uZWN0b3JzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBjbmN0ID0gbmV3IENvbm5lY3RvcihkczEsIG1vZGUsIGRzMiwgb3B0aW9ucyk7XG4gICAgICAgIF9hZGRDb25uZWN0b3IoY25jdCk7XG4gICAgICAgIHJldHVybiBjbmN0O1xuICAgIH1cbn1cblxuXG4vKipcbiAqIG1lc3NlbmdlciBvZiBtaW5kZXIgd2hlcmUgaXQgZW1pdHMgZXZlbnRzIHJlbGF0ZWQgdG8gYWxsIGNvbm5lY3RvcnNcbiAqIEB0eXBlIHtNZXNzZW5nZXJ9XG4gKi9cbnZhciBfbWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtaW5kZXIsIE1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcyk7XG5cblxudmFyIF9jb25uZWN0b3JzID0gW11cbiAgICAsIF9yZWNlaXZlZE1lc3NhZ2VzID0gW11cbiAgICAsIF9pc1Byb3BhZ2F0aW5nID0gZmFsc2U7XG5cblxuXy5leHRlbmQobWluZGVyLCB7XG4gICAgZ2V0Q29ubmVjdG9yczogbWluZGVyX2dldENvbm5lY3RvcnMsXG4gICAgZ2V0RXhwYW5kZWRDb25uZWN0aW9uczogbWluZGVyX2dldEV4cGFuZGVkQ29ubmVjdGlvbnMsXG4gICAgaXNQcm9wYWdhdGluZzogbWluZGVyX2lzUHJvcGFnYXRpbmcsXG4gICAgd2hlblByb3BhZ2F0aW9uQ29tcGxldGVkOiBtaW5kZXJfd2hlblByb3BhZ2F0aW9uQ29tcGxldGVkLFxuICAgIGRlc3Ryb3lDb25uZWN0b3I6IG1pbmRlcl9kZXN0cm95Q29ubmVjdG9yLFxuICAgIGRlc3Ryb3k6IG1pbmRlcl9kZXN0cm95XG59KTtcblxuXG5mdW5jdGlvbiBfYWRkQ29ubmVjdG9yKGNuY3QpIHtcbiAgICBjbmN0Ll9fX21pbmRlcl9pZCA9IF9jb25uZWN0b3JzLnB1c2goY25jdCkgLSAxO1xuICAgIGNuY3Qub24oLy4qLywgb25Db25uZWN0b3JNZXNzYWdlKTtcbiAgICBtaW5kZXIucG9zdE1lc3NhZ2UoJ2FkZGVkJywgeyBjb25uZWN0b3I6IGNuY3QgfSk7XG4gICAgbWluZGVyLnBvc3RNZXNzYWdlKCd0dXJuZWRvbicsIHsgY29ubmVjdG9yOiBjbmN0IH0pO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ29ubmVjdG9yTWVzc2FnZShtc2csIGRhdGEpIHtcbiAgICB2YXIgZGF0YSA9IGRhdGEgPyBfLmNsb25lKGRhdGEpIDoge307XG4gICAgXy5leHRlbmQoZGF0YSwge1xuICAgICAgICBpZDogdGhpcy5fX19taW5kZXJfaWQsXG4gICAgICAgIGNvbm5lY3RvcjogdGhpc1xuICAgIH0pO1xuICAgIG1pbmRlci5wb3N0TWVzc2FnZShtc2csIGRhdGEpO1xuICAgIGlmICghIF9yZWNlaXZlZE1lc3NhZ2VzLmxlbmd0aCAmJiAhIF9pc1Byb3BhZ2F0aW5nKSB7XG4gICAgICAgIF8uZGVmZXIoX2lkbGVDaGVjayk7XG4gICAgICAgIF9pc1Byb3BhZ2F0aW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfcmVjZWl2ZWRNZXNzYWdlcy5wdXNoKHsgbXNnOiBtc2csIGRhdGE6IGRhdGEgfSk7XG59XG5cblxuZnVuY3Rpb24gX2lkbGVDaGVjaygpIHtcbiAgICBpZiAoX3JlY2VpdmVkTWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICAgIF9yZWNlaXZlZE1lc3NhZ2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIF8uZGVmZXIoX2lkbGVDaGVjayk7XG4gICAgICAgIG1pbmRlci5wb3N0TWVzc2FnZSgncHJvcGFnYXRpb250aWNrZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfaXNQcm9wYWdhdGluZyA9IGZhbHNlO1xuICAgICAgICBtaW5kZXIucG9zdE1lc3NhZ2UoJ3Byb3BhZ2F0aW9uY29tcGxldGVkJyk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9pc1Byb3BhZ2F0aW5nKCkge1xuICAgIHJldHVybiBfaXNQcm9wYWdhdGluZztcbn1cblxuXG5mdW5jdGlvbiBtaW5kZXJfd2hlblByb3BhZ2F0aW9uQ29tcGxldGVkKGNhbGxiYWNrKSB7XG4gICAgaWYgKF9pc1Byb3BhZ2F0aW5nKVxuICAgICAgICBtaW5kZXIub25jZSgncHJvcGFnYXRpb25jb21wbGV0ZWQnLCBleGVjdXRlQ2FsbGJhY2spO1xuICAgIGVsc2VcbiAgICAgICAgXy5kZWZlcihleGVjdXRlQ2FsbGJhY2spO1xuXG4gICAgZnVuY3Rpb24gZXhlY3V0ZUNhbGxiYWNrKCkge1xuICAgICAgICBpZiAoX2lzUHJvcGFnYXRpbmcpXG4gICAgICAgICAgICBtaW5kZXIub25jZSgncHJvcGFnYXRpb25jb21wbGV0ZWQnLCBleGVjdXRlQ2FsbGJhY2spO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBtaW5kZXJfZ2V0Q29ubmVjdG9ycyhvbk9mZikge1xuICAgIGlmICh0eXBlb2Ygb25PZmYgPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHJldHVybiBfY29ubmVjdG9ycztcblxuICAgIHJldHVybiBfY29ubmVjdG9ycy5maWx0ZXIoZnVuY3Rpb24oY25jdCkge1xuICAgICAgICByZXR1cm4gY25jdC5pc09uID09PSBvbk9mZjtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBtaW5kZXJfZGVzdHJveUNvbm5lY3RvcihjbmN0KSB7XG4gICAgY25jdC5kZXN0cm95KCk7XG4gICAgdmFyIGluZGV4ID0gX2Nvbm5lY3RvcnMuaW5kZXhPZihjbmN0KTtcbiAgICBpZiAoaW5kZXggPj0gMClcbiAgICAgICAgZGVsZXRlIF9jb25uZWN0b3JzW2luZGV4XTtcbiAgICBlbHNlXG4gICAgICAgIGxvZ2dlci53YXJuKCdtaW5kZXI6IGNvbm5lY3RvciBkZXN0cm95ZWQgdGhhdCBpcyBub3QgcmVnaXN0ZXJlZCBpbiBtaW5kZXInKTtcbn1cblxuXG5mdW5jdGlvbiBtaW5kZXJfZ2V0RXhwYW5kZWRDb25uZWN0aW9ucyhvbk9mZiwgc2VhcmNoU3RyKSB7XG4gICAgdmFyIGNvbm5lY3RvcnMgPSBtaW5kZXIuZ2V0Q29ubmVjdG9ycyhvbk9mZik7XG4gICAgdmFyIGNvbm5lY3Rpb25zID0gIGNvbm5lY3RvcnMubWFwKGZ1bmN0aW9uKGNuY3QpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSB7XG4gICAgICAgICAgICBsZWZ0U291cmNlOiBfZ2V0RXhwYW5kZWRTb3VyY2UoY25jdC5kczEpLFxuICAgICAgICAgICAgcmlnaHRTb3VyY2U6IF9nZXRFeHBhbmRlZFNvdXJjZShjbmN0LmRzMiksXG4gICAgICAgICAgICBtb2RlOiBjbmN0Lm1vZGUsXG4gICAgICAgICAgICBpc09uOiBjbmN0LmlzT25cbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGlmIChjbmN0Lm9wdGlvbnMpXG4gICAgICAgICAgICBjb25uZWN0aW9uLm9wdGlvbnMgPSBjbmN0Lm9wdGlvbnM7XG5cbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgfSk7XG5cbiAgICBpZiAoc2VhcmNoU3RyKVxuICAgICAgICBjb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zLmZpbHRlcihmdW5jdGlvbihjbmN0bikge1xuICAgICAgICAgICAgcmV0dXJuIF9zb3VyY2VNYXRjaGVzU3RyaW5nKGNuY3RuLmxlZnRTb3VyY2UsIHNlYXJjaFN0cilcbiAgICAgICAgICAgICAgICAgICAgfHwgX3NvdXJjZU1hdGNoZXNTdHJpbmcoY25jdG4ucmlnaHRTb3VyY2UsIHNlYXJjaFN0cik7XG4gICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25zO1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRFeHBhbmRlZFNvdXJjZShkcykge1xuICAgIHZhciBzb3VyY2UgPSBbXTtcbiAgICBpZiAodHlwZW9mIGRzID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGRzLl9tb2RlbCAmJiBkcy5fYWNjZXNzUGF0aCkge1xuICAgICAgICAgICAgc291cmNlLnVuc2hpZnQoZHMuX2FjY2Vzc1BhdGgpO1xuICAgICAgICAgICAgZHMgPSBkcy5fbW9kZWw7XG4gICAgICAgIH1cblxuICAgICAgICBzb3VyY2UudW5zaGlmdChkcyk7XG4gICAgICAgIGRzID0gZHMuX2hvc3RPYmplY3Q7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkcyA9PSAnb2JqZWN0Jykge1xuICAgICAgICBzb3VyY2UudW5zaGlmdChkcyk7XG5cbiAgICAgICAgaWYgKGRzLm93bmVyKVxuICAgICAgICAgICAgc291cmNlLnVuc2hpZnQoZHMub3duZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2U7XG59XG5cblxuZnVuY3Rpb24gX3NvdXJjZU1hdGNoZXNTdHJpbmcoc291cmNlLCBtYXRjaFN0cikge1xuICAgIHJldHVybiBzb3VyY2Uuc29tZShmdW5jdGlvbihzcmNOb2RlKSB7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSBzcmNOb2RlLmNvbnN0cnVjdG9yICYmIHNyY05vZGUuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgcmV0dXJuIF9zdHJpbmdNYXRjaChjbGFzc05hbWUsIG1hdGNoU3RyKVxuICAgICAgICAgICAgICAgIHx8IF9zdHJpbmdNYXRjaChzcmNOb2RlLm5hbWUsIG1hdGNoU3RyKVxuICAgICAgICAgICAgICAgIHx8IF9zdHJpbmdNYXRjaChzcmNOb2RlLCBtYXRjaFN0cik7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX3N0cmluZ01hdGNoKHN0ciwgc3Vic3RyKSB7XG4gICAgcmV0dXJuIHN0ciAmJiB0eXBlb2Ygc3RyID09ICdzdHJpbmcnICYmIHN0ci5pbmRleE9mKHN1YnN0cikgPj0gMDtcbn1cblxuXG5mdW5jdGlvbiBtaW5kZXJfZGVzdHJveSgpIHtcbiAgICBfY29ubmVjdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKGNuY3QpIHtcbiAgICAgICAgZGVzdHJveURTKGNuY3QuZHMxKTtcbiAgICAgICAgZGVzdHJveURTKGNuY3QuZHMyKTtcbiAgICAgICAgY25jdC5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgX21lc3Nlbmdlci5kZXN0cm95KCk7XG4gICAgbWluZGVyLl9kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgZnVuY3Rpb24gZGVzdHJveURTKGRzKSB7XG4gICAgICAgIGlmIChkcyAmJiAhZHMuX2Rlc3Ryb3llZCkgZHMuZGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBwcm9jZXNzIFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2VzIGVtaXR0ZWQgYnkgQ29ubmVjdG9yIG9iamVjdC5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBjaGFuZ2VEYXRhSGFuZGxlcjtcblxuXG5fLmV4dGVuZChjaGFuZ2VEYXRhSGFuZGxlciwge1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZzogc2V0VHJhbnNhY3Rpb25GbGFnLFxuICAgIGdldFRyYW5zYWN0aW9uRmxhZzogZ2V0VHJhbnNhY3Rpb25GbGFnLFxuICAgIHBhc3NUcmFuc2FjdGlvbkZsYWc6IHBhc3NUcmFuc2FjdGlvbkZsYWcsXG4gICAgcG9zdFRyYW5zYWN0aW9uRmluaXNoZWQ6IHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkXG59KTtcblxuXG4vKipcbiAqIENoYW5nZSBkYXRhIHVzZXMgaGlkZGVuIHByb3BlcnR5IG9uIGFjY2Vzc29yIG1ldGhvZHMgdG8gcGFzcyBmbGFnIHRoYXQgdGhlIGFjY2Vzc29yIGlzIGV4ZWN1dGVkIGFzIGEgcGFydCBvZiBjaGFuZ2UgdHJhbnNhY3Rpb24uXG4gKiBBY2Nlc3NvciBtZXRob2RzIGFyZSBzdXBwb3NlZCB0byBzdG9yZSB0aGlzIGZsYWcgaW4gYSBsb2NhbCB2YXJpYWJsZSBhbmQgdG8gY2xlYXIgaXQgKGJlY2F1c2UgYW5vdGhlciBhY2Nlc3NvciBjYW4gYmUgZXhlY3V0ZWQgaW4gb3Igb3V0IG9mIHRyYW5zYWN0aW9uKSB1c2luZyBgZ2V0VHJhbnNhY3Rpb25GbGFnYFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGFjY2Vzc29yIG1ldGhvZCByZWZlcmVuY2VcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZmxhZyBhIGZsYWcgdG8gYmUgc2V0XG4gKi9cbmZ1bmN0aW9uIHNldFRyYW5zYWN0aW9uRmxhZyhmdW5jLCBmbGFnKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eShmdW5jLCAnX19pbkNoYW5nZVRyYW5zYWN0aW9uJywgZmxhZywgXy5DT05GIHwgXy5XUklUKTtcbn1cblxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgY2xlYXJzIHRyYW5zYWN0aW9uIGZsYWcgZnJvbSBhY2Nlc3NvciBtZXRob2RcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBhY2Nlc3NvciBtZXRob2QgcmVmZXJlbmNlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkZsYWcoZnVuYykge1xuICAgIHZhciBpblRyYW5zYWN0aW9uID0gZnVuYy5fX2luQ2hhbmdlVHJhbnNhY3Rpb247XG4gICAgZGVsZXRlIGZ1bmMuX19pbkNoYW5nZVRyYW5zYWN0aW9uO1xuICAgIHJldHVybiBpblRyYW5zYWN0aW9uO1xufVxuXG5cbmZ1bmN0aW9uIHBhc3NUcmFuc2FjdGlvbkZsYWcoZnJvbUZ1bmMsIHRvRnVuYykge1xuICAgIHZhciBpblRyYW5zYWN0aW9uID0gZ2V0VHJhbnNhY3Rpb25GbGFnKGZyb21GdW5jKTtcbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcodG9GdW5jLCBpblRyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gaW5UcmFuc2FjdGlvbjtcbn1cblxuXG4vKipcbiAqIFBvc3RzIG1lc3NhZ2Ugb24gdGhpcyB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRyYW5zYWN0aW9uIHVubGVzcyBgaW5DaGFuZ2VUcmFuc2FjdGlvbmAgaXMgYHRydWVgLlxuICovXG5mdW5jdGlvbiBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZCgpIHtcbiAgICB0aGlzLnBvc3RNZXNzYWdlU3luYygnZGF0YWNoYW5nZXMnLCB7IHRyYW5zYWN0aW9uOiBmYWxzZSwgY2hhbmdlczogW10gfSk7XG59XG5cblxuLyoqXG4gKiBzdWJzY3JpYmVyIHRvIFwiY2hhbmdlZGF0YVwiIGV2ZW50IGVtaXR0ZWQgYnkgW0Nvbm5lY3Rvcl0oLi9jb25uZWN0b3IuanMuaHRtbCkgb2JqZWN0IHRvIGVuYWJsZSByZWFjdGl2ZSBjb25uZWN0aW9uc1xuICogVXNlZCBieSBEYXRhIGZhY2V0LCBNb2RlbCBhbmQgTW9kZWxQYXRoLiBDYW4gYmUgdXNlZCBieSBhbnkgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBnZXQvc2V0L2RlbC9zcGxpY2UgYXBpIGFuZCBzZXRzIGRhdGEgZGVlcGx5IHRvIHRoZSB3aG9sZSB0cmVlLlxuICogT2JqZWN0IHNob3VsZCBjYWxsIGBjaGFuZ2VEYXRhSGFuZGxlci5pbml0aWFsaXplLmNhbGwodGhpcylgIGluIGl0cyBjb25zdHJ1Y3Rvci5cbiAqIFRPRE86IG9wdGltaXplIG1lc3NhZ2VzIGxpc3QgdG8gYXZvaWQgc2V0dGluZyBkdXBsaWNhdGUgdmFsdWVzIGRvd24gdGhlIHRyZWVcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIHNob3VsZCBiZSBcImNoYW5nZWRhdGFcIiBoZXJlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSBiYXRjaCBvZiBkYXRhIGNoYW5nZSBkZXNjaXB0aW9uIG9iamVjdHNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNhbGxiYWNrIHRvIGNhbGwgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGF0YSBpcyBwcm9jZXNzZWRcbiAqL1xuZnVuY3Rpb24gY2hhbmdlRGF0YUhhbmRsZXIobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2spIHtcbiAgICBwcm9jZXNzQ2hhbmdlcy5jYWxsKHRoaXMsIGRhdGEuY2hhbmdlcywgY2FsbGJhY2spO1xufVxuXG5cbi8vIG1hcCBvZiBtZXNzYWdlIHR5cGVzIHRvIG1ldGhvZHNcbnZhciBDSEFOR0VfVFlQRV9UT19NRVRIT0RfTUFQID0ge1xuICAgICdhZGRlZCc6ICAgJ3NldCcsXG4gICAgJ2NoYW5nZWQnOiAnc2V0JyxcbiAgICAnZGVsZXRlZCc6ICdkZWwnLFxuICAgICdyZW1vdmVkJzogJ2RlbCdcbn07XG5cblxuLyoqXG4gKiBQcm9jZXNzZXMgcXVldWVkIFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2VzLlxuICogUG9zdHMgXCJjaGFuZ2VzdGFydGVkXCIgYW5kIFwiY2hhbmdlY29tcGxldGVkXCIgbWVzc2FnZXMgYW5kIGNhbGxzIGNhbGxiYWNrXG4gKlxuICogQHBhcmFtIHtbRnVuY3Rpb25dfSBjYWxsYmFjayBvcHRpb25hbCBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aXRoIGAobnVsbCwgZmFsc2UpYCBwYXJhbWV0ZXJzIGJlZm9yZSBjaGFuZ2UgcHJvY2Vzc2luZyBzdGFydHMgYW5kIGAobnVsbCwgdHJ1ZSlgIGFmdGVyIGl0J3MgZmluaXNoZWQuXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDaGFuZ2VzKHRyYW5zYWN0aW9uLCBjYWxsYmFjaykge1xuICAgIG5vdGlmeS5jYWxsKHRoaXMsIGNhbGxiYWNrLCBmYWxzZSk7XG4gICAgcHJvY2Vzc1RyYW5zYWN0aW9uLmNhbGwodGhpcyxcbiAgICAgICAgcHJlcGFyZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAgdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikpKTtcbiAgICBub3RpZnkuY2FsbCh0aGlzLCBjYWxsYmFjaywgdHJ1ZSk7XG59XG5cblxuZnVuY3Rpb24gbm90aWZ5KGNhbGxiYWNrLCBjaGFuZ2VGaW5pc2hlZCkge1xuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwsIGNoYW5nZUZpbmlzaGVkKTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKGNoYW5nZUZpbmlzaGVkID8gJ2NoYW5nZWNvbXBsZXRlZCcgOiAnY2hhbmdlc3RhcnRlZCcpO1xufVxuXG5cbi8qKlxuICogQ2hlY2tzIHRoYXQgYWxsIG1lc3NhZ2VzIGZyb20gdGhlIHRyYW5zYWN0aW9uIGNvbWUgZnJvbSB0aGUgc2FtZSBzb3VyY2UuXG4gKiBIYWNrOiByZXZlcnNlcyB0aGUgdHJhbnNhY3Rpb24gaWYgaXQgY29tZXMgZnJvbSB0aGUgRGF0YSBmYWNldFxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIHRoZSB0cmFuc2FjdGlvbiAoZm9yIGNoYWluaW5nKVxuICogXG4gKiBAcGFyYW0gIHtBcnJheX0gdHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gb2YgZGF0YSBjaGFuZ2VzXG4gKiBAcmV0dXJuIHtBcnJheX0gXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICB2YXIgc291cmNlID0gdHJhbnNhY3Rpb25bMF0uc291cmNlXG4gICAgICAgICwgc2FtZVNvdXJjZSA9IHRydWU7XG5cbiAgICBpZiAodHJhbnNhY3Rpb24ubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMSwgbGVuID0gdHJhbnNhY3Rpb24ubGVuZ3RoOyBpIDwgbGVuOyBpKyspXG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25baV0uc291cmNlICE9IHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignY2hhbmdlZGF0YTogY2hhbmdlcyBmcm9tIGRpZmZlcmVudCBzb3VyY2VzIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLCBzb3VyY2VzOicsIHRyYW5zYWN0aW9uW2ldLnNvdXJjZS5uYW1lLCBzb3VyY2UubmFtZSk7XG4gICAgICAgICAgICAgICAgc2FtZVNvdXJjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHNvdXJjZSA9IHRyYW5zYWN0aW9uW2ldLnNvdXJjZTtcbiAgICAgICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XG59XG5cblxuZnVuY3Rpb24gcHJlcGFyZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdmFyIHRvZG8gPSBbXVxuICAgICAgICAsIHBhdGhzVG9TcGxpY2UgPSBbXVxuICAgICAgICAsIHBhdGhzVG9DaGFuZ2UgPSBbXVxuICAgICAgICAsIGhhZFNwbGljZVxuICAgICAgICAsIGV4aXRMb29wID0ge307XG5cblxuICAgIHRyeSB7IHRyYW5zYWN0aW9uLmZvckVhY2goY2hlY2tDaGFuZ2UpOyB9XG4gICAgY2F0Y2ggKGUpIHsgaWYgKGUgIT0gZXhpdExvb3ApIHRocm93IGU7IH1cblxuICAgIHJldHVybiB0b2RvO1xuXG5cbiAgICBmdW5jdGlvbiBjaGVja0NoYW5nZShkYXRhKSB7XG4gICAgICAgIChkYXRhLnR5cGUgPT0gJ3NwbGljZScgPyBjaGVja1NwbGljZSA6IGNoZWNrTWV0aG9kKShkYXRhKTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNoZWNrU3BsaWNlKGRhdGEpIHtcbiAgICAgICAgdmFyIHBhcnNlZFBhdGggPSBwYXRoVXRpbHMucGFyc2VBY2Nlc3NQYXRoKGRhdGEucGF0aCk7XG4gICAgICAgIHZhciBwYXJlbnRQYXRoQ2hhbmdlZCA9IHBhdGhzVG9DaGFuZ2Uuc29tZShmdW5jdGlvbihwYXJlbnRQYXRoKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VkUGF0aC5sZW5ndGggPCBwYXJlbnRQYXRoLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIF9wYXRoSXNQYXJlbnRPZihwYXJlbnRQYXRoLCBwYXJzZWRQYXRoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBhcmVudFBhdGhDaGFuZ2VkKSByZXR1cm47XG5cbiAgICAgICAgdG9kby5wdXNoKGRhdGEpO1xuXG4gICAgICAgIGlmICghIGNvbmZpZy5kZWJ1ZykgdGhyb3cgZXhpdExvb3A7XG4gICAgICAgIHBhdGhzVG9TcGxpY2UucHVzaChwYXJzZWRQYXRoKTtcbiAgICAgICAgaGFkU3BsaWNlID0gdHJ1ZTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNoZWNrTWV0aG9kKGRhdGEpIHtcbiAgICAgICAgdmFyIHBhcnNlZFBhdGggPSBwYXRoVXRpbHMucGFyc2VBY2Nlc3NQYXRoKGRhdGEucGF0aCk7XG4gICAgICAgIHZhciBwYXJlbnRQYXRoU3BsaWNlZCA9IHBhdGhzVG9TcGxpY2UgJiYgcGF0aHNUb1NwbGljZS5zb21lKGZ1bmN0aW9uKHBhcmVudFBhdGgpIHtcbiAgICAgICAgICAgIGlmIChwYXJzZWRQYXRoLmxlbmd0aCA8PSBwYXJlbnRQYXRoLmxlbmd0aFxuICAgICAgICAgICAgICAgIHx8IHBhcnNlZFBhdGhbcGFyZW50UGF0aC5sZW5ndGhdLnN5bnRheCAhPSAnYXJyYXknKSByZXR1cm47XG4gICAgICAgICAgICByZXR1cm4gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIHBhcnNlZFBhdGgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGFyZW50UGF0aFNwbGljZWQpIHJldHVybjtcbiAgICAgICAgaWYgKGhhZFNwbGljZSkgbG9nZ2VyLmVycm9yKCdjaGFuZ2VkYXRhOiBjaGlsZCBjaGFuZ2UgaXMgZXhlY3V0ZWQgYWZ0ZXIgc3BsaWNlOyBwcm9iYWJseSBkYXRhIHNvdXJjZSBkaWQgbm90IGVtaXQgbWVzc2FnZSB3aXRoIGRhdGEudHlwZT09XCJmaW5pc2hlZFwiJyk7XG5cbiAgICAgICAgdmFyIHBhcmVudFBhdGhDaGFuZ2VkID0gcGF0aHNUb0NoYW5nZS5zb21lKGZ1bmN0aW9uKHBhcmVudFBhdGgpIHtcbiAgICAgICAgICAgIGlmIChwYXJzZWRQYXRoLmxlbmd0aCA8PSBwYXJlbnRQYXRoLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIF9wYXRoSXNQYXJlbnRPZihwYXJlbnRQYXRoLCBwYXJzZWRQYXRoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBhcmVudFBhdGhDaGFuZ2VkKSByZXR1cm47XG5cbiAgICAgICAgcGF0aHNUb0NoYW5nZS5wdXNoKHBhcnNlZFBhdGgpO1xuXG4gICAgICAgIHRvZG8ucHVzaChkYXRhKTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIF9wYXRoSXNQYXJlbnRPZihwYXJlbnRQYXRoLCBjaGlsZFBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudFBhdGguZXZlcnkoZnVuY3Rpb24ocGF0aE5vZGUsIGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aE5vZGUucHJvcGVydHkgPT0gY2hpbGRQYXRoW2luZGV4XS5wcm9wZXJ0eTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIHByb2Nlc3NUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgIHRyYW5zYWN0aW9uLmZvckVhY2gocHJvY2Vzc0NoYW5nZSwgdGhpcyk7XG4gICAgcG9zdFRyYW5zYWN0aW9uRmluaXNoZWQuY2FsbCh0aGlzLCBmYWxzZSk7XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQ2hhbmdlKGRhdGEpIHtcbiAgICAgICAgdmFyIG1vZGVsUGF0aCA9IHRoaXMucGF0aChkYXRhLnBhdGgsIGRhdGEudHlwZSAhPSAncmVtb3ZlZCcgJiYgZGF0YS50eXBlICE9ICdkZWxldGVkJyk7XG4gICAgICAgIGlmICghIG1vZGVsUGF0aCkgcmV0dXJuO1xuICAgICAgICAoZGF0YS50eXBlID09ICdzcGxpY2UnID8gZXhlY3V0ZVNwbGljZSA6IGV4ZWN1dGVNZXRob2QpKG1vZGVsUGF0aCwgZGF0YSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIGV4ZWN1dGVTcGxpY2UobW9kZWxQYXRoLCBkYXRhKSB7XG4gICAgdmFyIGluZGV4ID0gZGF0YS5pbmRleFxuICAgICAgICAsIGhvd01hbnkgPSBkYXRhLnJlbW92ZWQubGVuZ3RoXG4gICAgICAgICwgc3BsaWNlQXJncyA9IFtpbmRleCwgaG93TWFueV07XG5cbiAgICBzcGxpY2VBcmdzID0gc3BsaWNlQXJncy5jb25jYXQoZGF0YS5uZXdWYWx1ZS5zbGljZShpbmRleCwgaW5kZXggKyBkYXRhLmFkZGVkQ291bnQpKTtcbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcobW9kZWxQYXRoLnNwbGljZSwgdHJ1ZSk7XG4gICAgbW9kZWxQYXRoLnNwbGljZS5hcHBseShtb2RlbFBhdGgsIHNwbGljZUFyZ3MpO1xufVxuXG5cbmZ1bmN0aW9uIGV4ZWN1dGVNZXRob2QobW9kZWxQYXRoLCBkYXRhKSB7XG4gICAgdmFyIG1ldGhvZE5hbWUgPSBDSEFOR0VfVFlQRV9UT19NRVRIT0RfTUFQW2RhdGEudHlwZV07XG4gICAgaWYgKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1vZGVsUGF0aFttZXRob2ROYW1lXSwgdHJ1ZSk7XG4gICAgICAgIG1vZGVsUGF0aFttZXRob2ROYW1lXShkYXRhLm5ld1ZhbHVlKTtcbiAgICB9IGVsc2VcbiAgICAgICAgbG9nZ2VyLmVycm9yKCd1bmtub3duIGRhdGEgY2hhbmdlIHR5cGUnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4uL21lc3NlbmdlcicpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQ29ubmVjdG9yO1xuXG5cbnZhciBtb2RlUGF0dGVybiA9IC9eKFxcPCopXFwtKyhcXD4qKSQvO1xuXG5cbi8qKlxuICogQ29ubmVjdG9yXG4gKiBDbGFzcyB0aGF0IGNyZWF0ZXMgY29ubmVjdG9yIG9iamVjdCBmb3IgZGF0YSBjb25uZWN0aW9uIGJldHdlZW5cbiAqIHR3byBkYXRhLXNvdXJjZXNcbiAqIERhdGEtc291cmNlcyBzaG91bGQgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgQVBJOlxuICogZ2V0KCkgLSBnZXQgdmFsdWUgZnJvbSBkYXRhc291cmNlIG9yIGl0cyBwYXRoXG4gKiBzZXQodmFsdWUpIC0gc2V0IHZhbHVlIHRvIGRhdGFzb3VyY2Ugb3IgdG8gaXRzIHBhdGhcbiAqIG9uKHBhdGgsIHN1YnNjcmliZXIpIC0gc3Vic2NyaXB0aW9uIHRvIGRhdGEgY2hhbmdlcyB3aXRoIFwiKlwiIHN1cHBvcnRcbiAqIG9mZihwYXRoLCBzdWJzY3JpYmVyKVxuICogcGF0aChhY2Nlc3NQYXRoKSAtIHRvIHJldHVybiB0aGUgb2JqZWN0IHRoYXQgZ2l2ZXMgcmVmZXJlbmNlIHRvIHNvbWUgcGFydCBvZiBkYXRhc291cmNlXG4gKiBhbmQgY29tcGxpZXMgd2l0aCB0aGF0IGFwaSB0b28uXG4gKlxuICogIyMjI0V2ZW50cyMjIyNcbiAqXG4gKiAtICd0dXJuZWRvbicgLSBjb25uZWN0b3Igd2FzIHR1cm5lZCBvblxuICogLSAndHVybmVkb2ZmJyAtIGNvbm5lY3RvciB3YXMgdHVybmVkIG9mZlxuICogLSAnY2hhbmdlc3RhcnRlZCcgLSBjaGFuZ2Ugb24gY29ubmVjdGVkIGRhdGFzb3VyY2UgaXMgc3RhcnRlZFxuICogLSAnY2hhbmdlY29tcGxldGVkJyAtIGNoYW5nZSBvbiBjb25uZWN0ZWQgZGF0YXNvdXJjZSBpcyBjb21wbGV0ZWRcbiAqIC0gJ2Rlc3Ryb3llZCcgLSBjb25uZWN0b3Igd2FzIGRlc3Ryb3llZFxuICogXG4gKiBAcGFyYW0ge09iamVjdH0gZHMxIHRoZSBmaXJzdCBkYXRhIHNvdXJjZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBtb2RlIHRoZSBjb25uZWN0aW9uIG1vZGUgdGhhdCBkZWZpbmVzIHRoZSBkaXJlY3Rpb24gYW5kIHRoZSBkZXB0aCBvZiBjb25uZWN0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICctPicsICc8PC0nLCAnPDw8LT4+PicsIGV0Yy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBkczIgdGhlIHNlY29uZCBkYXRhIHNvdXJjZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgbm90IGltcGxlbWVudGVkIHlldFxuICogQHJldHVybiB7Q29ubmVjdG9yfSB3aGVuIGNhbGxlZCB3aXRoIGBuZXdgLCBjcmVhdGVzIGEgQ29ubmVjdG9yIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gQ29ubmVjdG9yKGRzMSwgbW9kZSwgZHMyLCBvcHRpb25zKSB7XG4gICAgc2V0dXBNb2RlLmNhbGwodGhpcywgbW9kZSk7XG5cbiAgICBfLmV4dGVuZCh0aGlzLCB7XG4gICAgICAgIGRzMTogZHMxLFxuICAgICAgICBkczI6IGRzMixcbiAgICAgICAgaXNPbjogZmFsc2UsXG4gICAgICAgIF9jaGFuZ2VzUXVldWUxOiBbXSxcbiAgICAgICAgX2NoYW5nZXNRdWV1ZTI6IFtdLFxuICAgICAgICBfbWVzc2VuZ2VyOiBuZXcgTWVzc2VuZ2VyKHRoaXMsIE1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcylcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAgICAgdmFyIHBhdGhUcmFuc2xhdGlvbiA9IG9wdGlvbnMucGF0aFRyYW5zbGF0aW9uO1xuICAgICAgICBpZiAocGF0aFRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICBwYXRoVHJhbnNsYXRpb24gPSBfLmNsb25lKHBhdGhUcmFuc2xhdGlvbik7XG4gICAgICAgICAgICB2YXIgcGF0dGVyblRyYW5zbGF0aW9uID0gZ2V0UGF0dGVyblRyYW5zbGF0aW9ucyhwYXRoVHJhbnNsYXRpb24pO1xuICAgICAgICAgICAgXy5leHRlbmQodGhpcywge1xuICAgICAgICAgICAgICAgIHBhdGhUcmFuc2xhdGlvbjE6IHJldmVyc2VUcmFuc2xhdGlvblJ1bGVzKHBhdGhUcmFuc2xhdGlvbiksXG4gICAgICAgICAgICAgICAgcGF0aFRyYW5zbGF0aW9uMjogcGF0aFRyYW5zbGF0aW9uLFxuICAgICAgICAgICAgICAgIHBhdHRlcm5UcmFuc2xhdGlvbjE6IHJldmVyc2VQYXR0ZXJuVHJhbnNsYXRpb25SdWxlcyhwYXR0ZXJuVHJhbnNsYXRpb24pLFxuICAgICAgICAgICAgICAgIHBhdHRlcm5UcmFuc2xhdGlvbjI6IHBhdHRlcm5UcmFuc2xhdGlvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGF0YVRyYW5zbGF0aW9uID0gb3B0aW9ucy5kYXRhVHJhbnNsYXRpb247XG4gICAgICAgIGlmIChkYXRhVHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIF8uZXh0ZW5kKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBkYXRhVHJhbnNsYXRpb24xOiBkYXRhVHJhbnNsYXRpb25bJzwtJ10sXG4gICAgICAgICAgICAgICAgZGF0YVRyYW5zbGF0aW9uMjogZGF0YVRyYW5zbGF0aW9uWyctPiddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXRhVmFsaWRhdGlvbiA9IG9wdGlvbnMuZGF0YVZhbGlkYXRpb247XG4gICAgICAgIGlmIChkYXRhVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgXy5leHRlbmQodGhpcywge1xuICAgICAgICAgICAgICAgIGRhdGFWYWxpZGF0aW9uMTogZGF0YVZhbGlkYXRpb25bJzwtJ10sXG4gICAgICAgICAgICAgICAgZGF0YVZhbGlkYXRpb24yOiBkYXRhVmFsaWRhdGlvblsnLT4nXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnR1cm5PbigpO1xufVxuXG5cbmZ1bmN0aW9uIHNldHVwTW9kZShtb2RlKXtcbiAgICB2YXIgcGFyc2VkTW9kZSA9IG1vZGUubWF0Y2gobW9kZVBhdHRlcm4pO1xuXG4gICAgaWYgKCEgcGFyc2VkTW9kZSlcbiAgICAgICAgbW9kZVBhcnNlRXJyb3IoKTtcblxuICAgIHZhciBkZXB0aDEgPSBwYXJzZWRNb2RlWzFdLmxlbmd0aFxuICAgICAgICAsIGRlcHRoMiA9IHBhcnNlZE1vZGVbMl0ubGVuZ3RoO1xuXG4gICAgaWYgKGRlcHRoMSAmJiBkZXB0aDIgJiYgZGVwdGgxICE9IGRlcHRoMilcbiAgICAgICAgbW9kZVBhcnNlRXJyb3IoKTtcblxuICAgIGlmICghIGRlcHRoMSAmJiAhIGRlcHRoMilcbiAgICAgICAgbW9kZVBhcnNlRXJyb3IoKTtcblxuICAgIF8uZXh0ZW5kKHRoaXMsIHtcbiAgICAgICAgbW9kZTogbW9kZSxcbiAgICAgICAgZGVwdGgxOiBkZXB0aDEsXG4gICAgICAgIGRlcHRoMjogZGVwdGgyLFxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gbW9kZVBhcnNlRXJyb3IoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBDb25uZWN0b3IgbW9kZTogJyArIG1vZGUpO1xuICAgIH1cbn1cblxuXG5fLmV4dGVuZFByb3RvKENvbm5lY3Rvciwge1xuICAgIHR1cm5PbjogQ29ubmVjdG9yJHR1cm5PbixcbiAgICB0dXJuT2ZmOiBDb25uZWN0b3IkdHVybk9mZixcbiAgICBkZXN0cm95OiBDb25uZWN0b3IkZGVzdHJveSxcbiAgICBjaGFuZ2VNb2RlOiBDb25uZWN0b3IkY2hhbmdlTW9kZSxcbiAgICBkZWZlckNoYW5nZU1vZGU6IENvbm5lY3RvciRkZWZlckNoYW5nZU1vZGVcbn0pO1xuXG4vKipcbiAqIEZ1bmN0aW9uIGNoYW5nZSB0aGUgbW9kZSBvZiB0aGUgY29ubmVjdGlvblxuICpcbiAqIEBwYXJhbSBAcGFyYW0ge1N0cmluZ30gbW9kZSB0aGUgY29ubmVjdGlvbiBtb2RlIHRoYXQgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIGFuZCB0aGUgZGVwdGggb2YgY29ubmVjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZSAnLT4nLCAnPDwtJywgJzw8PC0+Pj4nLCBldGMuXG4gKiBAcmV0dXJuIHtPYmplY3RbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gQ29ubmVjdG9yJGNoYW5nZU1vZGUobW9kZSkge1xuICAgIHRoaXMudHVybk9mZigpO1xuICAgIHNldHVwTW9kZS5jYWxsKHRoaXMsIG1vZGUpO1xuICAgIHRoaXMudHVybk9uKCk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBGdW5jdGlvbiBjaGFuZ2UgdGhlIG1vZGUgb2YgdGhlIGNvbm5lY3Rpb25cbiAqXG4gKiBAcGFyYW0gQHBhcmFtIHtTdHJpbmd9IG1vZGUgdGhlIGNvbm5lY3Rpb24gbW9kZSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIGRlcHRoIG9mIGNvbm5lY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmUgJy0+JywgJzw8LScsICc8PDwtPj4+JywgZXRjLlxuICogQHJldHVybiB7T2JqZWN0W1N0cmluZ119XG4gKi9cbmZ1bmN0aW9uIENvbm5lY3RvciRkZWZlckNoYW5nZU1vZGUobW9kZSkge1xuICAgIF8uZGVmZXJNZXRob2QodGhpcywgJ2NoYW5nZU1vZGUnLCBtb2RlKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV2ZXJzZXMgdHJhbnNsYXRpb24gcnVsZXMgZm9yIHBhdGhzIG9mIGNvbm5lY3RlZCBvZGF0YSBzb3VyY2VzXG4gKlxuICogQHBhcmFtIHtPYmplY3RbU3RyaW5nXX0gcnVsZXMgbWFwIG9mIHBhdGhzIGRlZmluaW5nIHRoZSB0cmFuc2xhdGlvbiBydWxlc1xuICogQHJldHVybiB7T2JqZWN0W1N0cmluZ119XG4gKi9cbmZ1bmN0aW9uIHJldmVyc2VUcmFuc2xhdGlvblJ1bGVzKHJ1bGVzKSB7XG4gICAgdmFyIHJldmVyc2VSdWxlcyA9IHt9O1xuICAgIF8uZWFjaEtleShydWxlcywgZnVuY3Rpb24ocGF0aDJfdmFsdWUsIHBhdGgxX2tleSkge1xuICAgICAgICByZXZlcnNlUnVsZXNbcGF0aDJfdmFsdWVdID0gcGF0aDFfa2V5O1xuICAgIH0pO1xuICAgIHJldHVybiByZXZlcnNlUnVsZXM7XG59XG5cblxuZnVuY3Rpb24gZ2V0UGF0dGVyblRyYW5zbGF0aW9ucyhwYXRoVHJhbnNsYXRpb24pIHtcbiAgICB2YXIgcGF0dGVyblRyYW5zbGF0aW9uID0gW107XG4gICAgXy5lYWNoS2V5KHBhdGhUcmFuc2xhdGlvbiwgZnVuY3Rpb24ocGF0aDJfdmFsdWUsIHBhdGgxX2tleSkge1xuICAgICAgICB2YXIgc3RhckluZGV4MSA9IHBhdGgxX2tleS5pbmRleE9mKCcqJylcbiAgICAgICAgICAgICwgc3RhckluZGV4MiA9IHBhdGgyX3ZhbHVlLmluZGV4T2YoJyonKTtcbiAgICAgICAgaWYgKHN0YXJJbmRleDEgPj0gMCAmJiBzdGFySW5kZXgyID49IDApIHsgLy8gcGF0dGVybiB0cmFuc2xhdGlvblxuICAgICAgICAgICAgaWYgKHBhdGgxX2tleS5zbGljZShzdGFySW5kZXgxKSAhPSBwYXRoMl92YWx1ZS5zbGljZShzdGFySW5kZXgyKSlcbiAgICAgICAgICAgICAgICBfdGhyb3dJbnZhbGlkVHJhbnNsYXRpb24ocGF0aDFfa2V5LCBwYXRoMl92YWx1ZSk7XG4gICAgICAgICAgICBkZWxldGUgcGF0aFRyYW5zbGF0aW9uW3BhdGgxX2tleV07ICAgICAgICAgICAgXG5cbiAgICAgICAgICAgIHBhdHRlcm5UcmFuc2xhdGlvbi5wdXNoKHtcbiAgICAgICAgICAgICAgICBmcm9tUGF0dGVybjogcGF0aFV0aWxzLmNyZWF0ZVJlZ2V4UGF0aChwYXRoMV9rZXkpLFxuICAgICAgICAgICAgICAgIGZyb21TdGF0aWNQYXRoOiBfZ2V0U3RhdGljUGF0aChwYXRoMV9rZXksIHN0YXJJbmRleDEpLFxuICAgICAgICAgICAgICAgIHRvUGF0dGVybjogcGF0aFV0aWxzLmNyZWF0ZVJlZ2V4UGF0aChwYXRoMl92YWx1ZSksXG4gICAgICAgICAgICAgICAgdG9TdGF0aWNQYXRoOiBfZ2V0U3RhdGljUGF0aChwYXRoMl92YWx1ZSwgc3RhckluZGV4MilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXJJbmRleDEgPj0gMCB8fCBzdGFySW5kZXgyID49IDApIC8vIHBhdHRlcm4gb25seSBvbiBvbmUgc2lkZSBvZiB0cmFuc2xhdGlvblxuICAgICAgICAgICAgX3Rocm93SW52YWxpZFRyYW5zbGF0aW9uKHBhdGgxX2tleSwgcGF0aDJfdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhdHRlcm5UcmFuc2xhdGlvbjtcblxuXG4gICAgZnVuY3Rpb24gX3Rocm93SW52YWxpZFRyYW5zbGF0aW9uKHBhdGgxLCBwYXRoMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGF0dGVybiB0cmFuc2xhdGlvbjogJyArIHBhdGgxICsgJywgJyArIHBhdGgyKTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIF9nZXRTdGF0aWNQYXRoKHBhdGgsIHN0YXJJbmRleCkge1xuICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9bXFwuXFxbXT9cXCouKiQvLCAnJyk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIHJldmVyc2VQYXR0ZXJuVHJhbnNsYXRpb25SdWxlcyhwYXR0ZXJuVHJhbnNsYXRpb24pIHtcbiAgICByZXR1cm4gcGF0dGVyblRyYW5zbGF0aW9uLm1hcChmdW5jdGlvbihwdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZnJvbVBhdHRlcm46IHB0LnRvUGF0dGVybixcbiAgICAgICAgICAgIGZyb21TdGF0aWNQYXRoOiBwdC50b1N0YXRpY1BhdGgsXG4gICAgICAgICAgICB0b1BhdHRlcm46IHB0LmZyb21QYXR0ZXJuLFxuICAgICAgICAgICAgdG9TdGF0aWNQYXRoOiBwdC5mcm9tU3RhdGljUGF0aFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5cbi8qKlxuICogdHVybk9uXG4gKiBNZXRob2Qgb2YgQ29ubmVjdG9yIHRoYXQgZW5hYmxlcyBjb25uZWN0aW9uIChpZiBpdCB3YXMgcHJldmlvdXNseSBkaXNhYmxlZClcbiAqL1xuZnVuY3Rpb24gQ29ubmVjdG9yJHR1cm5PbigpIHtcbiAgICBpZiAodGhpcy5pc09uKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ2RhdGEgc291cmNlcyBhcmUgYWxyZWFkeSBjb25uZWN0ZWQnKTtcblxuICAgIHZhciBzdWJzY3JpcHRpb25QYXRoID0gdGhpcy5fc3Vic2NyaXB0aW9uUGF0aCA9XG4gICAgICAgIG5ldyBBcnJheSh0aGlzLmRlcHRoMSB8fCB0aGlzLmRlcHRoMikuam9pbignKicpO1xuXG4gICAgdmFyIHN1YnNjcmlwdGlvblBhdHRlcm4gPSBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKHN1YnNjcmlwdGlvblBhdGgpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLmRlcHRoMSlcbiAgICAgICAgdGhpcy5fbGluazEgPSBsaW5rRGF0YVNvdXJjZSgnX2xpbmsyJywgdGhpcy5kczIsIHRoaXMuZHMxLCB0aGlzLl9jaGFuZ2VzUXVldWUxLCB0aGlzLnBhdGhUcmFuc2xhdGlvbjEsIHRoaXMucGF0dGVyblRyYW5zbGF0aW9uMSwgdGhpcy5kYXRhVHJhbnNsYXRpb24xLCB0aGlzLmRhdGFWYWxpZGF0aW9uMSk7XG4gICAgaWYgKHRoaXMuZGVwdGgyKVxuICAgICAgICB0aGlzLl9saW5rMiA9IGxpbmtEYXRhU291cmNlKCdfbGluazEnLCB0aGlzLmRzMSwgdGhpcy5kczIsIHRoaXMuX2NoYW5nZXNRdWV1ZTIsIHRoaXMucGF0aFRyYW5zbGF0aW9uMiwgdGhpcy5wYXR0ZXJuVHJhbnNsYXRpb24yLCB0aGlzLmRhdGFUcmFuc2xhdGlvbjIsIHRoaXMuZGF0YVZhbGlkYXRpb24yKTtcblxuICAgIHRoaXMuaXNPbiA9IHRydWU7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgndHVybmVkb24nKTtcblxuXG4gICAgZnVuY3Rpb24gbGlua0RhdGFTb3VyY2UocmV2ZXJzZUxpbmssIGZyb21EUywgdG9EUywgY2hhbmdlc1F1ZXVlLCBwYXRoVHJhbnNsYXRpb24sIHBhdHRlcm5UcmFuc2xhdGlvbiwgZGF0YVRyYW5zbGF0aW9uLCBkYXRhVmFsaWRhdGlvbikge1xuICAgICAgICBmcm9tRFMub25TeW5jKCdkYXRhY2hhbmdlcycsIG9uRGF0YSk7XG4gICAgICAgIHJldHVybiBvbkRhdGE7XG5cbiAgICAgICAgZnVuY3Rpb24gb25EYXRhKG1lc3NhZ2UsIGJhdGNoKSB7XG4gICAgICAgICAgICB2YXIgc2VuZERhdGEgPSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlczogW10sXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb246IGJhdGNoLnRyYW5zYWN0aW9uXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJhdGNoLmNoYW5nZXMuZm9yRWFjaChmdW5jdGlvbihjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgc291cmNlUGF0aCA9IGNoYW5nZS5wYXRoXG4gICAgICAgICAgICAgICAgICAgICwgdGFyZ2V0UGF0aCA9IHRyYW5zbGF0ZVBhdGgoc291cmNlUGF0aCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFBhdGggPT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBfLmNsb25lKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgXy5leHRlbmQoY2hhbmdlLCB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnJvbURTLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiB0YXJnZXRQYXRoXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVEYXRhKHNvdXJjZVBhdGgsIGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVEYXRhKHNvdXJjZVBhdGgsIGNoYW5nZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCEgY2hhbmdlc1F1ZXVlLmxlbmd0aClcbiAgICAgICAgICAgICAgICBfLmRlZmVyKHBvc3RDaGFuZ2VEYXRhKTtcblxuICAgICAgICAgICAgY2hhbmdlc1F1ZXVlLnB1c2goc2VuZERhdGEpO1xuXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVBhdGgoc291cmNlUGF0aCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoVHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZWRQYXRoID0gcGF0aFRyYW5zbGF0aW9uW3NvdXJjZVBhdGhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRlZFBhdGgpIHJldHVybiB0cmFuc2xhdGVkUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXR0ZXJuVHJhbnNsYXRpb24ubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHZhciBwdCA9IF8uZmluZChwYXR0ZXJuVHJhbnNsYXRpb24sIGZ1bmN0aW9uKHBUcmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBUcmFuc2xhdGlvbi5mcm9tUGF0dGVybi50ZXN0KHNvdXJjZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHJhbnNsYXRlZFBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UocHQuZnJvbVN0YXRpY1BhdGgsIHB0LnRvU3RhdGljUGF0aCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghICgoc3Vic2NyaXB0aW9uUGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3Vic2NyaXB0aW9uUGF0dGVybi50ZXN0KHNvdXJjZVBhdGgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3Vic2NyaXB0aW9uUGF0dGVybiA9PSBzb3VyY2VQYXRoKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWRQYXRoIHx8IHNvdXJjZVBhdGg7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gdHJhbnNsYXRlRGF0YShzb3VyY2VQYXRoLCBjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc2xhdGUgPSBkYXRhVHJhbnNsYXRpb25bc291cmNlUGF0aF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGUgJiYgdHlwZW9mIHRyYW5zbGF0ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2Uub2xkVmFsdWUgPSB0cmFuc2xhdGUoY2hhbmdlLm9sZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZS5uZXdWYWx1ZSA9IHRyYW5zbGF0ZShjaGFuZ2UubmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgXG4gICAgICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZURhdGEoc291cmNlUGF0aCwgY2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgcHJvcGFnYXRlRGF0YShjaGFuZ2UpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGFWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZGF0b3JzID0gZGF0YVZhbGlkYXRpb25bc291cmNlUGF0aF1cbiAgICAgICAgICAgICAgICAgICAgICAgICwgcGFzc2VkQ291bnQgPSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAsIGFscmVhZHlGYWlsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9ycylcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMuZm9yRWFjaChjYWxsVmFsaWRhdG9yKTsgICBcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxWYWxpZGF0b3IodmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcihjaGFuZ2UubmV3VmFsdWUsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnBhdGggPSBzb3VyY2VQYXRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgYWxyZWFkeUZhaWxlZCAmJiAoZXJyIHx8IHJlc3BvbnNlLnZhbGlkKSAmJiArK3Bhc3NlZENvdW50ID09IHZhbGlkYXRvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbURTLnBvc3RNZXNzYWdlKCd2YWxpZGF0ZWQnLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEgcmVzcG9uc2UudmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5RmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tRFMucG9zdE1lc3NhZ2UoJ3ZhbGlkYXRlZCcsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHByb3BhZ2F0ZURhdGEoY2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgc2VuZERhdGEuY2hhbmdlcy5wdXNoKGNoYW5nZSk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gcG9zdENoYW5nZURhdGEoKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmVudCBlbmRsZXNzIGxvb3Agb2YgdXBkYXRlcyBmb3IgMi13YXkgY29ubmVjdGlvblxuICAgICAgICAgICAgICAgIGlmIChzZWxmW3JldmVyc2VMaW5rXSkgdmFyIGNhbGxiYWNrID0gc3Vic2NyaXB0aW9uU3dpdGNoO1xuXG4gICAgICAgICAgICAgICAgdmFyIHRyYW5zYWN0aW9ucyA9IG1lcmdlVHJhbnNhY3Rpb25zKGNoYW5nZXNRdWV1ZSk7XG4gICAgICAgICAgICAgICAgY2hhbmdlc1F1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBkYXRhIGNoYW5nZSBpbnN0cnVjdGlvbiBhcyBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgIHRvRFMucG9zdE1lc3NhZ2VTeW5jKCdjaGFuZ2VkYXRhJywgeyBjaGFuZ2VzOiB0cmFuc2FjdGlvbiB9LCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gc3Vic2NyaXB0aW9uU3dpdGNoKGVyciwgY2hhbmdlRmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdmFyIG9uT2ZmID0gY2hhbmdlRmluaXNoZWQgPyAnb25TeW5jJyA6ICdvZmYnO1xuICAgICAgICAgICAgICAgIHRvRFNbb25PZmZdKCdkYXRhY2hhbmdlcycsIHNlbGZbcmV2ZXJzZUxpbmtdKTtcblxuICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gY2hhbmdlRmluaXNoZWQgPyAnY2hhbmdlY29tcGxldGVkJyA6ICdjaGFuZ2VzdGFydGVkJztcbiAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHsgc291cmNlOiBmcm9tRFMsIHRhcmdldDogdG9EUyB9KTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBtZXJnZVRyYW5zYWN0aW9ucyhiYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRyYW5zYWN0aW9ucyA9IFtdXG4gICAgICAgICAgICAgICAgICAgICwgY3VycmVudFRyYW5zYWN0aW9uO1xuXG4gICAgICAgICAgICAgICAgYmF0Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uKGJhdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIGJhdGNoLnRyYW5zYWN0aW9uKSBjdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIGJhdGNoLmNoYW5nZXMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJhdGNoLnRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRyYW5zYWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uYXBwZW5kQXJyYXkoY3VycmVudFRyYW5zYWN0aW9uLCBiYXRjaC5jaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFuc2FjdGlvbiA9IF8uY2xvbmUoYmF0Y2guY2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zLnB1c2goY3VycmVudFRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMucHVzaChiYXRjaC5jaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2FjdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiB0dXJuT2ZmXG4gKiBNZXRob2Qgb2YgQ29ubmVjdG9yIHRoYXQgZGlzYWJsZXMgY29ubmVjdGlvbiAoaWYgaXQgd2FzIHByZXZpb3VzbHkgZW5hYmxlZClcbiAqL1xuZnVuY3Rpb24gQ29ubmVjdG9yJHR1cm5PZmYoKSB7XG4gICAgaWYgKCEgdGhpcy5pc09uKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ2RhdGEgc291cmNlcyBhcmUgYWxyZWFkeSBkaXNjb25uZWN0ZWQnKTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB1bmxpbmtEYXRhU291cmNlKHRoaXMuZHMxLCAnX2xpbmsyJywgdGhpcy5wYXRoVHJhbnNsYXRpb24yKTtcbiAgICB1bmxpbmtEYXRhU291cmNlKHRoaXMuZHMyLCAnX2xpbmsxJywgdGhpcy5wYXRoVHJhbnNsYXRpb24xKTtcblxuICAgIHRoaXMuaXNPbiA9IGZhbHNlO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ3R1cm5lZG9mZicpO1xuXG5cbiAgICBmdW5jdGlvbiB1bmxpbmtEYXRhU291cmNlKGZyb21EUywgbGlua05hbWUsIHBhdGhUcmFuc2xhdGlvbikge1xuICAgICAgICBpZiAoc2VsZltsaW5rTmFtZV0pIHtcbiAgICAgICAgICAgIGZyb21EUy5vZmYoJ2RhdGFjaGFuZ2VzJywgc2VsZltsaW5rTmFtZV0pO1xuICAgICAgICAgICAgZGVsZXRlIHNlbGZbbGlua05hbWVdO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGVzdHJveXMgY29ubmVjdG9yIG9iamVjdCBieSB0dXJuaW5nIGl0IG9mZiBhbmQgcmVtb3ZpbmcgcmVmZXJlbmNlcyB0byBjb25uZWN0ZWQgc291cmNlc1xuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkZGVzdHJveSgpIHtcbiAgICB0aGlzLnR1cm5PZmYoKTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCdkZXN0cm95ZWQnKTtcbiAgICB0aGlzLl9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLmRzMTtcbiAgICBkZWxldGUgdGhpcy5kczI7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1vZGVsUGF0aCA9IHJlcXVpcmUoJy4vbV9wYXRoJylcbiAgICAsIHN5bnRoZXNpemUgPSByZXF1aXJlKCcuL3N5bnRoZXNpemUnKVxuICAgICwgcGF0aFV0aWxzID0gcmVxdWlyZSgnLi9wYXRoX3V0aWxzJylcbiAgICAsIG1vZGVsVXRpbHMgPSByZXF1aXJlKCcuL21vZGVsX3V0aWxzJylcbiAgICAsIGNoYW5nZURhdGFIYW5kbGVyID0gcmVxdWlyZSgnLi9jaGFuZ2VfZGF0YScpXG4gICAgLCBNZXNzZW5nZXIgPSByZXF1aXJlKCcuLi9tZXNzZW5nZXInKVxuICAgICwgTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSA9IHJlcXVpcmUoJy4uL21lc3Nlbmdlci9tc25ncl9zb3VyY2UnKVxuICAgICwgTW9kZWxNc2dBUEkgPSByZXF1aXJlKCcuL21fbXNnX2FwaScpXG4gICAgLCBNaXhpbiA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L21peGluJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgY2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrJylcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIGxvZ2dlciA9IHJlcXVpcmUoJy4uL3V0aWwvbG9nZ2VyJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNb2RlbDtcblxuXG4vKipcbiAqIGBtaWxvLk1vZGVsYFxuICogTW9kZWwgY2xhc3MgaW5zdGFudGlhdGVzIG9iamVjdHMgdGhhdCBhbGxvdyBkZWVwIGRhdGEgYWNjZXNzIHdpdGggX19zYWZlIGdldHRlcnNfXyB0aGF0IHJldHVybiB1bmRlZmluZWQgKHJhdGhlciB0aGFuIHRocm93aW5nIGV4Y2VwdGlvbikgd2hlbiBwcm9wZXJ0aWVzL2l0ZW1zIG9mIHVuZXhpc3Rpbmcgb2JqZWN0cy9hcnJheXMgYXJlIHJlcXVlc3RlZCBhbmQgX19zYWZlIHNldHRlcnNfXyB0aGF0IGNyZWF0ZSBvYmplY3QgdHJlZXMgd2hlbiBwcm9wZXJ0aWVzL2l0ZW1zIG9mIHVuZXhpc3Rpbmcgb2JqZWN0cy9hcnJheXMgYXJlIHNldCBhbmQgYWxzbyBwb3N0IG1lc3NhZ2VzIHRvIGFsbG93IHN1YnNjcmlwdGlvbiBvbiBjaGFuZ2VzIGFuZCBlbmFibGUgZGF0YSByZWFjdGl2aXR5LlxuICogUmVhY3Rpdml0eSBpcyBpbXBsZW1lbW50ZWQgdmlhIFtDb25uZWN0b3JdKC4vY29ubmVjdG9yLmpzLmh0bWwpIHRoYXQgY2FuIGJlIGluc3RhbnRpYXRlZCBlaXRoZXIgZGlyZWN0bHkgb3Igd2l0aCBtb3JlIGNvbnZlbmllbnQgaW50ZXJmYWNlIG9mIFttaWxvLm1pbmRlcl0oLi4vbWluZGVyLmpzLmh0bWwpLiBBdCB0aGUgbW9tZW50IG1vZGVsIGNhbiBiZSBjb25uZWN0ZWQgdG8gW0RhdGEgZmFjZXRdKC4uL2NvbXBvbmVudHMvY19mYWNldHMvRGF0YS5qcy5odG1sKSBvciB0byBhbm90aGVyIG1vZGVsIG9yIFtNb2RlbFBhdGhdKC4vbV9wYXRoLmpzLmh0bWwpLlxuICogTW9kZWwgY29uc3RydWN0b3IgcmV0dXJucyBvYmplY3RzIHRoYXQgYXJlIGZ1bmN0aW9ucyBhdCB0aGUgc2FtZSB0aW1lOyB3aGVuIGNhbGxlZCB0aGV5IHJldHVybiBNb2RlbFBhdGggb2JqZWN0cyB0aGF0IGFsbG93IGdldC9zZXQgYWNjZXNzIHRvIGFueSBwb2ludCBpbiBtb2RlbCBkYXRhLiBTZWUgW01vZGVsRGF0YV0oI01vZGVsRGF0YSkgYmVsb3cuXG4gKlxuICogWW91IGNhbiBzdWJzY3JpYmUgdG8gbW9kZWwgY2hhbmdlcyB3aXRoIGBvbmAgbWV0aG9kIGJ5IHBhc3NpbmcgbW9kZWwgYWNjZXNzIHBhdGggaW4gcGxhY2Ugb2YgbWVzc2FnZSwgcGF0dGVybiBvciBzdHJpbmcgd2l0aCBhbnkgbnVtYmVyIG9mIHN0YXJzIHRvIHN1YnNjcmliZSB0byBhIGNlcnRhaW4gZGVwdGggaW4gbW9kZWwgKGUuZy4sIGAnKioqJ2AgdG8gc3Vic2NyaWJlIHRvIHRocmVlIGxldmVscykuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gZGF0YSBvcHRpb25hbCBpbml0aWFsIGFycmF5IGRhdGEuIElmIGl0IGlzIHBsYW5uZWQgdG8gY29ubmVjdCBtb2RlbCB0byB2aWV3IGl0IGlzIHVzdWFsbHkgYmV0dGVyIHRvIGluc3RhbnRpYXRlIGFuIGVtcHR5IE1vZGVsIChgdmFyIG0gPSBuZXcgTW9kZWxgKSwgY29ubmVjdCBpdCB0byBbQ29tcG9uZW50XSguLi9jb21wb25lbnRzL2NfY2xhc3MuanMuaHRtbCkncyBbRGF0YSBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzLmh0bWwpIChlLmcuLCBgbWlsby5taW5kZXIobSwgJzw8LT4+JywgYy5kYXRhKTtgKSBhbmQgdGhlbiBzZXQgdGhlIG1vZGVsIHdpdGggYG0uc2V0KGRhdGEpYCAtIHRoZSB2aWV3IHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkLlxuICogQHBhcmFtIHtPYmplY3R9IGhvc3RPYmplY3Qgb3B0aW9uYWwgb2JqZWN0IHRoYXQgaG9zdHMgbW9kZWwgb24gb25lIG9mIGl0cyBwcm9wZXJ0aWVzLiBDYW4gYmUgdXNlZCB3aGVuIG1vZGVsIGl0c2VsZiBpcyB0aGUgY29udGV4dCBvZiB0aGUgbWVzc2FnZSBzdWJzY3JpYmVyIGFuZCB5b3UgbmVlZCB0byB0cmF2ZXJzIHRvIHRoaXMgb2JqZWN0IChhbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0byBzZXQgYW55IGNvbnRleHQpLiBDYW4gYWxzbyBiZSB1c2VkIHRvIHByb3h5IG1vZGVsJ3MgbWV0aG9kcyB0byB0aGUgaG9zdCBsaWtlIFtNb2RlbCBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9Nb2RlbEZhY2V0LmpzLmh0bWwpIGlzIGRvaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgcGFzcyB7IHJlYWN0aXZlOiBmYWxzZSB9IHRvIHVzZSBtb2RlbCB3aXRob3V0IG1lc3NhZ2luZyB3aGVuIGl0IGlzIG5vdCBuZWVkZWQgLSBpdCBtYWtlcyBpdCBtdWNoIGZhc3RlclxuICogQHJldHVybiB7TW9kZWx9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsKGRhdGEsIGhvc3RPYmplY3QsIG9wdGlvbnMpIHtcbiAgICAvLyBgbW9kZWxgIHdpbGwgYmUgcmV0dXJuZWQgYnkgY29uc3RydWN0b3IgaW5zdGVhZCBvZiBgdGhpc2AuIGBtb2RlbGBcbiAgICAvLyAoYG1vZGVsUGF0aGAgZnVuY3Rpb24pIHNob3VsZCByZXR1cm4gYSBNb2RlbFBhdGggb2JqZWN0IHdpdGggXCJzeW50aGVzaXplZFwiIG1ldGhvZHNcbiAgICAvLyB0byBnZXQvc2V0IG1vZGVsIHByb3BlcnRpZXMsIHRvIHN1YnNjcmliZSB0byBwcm9wZXJ0eSBjaGFuZ2VzLCBldGMuXG4gICAgLy8gQWRkaXRpb25hbCBhcmd1bWVudHMgb2YgbW9kZWxQYXRoIGNhbiBiZSB1c2VkIGluIHRoZSBwYXRoIHVzaW5nIGludGVycG9sYXRpb24gLSBzZWUgTW9kZWxQYXRoIGJlbG93LlxuICAgIHZhciBtb2RlbCA9IGZ1bmN0aW9uIG1vZGVsUGF0aChhY2Nlc3NQYXRoKSB7IC8vICwgLi4uIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgaW50ZXJwb2xhdGVkXG4gICAgICAgIHJldHVybiBNb2RlbCRwYXRoLmFwcGx5KG1vZGVsLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgbW9kZWwuX19wcm90b19fID0gTW9kZWwucHJvdG90eXBlO1xuXG4gICAgbW9kZWwuX2hvc3RPYmplY3QgPSBob3N0T2JqZWN0O1xuICAgIG1vZGVsLl9vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGlmIChtb2RlbC5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgbW9kZWwuX3ByZXBhcmVNZXNzZW5nZXJzKCk7XG4gICAgICAgIC8vIHN1YnNjcmliZSB0byBcImNoYW5nZWRhdGFcIiBtZXNzYWdlIHRvIGVuYWJsZSByZWFjdGl2ZSBjb25uZWN0aW9uc1xuICAgICAgICBtb2RlbC5vblN5bmMoJ2NoYW5nZWRhdGEnLCBjaGFuZ2VEYXRhSGFuZGxlcik7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEpIG1vZGVsLl9kYXRhID0gZGF0YTtcblxuICAgIHJldHVybiBtb2RlbDtcbn1cblxuTW9kZWwucHJvdG90eXBlLl9fcHJvdG9fXyA9IE1vZGVsLl9fcHJvdG9fXztcblxuXG4vKipcbiAqICMjIyNNb2RlbCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW3BhdGhdKCNwYXRoKSAtIHJldHVybnMgTW9kZWxQYXRoIG9iamVjdCB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gYW55IHBvaW50IGluIE1vZGVsXG4gKiAtIFtnZXRdKCNNb2RlbCRnZXQpIC0gZ2V0IG1vZGVsIGRhdGFcbiAqIC0gc2V0IC0gc2V0IG1vZGVsIGRhdGEsIHN5bnRoZXNpemVkXG4gKiAtIHNwbGljZSAtIHNwbGljZSBtb2RlbCBkYXRhIChhcyBhcnJheSBvciBwc2V1ZG8tYXJyYXkpLCBzeW50aGVzaXplZFxuICogLSBbbGVuXSguL21fcGF0aC5qcy5odG1sI01vZGVsUGF0aCRsZW4pIC0gcmV0dXJucyBsZW5ndGggb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWwgaW4gc2FmZSB3YXksIDAgaWYgbm8gbGVuZ3RoIGlzIHNldFxuICogLSBbcHVzaF0oLi9tX3BhdGguanMuaHRtbCNNb2RlbFBhdGgkcHVzaCkgLSBhZGQgaXRlbXMgdG8gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBtb2RlbFxuICogLSBbcG9wXSguL21fcGF0aC5qcy5odG1sI01vZGVsUGF0aCRwb3ApIC0gcmVtb3ZlIGl0ZW0gZnJvbSB0aGUgZW5kIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIG1vZGVsXG4gKiAtIFt1bnNoaWZ0XSguL21fcGF0aC5qcy5odG1sI01vZGVsUGF0aCR1bnNoaWZ0KSAtIGFkZCBpdGVtcyB0byB0aGUgYmVnaW5uaW5nIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIG1vZGVsXG4gKiAtIFtzaGlmdF0oLi9tX3BhdGguanMuaHRtbCNNb2RlbFBhdGgkc2hpZnQpIC0gcmVtb3ZlIGl0ZW0gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIG1vZGVsXG4gKiAtIFtwcm94eU1lc3Nlbmdlcl0oI3Byb3h5TWVzc2VuZ2VyKSAtIHByb3h5IG1vZGVsJ3MgTWVzc2VuZ2VyIG1ldGhvZHMgdG8gaG9zdCBvYmplY3RcbiAqIC0gW3Byb3h5TWV0aG9kc10oI3Byb3h5TWV0aG9kcykgLSBwcm94eSBtb2RlbCBtZXRob2RzIHRvIGhvc3Qgb2JqZWN0XG4gKi9cbl8uZXh0ZW5kUHJvdG8oTW9kZWwsIHtcbiAgICBwYXRoOiBNb2RlbCRwYXRoLFxuICAgIGdldDogTW9kZWwkZ2V0LFxuICAgIHByb3h5TWVzc2VuZ2VyOiBwcm94eU1lc3NlbmdlciwgLy8gZGVwcmVjYXRlZCwgc2hvdWxkIG5vdCBiZSB1c2VkXG4gICAgcHJveHlNZXRob2RzOiBwcm94eU1ldGhvZHMsXG4gICAgX3ByZXBhcmVNZXNzZW5nZXJzOiBfcHJlcGFyZU1lc3NlbmdlcnMsXG4gICAgX2dldEhvc3RPYmplY3Q6IF9nZXRIb3N0T2JqZWN0LFxuICAgIGRlc3Ryb3k6IE1vZGVsJGRlc3Ryb3lcbn0pO1xuXG4vLyBzZXQsIGRlbCwgc3BsaWNlIGFyZSBhZGRlZCB0byBtb2RlbFxuXy5leHRlbmRQcm90byhNb2RlbCwgc3ludGhlc2l6ZS5tb2RlbE1ldGhvZHMpO1xuXG5cbi8qKlxuICogLSBQYXRoOiBNb2RlbFBhdGggY2xhc3MgYXMgYG1pbG8uTW9kZWwuUGF0aGBcbiAqL1xuXy5leHRlbmQoTW9kZWwsIHtcbiAgICBQYXRoOiBNb2RlbFBhdGgsXG4gICAgdXNlV2l0aDogTW9kZWwkJHVzZVdpdGgsXG4gICAgX3V0aWxzOiB7XG4gICAgICAgIHBhdGg6IHBhdGhVdGlscyxcbiAgICAgICAgbW9kZWw6IG1vZGVsVXRpbHMsXG4gICAgICAgIGNoYW5nZURhdGFIYW5kbGVyOiBjaGFuZ2VEYXRhSGFuZGxlclxuICAgIH1cbn0pO1xuXG5cbi8qKlxuICogRXhwb3NlIE1lc3NlbmdlciBtZXRob2RzIG9uIEZhY2V0IHByb3RvdHlwZVxuICovXG52YXIgTUVTU0VOR0VSX1BST1BFUlRZID0gJ19tZXNzZW5nZXInO1xuTWVzc2VuZ2VyLnVzZVdpdGgoTW9kZWwsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG4vKipcbiAqIE1vZGVsUGF0aCBtZXRob2RzIGFkZGVkIHRvIE1vZGVsIHByb3RvdHlwZVxuICovXG5bJ2xlbicsICdwdXNoJywgJ3BvcCcsICd1bnNoaWZ0JywgJ3NoaWZ0J10uZm9yRWFjaChmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgdmFyIG1ldGhvZCA9IE1vZGVsUGF0aC5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG4gICAgXy5kZWZpbmVQcm9wZXJ0eShNb2RlbC5wcm90b3R5cGUsIG1ldGhvZE5hbWUsIG1ldGhvZCk7XG59KTtcblxuXG4vKipcbiAqIE1vZGVsIGluc3RhbmNlIG1ldGhvZC5cbiAqIEdldCBtb2RlbCBkYXRhLlxuICpcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gTW9kZWwkZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xufVxuXG5cbi8qKlxuICogTW9kZWwgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyBNb2RlbFBhdGggb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgc2FtZSBBUEkgYXMgbW9kZWwgYnV0IGFsbG93cyBhY2Nlc3MgdG8gYW55IHBvaW50IGluc2lkZSBtb2RlbCBhcyBkZWZpbmVkIGJ5IGBhY2Nlc3NQYXRoYC5cbiAqIFNlZSBbTW9kZWxQYXRoXSguL21fcGF0aC5qcy5odG1sKSBjbGFzcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzUGF0aCBzdHJpbmcgdGhhdCBkZWZpbmVzIHBhdGggdG8gYWNjZXNzIG1vZGVsLlxuICogIFBhdGggc3RyaW5nIGNvbnNpc3RzIG9mIHBhcnRzIHRvIGRlZmluZSBlaXRoZXIgcHJvcGVydHkgYWNjZXNzIChgXCIubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgbmFtZSkgb3IgYXJyYXkgaXRlbSBhY2Nlc3MgKGBcIlsxXVwiYCB0byBhY2Nlc3MgaXRlbSB3aXRoIGluZGV4IDEpLlxuICogIEFjY2VzcyBwYXRoIGNhbiBjb250YWluIGFzIG1hbnkgcGFydHMgYXMgbmVjZXNzYXJ5IChlLmcuIGBcIi5saXN0WzBdLm5hbWVcImAgdG8gYWNjZXNzIHByb3BlcnR5IGBuYW1lYCBpbiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhcnJheSBzdG9yZWQgaW4gcHJvcGVydHkgYGxpc3RgLlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWRkaXRpb25hbCBhcmd1bWVudHMgb2YgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGludGVycG9sYXRlZCBwYXRocy5cbiAqICBFLmcuIGBtLnBhdGgoXCJbJDFdLiQyXCIsIGlkLCBwcm9wKWAgcmV0dXJucyBNb2RlbFBhdGggdG8gYWNjZXNzIHByb3BlcnR5IHdpdGggbmFtZSBgcHJvcGAgaW4gYXJyYXkgaXRlbSB3aXRoIGluZGV4IGBpZGAuIEFsdGhvdWdoIHRoaXMgTW9kZWxQYXRoIG9iamVjdCB3aWxsIHdvcmsgZXhhY3RseSBhcyBgbShcIltcIiArIGlkICsgXCJdLlwiICsgcHJvcClgLCB0aGUgaW50ZXJwb2xhdGVkIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgYXMgTW9kZWxQYXRoIHdpdGggaW50ZXJwb2xhdGlvbiB3aWxsIG5vdCBzeW50aGVzaXplIG5ldyBnZXR0ZXJzIGFuZCBzZXR0ZXJzLCB3aGlsZSBNb2RlbFBhdGggd2l0aCBjb21wdXRlZCBhY2Nlc3MgcGF0aCB3aWxsIHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVhY2ggcGFpciBvZiB2YWx1ZXMgb2YgYGlkYCBhbmQgYHByb3BgLlxuICogQHJldHVybiB7TW9kZWxQYXRofVxuICovXG5mdW5jdGlvbiBNb2RlbCRwYXRoKGFjY2Vzc1BhdGgpIHsgIC8vICwgLi4uIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgaW50ZXJwb2xhdGVkXG4gICAgaWYgKCEgYWNjZXNzUGF0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBcIm51bGxcIiBpcyBjb250ZXh0IHRvIHBhc3MgdG8gTW9kZWxQYXRoLCBmaXJzdCBwYXJhbWV0ZXIgb2YgYmluZFxuICAgIC8vIFwidGhpc1wiIChtb2RlbCkgaXMgYWRkZWQgaW4gZnJvbnQgb2YgYWxsIGFyZ3VtZW50c1xuICAgIF8uc3BsaWNlKGFyZ3VtZW50cywgMCwgMCwgbnVsbCwgdGhpcyk7XG5cbiAgICAvLyBjYWxsaW5nIE1vZGVsUGF0aCBjb25zdHJ1Y3RvciB3aXRoIG5ldyBhbmQgdGhlIGxpc3Qgb2YgYXJndW1lbnRzOiB0aGlzIChtb2RlbCksIGFjY2Vzc1BhdGgsIC4uLlxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KE1vZGVsUGF0aCwgYXJndW1lbnRzKSk7XG59XG5cblxuLyoqXG4gKiBNb2RlbCBpbnN0YW5jZSBtZXRob2QuXG4gKiBQcm94eSBtb2RlbCdzIE1lc3NlbmdlciBtZXRob2RzIHRvIGhvc3Qgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbEhvc3RPYmplY3Qgb3B0aW9uYWwgaG9zdCBvYmplY3QuIElmIG5vdCBwYXNzZWQsIGhvc3RPYmplY3QgcGFzc2VkIHRvIE1vZGVsIGNvbnN0cnVjdG9yIHdpbGwgYmUgdXNlZC5cbiAqL1xuZnVuY3Rpb24gcHJveHlNZXNzZW5nZXIobW9kZWxIb3N0T2JqZWN0KSB7XG4gICAgbW9kZWxIb3N0T2JqZWN0ID0gbW9kZWxIb3N0T2JqZWN0IHx8IHRoaXMuX2hvc3RPYmplY3Q7XG4gICAgTWl4aW4ucHJvdG90eXBlLl9jcmVhdGVQcm94eU1ldGhvZHMuY2FsbCh0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0sIE1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcywgbW9kZWxIb3N0T2JqZWN0KTtcbn1cblxuXG52YXIgbW9kZWxNZXRob2RzVG9Qcm94eSA9IFsncGF0aCcsICdnZXQnLCAnc2V0JywgJ2RlbCcsICdzcGxpY2UnLCAnbGVuJywgJ3B1c2gnLCAncG9wJywgJ3Vuc2hpZnQnLCAnc2hpZnQnXTtcblxuXG4vKipcbiAqIEV4cG9zZSBtb2RlbCBtZXRob2RzIG9uXG4gKiBTZWUgc2FtZSBtZXRob2QgaW4gTWl4aW4gY2xhc3MgZm9yIHBhcmFtZXRlcnMgbWVhbmluZ1xuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhvc3RDbGFzc1xuICogQHBhcmFtIHtbdHlwZV19IGluc3RhbmNlS2V5XG4gKiBAcGFyYW0ge1t0eXBlXX0gbWl4aW5NZXRob2RzIG9wdGlvbmFsXG4gKi9cbmZ1bmN0aW9uIE1vZGVsJCR1c2VXaXRoKGhvc3RDbGFzcywgaW5zdGFuY2VLZXksIG1peGluTWV0aG9kcykge1xuICAgIG1peGluTWV0aG9kcyA9IG1peGluTWV0aG9kcyB8fCBtb2RlbE1ldGhvZHNUb1Byb3h5O1xuICAgIE1peGluLnVzZVdpdGguY2FsbChNb2RlbCwgaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2RzKTtcbn1cblxuXG4vKipcbiAqIE1vZGVsIGluc3RhbmNlIG1ldGhvZC5cbiAqIFByb3h5IG1vZGVsIG1ldGhvZHMgdG8gaG9zdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1vZGVsSG9zdE9iamVjdCBvcHRpb25hbCBob3N0IG9iamVjdC4gSWYgbm90IHBhc3NlZCwgaG9zdE9iamVjdCBwYXNzZWQgdG8gTW9kZWwgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiBwcm94eU1ldGhvZHMobW9kZWxIb3N0T2JqZWN0KSB7XG4gICAgbW9kZWxIb3N0T2JqZWN0ID0gbW9kZWxIb3N0T2JqZWN0IHx8IHRoaXMuX2hvc3RPYmplY3Q7XG4gICAgTWl4aW4ucHJvdG90eXBlLl9jcmVhdGVQcm94eU1ldGhvZHMuY2FsbCh0aGlzLCBtb2RlbE1ldGhvZHNUb1Byb3h5LCBtb2RlbEhvc3RPYmplY3QpO1xufVxuXG5cbi8qKlxuICogTW9kZWwgaW5zdGFuY2UgbWV0aG9kLlxuICogQ3JlYXRlIGFuZCBjb25uZWN0IGludGVybmFsIGFuZCBleHRlcm5hbCBtb2RlbCdzIG1lc3NlbmdlcnMuXG4gKiBFeHRlcm5hbCBtZXNzZW5nZXIncyBtZXRob2RzIGFyZSBwcm94aWVkIG9uIHRoZSBtb2RlbCBhbmQgdGhleSBhbGxvd3MgXCIqXCIgc3Vic2NyaXB0aW9ucy5cbiAqL1xuZnVuY3Rpb24gX3ByZXBhcmVNZXNzZW5nZXJzKCkge1xuICAgIC8vIG1vZGVsIHdpbGwgcG9zdCBhbGwgaXRzIGNoYW5nZXMgb24gaW50ZXJuYWwgbWVzc2VuZ2VyXG4gICAgdmFyIGludGVybmFsTWVzc2VuZ2VyID0gbmV3IE1lc3Nlbmdlcih0aGlzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG5cbiAgICAvLyBtZXNzYWdlIHNvdXJjZSB0byBjb25uZWN0IGludGVybmFsIG1lc3NlbmdlciB0byBleHRlcm5hbFxuICAgIHZhciBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSA9IG5ldyBNZXNzZW5nZXJNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgbmV3IE1vZGVsTXNnQVBJLCBpbnRlcm5hbE1lc3Nlbmdlcik7XG5cbiAgICAvLyBleHRlcm5hbCBtZXNzZW5nZXIgdG8gd2hpY2ggYWxsIG1vZGVsIHVzZXJzIHdpbGwgc3Vic2NyaWJlLFxuICAgIC8vIHRoYXQgd2lsbCBhbGxvdyBcIipcIiBzdWJzY3JpcHRpb25zIGFuZCBzdXBwb3J0IFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgYXBpLlxuICAgIHZhciBleHRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgdW5kZWZpbmVkLCBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsIE1FU1NFTkdFUl9QUk9QRVJUWSwgZXh0ZXJuYWxNZXNzZW5nZXIpO1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19pbnRlcm5hbE1lc3NlbmdlcicsIGludGVybmFsTWVzc2VuZ2VyKTtcbn1cblxuXG5mdW5jdGlvbiBfZ2V0SG9zdE9iamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5faG9zdE9iamVjdDtcbn1cblxuXG5mdW5jdGlvbiBNb2RlbCRkZXN0cm95KCkge1xuICAgIHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXS5kZXN0cm95KCk7XG4gICAgdGhpcy5faW50ZXJuYWxNZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBNZXNzZW5nZXJSZWdleHBBUEkgPSByZXF1aXJlKCcuLi9tZXNzZW5nZXIvbV9hcGlfcngnKVxuICAgICwgcGF0aFV0aWxzID0gcmVxdWlyZSgnLi9wYXRoX3V0aWxzJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuXG4vKipcbiAqIFN1YmNsYXNzIG9mIE1lc3NlbmdlclJlZ2V4cEFQSSB0aGF0IGlzIHVzZWQgdG8gdHJhbnNsYXRlIG1lc3NhZ2VzIG9mIGV4dGVybmFsIG1lc3NlbmdlciBvZiBNb2RlbCB0byBpbnRlcm5hbCBtZXNzZW5nZXIgb2YgTW9kZWwuXG4gKi9cbnZhciBNb2RlbE1zZ0FQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyUmVnZXhwQVBJLCAnTW9kZWxNc2dBUEknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNb2RlbE1zZ0FQSTtcblxuXG4vKipcbiAqICMjIyNNb2RlbE1zZ0FQSSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW3RyYW5zbGF0ZVRvU291cmNlTWVzc2FnZV0oI3RyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSkgLSB0cmFuc2xhdGVzIHN1YnNjcmlwdGlvbiBwYXRocyB3aXRoIFwiKlwicyB0byByZWdleCwgbGVhdmluZyBvdGhlciBzdHJpbmdzIHVudG91Y2hlZFxuICovXG5fLmV4dGVuZFByb3RvKE1vZGVsTXNnQVBJLCB7XG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG59KTtcblxuXG4vKipcbiAqIE1vZGVsTXNnQVBJIGluc3RhbmNlIG1ldGhvZFxuICogVHJhbnNsYXRlcyBzdWJzY3JpcHRpb24gcGF0aHMgd2l0aCBcIipcInMgdG8gcmVnZXgsIGxlYXZpbmcgb3RoZXIgc3RyaW5ncyB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc1BhdGggcmVsYXRpdmUgYWNjZXNzIHBhdGggdG8gYmUgdHJhbnNsYXRlZFxuICogQHJldHVybiB7UmVnRXhwfFN0cmluZ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKGFjY2Vzc1BhdGgpIHtcbiAgICBpZiAoYWNjZXNzUGF0aCBpbnN0YW5jZW9mIFJlZ0V4cCkgcmV0dXJuIGFjY2Vzc1BhdGg7XG5cbiAgICByZXR1cm4gcGF0aFV0aWxzLmNyZWF0ZVJlZ2V4UGF0aChhY2Nlc3NQYXRoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN5bnRoZXNpemUgPSByZXF1aXJlKCcuL3N5bnRoZXNpemUnKVxuICAgICwgcGF0aFV0aWxzID0gcmVxdWlyZSgnLi9wYXRoX3V0aWxzJylcbiAgICAsIGNoYW5nZURhdGFIYW5kbGVyID0gcmVxdWlyZSgnLi9jaGFuZ2VfZGF0YScpXG4gICAgLCBNZXNzZW5nZXIgPSByZXF1aXJlKCcuLi9tZXNzZW5nZXInKVxuICAgICwgTW9kZWxQYXRoTXNnQVBJID0gcmVxdWlyZSgnLi9wYXRoX21zZ19hcGknKVxuICAgICwgTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSA9IHJlcXVpcmUoJy4uL21lc3Nlbmdlci9tc25ncl9zb3VyY2UnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsUGF0aDtcblxuXG4vKipcbiAqIGBtaWxvLk1vZGVsLlBhdGhgXG4gKiBNb2RlbFBhdGggb2JqZWN0IHRoYXQgYWxsb3dzIGFjY2VzcyB0byBhbnkgcG9pbnQgaW5zaWRlIFtNb2RlbF0oLi9pbmRleC5qcy5odG1sKSBhcyBkZWZpbmVkIGJ5IGBhY2Nlc3NQYXRoYFxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtNb2RlbH0gbW9kZWwgTW9kZWwgaW5zdGFuY2UgdGhhdCBNb2RlbFBhdGggZ2l2ZXMgYWNjZXNzIHRvLlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc1BhdGggc3RyaW5nIHRoYXQgZGVmaW5lcyBwYXRoIHRvIGFjY2VzcyBtb2RlbC5cbiAqICBQYXRoIHN0cmluZyBjb25zaXN0cyBvZiBwYXJ0cyB0byBkZWZpbmUgZWl0aGVyIHByb3BlcnR5IGFjY2VzcyAoYFwiLm5hbWVcImAgdG8gYWNjZXNzIHByb3BlcnR5IG5hbWUpIG9yIGFycmF5IGl0ZW0gYWNjZXNzIChgXCJbMV1cImAgdG8gYWNjZXNzIGl0ZW0gd2l0aCBpbmRleCAxKS5cbiAqICBBY2Nlc3MgcGF0aCBjYW4gY29udGFpbiBhcyBtYW55IHBhcnRzIGFzIG5lY2Vzc2FyeSAoZS5nLiBgXCIubGlzdFswXS5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBgbmFtZWAgaW4gdGhlIGZpcnN0IGVsZW1lbnQgb2YgYXJyYXkgc3RvcmVkIGluIHByb3BlcnR5IGBsaXN0YC5cbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGFkZGl0aW9uYWwgYXJndW1lbnRzIG9mIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnRlcnBvbGF0ZWQgcGF0aHMuXG4gKiAgRS5nLiBgbS5wYXRoKFwiWyQxXS4kMlwiLCBpZCwgcHJvcClgIHJldHVybnMgTW9kZWxQYXRoIHRvIGFjY2VzcyBwcm9wZXJ0eSB3aXRoIG5hbWUgYHByb3BgIGluIGFycmF5IGl0ZW0gd2l0aCBpbmRleCBgaWRgLiBBbHRob3VnaCB0aGlzIE1vZGVsUGF0aCBvYmplY3Qgd2lsbCB3b3JrIGV4YWN0bHkgYXMgYG0oXCJbXCIgKyBpZCArIFwiXS5cIiArIHByb3ApYCwgdGhlIGludGVycG9sYXRlZCBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IGFzIE1vZGVsUGF0aCB3aXRoIGludGVycG9sYXRpb24gd2lsbCBub3Qgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycywgd2hpbGUgTW9kZWxQYXRoIHdpdGggY29tcHV0ZWQgYWNjZXNzIHBhdGggd2lsbCBzeW50aGVzaXplIG5ldyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGZvciBlYWNoIHBhaXIgb2YgdmFsdWVzIG9mIGBpZGAgYW5kIGBwcm9wYC5cbiAqIEByZXR1cm4ge01vZGVsUGF0aH1cbiAqL1xuZnVuY3Rpb24gTW9kZWxQYXRoKG1vZGVsLCBwYXRoKSB7IC8vICwuLi4gLSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgaW50ZXJwb2xhdGlvblxuICAgIC8vIGNoZWNrKG1vZGVsLCBNb2RlbCk7XG4gICAgY2hlY2socGF0aCwgU3RyaW5nKTtcblxuICAgIC8vIGBtb2RlbFBhdGhgIHdpbGwgYmUgcmV0dXJuZWQgYnkgY29uc3RydWN0b3IgaW5zdGVhZCBvZiBgdGhpc2AuIGBtb2RlbFBhdGhgXG4gICAgLy8gKGBtb2RlbFBhdGhfcGF0aGAgZnVuY3Rpb24pIHNob3VsZCBhbHNvIHJldHVybiBhIE1vZGVsUGF0aCBvYmplY3Qgd2l0aCBcInN5bnRoZXNpemVkXCIgbWV0aG9kc1xuICAgIC8vIHRvIGdldC9zZXQgbW9kZWwgcHJvcGVydGllcywgdG8gc3Vic2NyaWJlIHRvIHByb3BlcnR5IGNoYW5nZXMsIGV0Yy5cbiAgICAvLyBBZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiBtb2RlbFBhdGggY2FuIGJlIHVzZWQgaW4gdGhlIHBhdGggdXNpbmcgaW50ZXJwb2xhdGlvbiAtIHNlZSBNb2RlbFBhdGggYmVsb3cuXG4gICAgdmFyIG1vZGVsUGF0aCA9IGZ1bmN0aW9uIG1vZGVsUGF0aF9wYXRoKGFjY2Vzc1BhdGgpIHsgLy8gLCAuLi4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBpbnRlcnBvbGF0ZWRcbiAgICAgICAgcmV0dXJuIE1vZGVsUGF0aCRwYXRoLmFwcGx5KG1vZGVsUGF0aCwgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIG1vZGVsUGF0aC5fX3Byb3RvX18gPSBNb2RlbFBhdGgucHJvdG90eXBlO1xuXG5cbiAgICBfLmRlZmluZVByb3BlcnRpZXMobW9kZWxQYXRoLCB7XG4gICAgICAgIF9tb2RlbDogbW9kZWwsXG4gICAgICAgIF9wYXRoOiBwYXRoLFxuICAgICAgICBfYXJnczogXy5zbGljZShhcmd1bWVudHMsIDEpLCAvLyBwYXRoIHdpbGwgYmUgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBhcnJheVxuICAgICAgICBfb3B0aW9uczogbW9kZWwuX29wdGlvbnNcbiAgICB9KTtcblxuICAgIC8vIHBhcnNlIGFjY2VzcyBwYXRoXG4gICAgdmFyIHBhcnNlZFBhdGggPSBwYXRoVXRpbHMucGFyc2VBY2Nlc3NQYXRoKHBhdGgpO1xuXG4gICAgLy8gY29tcHV0ZSBhY2Nlc3MgcGF0aCBzdHJpbmdcbiAgICBfLmRlZmluZVByb3BlcnR5KG1vZGVsUGF0aCwgJ19hY2Nlc3NQYXRoJywgaW50ZXJwb2xhdGVBY2Nlc3NQYXRoKHBhcnNlZFBhdGgsIG1vZGVsUGF0aC5fYXJncykpO1xuXG4gICAgaWYgKG1vZGVsUGF0aC5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgLy8gbWVzc2VuZ2VyIGZhaWxzIG9uIFwiKlwiIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgbW9kZWxQYXRoLl9wcmVwYXJlTWVzc2VuZ2VyKCk7XG4gICAgICAgIC8vIHN1YnNjcmliZSB0byBcImNoYW5nZWRhdGFcIiBtZXNzYWdlIHRvIGVuYWJsZSByZWFjdGl2ZSBjb25uZWN0aW9uc1xuICAgICAgICBtb2RlbFBhdGgub25TeW5jKCdjaGFuZ2VkYXRhJywgY2hhbmdlRGF0YUhhbmRsZXIpO1xuICAgIH1cblxuICAgIC8vIGNvbXBpbGluZyBnZXR0ZXIgYW5kIHNldHRlclxuICAgIHZhciBtZXRob2RzID0gc3ludGhlc2l6ZShwYXRoLCBwYXJzZWRQYXRoKTtcblxuICAgIC8vIGFkZGluZyBtZXRob2RzIHRvIG1vZGVsIHBhdGhcbiAgICBfLmRlZmluZVByb3BlcnRpZXMobW9kZWxQYXRoLCBtZXRob2RzKTtcblxuICAgIE9iamVjdC5mcmVlemUobW9kZWxQYXRoKTtcblxuICAgIHJldHVybiBtb2RlbFBhdGg7XG59XG5cbk1vZGVsUGF0aC5wcm90b3R5cGUuX19wcm90b19fID0gTW9kZWxQYXRoLl9fcHJvdG9fXztcblxuXG4vKipcbiAqIEludGVycG9sYXRlcyBwYXRoIGVsZW1lbnRzIHRvIGNvbXB1dGUgcmVhbCBwYXRoXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcGFyc2VkUGF0aCBwYXJzZWQgcGF0aCAtIGFycmF5IG9mIHBhdGggbm9kZXNcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgcGF0aCBpbnRlcnBvbGF0aW9uIGFyZ3VtZW50cywgYXJnc1swXSBpcyBwYXRoIGl0c2VsZlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUFjY2Vzc1BhdGgocGFyc2VkUGF0aCwgYXJncykge1xuICAgIHJldHVybiBwYXJzZWRQYXRoLnJlZHVjZShmdW5jdGlvbihhY2Nlc3NQYXRoU3RyLCBjdXJyTm9kZSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGludGVycG9sYXRlID0gY3Vyck5vZGUuaW50ZXJwb2xhdGU7XG4gICAgICAgIHJldHVybiBhY2Nlc3NQYXRoU3RyICtcbiAgICAgICAgICAgICAgICAoaW50ZXJwb2xhdGVcbiAgICAgICAgICAgICAgICAgICAgPyAoY3Vyck5vZGUuc3ludGF4ID09ICdhcnJheSdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ1snICsgYXJnc1tpbnRlcnBvbGF0ZV0gKyAnXSdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJy4nICsgYXJnc1tpbnRlcnBvbGF0ZV0pXG4gICAgICAgICAgICAgICAgICAgIDogY3Vyck5vZGUucHJvcGVydHkpO1xuICAgIH0sICcnKTtcbn1cblxuXG4vKipcbiAqICMjIyNNb2RlbFBhdGggaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtwYXRoXSgjTW9kZWxQYXRoJHBhdGgpIC0gZ2l2ZXMgYWNjZXNzIHRvIHBhdGggaW5zaWRlIE1vZGVsUGF0aFxuICogLSBnZXQgLSBzeW50aGVzaXplZFxuICogLSBzZXQgLSBzeW50aGVzaXplZFxuICogLSBzcGxpY2UgLSBzcGxpY2UgbW9kZWwgZGF0YSAoYXMgYXJyYXkgb3IgcHNldWRvLWFycmF5KSwgc3ludGhlc2l6ZWRcbiAqIC0gW2xlbl0oI01vZGVsUGF0aCRsZW4pIC0gcmV0dXJucyBsZW5ndGggb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gc2FmZSB3YXksIDAgaWYgbm8gbGVuZ3RoIGlzIHNldFxuICogLSBbcHVzaF0oI01vZGVsUGF0aCRwdXNoKSAtIGFkZCBpdGVtcyB0byB0aGUgZW5kIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIE1vZGVsUGF0aFxuICogLSBbcG9wXSgjTW9kZWxQYXRoJHBvcCkgLSByZW1vdmUgaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gTW9kZWxQYXRoXG4gKiAtIFt1bnNoaWZ0XSgjTW9kZWxQYXRoJHVuc2hpZnQpIC0gYWRkIGl0ZW1zIHRvIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gTW9kZWxQYXRoXG4gKiAtIFtzaGlmdF0oI01vZGVsUGF0aCRzaGlmdCkgLSByZW1vdmUgaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gTW9kZWxQYXRoXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTW9kZWxQYXRoLCB7XG4gICAgcGF0aDogTW9kZWxQYXRoJHBhdGgsXG4gICAgbGVuOiBNb2RlbFBhdGgkbGVuLFxuICAgIHB1c2g6IE1vZGVsUGF0aCRwdXNoLFxuICAgIHBvcDogTW9kZWxQYXRoJHBvcCxcbiAgICB1bnNoaWZ0OiBNb2RlbFBhdGgkdW5zaGlmdCxcbiAgICBzaGlmdDogTW9kZWxQYXRoJHNoaWZ0LFxuICAgIF9wcmVwYXJlTWVzc2VuZ2VyOiBfcHJlcGFyZU1lc3NlbmdlcixcbiAgICBfZ2V0RGVmaW5pdGlvbjogX2dldERlZmluaXRpb24sXG4gICAgZGVzdHJveTogTW9kZWxQYXRoJGRlc3Ryb3lcbn0pO1xuXG5cbl8uZXh0ZW5kKE1vZGVsUGF0aCwge1xuICAgIF9jcmVhdGVGcm9tRGVmaW5pdGlvbjogX2NyZWF0ZUZyb21EZWZpbml0aW9uXG59KVxuXG5cbi8qKlxuICogRXhwb3NlIE1lc3NlbmdlciBtZXRob2RzIG9uIEZhY2V0IHByb3RvdHlwZVxuICovXG52YXIgTUVTU0VOR0VSX1BST1BFUlRZID0gJ19tZXNzZW5nZXInO1xuTWVzc2VuZ2VyLnVzZVdpdGgoTW9kZWxQYXRoLCBNRVNTRU5HRVJfUFJPUEVSVFksIE1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcyk7XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggaW5zdGFuY2UgbWV0aG9kXG4gKiBHaXZlcyBhY2Nlc3MgdG8gcGF0aCBpbnNpZGUgTW9kZWxQYXRoLiBNZXRob2Qgd29ya3Mgc2ltaWxhcmx5IHRvIFtwYXRoIG1ldGhvZF0oI01vZGVsJHBhdGgpIG9mIG1vZGVsLCB1c2luZyByZWxhdGl2ZSBwYXRocy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzUGF0aCBzdHJpbmcgdGhhdCBkZWZpbmVzIHBhdGggdG8gYWNjZXNzIG1vZGVsLlxuICogIFBhdGggc3RyaW5nIGNvbnNpc3RzIG9mIHBhcnRzIHRvIGRlZmluZSBlaXRoZXIgcHJvcGVydHkgYWNjZXNzIChgXCIubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgbmFtZSkgb3IgYXJyYXkgaXRlbSBhY2Nlc3MgKGBcIlsxXVwiYCB0byBhY2Nlc3MgaXRlbSB3aXRoIGluZGV4IDEpLlxuICogIEFjY2VzcyBwYXRoIGNhbiBjb250YWluIGFzIG1hbnkgcGFydHMgYXMgbmVjZXNzYXJ5IChlLmcuIGBcIi5saXN0WzBdLm5hbWVcImAgdG8gYWNjZXNzIHByb3BlcnR5IGBuYW1lYCBpbiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhcnJheSBzdG9yZWQgaW4gcHJvcGVydHkgYGxpc3RgLlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWRkaXRpb25hbCBhcmd1bWVudHMgb2YgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGludGVycG9sYXRlZCBwYXRocy5cbiAqICBFLmcuIGBtLnBhdGgoXCJbJDFdLiQyXCIsIGlkLCBwcm9wKWAgcmV0dXJucyBNb2RlbFBhdGggdG8gYWNjZXNzIHByb3BlcnR5IHdpdGggbmFtZSBgcHJvcGAgaW4gYXJyYXkgaXRlbSB3aXRoIGluZGV4IGBpZGAuIEFsdGhvdWdoIHRoaXMgTW9kZWxQYXRoIG9iamVjdCB3aWxsIHdvcmsgZXhhY3RseSBhcyBgbShcIltcIiArIGlkICsgXCJdLlwiICsgcHJvcClgLCB0aGUgaW50ZXJwb2xhdGVkIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgYXMgTW9kZWxQYXRoIHdpdGggaW50ZXJwb2xhdGlvbiB3aWxsIG5vdCBzeW50aGVzaXplIG5ldyBnZXR0ZXJzIGFuZCBzZXR0ZXJzLCB3aGlsZSBNb2RlbFBhdGggd2l0aCBjb21wdXRlZCBhY2Nlc3MgcGF0aCB3aWxsIHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVhY2ggcGFpciBvZiB2YWx1ZXMgb2YgYGlkYCBhbmQgYHByb3BgLlxuICogQHJldHVybiB7TW9kZWxQYXRofVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkcGF0aChhY2Nlc3NQYXRoKSB7ICAvLyAsIC4uLiBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIGludGVycG9sYXRlZFxuICAgIGlmICghIGFjY2Vzc1BhdGgpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIHRoaXNQYXRoQXJnc0NvdW50ID0gdGhpcy5fYXJncy5sZW5ndGggLSAxO1xuXG4gICAgaWYgKHRoaXNQYXRoQXJnc0NvdW50ID4gMCkgey8vIHRoaXMgcGF0aCBoYXMgaW50ZXJwb2xhdGVkIGFyZ3VtZW50cyB0b29cbiAgICAgICAgYWNjZXNzUGF0aCA9IGFjY2Vzc1BhdGgucmVwbGFjZSgvXFwkWzEtOV1bMC05XSovZywgZnVuY3Rpb24oc3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gJyQnICsgKCtzdHIuc2xpY2UoMSkgKyB0aGlzUGF0aEFyZ3NDb3VudCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBuZXdQYXRoID0gdGhpcy5fcGF0aCArIGFjY2Vzc1BhdGg7XG5cbiAgICAvLyB0aGlzLl9tb2RlbCBpcyBhZGRlZCBpbiBmcm9udCBvZiBhbGwgYXJndW1lbnRzIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXJcbiAgICAvLyBvZiBNb2RlbFBhdGggY29uc3RydWN0b3JcbiAgICB2YXIgYXJncyA9IFt0aGlzLl9tb2RlbCwgbmV3UGF0aF1cbiAgICAgICAgICAgICAgICAuY29uY2F0KHRoaXMuX2FyZ3Muc2xpY2UoMSkpIC8vIHJlbW92ZSBvbGQgcGF0aCBmcm9tIF9hcmdzLCBhcyBpdCBpcyAxIGJhc2VkXG4gICAgICAgICAgICAgICAgLmNvbmNhdChfLnNsaWNlKGFyZ3VtZW50cywgMSkpOyAvLyBhZGQgbmV3IGludGVycG9sYXRpb24gYXJndW1lbnRzXG5cbiAgICAvLyBjYWxsaW5nIE1vZGVsUGF0aCBjb25zdHJ1Y3RvciB3aXRoIG5ldyBhbmQgdGhlIGxpc3Qgb2YgYXJndW1lbnRzOiB0aGlzIChtb2RlbCksIGFjY2Vzc1BhdGgsIC4uLlxuICAgIHJldHVybiBfLm5ld0FwcGx5KE1vZGVsUGF0aCwgYXJncyk7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBsZW5ndGggcHJvcGVydHkgYW5kIHNldHMgaXQgdG8gMCBpZiBpdCB3YXNuJ3Qgc2V0LlxuICpcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gTW9kZWxQYXRoJGxlbigpIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoKCcubGVuZ3RoJykuZ2V0KCkgfHwgMDtcbn1cblxuXG4vKipcbiAqIE1vZGVsUGF0aCBhbmQgTW9kZWwgaW5zdGFuY2UgbWV0aG9kXG4gKiBBZGRzIGl0ZW1zIHRvIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkuIFJldHVybnMgbmV3IGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBsaXN0IG9mIGl0ZW1zIHRoYXQgd2lsbCBiZSBhZGRlZCB0byBhcnJheSAocHNldWRvIGFycmF5KVxuICogQHJldHVybiB7SW50ZWdlcn1cbiAqL1xuZnVuY3Rpb24gTW9kZWxQYXRoJHB1c2goKSB7IC8vIGFyZ3VtZW50c1xuICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbigpO1xuICAgIHZhciBuZXdMZW5ndGggPSBsZW5ndGggKyBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgXy5zcGxpY2UoYXJndW1lbnRzLCAwLCAwLCBsZW5ndGgsIDApO1xuICAgIHRoaXMuc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICByZXR1cm4gbmV3TGVuZ3RoO1xufVxuXG5cbi8qKlxuICogTW9kZWxQYXRoIGFuZCBNb2RlbCBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbW92ZXMgaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkuIFJldHVybnMgdGhpcyBpdGVtLlxuICpcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gTW9kZWxQYXRoJHBvcCgpIHtcbiAgICByZXR1cm4gdGhpcy5zcGxpY2UodGhpcy5sZW4oKSAtIDEsIDEpWzBdO1xufVxuXG5cbi8qKlxuICogTW9kZWxQYXRoIGFuZCBNb2RlbCBpbnN0YW5jZSBtZXRob2RcbiAqIEluc2VydHMgaXRlbXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIFJldHVybnMgbmV3IGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBpdGVtcyB0byBiZSBpbnNlcnRlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIGFycmF5XG4gKiBAcmV0dXJuIHtJbnRlZ2VyfVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkdW5zaGlmdCgpIHsgLy8gYXJndW1lbnRzXG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuKCk7XG4gICAgbGVuZ3RoICs9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICBfLnNwbGljZShhcmd1bWVudHMsIDAsIDAsIDAsIDApO1xuICAgIHRoaXMuc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICByZXR1cm4gbGVuZ3RoO1xufVxuXG5cbi8qKlxuICogTW9kZWxQYXRoIGFuZCBNb2RlbCBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbW92ZXMgdGhlIGl0ZW0gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpLiBSZXR1cm5zIHRoaXMgaXRlbS5cbiAqXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCRzaGlmdCgpIHsgLy8gYXJndW1lbnRzXG4gICAgcmV0dXJuIHRoaXMuc3BsaWNlKDAsIDEpWzBdO1xufVxuXG5cbi8qKlxuICogTW9kZWxQYXRoIGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbGl6ZXMgTW9kZWxQYXRoIG1lc2VuZ2VyIHdpdGggTW9kZWwncyBtZXNzZW5nZXIgYXMgaXRzIHNvdXJjZSAoW01lc3Nlbmdlck1lc3NhZ2VTb3VyY2VdKC4uL21lc3Nlbmdlci9tc25ncl9zb3VyY2UuanMuaHRtbCkpIGFuZCBbTW9kZWxQYXRoTXNnQVBJXSguL3BhdGhfbXNnX2FwaS5qcy5odG1sKSBhcyBbTWVzc2VuZ2VyQVBJXSguLi9tZXNzZW5nZXIvbV9hcGkuanMuaHRtbClcbiAqL1xuZnVuY3Rpb24gX3ByZXBhcmVNZXNzZW5nZXIoKSB7XG4gICAgdmFyIG1QYXRoQVBJID0gbmV3IE1vZGVsUGF0aE1zZ0FQSSh0aGlzLl9hY2Nlc3NQYXRoKTtcblxuICAgIC8vIGNyZWF0ZSBNZXNzZW5nZXJNZXNzYWdlU291cmNlIGNvbm5lY3RlZCB0byBNb2RlbCdzIG1lc3NlbmdlclxuICAgIHZhciBtb2RlbE1lc3NhZ2VTb3VyY2UgPSBuZXcgTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSh0aGlzLCB1bmRlZmluZWQsIG1QYXRoQVBJLCB0aGlzLl9tb2RlbCk7XG5cbiAgICAvLyBjcmVhdGUgbWVzc2VuZ2VyIHdpdGggbW9kZWwgcGFzc2VkIGFzIGhvc3RPYmplY3QgKGRlZmF1bHQgbWVzc2FnZSBkaXNwYXRjaCBjb250ZXh0KVxuICAgIC8vIGFuZCB3aXRob3V0IHByb3h5aW5nIG1ldGhvZHMgKHdlIGRvbid0IHdhbnQgdG8gcHJveHkgdGhlbSB0byBNb2RlbClcbiAgICB2YXIgbVBhdGhNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHRoaXMsIHVuZGVmaW5lZCwgbW9kZWxNZXNzYWdlU291cmNlKTtcblxuICAgIC8vIHN0b3JlIG1lc3NlbmdlciBvbiBNb2RlbFBhdGggaW5zdGFuY2VcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsIE1FU1NFTkdFUl9QUk9QRVJUWSwgbVBhdGhNZXNzZW5nZXIpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgb2JqZWN0IGFsbG93aW5nIHRvIHJlY3JlYXRlIG1vZGVsIHBhdGhcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIF9nZXREZWZpbml0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG1vZGVsOiB0aGlzLl9tb2RlbCxcbiAgICAgICAgcGF0aDogdGhpcy5fcGF0aCxcbiAgICAgICAgYXJnczogdGhpcy5fYXJnc1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBDbGFzcyBtZXRob2RcbiAqIENyZWF0ZXMgbW9kZWxQYXRoIG9iamVjdCBmcm9tIGRlZmluaXRpb24gY3JlYXRlZCBieSBfZ2V0RGVmaW5pdGlvblxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gZGVmaW5pdGlvblxuICogQHJldHVybiB7TW9kZWxQYXRofVxuICovXG5mdW5jdGlvbiBfY3JlYXRlRnJvbURlZmluaXRpb24oZGVmaW5pdGlvbikge1xuICAgIGNoZWNrKGRlZmluaXRpb24sIHtcbiAgICAgICAgbW9kZWw6IEZ1bmN0aW9uLCAvLyBNb2RlbFxuICAgICAgICBwYXRoOiBTdHJpbmcsXG4gICAgICAgIGFyZ3M6IEFycmF5XG4gICAgfSk7XG5cbiAgICB2YXIgbSA9IGRlZmluaXRpb24ubW9kZWw7XG5cbiAgICByZXR1cm4gbS5hcHBseShtLCBkZWZpbml0aW9uLmFyZ3MpO1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsUGF0aCRkZXN0cm95KCkge1xuICAgIHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXS5kZXN0cm95KCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1vZGVsVXRpbHMgPSB7XG4gICAgbm9ybWFsaXplU3BsaWNlSW5kZXg6IG5vcm1hbGl6ZVNwbGljZUluZGV4XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1vZGVsVXRpbHM7XG5cblxuZnVuY3Rpb24gbm9ybWFsaXplU3BsaWNlSW5kZXgoc3BsaWNlSW5kZXgsIGxlbmd0aCkge1xuICAgIHJldHVybiBzcGxpY2VJbmRleCA+IGxlbmd0aFxuICAgICAgICAgICAgPyBsZW5ndGhcbiAgICAgICAgICAgIDogc3BsaWNlSW5kZXggPj0gMFxuICAgICAgICAgICAgICAgID8gc3BsaWNlSW5kZXhcbiAgICAgICAgICAgICAgICA6IHNwbGljZUluZGV4ICsgbGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICA/IHNwbGljZUluZGV4ICsgbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIDogMDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1lc3NlbmdlckFQSSA9IHJlcXVpcmUoJy4uL21lc3Nlbmdlci9tX2FwaScpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogU3ViY2xhc3Mgb2YgTWVzc2VuZ2VyQVBJIHRoYXQgaXMgdXNlZCB0byB0cmFuc2xhdGUgbWVzc2FnZXMgb2YgTWVzc2VuZ2VyIG9uIE1vZGVsUGF0aCB0byBNZXNzZW5nZXIgb24gTW9kZWwuXG4gKi9cbnZhciBNb2RlbFBhdGhNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ01vZGVsUGF0aE1zZ0FQSScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsUGF0aE1zZ0FQSTtcblxuXG4vKipcbiAqICMjIyNNb2RlbFBhdGhNc2dBUEkgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjaW5pdCkgLSBpbml0aWFsaXplcyBNb2RlbFBhdGhNc2dBUElcbiAqIC0gW3RyYW5zbGF0ZVRvU291cmNlTWVzc2FnZV0oI3RyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSkgLSB0cmFuc2xhdGVzIHJlbGF0aXZlIGFjY2VzcyBwYXRocyBvZiBNb2RlbFBhdGggdG8gZnVsbCBwYXRoIG9mIE1vZGVsXG4gKiAtIFtjcmVhdGVJbnRlcm5hbERhdGFdKCNjcmVhdGVJbnRlcm5hbERhdGEpIC0gY2hhbmdlcyBwYXRoIGluIG1lc3NhZ2Ugb24gbW9kZWwgdG8gcmVsYXRpdmUgcGF0aCBhbmQgYWRkcyBgZnVsbFBhdGhgIHByb3BlcnR5IHRvIG1lc3NhZ2UgZGF0YVxuICovXG5fLmV4dGVuZFByb3RvKE1vZGVsUGF0aE1zZ0FQSSwge1xuICAgIGluaXQ6IGluaXQsXG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgY3JlYXRlSW50ZXJuYWxEYXRhOiBjcmVhdGVJbnRlcm5hbERhdGEsXG59KTtcblxuXG4vKipcbiAqIE1vZGVsUGF0aE1zZ0FQSSBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBNZXNzZW5nZXJBUEkgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHJvb3RQYXRoIHJvb3QgcGF0aCBvZiBtb2RlbCBwYXRoXG4gKi9cbmZ1bmN0aW9uIGluaXQocm9vdFBhdGgpIHtcbiAgICBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnJvb3RQYXRoID0gcm9vdFBhdGg7XG59XG5cbi8qKlxuICogTW9kZWxQYXRoTXNnQVBJIGluc3RhbmNlIG1ldGhvZFxuICogVHJhbnNsYXRlcyByZWxhdGl2ZSBhY2Nlc3MgcGF0aHMgb2YgTW9kZWxQYXRoIHRvIGZ1bGwgcGF0aCBvZiBNb2RlbC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzUGF0aCByZWxhdGl2ZSBhY2Nlc3MgcGF0aCB0byBiZSB0cmFuc2xhdGVkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgLy8gVE9ETyBzaG91bGQgcHJlcGVuZCBSZWdFeGVzXG4gICAgLy8gVE9ETyBzaG91bGQgbm90IHByZXBlbmQgY2hhbmdlZGF0YSB0b28/Pz9cbiAgICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgaWYgKG1lc3NhZ2UgPT0gJ2RhdGFjaGFuZ2VzJylcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgXG4gICAgcmV0dXJuIHRoaXMucm9vdFBhdGggKyBtZXNzYWdlO1xufVxuXG5cbi8qKlxuICogTW9kZWxQYXRoTXNnQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQ2hhbmdlcyBwYXRoIGluIG1lc3NhZ2Ugb24gbW9kZWwgdG8gcmVsYXRpdmUgcGF0aCBhbmQgYWRkcyBgZnVsbFBhdGhgIHByb3BlcnR5IHRvIG1lc3NhZ2UgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc291cmNlTWVzc2FnZSBmdWxsIGFjY2VzcyBwYXRoIG9uIE1vZGVsXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSByZWxhdGl2ZSBhY2Nlc3MgcGF0aCBvbiBNb2RlbFBhdGhcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VEYXRhIGRhdGEgcmVjZWl2ZWQgZnJvbSBNb2RlbCwgd2lsbCBiZSB0cmFuc2xhdGVkIGFzIGRlc2NyaWJlZCB0byBiZSBkaXNwYXRjaGVkIHRvIE1vZGVsUGF0aFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnRlcm5hbERhdGEoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgc291cmNlRGF0YSkge1xuICAgIC8vIFRPRE8gcmV0dXJuIG9uIGNoYW5nZWRhdGEgdG9vPz8/XG4gICAgaWYgKG1lc3NhZ2UgPT0gJ2RhdGFjaGFuZ2VzJykge1xuICAgICAgICB2YXIgaW50ZXJuYWxDaGFuZ2VzID0gc291cmNlRGF0YS5jaGFuZ2VzXG4gICAgICAgICAgICAubWFwKHRydW5jYXRlQ2hhbmdlUGF0aCwgdGhpcylcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oY2hhbmdlKSB7IHJldHVybiBjaGFuZ2U7IH0pO1xuICAgICAgICB2YXIgaW50ZXJuYWxEYXRhID0ge1xuICAgICAgICAgICAgY2hhbmdlczogaW50ZXJuYWxDaGFuZ2VzLFxuICAgICAgICAgICAgdHJhbnNhY3Rpb246IHNvdXJjZURhdGEudHJhbnNhY3Rpb25cbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gaW50ZXJuYWxEYXRhXG4gICAgfVxuXG4gICAgdmFyIGludGVybmFsRGF0YSA9IHRydW5jYXRlQ2hhbmdlUGF0aC5jYWxsKHRoaXMsIHNvdXJjZURhdGEpO1xuICAgIHJldHVybiBpbnRlcm5hbERhdGE7XG59XG5cblxuZnVuY3Rpb24gdHJ1bmNhdGVDaGFuZ2VQYXRoKGNoYW5nZSkge1xuICAgIHZhciBmdWxsUGF0aCA9IGNoYW5nZS5wYXRoXG4gICAgICAgICwgcGF0aCA9IF8udW5QcmVmaXgoZnVsbFBhdGgsIHRoaXMucm9vdFBhdGgpO1xuXG4gICAgaWYgKHR5cGVvZiBwYXRoID09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBjaGFuZ2UgPSBfLmNsb25lKGNoYW5nZSk7XG4gICAgICAgIGNoYW5nZS5mdWxsUGF0aCA9IGZ1bGxQYXRoO1xuICAgICAgICBjaGFuZ2UucGF0aCA9IHBhdGg7XG4gICAgICAgIHJldHVybiBjaGFuZ2U7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwibW9kZWwtcGF0aFwiPjwvYT5cbi8vICMjIyBtb2RlbCBwYXRoIHV0aWxzXG5cbnZhciBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG52YXIgcGF0aFV0aWxzID0ge1xuICAgIHBhcnNlQWNjZXNzUGF0aDogcGFyc2VBY2Nlc3NQYXRoLFxuICAgIGNyZWF0ZVJlZ2V4UGF0aDogY3JlYXRlUmVnZXhQYXRoLFxuICAgIGdldFBhdGhOb2RlS2V5OiBnZXRQYXRoTm9kZUtleSxcbiAgICB3cmFwTWVzc2VuZ2VyTWV0aG9kczogd3JhcE1lc3Nlbmdlck1ldGhvZHNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aFV0aWxzO1xuXG5cbnZhciBwcm9wZXJ0eVBhdGhTeW50YXggPSAnXFxcXC5bQS1aYS16Xy1dW0EtWmEtejAtOV8tXSonXG4gICAgLCBhcnJheVBhdGhTeW50YXggPSAnXFxcXFtbMC05XStcXFxcXSdcbiAgICAsIGludGVycG9sYXRpb25TeW50YXggPSAnXFxcXCRbMS05XVswLTldKidcbiAgICAsIHByb3BlcnR5SW50ZXJwb2xhdGVTeW50YXggPSAnXFxcXC4nICsgaW50ZXJwb2xhdGlvblN5bnRheFxuICAgICwgYXJyYXlJbnRlcnBvbGF0ZVN5bnRheCA9ICdcXFxcWycgKyBpbnRlcnBvbGF0aW9uU3ludGF4ICsgJ1xcXFxdJ1xuXG4gICAgLCBwcm9wZXJ0eVN0YXJTeW50YXggPSAnXFxcXC5cXFxcKidcbiAgICAsIGFycmF5U3RhclN5bnRheCA9ICdcXFxcW1xcXFwqXFxcXF0nXG4gICAgLCBzdGFyU3ludGF4ID0gJ1xcXFwqJ1xuXG4gICAgLCBwYXRoUGFyc2VTeW50YXggPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoU3ludGF4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5UGF0aFN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUludGVycG9sYXRlU3ludGF4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5SW50ZXJwb2xhdGVTeW50YXhcbiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignfCcpXG4gICAgLCBwYXRoUGFyc2VQYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXRoUGFyc2VTeW50YXgsICdnJylcblxuICAgICwgcGF0dGVyblBhdGhQYXJzZVN5bnRheCA9ICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoUGFyc2VTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVN0YXJTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVN0YXJTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFyU3ludGF4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignfCcpXG4gICAgLCBwYXR0ZXJuUGF0aFBhcnNlUGF0dGVybiA9IG5ldyBSZWdFeHAocGF0dGVyblBhdGhQYXJzZVN5bnRheCwgJ2cnKVxuXG4gICAgLy8sIHRhcmdldFBhdGhQYXJzZVBhdHRlcm4gPSAvXFwuW0EtWmEtel1bQS1aYS16MC05X10qfFxcW1swLTldK1xcXXxcXC5cXCRbMS05XVswLTldKnxcXFtcXCRbMS05XVswLTldKlxcXXxcXCRbMS05XVswLTldL2dcbiAgICAsIHBhdGhOb2RlVHlwZXMgPSB7XG4gICAgICAgICcuJzogeyBzeW50YXg6ICdvYmplY3QnLCBlbXB0eTogJ3t9JyB9LFxuICAgICAgICAnWyc6IHsgc3ludGF4OiAnYXJyYXknLCBlbXB0eTogJ1tdJ30sXG4gICAgICAgICcqJzogeyBzeW50YXg6ICdtYXRjaCcsIGVtcHR5OiAne30nfSxcbiAgICB9O1xuXG5mdW5jdGlvbiBwYXJzZUFjY2Vzc1BhdGgocGF0aCwgbm9kZVBhcnNlUGF0dGVybikge1xuICAgIG5vZGVQYXJzZVBhdHRlcm4gPSBub2RlUGFyc2VQYXR0ZXJuIHx8IHBhdGhQYXJzZVBhdHRlcm47XG5cbiAgICB2YXIgcGFyc2VkUGF0aCA9IFtdO1xuXG4gICAgaWYgKCEgcGF0aClcbiAgICAgICAgcmV0dXJuIHBhcnNlZFBhdGg7XG5cbiAgICB2YXIgdW5wYXJzZWQgPSBwYXRoLnJlcGxhY2Uobm9kZVBhcnNlUGF0dGVybiwgZnVuY3Rpb24obm9kZVN0cikge1xuICAgICAgICB2YXIgcGF0aE5vZGUgPSB7IHByb3BlcnR5OiBub2RlU3RyIH07XG4gICAgICAgIF8uZXh0ZW5kKHBhdGhOb2RlLCBwYXRoTm9kZVR5cGVzW25vZGVTdHJbMF1dKTtcbiAgICAgICAgaWYgKG5vZGVTdHJbMV0gPT0gJyQnKVxuICAgICAgICAgICAgcGF0aE5vZGUuaW50ZXJwb2xhdGUgPSBnZXRQYXRoTm9kZUtleShwYXRoTm9kZSwgdHJ1ZSk7XG5cbiAgICAgICAgcGFyc2VkUGF0aC5wdXNoKHBhdGhOb2RlKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuICAgIGlmICh1bnBhcnNlZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmNvcnJlY3QgbW9kZWwgcGF0aDogJyArIHBhdGgpO1xuXG4gICAgcmV0dXJuIHBhcnNlZFBhdGg7XG59XG5cblxudmFyIG5vZGVSZWdleCA9IHtcbiAgICAnLionOiBwcm9wZXJ0eVBhdGhTeW50YXgsXG4gICAgJ1sqXSc6IGFycmF5UGF0aFN5bnRheFxufTtcbm5vZGVSZWdleFsnKiddID0gbm9kZVJlZ2V4WycuKiddICsgJ3wnICsgbm9kZVJlZ2V4WydbKl0nXTtcblxuZnVuY3Rpb24gY3JlYXRlUmVnZXhQYXRoKHBhdGgpIHtcbiAgICBjaGVjayhwYXRoLCBNYXRjaC5PbmVPZihTdHJpbmcsIFJlZ0V4cCkpO1xuXG4gICAgaWYgKHBhdGggaW5zdGFuY2VvZiBSZWdFeHAgfHwgcGF0aC5pbmRleE9mKCcqJykgPT0gLTEpXG4gICAgICAgIHJldHVybiBwYXRoO1xuXG4gICAgdmFyIHBhcnNlZFBhdGggPSBwYXRoVXRpbHMucGFyc2VBY2Nlc3NQYXRoKHBhdGgsIHBhdHRlcm5QYXRoUGFyc2VQYXR0ZXJuKVxuICAgICAgICAsIHJlZ2V4U3RyID0gJ14nXG4gICAgICAgIC8vICwgcmVnZXhTdHJFbmQgPSAnJ1xuICAgICAgICAsIHBhdHRlcm5zU3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgcGFyc2VkUGF0aC5mb3JFYWNoKGZ1bmN0aW9uKHBhdGhOb2RlKSB7XG4gICAgICAgIHZhciBwcm9wID0gcGF0aE5vZGUucHJvcGVydHlcbiAgICAgICAgICAgICwgcmVnZXggPSBub2RlUmVnZXhbcHJvcF07XG4gICAgICAgIFxuICAgICAgICBpZiAocmVnZXgpIHtcbiAgICAgICAgICAgIC8vIHJlZ2V4U3RyICs9ICcoJyArIHJlZ2V4O1xuICAgICAgICAgICAgLy8gcmVnZXhTdHJFbmQgKz0gJ3wpJztcbiAgICAgICAgICAgIHJlZ2V4U3RyICs9ICcoJyArIHJlZ2V4ICsgJ3wpJztcbiAgICAgICAgICAgIC8vIHJlZ2V4U3RyRW5kICs9ICd8KSc7XG4gICAgICAgICAgICBwYXR0ZXJuc1N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgKHBhdHRlcm5zU3RhcnRlZClcbiAgICAgICAgICAgIC8vICB0aHJvdyBuZXcgRXJyb3IoJ1wiKlwiIHBhdGggc2VnbWVudCBjYW5ub3QgYmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcGF0aDogJyArIHBhdGgpO1xuICAgICAgICAgICAgcmVnZXhTdHIgKz0gcHJvcC5yZXBsYWNlKC8oXFwufFxcW3xcXF0pL2csICdcXFxcJDEnKTsgLy8gYWRkIHNsYXNoIGluIGZyb250IG9mIHN5bWJvbHMgdGhhdCBoYXZlIHNwZWNpYWwgbWVhbmluZyBpbiByZWdleFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZWdleFN0ciArPSAvKiByZWdleFN0ckVuZCArICovICckJztcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4U3RyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuXFwndCBjb25zdHJ1Y3QgcmVnZXggZm9yIHBhdGggcGF0dGVybjogJyArIHBhdGgpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBnZXRQYXRoTm9kZUtleShwYXRoTm9kZSwgaW50ZXJwb2xhdGVkKSB7XG4gICAgdmFyIHByb3AgPSBwYXRoTm9kZS5wcm9wZXJ0eVxuICAgICAgICAsIHN0YXJ0SW5kZXggPSBpbnRlcnBvbGF0ZWQgPyAyIDogMTtcbiAgICByZXR1cm4gcGF0aE5vZGUuc3ludGF4ID09ICdhcnJheSdcbiAgICAgICAgPyBwcm9wLnNsaWNlKHN0YXJ0SW5kZXgsIHByb3AubGVuZ3RoIC0gMSlcbiAgICAgICAgOiBwcm9wLnNsaWNlKHN0YXJ0SW5kZXgpO1xufVxuXG5cbi8vIFRPRE8gYWxsb3cgZm9yIG11bHRpcGxlIG1lc3NhZ2VzIGluIGEgc3RyaW5nXG5mdW5jdGlvbiB3cmFwTWVzc2VuZ2VyTWV0aG9kcyhtZXRob2RzTmFtZXMpIHtcbiAgICBtZXRob2RzTmFtZXMgPSBtZXRob2RzTmFtZXMgfHwgWydvbicsICdvZmYnXTtcbiAgICB2YXIgd3JhcHBlZE1ldGhvZHMgPSBfLm1hcFRvT2JqZWN0KG1ldGhvZHNOYW1lcywgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgb3JpZ01ldGhvZCA9IHRoaXNbbWV0aG9kTmFtZV07XG4gICAgICAgIC8vIHJlcGxhY2luZyBtZXNzYWdlIHN1YnNyaWJlL3Vuc3Vic2NyaWJlL2V0Yy4gdG8gY29udmVydCBcIipcIiBtZXNzYWdlIHBhdHRlcm5zIHRvIHJlZ2V4cHNcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgsIHN1YnNjcmliZXIpIHtcbiAgICAgICAgICAgIHZhciByZWdleFBhdGggPSBjcmVhdGVSZWdleFBhdGgocGF0aCk7XG4gICAgICAgICAgICBvcmlnTWV0aG9kLmNhbGwodGhpcywgcmVnZXhQYXRoLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgfTtcbiAgICB9LCB0aGlzKTtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywgd3JhcHBlZE1ldGhvZHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcGF0aFV0aWxzID0gcmVxdWlyZSgnLi4vcGF0aF91dGlscycpXG4gICAgLCBtb2RlbFV0aWxzID0gcmVxdWlyZSgnLi4vbW9kZWxfdXRpbHMnKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9sb2dnZXInKVxuICAgICwgZnMgPSByZXF1aXJlKCdmcycpXG4gICAgLCBkb1QgPSByZXF1aXJlKCdkb3QnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGFuZ2VEYXRhSGFuZGxlciA9IHJlcXVpcmUoJy4uL2NoYW5nZV9kYXRhJylcbiAgICAsIGdldFRyYW5zYWN0aW9uRmxhZyA9IGNoYW5nZURhdGFIYW5kbGVyLmdldFRyYW5zYWN0aW9uRmxhZ1xuICAgICwgcG9zdFRyYW5zYWN0aW9uRmluaXNoZWQgPSBjaGFuZ2VEYXRhSGFuZGxlci5wb3N0VHJhbnNhY3Rpb25GaW5pc2hlZDtcblxuXG4vKipcbiAqIFRlbXBsYXRlcyB0byBzeW50aGVzaXplIG1vZGVsIGdldHRlcnMgYW5kIHNldHRlcnNcbiAqL1xudmFyIHRlbXBsYXRlcyA9IHtcbiAgICBnZXQ6IFwiJ3VzZSBzdHJpY3QnO1xcbi8qIE9ubHkgdXNlIHRoaXMgc3R5bGUgb2YgY29tbWVudHMsIG5vdCBcXFwiLy9cXFwiICovXFxuXFxubWV0aG9kID0gZnVuY3Rpb24gZ2V0KCkge1xcbiAgICB2YXIgbSA9IHt7IyBkZWYubW9kZWxBY2Nlc3NQcmVmaXggfX07XFxuICAgIHJldHVybiBtIHt7fiBpdC5wYXJzZWRQYXRoIDpwYXRoTm9kZSB9fVxcbiAgICAgICAge3s/IHBhdGhOb2RlLmludGVycG9sYXRlfX1cXG4gICAgICAgICAgICAmJiAobSA9IG1bdGhpcy5fYXJnc1sge3s9IHBhdGhOb2RlLmludGVycG9sYXRlIH19IF1dKVxcbiAgICAgICAge3s/P319XFxuICAgICAgICAgICAgJiYgKG0gPSBte3s9IHBhdGhOb2RlLnByb3BlcnR5IH19KVxcbiAgICAgICAge3s/fX0ge3t+fX07XFxufTtcXG5cIixcbiAgICBzZXQ6IFwiJ3VzZSBzdHJpY3QnO1xcbi8qIE9ubHkgdXNlIHRoaXMgc3R5bGUgb2YgY29tbWVudHMsIG5vdCBcXFwiLy9cXFwiICovXFxuXFxue3sjIGRlZi5pbmNsdWRlX2RlZmluZXMgfX1cXG57eyMgZGVmLmluY2x1ZGVfY3JlYXRlX3RyZWUgfX1cXG5cXG5cXG4vKipcXG4gKiBUZW1wbGF0ZSB0aGF0IHN5bnRoZXNpemVzIHNldHRlciBmb3IgTW9kZWwgYW5kIGZvciBNb2RlbFBhdGhcXG4gKi9cXG5tZXRob2QgPSBmdW5jdGlvbiBzZXQodmFsdWUpIHtcXG4gICAge3sjIGRlZi5pbml0VmFyczonc2V0JyB9fVxcblxcbiAgICB7eyMgZGVmLmNyZWF0ZVRyZWU6J3NldCcgfX1cXG5cXG4gICAge3tcXG4gICAgICAgIGN1cnJOb2RlID0gbmV4dE5vZGU7XFxuICAgICAgICBjdXJyUHJvcCA9IGN1cnJOb2RlICYmIGN1cnJOb2RlLnByb3BlcnR5O1xcbiAgICB9fVxcblxcbiAgICB7eyAvKiBhc3NpZ24gdmFsdWUgdG8gdGhlIGxhc3QgcHJvcGVydHkgKi8gfX1cXG4gICAge3s/IGN1cnJQcm9wIH19XFxuICAgICAgICB3YXNEZWYgPSB7eyMgZGVmLndhc0RlZmluZWR9fTtcXG4gICAgICAgIHt7IyBkZWYuY2hhbmdlQWNjZXNzUGF0aCB9fVxcblxcbiAgICAgICAgdmFyIG9sZCA9IG17eyMgZGVmLmN1cnJQcm9wIH19O1xcblxcbiAgICAgICAge3sgLyogY2xvbmUgdmFsdWUgdG8gcHJldmVudCBzYW1lIHJlZmVyZW5jZSBpbiBsaW5rZWQgbW9kZWxzICovIH19XFxuICAgICAgICBte3sjIGRlZi5jdXJyUHJvcCB9fSA9IGNsb25lVHJlZSh2YWx1ZSk7XFxuICAgIHt7P319XFxuXFxuICAgIHt7IC8qIGFkZCBtZXNzYWdlIHJlbGF0ZWQgdG8gdGhlIGxhc3QgcHJvcGVydHkgY2hhbmdlICovIH19XFxuICAgIGlmICh0aGlzLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xcbiAgICAgICAgaWYgKCEgd2FzRGVmKVxcbiAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGFjY2Vzc1BhdGgsIHR5cGU6ICdhZGRlZCcsXFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiB2YWx1ZSB9KTtcXG4gICAgICAgIGVsc2UgaWYgKG9sZCAhPSB2YWx1ZSlcXG4gICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnY2hhbmdlZCcsXFxuICAgICAgICAgICAgICAgIG9sZFZhbHVlOiBvbGQsIG5ld1ZhbHVlOiB2YWx1ZSB9KTtcXG5cXG4gICAgICAgIHt7IC8qIGFkZCBtZXNzYWdlIHJlbGF0ZWQgdG8gY2hhbmdlcyBpbiAoc3ViKXByb3BlcnRpZXMgaW5zaWRlIHJlbW92ZWQgYW5kIGFzc2lnbmVkIHZhbHVlICovIH19XFxuICAgICAgICBpZiAoISB3YXNEZWYgfHwgb2xkICE9IHZhbHVlKVxcbiAgICAgICAgICAgIGFkZFRyZWVDaGFuZ2VzTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCxcXG4gICAgICAgICAgICAgICAgYWNjZXNzUGF0aCwgb2xkLCB2YWx1ZSk7IC8qIGRlZmluZWQgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgc3ludGhlc2l6ZXMgTW9kZWxQYXRoIHNldHRlciAqL1xcblxcbiAgICAgICAge3sgLyogcG9zdCBhbGwgc3RvcmVkIG1lc3NhZ2VzICovIH19XFxuICAgICAgICB7eyMgZGVmLnBvc3RNZXNzYWdlcyB9fVxcbiAgICB9XFxufTtcXG5cIixcbiAgICBkZWw6IFwiJ3VzZSBzdHJpY3QnO1xcbi8qIE9ubHkgdXNlIHRoaXMgc3R5bGUgb2YgY29tbWVudHMsIG5vdCBcXFwiLy9cXFwiICovXFxuXFxue3sjIGRlZi5pbmNsdWRlX2RlZmluZXMgfX1cXG57eyMgZGVmLmluY2x1ZGVfdHJhdmVyc2VfdHJlZSB9fVxcblxcbm1ldGhvZCA9IGZ1bmN0aW9uIGRlbCgpIHtcXG4gICAge3sjIGRlZi5pbml0VmFyczonZGVsJyB9fVxcblxcbiAgICB7ez8gaXQucGFyc2VkUGF0aC5sZW5ndGggfX1cXG4gICAgICAgIHt7IyBkZWYudHJhdmVyc2VUcmVlIH19XFxuXFxuICAgICAgICB7e1xcbiAgICAgICAgICAgIHZhciBjdXJyTm9kZSA9IGl0LnBhcnNlZFBhdGhbY291bnRdO1xcbiAgICAgICAgICAgIHZhciBjdXJyUHJvcCA9IGN1cnJOb2RlLnByb3BlcnR5OyAgICAgICBcXG4gICAgICAgIH19XFxuXFxuICAgICAgICBpZiAoISB0cmVlRG9lc05vdEV4aXN0ICYmIG0gJiYgbS5oYXNPd25Qcm9wZXJ0eSAmJiB7eyMgZGVmLndhc0RlZmluZWR9fSkge1xcbiAgICAgICAgICAgIHZhciBvbGQgPSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgICAgICAgICBkZWxldGUgbXt7IyBkZWYuY3VyclByb3AgfX07XFxuICAgICAgICAgICAge3sjIGRlZi5jaGFuZ2VBY2Nlc3NQYXRoIH19XFxuICAgICAgICAgICAgdmFyIGRpZERlbGV0ZSA9IHRydWU7XFxuICAgICAgICB9XFxuICAgIHt7Pz99fVxcbiAgICAgICAgaWYgKHR5cGVvZiBtICE9ICd1bmRlZmluZWQnKSB7XFxuICAgICAgICAgICAgdmFyIG9sZCA9IG07XFxuICAgICAgICAgICAge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fSA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICB2YXIgZGlkRGVsZXRlID0gdHJ1ZTtcXG4gICAgICAgIH1cXG4gICAge3s/fX1cXG5cXG4gICAgaWYgKGRpZERlbGV0ZSAmJiB0aGlzLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xcbiAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ2RlbGV0ZWQnLCBvbGRWYWx1ZTogb2xkIH0pO1xcblxcbiAgICAgICAgYWRkVHJlZUNoYW5nZXNNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLFxcbiAgICAgICAgICAgIGFjY2Vzc1BhdGgsIG9sZCwgdW5kZWZpbmVkKTsgLyogZGVmaW5lZCBpbiB0aGUgZnVuY3Rpb24gdGhhdCBzeW50aGVzaXplcyBNb2RlbFBhdGggc2V0dGVyICovXFxuXFxuICAgICAgICB7eyAvKiBwb3N0IGFsbCBzdG9yZWQgbWVzc2FnZXMgKi8gfX1cXG4gICAgICAgIHt7IyBkZWYucG9zdE1lc3NhZ2VzIH19XFxuICAgIH1cXG59O1xcblwiLFxuICAgIHNwbGljZTogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG57eyMgZGVmLmluY2x1ZGVfZGVmaW5lcyB9fVxcbnt7IyBkZWYuaW5jbHVkZV9jcmVhdGVfdHJlZSB9fVxcbnt7IyBkZWYuaW5jbHVkZV90cmF2ZXJzZV90cmVlIH19XFxuXFxubWV0aG9kID0gZnVuY3Rpb24gc3BsaWNlKHNwbGljZUluZGV4LCBzcGxpY2VIb3dNYW55KSB7IC8qICwuLi4gLSBleHRyYSBhcmd1bWVudHMgdG8gc3BsaWNlIGludG8gYXJyYXkgKi9cXG4gICAge3sjIGRlZi5pbml0VmFyczonc3BsaWNlJyB9fVxcblxcbiAgICB2YXIgYXJnc0xlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XFxuICAgIHZhciBhZGRJdGVtcyA9IGFyZ3NMZW4gPiAyO1xcblxcbiAgICBpZiAoYWRkSXRlbXMpIHtcXG4gICAgICAgIHt7IC8qIG9ubHkgY3JlYXRlIG1vZGVsIHRyZWUgaWYgaXRlbXMgYXJlIGluc2VydGVkIGluIGFycmF5ICovIH19XFxuXFxuICAgICAgICB7eyAvKiBpZiBtb2RlbCBpcyB1bmRlZmluZWQgaXQgd2lsbCBiZSBzZXQgdG8gYW4gZW1wdHkgYXJyYXkgKi8gfX0gIFxcbiAgICAgICAgdmFyIHZhbHVlID0gW107XFxuICAgICAgICB7eyMgZGVmLmNyZWF0ZVRyZWU6J3NwbGljZScgfX1cXG5cXG4gICAgICAgIHt7PyBuZXh0Tm9kZSB9fVxcbiAgICAgICAgICAgIHt7XFxuICAgICAgICAgICAgICAgIHZhciBjdXJyTm9kZSA9IG5leHROb2RlO1xcbiAgICAgICAgICAgICAgICB2YXIgY3VyclByb3AgPSBjdXJyTm9kZS5wcm9wZXJ0eTtcXG4gICAgICAgICAgICAgICAgdmFyIGVtcHR5UHJvcCA9ICdbXSc7XFxuICAgICAgICAgICAgfX1cXG5cXG4gICAgICAgICAgICB7eyMgZGVmLmNyZWF0ZVRyZWVTdGVwIH19XFxuICAgICAgICB7ez99fVxcblxcbiAgICB9IGVsc2UgaWYgKHNwbGljZUhvd01hbnkgPiAwKSB7XFxuICAgICAgICB7eyAvKiBpZiBpdGVtcyBhcmUgbm90IGluc2VydGVkLCBvbmx5IHRyYXZlcnNlIG1vZGVsIHRyZWUgaWYgaXRlbXMgYXJlIGRlbGV0ZWQgZnJvbSBhcnJheSAqLyB9fVxcbiAgICAgICAge3s/IGl0LnBhcnNlZFBhdGgubGVuZ3RoIH19XFxuICAgICAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWUgfX1cXG5cXG4gICAgICAgICAgICB7e1xcbiAgICAgICAgICAgICAgICB2YXIgY3Vyck5vZGUgPSBpdC5wYXJzZWRQYXRoW2NvdW50XTtcXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7ICAgICAgIFxcbiAgICAgICAgICAgIH19XFxuXFxuICAgICAgICAgICAge3sgLyogZXh0cmEgYnJhY2UgY2xvc2VzICdlbHNlJyBpbiBkZWYudHJhdmVyc2VUcmVlU3RlcCAqLyB9fVxcbiAgICAgICAgICAgIHt7IyBkZWYudHJhdmVyc2VUcmVlU3RlcCB9fSB9XFxuICAgICAgICB7ez99fVxcbiAgICB9XFxuXFxuICAgIHt7IC8qIHNwbGljZSBpdGVtcyAqLyB9fVxcbiAgICBpZiAoYWRkSXRlbXMgfHwgKCEgdHJlZURvZXNOb3RFeGlzdCAmJiBtXFxuICAgICAgICAgICAgJiYgbS5sZW5ndGggPiBzcGxpY2VJbmRleCApICkge1xcbiAgICAgICAgdmFyIG9sZExlbmd0aCA9IG0ubGVuZ3RoID0gbS5sZW5ndGggfHwgMDtcXG5cXG4gICAgICAgIGFyZ3VtZW50c1swXSA9IHNwbGljZUluZGV4ID0gbm9ybWFsaXplU3BsaWNlSW5kZXgoc3BsaWNlSW5kZXgsIG0ubGVuZ3RoKTtcXG5cXG4gICAgICAgIHt7IC8qIGNsb25lIGFkZGVkIGFyZ3VtZW50cyB0byBwcmV2ZW50IHNhbWUgcmVmZXJlbmNlcyBpbiBsaW5rZWQgbW9kZWxzICovIH19XFxuICAgICAgICBpZiAoYWRkSXRlbXMpXFxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmdzTGVuOyBpKyspXFxuICAgICAgICAgICAgICAgIGFyZ3VtZW50c1tpXSA9IGNsb25lVHJlZShhcmd1bWVudHNbaV0pO1xcblxcbiAgICAgICAge3sgLyogYWN0dWFsIHNwbGljZSBjYWxsICovIH19XFxuICAgICAgICB2YXIgcmVtb3ZlZCA9IEFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkobSwgYXJndW1lbnRzKTtcXG5cXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xcbiAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGFjY2Vzc1BhdGgsIHR5cGU6ICdzcGxpY2UnLFxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHNwbGljZUluZGV4LCByZW1vdmVkOiByZW1vdmVkLCBhZGRlZENvdW50OiBhZGRJdGVtcyA/IGFyZ3NMZW4gLSAyIDogMCxcXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBtIH0pO1xcblxcbiAgICAgICAgICAgIGlmIChyZW1vdmVkICYmIHJlbW92ZWQubGVuZ3RoKVxcbiAgICAgICAgICAgICAgICByZW1vdmVkLmZvckVhY2goZnVuY3Rpb24oaXRlbSwgaW5kZXgpIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtUGF0aCA9IGFjY2Vzc1BhdGggKyAnWycgKyAoc3BsaWNlSW5kZXggKyBpbmRleCkgKyAnXSc7XFxuICAgICAgICAgICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBpdGVtUGF0aCwgdHlwZTogJ3JlbW92ZWQnLCBvbGRWYWx1ZTogaXRlbSB9KTtcXG5cXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUlzVHJlZShpdGVtKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCBpdGVtUGF0aCwgaXRlbSwgJ3JlbW92ZWQnLCAnb2xkVmFsdWUnKTtcXG4gICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgaWYgKGFkZEl0ZW1zKVxcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3NMZW47IGkrKykge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBhcmd1bWVudHNbaV07XFxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbVBhdGggPSBhY2Nlc3NQYXRoICsgJ1snICsgKHNwbGljZUluZGV4ICsgaSAtIDIpICsgJ10nO1xcbiAgICAgICAgICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gaXRlbVBhdGgsIHR5cGU6ICdhZGRlZCcsIG5ld1ZhbHVlOiBpdGVtIH0pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlSXNUcmVlKGl0ZW0pKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIGl0ZW1QYXRoLCBpdGVtLCAnYWRkZWQnLCAnbmV3VmFsdWUnKTtcXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIHt7IC8qIHBvc3QgYWxsIHN0b3JlZCBtZXNzYWdlcyAqLyB9fVxcbiAgICAgICAgICAgIHt7IyBkZWYucG9zdE1lc3NhZ2VzIH19XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIHJlbW92ZWQgfHwgW107XFxufVxcblwiXG59O1xuXG52YXIgaW5jbHVkZV9kZWZpbmVzID0gXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGluaXRpYWxpemF0aW9uIGNvZGVcXG4gKi9cXG4ge3sjIyBkZWYuaW5pdFZhcnM6bWV0aG9kOlxcbiAgICB2YXIgbSA9IHt7IyBkZWYubW9kZWxBY2Nlc3NQcmVmaXggfX07XFxuICAgIHZhciBtZXNzYWdlcyA9IFtdLCBtZXNzYWdlc0hhc2ggPSB7fTtcXG4gICAgdmFyIGFjY2Vzc1BhdGggPSAnJztcXG4gICAgdmFyIHRyZWVEb2VzTm90RXhpc3Q7XFxuICAgIC8qIGhhY2sgdG8gcHJldmVudCBzZW5kaW5nIGZpbmlzaGVkIGV2ZW50cyB0byBhbGxvdyBmb3IgcHJvcGFnYXRpb24gb2YgYmF0Y2hlcyB3aXRob3V0IHNwbGl0dGluZyB0aGVtICovXFxuICAgIHZhciBpbkNoYW5nZVRyYW5zYWN0aW9uID0gZ2V0VHJhbnNhY3Rpb25GbGFnKCB7ez0gbWV0aG9kIH19ICk7XFxuICN9fVxcblxcbi8qKlxcbiAqIEluc2VydHMgdGhlIGJlZ2lubmluZyBvZiBmdW5jdGlvbiBjYWxsIHRvIGFkZCBtZXNzYWdlIHRvIGxpc3RcXG4gKi9cXG57eyMjIGRlZi5hZGRNc2c6IGFkZENoYW5nZU1lc3NhZ2UobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgeyBwYXRoOiAjfX1cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGN1cnJlbnQgcHJvcGVydHkvaW5kZXggZm9yIGJvdGggbm9ybWFsIGFuZCBpbnRlcnBvbGF0ZWQgcHJvcGVydGllcy9pbmRleGVzXFxuICovXFxue3sjIyBkZWYuY3VyclByb3A6e3s/IGN1cnJOb2RlLmludGVycG9sYXRlIH19W3RoaXMuX2FyZ3NbIHt7PSBjdXJyTm9kZS5pbnRlcnBvbGF0ZSB9fSBdXXt7Pz99fXt7PSBjdXJyUHJvcCB9fXt7P319ICN9fVxcblxcbi8qKlxcbiAqIEluc2VydHMgY29uZGl0aW9uIHRvIHRlc3Qgd2hldGhlciBub3JtYWwvaW50ZXJwb2xhdGVkIHByb3BlcnR5L2luZGV4IGV4aXN0c1xcbiAqL1xcbnt7IyMgZGVmLndhc0RlZmluZWQ6IG0uaGFzT3duUHJvcGVydHkoXFxuICAgIHt7PyBjdXJyTm9kZS5pbnRlcnBvbGF0ZSB9fVxcbiAgICAgICAgdGhpcy5fYXJnc1sge3s9IGN1cnJOb2RlLmludGVycG9sYXRlIH19IF1cXG4gICAge3s/P319XFxuICAgICAgICAne3s9IGl0LmdldFBhdGhOb2RlS2V5KGN1cnJOb2RlKSB9fSdcXG4gICAge3s/fX1cXG4pICN9fVxcblxcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byB1cGRhdGUgYWNjZXNzIHBhdGggZm9yIGN1cnJlbnQgcHJvcGVydHlcXG4gKiBCZWNhdXNlIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBpbnRlcnBvbGF0ZWQgcHJvcGVydGllcywgaXQgY2FuJ3QgYmUgY2FsY3VsYXRlZCBpbiB0ZW1wbGF0ZSwgaXQgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBkdXJpbmcgYWNjZXNzb3IgY2FsbC5cXG4gKi9cXG57eyMjIGRlZi5jaGFuZ2VBY2Nlc3NQYXRoOlxcbiAgICBhY2Nlc3NQYXRoICs9IHt7PyBjdXJyTm9kZS5pbnRlcnBvbGF0ZSB9fVxcbiAgICAgICAge3s/IGN1cnJOb2RlLnN5bnRheCA9PSAnYXJyYXknIH19XFxuICAgICAgICAgICAgJ1snICsgdGhpcy5fYXJnc1sge3s9IGN1cnJOb2RlLmludGVycG9sYXRlIH19IF0gKyAnXSc7XFxuICAgICAgICB7ez8/fX1cXG4gICAgICAgICAgICAnLicgKyB0aGlzLl9hcmdzWyB7ez0gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX0gXTtcXG4gICAgICAgIHt7P319XFxuICAgIHt7Pz99fVxcbiAgICAgICAgJ3t7PSBjdXJyUHJvcCB9fSc7XFxuICAgIHt7P319XFxuI319XFxuXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIHBvc3Qgc3RvcmVkIG1lc3NhZ2VzXFxuICovXFxue3sjIyBkZWYucG9zdE1lc3NhZ2VzOlxcbiAgICBpZiAobWVzc2FnZXMubGVuZ3RoKSB7XFxuICAgICAgICB7eyMgZGVmLm1vZGVsUG9zdEJhdGNoQ29kZSB9fSgnZGF0YWNoYW5nZXMnLCB7XFxuICAgICAgICAgICAgY2hhbmdlczogbWVzc2FnZXMsXFxuICAgICAgICAgICAgdHJhbnNhY3Rpb246IGluQ2hhbmdlVHJhbnNhY3Rpb25cXG4gICAgICAgIH0pO1xcblxcbiAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbihtc2cpIHtcXG4gICAgICAgICAgICB7eyMgZGVmLm1vZGVsUG9zdE1lc3NhZ2VDb2RlIH19KG1zZy5wYXRoLCBtc2cpO1xcbiAgICAgICAgfSwgdGhpcyk7XFxuICAgIH1cXG4jfX1cXG5cIlxuICAgICwgaW5jbHVkZV9jcmVhdGVfdHJlZSA9IFwiJ3VzZSBzdHJpY3QnO1xcbi8qIE9ubHkgdXNlIHRoaXMgc3R5bGUgb2YgY29tbWVudHMsIG5vdCBcXFwiLy9cXFwiICovXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIGNyZWF0ZSBtb2RlbCB0cmVlIGFzIG5lY2Nlc3NhcnkgZm9yIGBzZXRgIGFuZCBgc3BsaWNlYCBhY2Nlc3NvcnMgYW5kIHRvIGFkZCBtZXNzYWdlcyB0byBzZW5kIGxpc3QgaWYgdGhlIHRyZWUgY2hhbmdlcy5cXG4gKi9cXG57eyMjIGRlZi5jcmVhdGVUcmVlOm1ldGhvZDpcXG4gICAgdmFyIHdhc0RlZiA9IHRydWU7XFxuICAgIHZhciBvbGQgPSBtO1xcblxcbiAgICB7eyB2YXIgZW1wdHlQcm9wID0gaXQucGFyc2VkUGF0aFswXSAmJiBpdC5wYXJzZWRQYXRoWzBdLmVtcHR5OyB9fVxcbiAgICB7ez8gZW1wdHlQcm9wIH19XFxuICAgICAgICB7eyAvKiBjcmVhdGUgdG9wIGxldmVsIG1vZGVsIGlmIGl0IHdhcyBub3QgcHJldmlvdXNseSBkZWZpbmVkICovIH19XFxuICAgICAgICBpZiAoISBtKSB7XFxuICAgICAgICAgICAgbSA9IHt7IyBkZWYubW9kZWxBY2Nlc3NQcmVmaXggfX0gPSB7ez0gZW1wdHlQcm9wIH19O1xcbiAgICAgICAgICAgIHdhc0RlZiA9IGZhbHNlO1xcblxcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xcbiAgICAgICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSAnJywgdHlwZTogJ2FkZGVkJyxcXG4gICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IG0gfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB7ez8/fX1cXG4gICAgICAgIHt7PyBtZXRob2QgPT0gJ3NwbGljZScgfX1cXG4gICAgICAgICAgICBpZiAoISBtKSB7XFxuICAgICAgICB7ez99fVxcbiAgICAgICAgICAgICAgICBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fSA9IGNsb25lVHJlZSh2YWx1ZSk7XFxuICAgICAgICAgICAgICAgIHdhc0RlZiA9IHR5cGVvZiBvbGQgIT0gJ3VuZGVmaW5lZCc7XFxuICAgICAgICB7ez8gbWV0aG9kID09ICdzcGxpY2UnIH19XFxuICAgICAgICAgICAgfVxcbiAgICAgICAge3s/fX0gICAgICAgXFxuICAgIHt7P319XFxuXFxuXFxuICAgIHt7IC8qIGNyZWF0ZSBtb2RlbCB0cmVlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgKi8gfX1cXG4gICAge3sgIHZhciBtb2RlbERhdGFQcm9wZXJ0eSA9ICcnO1xcbiAgICAgICAgdmFyIG5leHROb2RlID0gaXQucGFyc2VkUGF0aFswXTtcXG4gICAgICAgIHZhciBjb3VudCA9IGl0LnBhcnNlZFBhdGgubGVuZ3RoIC0gMTtcXG5cXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xcbiAgICAgICAgICAgIHZhciBjdXJyTm9kZSA9IG5leHROb2RlO1xcbiAgICAgICAgICAgIHZhciBjdXJyUHJvcCA9IGN1cnJOb2RlLnByb3BlcnR5O1xcbiAgICAgICAgICAgIG5leHROb2RlID0gaXQucGFyc2VkUGF0aFtpICsgMV07XFxuICAgICAgICAgICAgdmFyIGVtcHR5UHJvcCA9IG5leHROb2RlICYmIG5leHROb2RlLmVtcHR5O1xcbiAgICB9fVxcblxcbiAgICAgICAge3sjIGRlZi5jcmVhdGVUcmVlU3RlcCB9fVxcblxcbiAgICB7eyAgfSAvKiBmb3IgbG9vcCAqLyB9fVxcbiN9fVxcblxcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byBjcmVhdGUgb25lIHN0ZXAgaW4gdGhlIG1vZGVsIHRyZWVcXG4gKi9cXG57eyMjIGRlZi5jcmVhdGVUcmVlU3RlcDpcXG4gICAge3sjIGRlZi5jaGFuZ2VBY2Nlc3NQYXRoIH19XFxuXFxuICAgIGlmICghIHt7IyBkZWYud2FzRGVmaW5lZCB9fSkgeyBcXG4gICAgICAgIHt7IC8qIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0ICovIH19XFxuICAgICAgICBtID0gbXt7IyBkZWYuY3VyclByb3AgfX0gPSB7ez0gZW1wdHlQcm9wIH19O1xcblxcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ2FkZGVkJywgXFxuICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IG0gfSk7XFxuICAgICAgICB9XFxuXFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG17eyMgZGVmLmN1cnJQcm9wIH19ICE9ICdvYmplY3QnKSB7XFxuICAgICAgICB7eyAvKiBwcm9wZXJ0eSBpcyBub3Qgb2JqZWN0ICovIH19XFxuICAgICAgICB2YXIgb2xkID0gbXt7IyBkZWYuY3VyclByb3AgfX07XFxuICAgICAgICBtID0gbXt7IyBkZWYuY3VyclByb3AgfX0gPSB7ez0gZW1wdHlQcm9wIH19O1xcblxcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ2NoYW5nZWQnLCBcXG4gICAgICAgICAgICAgICAgICBvbGRWYWx1ZTogb2xkLCBuZXdWYWx1ZTogbSB9KTtcXG4gICAgICAgIH1cXG5cXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHt7IC8qIHByb3BlcnR5IGV4aXN0cywganVzdCB0cmF2ZXJzZSBkb3duIHRoZSBtb2RlbCB0cmVlICovIH19XFxuICAgICAgICBtID0gbXt7IyBkZWYuY3VyclByb3AgfX07XFxuICAgIH1cXG4jfX1cXG5cIlxuICAgICwgaW5jbHVkZV90cmF2ZXJzZV90cmVlID0gXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gdHJhdmVyc2UgbW9kZWwgdHJlZSBmb3IgYGRlbGV0ZWAgYW5kIGBzcGxpY2VgIGFjY2Vzc29ycy5cXG4gKi9cXG57eyMjIGRlZi50cmF2ZXJzZVRyZWU6XFxuICAgIHt7IFxcbiAgICAgICAgdmFyIGNvdW50ID0gaXQucGFyc2VkUGF0aC5sZW5ndGgtMTtcXG5cXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeyBcXG4gICAgICAgICAgICB2YXIgY3Vyck5vZGUgPSBpdC5wYXJzZWRQYXRoW2ldO1xcbiAgICAgICAgICAgIHZhciBjdXJyUHJvcCA9IGN1cnJOb2RlLnByb3BlcnR5O1xcbiAgICB9fVxcbiAgICAgICAgICAgIHt7IyBkZWYudHJhdmVyc2VUcmVlU3RlcCB9fVxcblxcbiAgICB7eyB9IC8qIGZvciBsb29wICovXFxuXFxuICAgICAgICB2YXIgaSA9IGNvdW50O1xcbiAgICAgICAgd2hpbGUgKGktLSkgeyAvKiBjbG9zaW5nIGJyYWNlcyBmb3IgZWxzZSdzIGFib3ZlICovXFxuICAgIH19XFxuICAgICAgICAgICAgfVxcbiAgICB7eyB9IC8qIHdoaWxlIGxvb3AgKi8gfX1cXG4jfX1cXG5cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gdHJhdmVyc2Ugb25lIHN0ZXAgaW4gdGhlIG1vZGVsIHRyZWVcXG4gKi9cXG57eyMjIGRlZi50cmF2ZXJzZVRyZWVTdGVwOlxcbiAgICBpZiAoISAobSAmJiBtLmhhc093blByb3BlcnR5ICYmIHt7IyBkZWYud2FzRGVmaW5lZH19ICkgKVxcbiAgICAgICAgdHJlZURvZXNOb3RFeGlzdCA9IHRydWU7XFxuICAgIGVsc2Uge1xcbiAgICAgICAgbSA9IG17eyMgZGVmLmN1cnJQcm9wIH19O1xcbiAgICAgICAge3sjIGRlZi5jaGFuZ2VBY2Nlc3NQYXRoIH19XFxuICAgIHt7IC8qIGJyYWNlIGZyb20gZWxzZSBpcyBub3QgY2xvc2VkIG9uIHB1cnBvc2UgLSBhbGwgYnJhY2VzIGFyZSBjbG9zZWQgaW4gd2hpbGUgbG9vcCAqLyB9fVxcbiN9fVxcblwiO1xuXG52YXIgZG90RGVmID0ge1xuICAgIGluY2x1ZGVfZGVmaW5lczogaW5jbHVkZV9kZWZpbmVzLFxuICAgIGluY2x1ZGVfY3JlYXRlX3RyZWU6IGluY2x1ZGVfY3JlYXRlX3RyZWUsXG4gICAgaW5jbHVkZV90cmF2ZXJzZV90cmVlOiBpbmNsdWRlX3RyYXZlcnNlX3RyZWUsXG4gICAgZ2V0UGF0aE5vZGVLZXk6IHBhdGhVdGlscy5nZXRQYXRoTm9kZUtleSxcbiAgICBtb2RlbEFjY2Vzc1ByZWZpeDogJ3RoaXMuX21vZGVsLl9kYXRhJyxcbiAgICBtb2RlbFBvc3RNZXNzYWdlQ29kZTogJ3RoaXMuX21vZGVsLl9pbnRlcm5hbE1lc3Nlbmdlci5wb3N0TWVzc2FnZScsXG4gICAgbW9kZWxQb3N0QmF0Y2hDb2RlOiAndGhpcy5fbW9kZWwucG9zdE1lc3NhZ2VTeW5jJyxcbiAgICBpbnRlcm5hbE1lc3NlbmdlcjogJ3RoaXMuX21vZGVsLl9pbnRlcm5hbE1lc3Nlbmdlcidcbn07XG5cbnZhciBtb2RlbERvdERlZiA9IF8oZG90RGVmKS5jbG9uZSgpLmV4dGVuZCh7XG4gICAgbW9kZWxBY2Nlc3NQcmVmaXg6ICd0aGlzLl9kYXRhJyxcbiAgICBtb2RlbFBvc3RNZXNzYWdlQ29kZTogJ3RoaXMuX2ludGVybmFsTWVzc2VuZ2VyLnBvc3RNZXNzYWdlJyxcbiAgICBtb2RlbFBvc3RCYXRjaENvZGU6ICd0aGlzLnBvc3RNZXNzYWdlU3luYycsXG4gICAgaW50ZXJuYWxNZXNzZW5nZXI6ICd0aGlzLl9pbnRlcm5hbE1lc3Nlbmdlcidcbn0pLl8oKTtcblxuXG52YXIgZG90U2V0dGluZ3MgPSBfLmNsb25lKGRvVC50ZW1wbGF0ZVNldHRpbmdzKTtcbmRvdFNldHRpbmdzLnN0cmlwID0gZmFsc2U7XG5cbnZhciBzeW50aGVzaXplcnMgPSBfLm1hcEtleXModGVtcGxhdGVzLCBmdW5jdGlvbih0bXBsKSB7XG4gICAgcmV0dXJuIGRvVC50ZW1wbGF0ZSh0bXBsLCBkb3RTZXR0aW5ncywgZG90RGVmKTsgXG59KTtcblxuXG52YXIgbW9kZWxTeW50aGVzaXplcnMgPSBfLm1hcFRvT2JqZWN0KFsnc2V0JywgJ2RlbCcsICdzcGxpY2UnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgIHJldHVybiBkb1QudGVtcGxhdGUodGVtcGxhdGVzW21ldGhvZE5hbWVdLCBkb3RTZXR0aW5ncywgbW9kZWxEb3REZWYpO1xufSk7XG5cblxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IHN5bnRoZXNpemVzIGFjY2Vzc29yIG1ldGhvZHMuXG4gKiBGdW5jdGlvbiBpcyBtZW1vaXplZCBzbyBhY2Nlc3NvcnMgYXJlIGNhY2hlZCAodXAgdG8gMTAwMCkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggTW9kZWwvTW9kZWxQYXRoIGFjY2VzcyBwYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJzZWRQYXRoIGFycmF5IG9mIHBhdGggbm9kZXNcbiAqIEByZXR1cm4ge09iamVjdFtGdW5jdGlvbl19XG4gKi9cbnZhciBzeW50aGVzaXplUGF0aE1ldGhvZHMgPSBfLm1lbW9pemUoX3N5bnRoZXNpemVQYXRoTWV0aG9kcywgdW5kZWZpbmVkLCAxMDAwKTtcblxuZnVuY3Rpb24gX3N5bnRoZXNpemVQYXRoTWV0aG9kcyhwYXRoLCBwYXJzZWRQYXRoKSB7XG4gICAgdmFyIG1ldGhvZHMgPSBfLm1hcEtleXMoc3ludGhlc2l6ZXJzLCBmdW5jdGlvbihzeW50aHN6cikge1xuICAgICAgICByZXR1cm4gX3N5bnRoZXNpemUoc3ludGhzenIsIHBhdGgsIHBhcnNlZFBhdGgpO1xuICAgIH0pO1xuICAgIHJldHVybiBtZXRob2RzO1xufVxuXG5cbnZhciBub3JtYWxpemVTcGxpY2VJbmRleCA9IG1vZGVsVXRpbHMubm9ybWFsaXplU3BsaWNlSW5kZXg7IC8vIHVzZWQgaW4gc3BsaWNlLmRvdC5qc1xuXG5cbmZ1bmN0aW9uIF9zeW50aGVzaXplKHN5bnRoZXNpemVyLCBwYXRoLCBwYXJzZWRQYXRoKSB7XG4gICAgdmFyIG1ldGhvZFxuICAgICAgICAsIG1ldGhvZENvZGUgPSBzeW50aGVzaXplcih7XG4gICAgICAgICAgICBwYXJzZWRQYXRoOiBwYXJzZWRQYXRoLFxuICAgICAgICAgICAgZ2V0UGF0aE5vZGVLZXk6IHBhdGhVdGlscy5nZXRQYXRoTm9kZUtleVxuICAgICAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICAgIGV2YWwobWV0aG9kQ29kZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBNb2RlbEVycm9yKCdNb2RlbFBhdGggbWV0aG9kIGNvbXBpbGF0aW9uIGVycm9yOyBwYXRoOiAnICsgcGF0aCArICcsIGNvZGU6ICcgKyBtZXRob2RDb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0aG9kO1xuXG5cbiAgICAvLyBmdW5jdGlvbnMgdXNlZCBieSBtZXRob2RzIGBzZXRgLCBgZGVsZXRlYCBhbmQgYHNwbGljZWAgKHN5bnRoZXNpemVkIGJ5IHRlbXBsYXRlKVxuICAgIGZ1bmN0aW9uIGFkZENoYW5nZU1lc3NhZ2UobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgbXNnKSB7XG4gICAgICAgIG1lc3NhZ2VzLnB1c2gobXNnKTtcbiAgICAgICAgbWVzc2FnZXNIYXNoW21zZy5wYXRoXSA9IG1zZztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRUcmVlQ2hhbmdlc01lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIHJvb3RQYXRoLCBvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgdmFyIG9sZElzVHJlZSA9IHZhbHVlSXNUcmVlKG9sZFZhbHVlKVxuICAgICAgICAgICAgLCBuZXdJc1RyZWUgPSB2YWx1ZUlzVHJlZShuZXdWYWx1ZSk7XG5cbiAgICAgICAgaWYgKG5ld0lzVHJlZSlcbiAgICAgICAgICAgIGFkZE1lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIHJvb3RQYXRoLCBuZXdWYWx1ZSwgJ2FkZGVkJywgJ25ld1ZhbHVlJyk7XG4gICAgICAgIFxuICAgICAgICBpZiAob2xkSXNUcmVlKVxuICAgICAgICAgICAgYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG9sZFZhbHVlLCAncmVtb3ZlZCcsICdvbGRWYWx1ZScpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIHJvb3RQYXRoLCBvYmosIG1zZ1R5cGUsIHZhbHVlUHJvcCkge1xuICAgICAgICBfYWRkTWVzc2FnZXMocm9vdFBhdGgsIG9iaik7XG5cblxuICAgICAgICBmdW5jdGlvbiBfYWRkTWVzc2FnZXMocm9vdFBhdGgsIG9iaikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgICAgIHZhciBwYXRoU3ludGF4ID0gcm9vdFBhdGggKyAnWyQkXSc7XG4gICAgICAgICAgICAgICAgb2JqLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UodmFsdWUsIGluZGV4LCBwYXRoU3ludGF4KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhdGhTeW50YXggPSByb290UGF0aCArICcuJCQnO1xuICAgICAgICAgICAgICAgIF8uZWFjaEtleShvYmosIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSh2YWx1ZSwga2V5LCBwYXRoU3ludGF4KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2UodmFsdWUsIGtleSwgcGF0aFN5bnRheCkge1xuICAgICAgICAgICAgdmFyIHBhdGggPSBwYXRoU3ludGF4LnJlcGxhY2UoJyQkJywga2V5KVxuICAgICAgICAgICAgICAgICwgZXhpc3RpbmdNc2cgPSBtZXNzYWdlc0hhc2hbcGF0aF07XG5cbiAgICAgICAgICAgIGlmIChleGlzdGluZ01zZykge1xuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ01zZy50eXBlID09IG1zZ1R5cGUpXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignc2V0dGVyIGVycm9yOiBzYW1lIG1lc3NhZ2UgdHlwZSBwb3N0ZWQgb24gdGhlIHNhbWUgcGF0aCcpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ01zZy50eXBlID0gJ2NoYW5nZWQnO1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ01zZ1t2YWx1ZVByb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0geyBwYXRoOiBwYXRoLCB0eXBlOiBtc2dUeXBlIH07XG4gICAgICAgICAgICAgICAgbXNnW3ZhbHVlUHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBhZGRDaGFuZ2VNZXNzYWdlKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIG1zZyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZUlzVHJlZSh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgX2FkZE1lc3NhZ2VzKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsb25lVHJlZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWVJc05vcm1hbE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IF8uZGVlcENsb25lKHZhbHVlKVxuICAgICAgICAgICAgICAgIDogdmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvdGVjdFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhIHZhbHVlSXNOb3JtYWxPYmplY3QodmFsdWUpXG4gICAgICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgICAgIDogQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyB2YWx1ZS5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgIDogT2JqZWN0LmNyZWF0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsdWVJc1RyZWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlSXNOb3JtYWxPYmplY3QodmFsdWUpXG4gICAgICAgICAgICAgICAgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWx1ZUlzTm9ybWFsT2JqZWN0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgICAgICAgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAmJiAhICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpXG4gICAgICAgICAgICAgICAgJiYgISAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZEJhdGNoSWRzVG9NZXNzYWdlKG1zZywgYmF0Y2hJZCwgbXNnSWQpIHtcbiAgICAgICAgXy5kZWZpbmVQcm9wZXJ0aWVzKG1zZywge1xuICAgICAgICAgICAgX19iYXRjaF9pZDogYmF0Y2hJZCxcbiAgICAgICAgICAgIF9fbXNnX2lkOiBtc2dJZFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBFeHBvcnRzIGBzeW50aGVzaXplYCBmdW5jdGlvbiB3aXRoIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogLSAubW9kZWxNZXRob2RzLnNldCAtIGBzZXRgIG1ldGhvZCBmb3IgTW9kZWxcbiAqIC0gLm1vZGVsTWV0aG9kcy5kZWwgLSBgZGVsYCBtZXRob2QgZm9yIE1vZGVsXG4gKiAtIC5tb2RlbE1ldGhvZHMuc3BsaWNlIC0gYHNwbGljZWAgbWV0aG9kIGZvciBNb2RlbFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHN5bnRoZXNpemVQYXRoTWV0aG9kcztcblxudmFyIG1vZGVsTWV0aG9kcyA9IF8ubWFwS2V5cyhtb2RlbFN5bnRoZXNpemVycywgZnVuY3Rpb24oc3ludGhlc2l6ZXIpIHtcbiAgICByZXR1cm4gX3N5bnRoZXNpemUoc3ludGhlc2l6ZXIsICcnLCBbXSk7XG59KTtcblxuc3ludGhlc2l6ZVBhdGhNZXRob2RzLm1vZGVsTWV0aG9kcyA9IG1vZGVsTWV0aG9kcztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgbWlsby51dGlscy5jaGVja2BcbiAqXG4gKiBDaGVjayBpcyBhIG1vZHVsZSBmb3IgcGFyYW1ldGVycyBjaGVja2luZyBleHRyYWN0ZWQgZnJvbSBbTWV0ZW9yXShodHRwOi8vZG9jcy5tZXRlb3IuY29tLykgZnJhbWV3b3JrLlxuICpcbiAqIEl0IGFsbG93cyB0byBib3RoIGRvY3VtZW50IGFuZCB0byBjaGVjayBwYXJhbWV0ZXIgdHlwZXMgaW4geW91ciBmdW5jdGlvblxuICogbWFraW5nIGNvZGUgYm90aCByZWFkYWJsZSBhbmQgc3RhYmxlLlxuICpcbiAqXG4gKiAjIyMgVXNhZ2VcbiAqYGBgXG4gKiB2YXIgY2hlY2sgPSBtaWxvLmNoZWNrXG4gKiAgICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuICpcbiAqIGZ1bmN0aW9uIE15KG5hbWUsIG9iaiwgY2IpIHtcbiAqICAgICAvLyBpZiBhbnkgb2YgY2hlY2tzIGZhaWwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd25cbiAqICAgICBjaGVjayhuYW1lLCBTdHJpbmcpO1xuICogICAgIGNoZWNrKG9iaiwgTWF0Y2guT2JqZWN0SW5jbHVkaW5nKHsgb3B0aW9uczogT2JqZWN0IH0pKTtcbiAqICAgICBjaGVjayhjYiwgRnVuY3Rpb24pO1xuICpcbiAqICAgICAvLyAuLi4geW91ciBjb2RlXG4gKiB9XG4gKmBgYFxuICogU2VlIFtNZXRlb3IgZG9jc10oaHR0cDovL2RvY3MubWV0ZW9yLmNvbS8jbWF0Y2gpIHRvIHNlZSBob3cgaXQgd29ya3NcbiAqXG4gKlxuICogIyMjIFBhdHRlcm5zXG4gKlxuICogQWxsIHBhdHRlcm5zIGFuZCBmdW5jdGlvbnMgZGVzY3JpYmVkIGluIE1ldGVvciBkb2NzIHdvcmsuXG4gKlxuICogVW5saWtlIGluIE1ldGVvciwgT2JqZWN0IHBhdHRlcm4gbWF0Y2hlcyBpbnN0YW5jZSBvZiBhbnkgY2xhc3MsXG4gKiBub3Qgb25seSBwbGFpbiBvYmplY3QuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gcGF0dGVybnMgZGVzY3JpYmVkIGluIE1ldGVvciBkb2NzIHRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIGltcGxlbWVudGVkXG4gKlxuICogKiBNYXRjaC5fX09iamVjdEhhc2hfXyhfcGF0dGVybl8pXG4gKlxuICogICBNYXRjaGVzIGFuIG9iamVjdCB3aGVyZSBhbGwgcHJvcGVydGllcyBtYXRjaCBhIGdpdmVuIHBhdHRlcm5cbiAqXG4gKiAqIE1hdGNoLl9fU3ViY2xhc3NfXyhfY29uc3RydWN0b3JfIFssIF9tYXRjaFRoaXNDbGFzc1Rvb19dKVxuICpcbiAqICAgTWF0Y2hlcyBhIGNsYXNzIHRoYXQgaXMgYSBzdWJjbGFzcyBvZiBhIGdpdmVuIGNsYXNzLiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICogICBpcyB0cnVlLCBpdCB3aWxsIGFsc28gbWF0Y2ggdGhlIGNsYXNzIGl0c2VsZi5cbiAqXG4gKiAgIFdpdGhvdXQgdGhpcyBwYXR0ZXJuIHRvIGNoZWNrIGlmIF9NeVN1YmNsYXNzXyBpcyBhIHN1YmNsYXNzIG9mIF9NeUNsYXNzX1xuICogICB5b3Ugd291bGQgaGF2ZSB0byB1c2VcbiAqXG4gKiAgICAgICBjaGVjayhNeVN1YmNsYXNzLCBNYXRjaC5XaGVyZShmdW5jdGlvbigpIHtcbiAqICAgICAgICAgICByZXR1cm4gTXlTdWJjbGFzcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBNeUNsYXNzO1xuICogICAgICAgfSk7XG4gKlxuICpcbiAqIFRoaW5ncyB3ZSBleHBsaWNpdGx5IGRvIE5PVCBzdXBwb3J0OlxuICogICAgLSBoZXRlcm9nZW5vdXMgYXJyYXlzXG4qKi9cblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG5cbnZhciBjaGVjayA9IGZ1bmN0aW9uICh2YWx1ZSwgcGF0dGVybikge1xuICAgIGlmIChjb25maWcuY2hlY2sgPT09IGZhbHNlKVxuICAgICAgICByZXR1cm47XG5cbiAgICAvLyBSZWNvcmQgdGhhdCBjaGVjayBnb3QgY2FsbGVkLCBpZiBzb21lYm9keSBjYXJlZC5cbiAgICB0cnkge1xuICAgICAgICBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoKGVyciBpbnN0YW5jZW9mIE1hdGNoLkVycm9yKSAmJiBlcnIucGF0aClcbiAgICAgICAgICAgIGVyci5tZXNzYWdlICs9IFwiIGluIGZpZWxkIFwiICsgZXJyLnBhdGg7XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrO1xuXG52YXIgTWF0Y2ggPSBjaGVjay5NYXRjaCA9IHtcbiAgICBPcHRpb25hbDogZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcHRpb25hbChwYXR0ZXJuKTtcbiAgICB9LFxuICAgIE9uZU9mOiBmdW5jdGlvbiAoLyogYXJndW1lbnRzICovKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25lT2YoYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIEFueTogWydfX2FueV9fJ10sXG4gICAgV2hlcmU6IGZ1bmN0aW9uIChjb25kaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVyZShjb25kaXRpb24pO1xuICAgIH0sXG4gICAgT2JqZWN0SW5jbHVkaW5nOiBmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICByZXR1cm4gbmV3IE9iamVjdEluY2x1ZGluZyhwYXR0ZXJuKTtcbiAgICB9LFxuICAgIC8vIE1hdGNoZXMgb25seSBzaWduZWQgMzItYml0IGludGVnZXJzXG4gICAgSW50ZWdlcjogWydfX2ludGVnZXJfXyddLFxuXG4gICAgLy8gTWF0Y2hlcyBzdHJpbmcgdGhhdCBpcyBhIHZhbGlkIGlkZW50aWZpZXIsIHdpbGwgbm90IGFsbG93IGphdmFzY3JpcHQgcmVzZXJ2ZWQgd29yZHNcbiAgICBJZGVudGlmaWVyU3RyaW5nOiAvXlthLXpfJF1bMC05YS16XyRdKiQvaSxcblxuICAgIC8vIE1hdGNoZXMgaGFzaCAob2JqZWN0KSB3aXRoIHZhbHVlcyBtYXRjaGluZyBwYXR0ZXJuXG4gICAgT2JqZWN0SGFzaDogZnVuY3Rpb24ocGF0dGVybikge1xuICAgICAgICByZXR1cm4gbmV3IE9iamVjdEhhc2gocGF0dGVybik7XG4gICAgfSxcblxuICAgIFN1YmNsYXNzOiBmdW5jdGlvbihTdXBlcmNsYXNzLCBtYXRjaFN1cGVyY2xhc3NUb28pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdWJjbGFzcyhTdXBlcmNsYXNzLCBtYXRjaFN1cGVyY2xhc3NUb28pO1xuICAgIH0sXG5cbiAgICAvLyBYWFggbWF0Y2hlcnMgc2hvdWxkIGtub3cgaG93IHRvIGRlc2NyaWJlIHRoZW1zZWx2ZXMgZm9yIGVycm9yc1xuICAgIEVycm9yOiBUeXBlRXJyb3IsXG5cbiAgICAvLyBNZXRlb3IubWFrZUVycm9yVHlwZShcIk1hdGNoLkVycm9yXCIsIGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgICAgLy8gdGhpcy5tZXNzYWdlID0gXCJNYXRjaCBlcnJvcjogXCIgKyBtc2c7XG4gICAgICAgIC8vIFRoZSBwYXRoIG9mIHRoZSB2YWx1ZSB0aGF0IGZhaWxlZCB0byBtYXRjaC4gSW5pdGlhbGx5IGVtcHR5LCB0aGlzIGdldHNcbiAgICAgICAgLy8gcG9wdWxhdGVkIGJ5IGNhdGNoaW5nIGFuZCByZXRocm93aW5nIHRoZSBleGNlcHRpb24gYXMgaXQgZ29lcyBiYWNrIHVwIHRoZVxuICAgICAgICAvLyBzdGFjay5cbiAgICAgICAgLy8gRS5nLjogXCJ2YWxzWzNdLmVudGl0eS5jcmVhdGVkXCJcbiAgICAgICAgLy8gdGhpcy5wYXRoID0gXCJcIjtcbiAgICAgICAgLy8gSWYgdGhpcyBnZXRzIHNlbnQgb3ZlciBERFAsIGRvbid0IGdpdmUgZnVsbCBpbnRlcm5hbCBkZXRhaWxzIGJ1dCBhdCBsZWFzdFxuICAgICAgICAvLyBwcm92aWRlIHNvbWV0aGluZyBiZXR0ZXIgdGhhbiA1MDAgSW50ZXJuYWwgc2VydmVyIGVycm9yLlxuICAgIC8vICAgICB0aGlzLnNhbml0aXplZEVycm9yID0gbmV3IE1ldGVvci5FcnJvcig0MDAsIFwiTWF0Y2ggZmFpbGVkXCIpO1xuICAgIC8vIH0pLFxuXG4gICAgLy8gVGVzdHMgdG8gc2VlIGlmIHZhbHVlIG1hdGNoZXMgcGF0dGVybi4gVW5saWtlIGNoZWNrLCBpdCBtZXJlbHkgcmV0dXJucyB0cnVlXG4gICAgLy8gb3IgZmFsc2UgKHVubGVzcyBhbiBlcnJvciBvdGhlciB0aGFuIE1hdGNoLkVycm9yIHdhcyB0aHJvd24pLlxuICAgIHRlc3Q6IGZ1bmN0aW9uICh2YWx1ZSwgcGF0dGVybikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2hlY2tTdWJ0cmVlKHZhbHVlLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE1hdGNoLkVycm9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIC8vIFJldGhyb3cgb3RoZXIgZXJyb3JzLlxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmZ1bmN0aW9uIE9wdGlvbmFsKHBhdHRlcm4pIHtcbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuO1xufTtcblxuZnVuY3Rpb24gT25lT2YoY2hvaWNlcykge1xuICAgIGlmIChjaG9pY2VzLmxlbmd0aCA9PSAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIGNob2ljZSB0byBNYXRjaC5PbmVPZlwiKTtcbiAgICB0aGlzLmNob2ljZXMgPSBjaG9pY2VzO1xufTtcblxuZnVuY3Rpb24gV2hlcmUoY29uZGl0aW9uKSB7XG4gICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XG59O1xuXG5mdW5jdGlvbiBPYmplY3RJbmNsdWRpbmcocGF0dGVybikge1xuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47XG59O1xuXG5mdW5jdGlvbiBPYmplY3RIYXNoKHBhdHRlcm4pIHtcbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuO1xufTtcblxuZnVuY3Rpb24gU3ViY2xhc3MoU3VwZXJjbGFzcywgbWF0Y2hTdXBlcmNsYXNzVG9vKSB7XG4gICAgdGhpcy5TdXBlcmNsYXNzID0gU3VwZXJjbGFzcztcbiAgICB0aGlzLm1hdGNoU3VwZXJjbGFzcyA9IG1hdGNoU3VwZXJjbGFzc1Rvbztcbn07XG5cbnZhciB0eXBlb2ZDaGVja3MgPSBbXG4gICAgW1N0cmluZywgXCJzdHJpbmdcIl0sXG4gICAgW051bWJlciwgXCJudW1iZXJcIl0sXG4gICAgW0Jvb2xlYW4sIFwiYm9vbGVhblwiXSxcbiAgICBbRnVuY3Rpb24sIFwiZnVuY3Rpb25cIl0sXG4gICAgLy8gV2hpbGUgd2UgZG9uJ3QgYWxsb3cgdW5kZWZpbmVkIGluIEpTT04sIHRoaXMgaXMgZ29vZCBmb3Igb3B0aW9uYWxcbiAgICAvLyBhcmd1bWVudHMgd2l0aCBPbmVPZi5cbiAgICBbdW5kZWZpbmVkLCBcInVuZGVmaW5lZFwiXVxuXTtcblxuZnVuY3Rpb24gY2hlY2tTdWJ0cmVlKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgLy8gTWF0Y2ggYW55dGhpbmchXG4gICAgaWYgKHBhdHRlcm4gPT09IE1hdGNoLkFueSlcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgLy8gQmFzaWMgYXRvbWljIHR5cGVzLlxuICAgIC8vIERvIG5vdCBtYXRjaCBib3hlZCBvYmplY3RzIChlLmcuIFN0cmluZywgQm9vbGVhbilcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVvZkNoZWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAocGF0dGVybiA9PT0gdHlwZW9mQ2hlY2tzW2ldWzBdKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSB0eXBlb2ZDaGVja3NbaV1bMV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgXCIgKyB0eXBlb2ZDaGVja3NbaV1bMV0gKyBcIiwgZ290IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0dGVybiA9PT0gbnVsbCkge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkV4cGVjdGVkIG51bGwsIGdvdCBcIiArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLy8gTWF0Y2guSW50ZWdlciBpcyBzcGVjaWFsIHR5cGUgZW5jb2RlZCB3aXRoIGFycmF5XG4gICAgaWYgKHBhdHRlcm4gPT09IE1hdGNoLkludGVnZXIpIHtcbiAgICAgICAgLy8gVGhlcmUgaXMgbm8gY29uc2lzdGVudCBhbmQgcmVsaWFibGUgd2F5IHRvIGNoZWNrIGlmIHZhcmlhYmxlIGlzIGEgNjQtYml0XG4gICAgICAgIC8vIGludGVnZXIuIE9uZSBvZiB0aGUgcG9wdWxhciBzb2x1dGlvbnMgaXMgdG8gZ2V0IHJlbWluZGVyIG9mIGRpdmlzaW9uIGJ5IDFcbiAgICAgICAgLy8gYnV0IHRoaXMgbWV0aG9kIGZhaWxzIG9uIHJlYWxseSBsYXJnZSBmbG9hdHMgd2l0aCBiaWcgcHJlY2lzaW9uLlxuICAgICAgICAvLyBFLmcuOiAxLjM0ODE5MjMwODQ5MTgyNGUrMjMgJSAxID09PSAwIGluIFY4XG4gICAgICAgIC8vIEJpdHdpc2Ugb3BlcmF0b3JzIHdvcmsgY29uc2lzdGFudGx5IGJ1dCBhbHdheXMgY2FzdCB2YXJpYWJsZSB0byAzMi1iaXRcbiAgICAgICAgLy8gc2lnbmVkIGludGVnZXIgYWNjb3JkaW5nIHRvIEphdmFTY3JpcHQgc3BlY3MuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICh2YWx1ZSB8IDApID09PSB2YWx1ZSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoJ0V4cGVjdGVkIEludGVnZXIsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogdmFsdWUpKTtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVybiA9PT0gTWF0Y2guSWRlbnRpZmllclN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBNYXRjaC5JZGVudGlmaWVyU3RyaW5nLnRlc3QodmFsdWUpXG4gICAgICAgICAgICAgICAgJiYgX2pzS2V5d29yZHMuaW5kZXhPZihrZXkpID09IC0xKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoJ0V4cGVjdGVkIGlkZW50aWZpZXIgc3RyaW5nLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLy8gXCJPYmplY3RcIiBpcyBzaG9ydGhhbmQgZm9yIE1hdGNoLk9iamVjdEluY2x1ZGluZyh7fSk7XG4gICAgaWYgKHBhdHRlcm4gPT09IE9iamVjdClcbiAgICAgICAgcGF0dGVybiA9IE1hdGNoLk9iamVjdEluY2x1ZGluZyh7fSk7XG5cbiAgICAvLyBBcnJheSAoY2hlY2tlZCBBRlRFUiBBbnksIHdoaWNoIGlzIGltcGxlbWVudGVkIGFzIGFuIEFycmF5KS5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGlmIChwYXR0ZXJuLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwiQmFkIHBhdHRlcm46IGFycmF5cyBtdXN0IGhhdmUgb25lIHR5cGUgZWxlbWVudFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHBhdHRlcm4pKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgYXJyYXksIGdvdCBcIiArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZUVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNoZWNrU3VidHJlZSh2YWx1ZUVsZW1lbnQsIHBhdHRlcm5bMF0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE1hdGNoLkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGVyci5wYXRoID0gX3ByZXBlbmRQYXRoKGluZGV4LCBlcnIucGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBcmJpdHJhcnkgdmFsaWRhdGlvbiBjaGVja3MuIFRoZSBjb25kaXRpb24gY2FuIHJldHVybiBmYWxzZSBvciB0aHJvdyBhXG4gICAgLy8gTWF0Y2guRXJyb3IgKGllLCBpdCBjYW4gaW50ZXJuYWxseSB1c2UgY2hlY2soKSkgdG8gZmFpbC5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIFdoZXJlKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuLmNvbmRpdGlvbih2YWx1ZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIFhYWCB0aGlzIGVycm9yIGlzIHRlcnJpYmxlXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkZhaWxlZCBNYXRjaC5XaGVyZSB2YWxpZGF0aW9uXCIpO1xuICAgIH1cblxuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPcHRpb25hbClcbiAgICAgICAgcGF0dGVybiA9IE1hdGNoLk9uZU9mKHVuZGVmaW5lZCwgcGF0dGVybi5wYXR0ZXJuKTtcblxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgT25lT2YpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXR0ZXJuLmNob2ljZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2hlY2tTdWJ0cmVlKHZhbHVlLCBwYXR0ZXJuLmNob2ljZXNbaV0pO1xuICAgICAgICAgICAgICAgIC8vIE5vIGVycm9yPyBZYXksIHJldHVybi5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlciBlcnJvcnMgc2hvdWxkIGJlIHRocm93bi4gTWF0Y2ggZXJyb3JzIGp1c3QgbWVhbiB0cnkgYW5vdGhlclxuICAgICAgICAgICAgICAgIC8vIGNob2ljZS5cbiAgICAgICAgICAgICAgICBpZiAoIShlcnIgaW5zdGFuY2VvZiBNYXRjaC5FcnJvcikpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBYWFggdGhpcyBlcnJvciBpcyB0ZXJyaWJsZVxuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJGYWlsZWQgTWF0Y2guT25lT2Ygb3IgTWF0Y2guT3B0aW9uYWwgdmFsaWRhdGlvblwiKTtcbiAgICB9XG5cbiAgICAvLyBBIGZ1bmN0aW9uIHRoYXQgaXNuJ3Qgc29tZXRoaW5nIHdlIHNwZWNpYWwtY2FzZSBpcyBhc3N1bWVkIHRvIGJlIGFcbiAgICAvLyBjb25zdHJ1Y3Rvci5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHBhdHRlcm4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIFhYWCB3aGF0IGlmIC5uYW1lIGlzbid0IGRlZmluZWRcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgXCIgKyBwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIH1cblxuICAgIHZhciB1bmtub3duS2V5c0FsbG93ZWQgPSBmYWxzZTtcbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIE9iamVjdEluY2x1ZGluZykge1xuICAgICAgICB1bmtub3duS2V5c0FsbG93ZWQgPSB0cnVlO1xuICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5wYXR0ZXJuO1xuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgT2JqZWN0SGFzaCkge1xuICAgICAgICB2YXIga2V5UGF0dGVybiA9IHBhdHRlcm4ucGF0dGVybjtcbiAgICAgICAgdmFyIGVtcHR5SGFzaCA9IHRydWU7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgZW1wdHlIYXNoID0gZmFsc2U7XG4gICAgICAgICAgICBjaGVjayh2YWx1ZVtrZXldLCBrZXlQYXR0ZXJuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW1wdHlIYXNoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgXCIgKyBwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBTdWJjbGFzcykge1xuICAgICAgICB2YXIgU3VwZXJjbGFzcyA9IHBhdHRlcm4uU3VwZXJjbGFzcztcbiAgICAgICAgaWYgKHBhdHRlcm4ubWF0Y2hTdXBlcmNsYXNzICYmIHZhbHVlID09IFN1cGVyY2xhc3MpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICghICh2YWx1ZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBTdXBlcmNsYXNzKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkV4cGVjdGVkIFwiICsgcGF0dGVybi5jb25zdHJ1Y3Rvci5uYW1lICsgXCIgb2YgXCIgKyBTdXBlcmNsYXNzLm5hbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSBcIm9iamVjdFwiKVxuICAgICAgICB0aHJvdyBFcnJvcihcIkJhZCBwYXR0ZXJuOiB1bmtub3duIHBhdHRlcm4gdHlwZVwiKTtcblxuICAgIC8vIEFuIG9iamVjdCwgd2l0aCByZXF1aXJlZCBhbmQgb3B0aW9uYWwga2V5cy4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgZG9cbiAgICAvLyBzdHJ1Y3R1cmFsIG1hdGNoZXMgYWdhaW5zdCBvYmplY3RzIG9mIHNwZWNpYWwgdHlwZXMgdGhhdCBoYXBwZW4gdG8gbWF0Y2hcbiAgICAvLyB0aGUgcGF0dGVybjogdGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgYSBwbGFpbiBvbGQge09iamVjdH0hXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkV4cGVjdGVkIG9iamVjdCwgZ290IFwiICsgdHlwZW9mIHZhbHVlKTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkV4cGVjdGVkIG9iamVjdCwgZ290IG51bGxcIik7XG5cbiAgICB2YXIgcmVxdWlyZWRQYXR0ZXJucyA9IHt9O1xuICAgIHZhciBvcHRpb25hbFBhdHRlcm5zID0ge307XG5cbiAgICBfLmVhY2hLZXkocGF0dGVybiwgZnVuY3Rpb24oc3ViUGF0dGVybiwga2V5KSB7XG4gICAgICAgIGlmIChwYXR0ZXJuW2tleV0gaW5zdGFuY2VvZiBPcHRpb25hbClcbiAgICAgICAgICAgIG9wdGlvbmFsUGF0dGVybnNba2V5XSA9IHBhdHRlcm5ba2V5XS5wYXR0ZXJuO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXF1aXJlZFBhdHRlcm5zW2tleV0gPSBwYXR0ZXJuW2tleV07XG4gICAgfSwgdGhpcywgdHJ1ZSk7XG5cbiAgICBfLmVhY2hLZXkodmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgdmFyIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyZXF1aXJlZFBhdHRlcm5zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjaGVja1N1YnRyZWUoc3ViVmFsdWUsIHJlcXVpcmVkUGF0dGVybnNba2V5XSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHJlcXVpcmVkUGF0dGVybnNba2V5XTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWxQYXR0ZXJucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tTdWJ0cmVlKHN1YlZhbHVlLCBvcHRpb25hbFBhdHRlcm5zW2tleV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXVua25vd25LZXlzQWxsb3dlZClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiVW5rbm93biBrZXlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE1hdGNoLkVycm9yKVxuICAgICAgICAgICAgICAgIGVyci5wYXRoID0gX3ByZXBlbmRQYXRoKGtleSwgZXJyLnBhdGgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgfSwgdGhpcywgdHJ1ZSk7XG5cbiAgICBfLmVhY2hLZXkocmVxdWlyZWRQYXR0ZXJucywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJNaXNzaW5nIGtleSAnXCIgKyBrZXkgKyBcIidcIik7XG4gICAgfSwgdGhpcywgdHJ1ZSk7XG59O1xuXG5cbnZhciBfanNLZXl3b3JkcyA9IFtcImRvXCIsIFwiaWZcIiwgXCJpblwiLCBcImZvclwiLCBcImxldFwiLCBcIm5ld1wiLCBcInRyeVwiLCBcInZhclwiLCBcImNhc2VcIixcbiAgICBcImVsc2VcIiwgXCJlbnVtXCIsIFwiZXZhbFwiLCBcImZhbHNlXCIsIFwibnVsbFwiLCBcInRoaXNcIiwgXCJ0cnVlXCIsIFwidm9pZFwiLCBcIndpdGhcIixcbiAgICBcImJyZWFrXCIsIFwiY2F0Y2hcIiwgXCJjbGFzc1wiLCBcImNvbnN0XCIsIFwic3VwZXJcIiwgXCJ0aHJvd1wiLCBcIndoaWxlXCIsIFwieWllbGRcIixcbiAgICBcImRlbGV0ZVwiLCBcImV4cG9ydFwiLCBcImltcG9ydFwiLCBcInB1YmxpY1wiLCBcInJldHVyblwiLCBcInN0YXRpY1wiLCBcInN3aXRjaFwiLFxuICAgIFwidHlwZW9mXCIsIFwiZGVmYXVsdFwiLCBcImV4dGVuZHNcIiwgXCJmaW5hbGx5XCIsIFwicGFja2FnZVwiLCBcInByaXZhdGVcIiwgXCJjb250aW51ZVwiLFxuICAgIFwiZGVidWdnZXJcIiwgXCJmdW5jdGlvblwiLCBcImFyZ3VtZW50c1wiLCBcImludGVyZmFjZVwiLCBcInByb3RlY3RlZFwiLCBcImltcGxlbWVudHNcIixcbiAgICBcImluc3RhbmNlb2ZcIl07XG5cbi8vIEFzc3VtZXMgdGhlIGJhc2Ugb2YgcGF0aCBpcyBhbHJlYWR5IGVzY2FwZWQgcHJvcGVybHlcbi8vIHJldHVybnMga2V5ICsgYmFzZVxuZnVuY3Rpb24gX3ByZXBlbmRQYXRoKGtleSwgYmFzZSkge1xuICAgIGlmICgodHlwZW9mIGtleSkgPT09IFwibnVtYmVyXCIgfHwga2V5Lm1hdGNoKC9eWzAtOV0rJC8pKVxuICAgICAgICBrZXkgPSBcIltcIiArIGtleSArIFwiXVwiO1xuICAgIGVsc2UgaWYgKCFrZXkubWF0Y2goTWF0Y2guSWRlbnRpZmllclN0cmluZykgfHwgX2pzS2V5d29yZHMuaW5kZXhPZihrZXkpICE9IC0xKVxuICAgICAgICBrZXkgPSBKU09OLnN0cmluZ2lmeShba2V5XSk7XG5cbiAgICBpZiAoYmFzZSAmJiBiYXNlWzBdICE9PSBcIltcIilcbiAgICAgICAgcmV0dXJuIGtleSArICcuJyArIGJhc2U7XG4gICAgcmV0dXJuIGtleSArIGJhc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLnV0aWxgXG4gKi9cbnZhciB1dGlsID0ge1xuICAgIGxvZ2dlcjogcmVxdWlyZSgnLi9sb2dnZXInKSxcbiAgICBjaGVjazogcmVxdWlyZSgnLi9jaGVjaycpLFxuICAgIGRvVDogcmVxdWlyZSgnZG90Jylcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gdXRpbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cInV0aWxzLWxvZ2dlclwiPjwvYT5cbi8vIG1pbG8udXRpbHMubG9nZ2VyXG4vLyAtLS0tLS0tLS0tLVxuXG4vLyBBcHBsaWNhdGlvbiBsb2dnZXIgdGhhdCBoYXMgZXJyb3IsIHdhcm4sIGluZm8gYW5kIGRlYnVnXG4vLyBtZXRob2RzLCB0aGF0IGNhbiBiZSBzdXBwcmVzc2VkIGJ5IHNldHRpbmcgbG9nIGxldmVsLlxuXG4vLyBQcm9wZXJ0aWVzOlxuXG4vLyAtIGxldmVsXG5cbi8vICAgLSAwIC0gZXJyb3Jcbi8vICAgLSAxIC0gd2FyblxuLy8gICAtIDIgLSBpbmZvXG4vLyAgIC0gMyAtIGRlYnVnIChkZWZhdWx0KVxuXG4vLyAtIGVuYWJsZWRcblxuLy8gICB0cnVlIGJ5IGRlZmF1bHQuIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nIGluIGJyb3dzZXIgY29uc29sZS5cblxuXG52YXIgTG9nZ2VyID0gcmVxdWlyZSgnLi9sb2dnZXJfY2xhc3MnKTtcblxudmFyIGxvZ2dlciA9IG5ldyBMb2dnZXIoeyBsZXZlbDogMyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBsb2dnZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vICMjIyBMb2dnZXIgQ2xhc3NcblxuLy8gUHJvcGVydGllczpcblxuLy8gLSBsZXZlbFxuXG4vLyAgIC0gMCAtIGVycm9yXG4vLyAgIC0gMSAtIHdhcm5cbi8vICAgLSAyIC0gaW5mb1xuLy8gICAtIDMgLSBkZWJ1ZyAoZGVmYXVsdClcblxuLy8gLSBlbmFibGVkXG5cbi8vICAgdHJ1ZSBieSBkZWZhdWx0LiBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBhbGwgbG9nZ2luZyBpbiBicm93c2VyIGNvbnNvbGUuXG5cblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuXG4vKipcbiAqIExvZyBsZXZlbHMuXG4gKi9cblxudmFyIGxldmVscyA9IFtcbiAgICAnZXJyb3InLFxuICAgICd3YXJuJyxcbiAgICAnaW5mbycsXG4gICAgJ2RlYnVnJ1xuXTtcblxudmFyIG1heExldmVsTGVuZ3RoID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgbGV2ZWxzLm1hcChmdW5jdGlvbihsZXZlbCkgeyByZXR1cm4gbGV2ZWwubGVuZ3RoOyB9KSk7XG5cbi8qKlxuICogQ29sb3JzIGZvciBsb2cgbGV2ZWxzLlxuICovXG5cbnZhciBjb2xvcnMgPSBbXG4gICAgMzEsXG4gICAgMzMsXG4gICAgMzYsXG4gICAgOTBcbl07XG5cbi8qKlxuICogUGFkcyB0aGUgbmljZSBvdXRwdXQgdG8gdGhlIGxvbmdlc3QgbG9nIGxldmVsLlxuICovXG5mdW5jdGlvbiBwYWQoc3RyKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPCBtYXhMZXZlbExlbmd0aClcbiAgICAgICAgcmV0dXJuIHN0ciArIG5ldyBBcnJheShtYXhMZXZlbExlbmd0aCAtIHN0ci5sZW5ndGggKyAxKS5qb2luKCcgJyk7XG5cbiAgICByZXR1cm4gc3RyO1xufTtcblxuXG5mdW5jdGlvbiBjb2xvcmVkKHN0ciwgY29sb3IpIHtcbiAgICByZXR1cm4gJ1xceDFCWycgKyBjb2xvciArICdtJyArIHN0ciArICcgLVxceDFCWzM5bSc7XG59XG5cblxudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgICBsZXZlbDogMyxcbiAgICB0aHJvd0xldmVsOiAtMSwgLy8gbmV2ZXIgdGhyb3dcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGxvZ1ByZWZpeDogJydcbn1cblxuXG4vKipcbiAqIExvZ2dlciAoY29uc29sZSkuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xudmFyIExvZ2dlciA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgXy5leHRlbmQodGhpcywgREVGQVVMVF9PUFRJT05TKTtcbiAgICBfLmV4dGVuZCh0aGlzLCBvcHRzIHx8IHt9KTtcbn07XG5cblxuLyoqXG4gKiBMb2cgbWV0aG9kLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuTG9nZ2VyLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgIHZhciBpbmRleCA9IGxldmVscy5pbmRleE9mKHR5cGUpO1xuXG4gICAgaWYgKCEgdGhpcy5lbmFibGVkIHx8IGluZGV4ID4gdGhpcy5sZXZlbClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTtcblxuICAgIGlmIChpbmRleCA8PSB0aGlzLnRocm93TGV2ZWwpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihbdGhpcy5sb2dQcmVmaXgsIHR5cGUgKyAnOiddLmNvbmNhdChhcmdzKS5qb2luKCcgJykpO1xuXG4gICAgY29uc29sZS5sb2cuYXBwbHkoXG4gICAgICAgICAgY29uc29sZVxuICAgICAgICAsIFsgdGhpcy5sb2dQcmVmaXhDb2xvclxuICAgICAgICAgICAgICA/ICcgICAnICsgY29sb3JlZCh0aGlzLmxvZ1ByZWZpeCwgdGhpcy5sb2dQcmVmaXhDb2xvcilcbiAgICAgICAgICAgICAgOiB0aGlzLmxvZ1ByZWZpeCxcbiAgICAgICAgICAgICh0aGlzLmNvbG9yc1xuICAgICAgICAgICAgICA/ICcgJyArIGNvbG9yZWQocGFkKHR5cGUpLCBjb2xvcnNbaW5kZXhdKVxuICAgICAgICAgICAgICA6IHR5cGUpICsgJzonXG4gICAgICAgICAgXS5jb25jYXQoYXJncylcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIG1ldGhvZHMuXG4gKi9cblxubGV2ZWxzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBMb2dnZXIucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmxvZy5hcHBseSh0aGlzLCBbbmFtZV0uY29uY2F0KF8udG9BcnJheShhcmd1bWVudHMpKSk7XG4gICAgfTtcbn0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTG9nZ2VyO1xuIiwiLy8gZG9ULmpzXG4vLyAyMDExLTIwMTQsIExhdXJhIERva3Rvcm92YSwgaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVFxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuXG4oZnVuY3Rpb24oKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdHZhciBkb1QgPSB7XG5cdFx0dmVyc2lvbjogXCIxLjAuM1wiLFxuXHRcdHRlbXBsYXRlU2V0dGluZ3M6IHtcblx0XHRcdGV2YWx1YXRlOiAgICAvXFx7XFx7KFtcXHNcXFNdKz8oXFx9PykrKVxcfVxcfS9nLFxuXHRcdFx0aW50ZXJwb2xhdGU6IC9cXHtcXHs9KFtcXHNcXFNdKz8pXFx9XFx9L2csXG5cdFx0XHRlbmNvZGU6ICAgICAgL1xce1xceyEoW1xcc1xcU10rPylcXH1cXH0vZyxcblx0XHRcdHVzZTogICAgICAgICAvXFx7XFx7IyhbXFxzXFxTXSs/KVxcfVxcfS9nLFxuXHRcdFx0dXNlUGFyYW1zOiAgIC8oXnxbXlxcdyRdKWRlZig/OlxcLnxcXFtbXFwnXFxcIl0pKFtcXHckXFwuXSspKD86W1xcJ1xcXCJdXFxdKT9cXHMqXFw6XFxzKihbXFx3JFxcLl0rfFxcXCJbXlxcXCJdK1xcXCJ8XFwnW15cXCddK1xcJ3xcXHtbXlxcfV0rXFx9KS9nLFxuXHRcdFx0ZGVmaW5lOiAgICAgIC9cXHtcXHsjI1xccyooW1xcd1xcLiRdKylcXHMqKFxcOnw9KShbXFxzXFxTXSs/KSNcXH1cXH0vZyxcblx0XHRcdGRlZmluZVBhcmFtczovXlxccyooW1xcdyRdKyk6KFtcXHNcXFNdKykvLFxuXHRcdFx0Y29uZGl0aW9uYWw6IC9cXHtcXHtcXD8oXFw/KT9cXHMqKFtcXHNcXFNdKj8pXFxzKlxcfVxcfS9nLFxuXHRcdFx0aXRlcmF0ZTogICAgIC9cXHtcXHt+XFxzKig/OlxcfVxcfXwoW1xcc1xcU10rPylcXHMqXFw6XFxzKihbXFx3JF0rKVxccyooPzpcXDpcXHMqKFtcXHckXSspKT9cXHMqXFx9XFx9KS9nLFxuXHRcdFx0dmFybmFtZTpcdFwiaXRcIixcblx0XHRcdHN0cmlwOlx0XHR0cnVlLFxuXHRcdFx0YXBwZW5kOlx0XHR0cnVlLFxuXHRcdFx0c2VsZmNvbnRhaW5lZDogZmFsc2UsXG5cdFx0XHRkb05vdFNraXBFbmNvZGVkOiBmYWxzZVxuXHRcdH0sXG5cdFx0dGVtcGxhdGU6IHVuZGVmaW5lZCwgLy9mbiwgY29tcGlsZSB0ZW1wbGF0ZVxuXHRcdGNvbXBpbGU6ICB1bmRlZmluZWQgIC8vZm4sIGZvciBleHByZXNzXG5cdH0sIF9nbG9iYWxzO1xuXG5cdGRvVC5lbmNvZGVIVE1MU291cmNlID0gZnVuY3Rpb24oZG9Ob3RTa2lwRW5jb2RlZCkge1xuXHRcdHZhciBlbmNvZGVIVE1MUnVsZXMgPSB7IFwiJlwiOiBcIiYjMzg7XCIsIFwiPFwiOiBcIiYjNjA7XCIsIFwiPlwiOiBcIiYjNjI7XCIsICdcIic6IFwiJiMzNDtcIiwgXCInXCI6IFwiJiMzOTtcIiwgXCIvXCI6IFwiJiM0NztcIiB9LFxuXHRcdFx0bWF0Y2hIVE1MID0gZG9Ob3RTa2lwRW5jb2RlZCA/IC9bJjw+XCInXFwvXS9nIDogLyYoPyEjP1xcdys7KXw8fD58XCJ8J3xcXC8vZztcblx0XHRyZXR1cm4gZnVuY3Rpb24oY29kZSkge1xuXHRcdFx0cmV0dXJuIGNvZGUgPyBjb2RlLnRvU3RyaW5nKCkucmVwbGFjZShtYXRjaEhUTUwsIGZ1bmN0aW9uKG0pIHtyZXR1cm4gZW5jb2RlSFRNTFJ1bGVzW21dIHx8IG07fSkgOiBcIlwiO1xuXHRcdH07XG5cdH07XG5cblx0X2dsb2JhbHMgPSAoZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXMgfHwgKDAsZXZhbCkoXCJ0aGlzXCIpOyB9KCkpO1xuXG5cdGlmICh0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBkb1Q7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHRkZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gZG9UO30pO1xuXHR9IGVsc2Uge1xuXHRcdF9nbG9iYWxzLmRvVCA9IGRvVDtcblx0fVxuXG5cdHZhciBzdGFydGVuZCA9IHtcblx0XHRhcHBlbmQ6IHsgc3RhcnQ6IFwiJysoXCIsICAgICAgZW5kOiBcIikrJ1wiLCAgICAgIHN0YXJ0ZW5jb2RlOiBcIicrZW5jb2RlSFRNTChcIiB9LFxuXHRcdHNwbGl0OiAgeyBzdGFydDogXCInO291dCs9KFwiLCBlbmQ6IFwiKTtvdXQrPSdcIiwgc3RhcnRlbmNvZGU6IFwiJztvdXQrPWVuY29kZUhUTUwoXCIgfVxuXHR9LCBza2lwID0gLyReLztcblxuXHRmdW5jdGlvbiByZXNvbHZlRGVmcyhjLCBibG9jaywgZGVmKSB7XG5cdFx0cmV0dXJuICgodHlwZW9mIGJsb2NrID09PSBcInN0cmluZ1wiKSA/IGJsb2NrIDogYmxvY2sudG9TdHJpbmcoKSlcblx0XHQucmVwbGFjZShjLmRlZmluZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlLCBhc3NpZ24sIHZhbHVlKSB7XG5cdFx0XHRpZiAoY29kZS5pbmRleE9mKFwiZGVmLlwiKSA9PT0gMCkge1xuXHRcdFx0XHRjb2RlID0gY29kZS5zdWJzdHJpbmcoNCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIShjb2RlIGluIGRlZikpIHtcblx0XHRcdFx0aWYgKGFzc2lnbiA9PT0gXCI6XCIpIHtcblx0XHRcdFx0XHRpZiAoYy5kZWZpbmVQYXJhbXMpIHZhbHVlLnJlcGxhY2UoYy5kZWZpbmVQYXJhbXMsIGZ1bmN0aW9uKG0sIHBhcmFtLCB2KSB7XG5cdFx0XHRcdFx0XHRkZWZbY29kZV0gPSB7YXJnOiBwYXJhbSwgdGV4dDogdn07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKCEoY29kZSBpbiBkZWYpKSBkZWZbY29kZV09IHZhbHVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5ldyBGdW5jdGlvbihcImRlZlwiLCBcImRlZlsnXCIrY29kZStcIiddPVwiICsgdmFsdWUpKGRlZik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH0pXG5cdFx0LnJlcGxhY2UoYy51c2UgfHwgc2tpcCwgZnVuY3Rpb24obSwgY29kZSkge1xuXHRcdFx0aWYgKGMudXNlUGFyYW1zKSBjb2RlID0gY29kZS5yZXBsYWNlKGMudXNlUGFyYW1zLCBmdW5jdGlvbihtLCBzLCBkLCBwYXJhbSkge1xuXHRcdFx0XHRpZiAoZGVmW2RdICYmIGRlZltkXS5hcmcgJiYgcGFyYW0pIHtcblx0XHRcdFx0XHR2YXIgcncgPSAoZCtcIjpcIitwYXJhbSkucmVwbGFjZSgvJ3xcXFxcL2csIFwiX1wiKTtcblx0XHRcdFx0XHRkZWYuX19leHAgPSBkZWYuX19leHAgfHwge307XG5cdFx0XHRcdFx0ZGVmLl9fZXhwW3J3XSA9IGRlZltkXS50ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChcIihefFteXFxcXHckXSlcIiArIGRlZltkXS5hcmcgKyBcIihbXlxcXFx3JF0pXCIsIFwiZ1wiKSwgXCIkMVwiICsgcGFyYW0gKyBcIiQyXCIpO1xuXHRcdFx0XHRcdHJldHVybiBzICsgXCJkZWYuX19leHBbJ1wiK3J3K1wiJ11cIjtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHR2YXIgdiA9IG5ldyBGdW5jdGlvbihcImRlZlwiLCBcInJldHVybiBcIiArIGNvZGUpKGRlZik7XG5cdFx0XHRyZXR1cm4gdiA/IHJlc29sdmVEZWZzKGMsIHYsIGRlZikgOiB2O1xuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gdW5lc2NhcGUoY29kZSkge1xuXHRcdHJldHVybiBjb2RlLnJlcGxhY2UoL1xcXFwoJ3xcXFxcKS9nLCBcIiQxXCIpLnJlcGxhY2UoL1tcXHJcXHRcXG5dL2csIFwiIFwiKTtcblx0fVxuXG5cdGRvVC50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHRtcGwsIGMsIGRlZikge1xuXHRcdGMgPSBjIHx8IGRvVC50ZW1wbGF0ZVNldHRpbmdzO1xuXHRcdHZhciBjc2UgPSBjLmFwcGVuZCA/IHN0YXJ0ZW5kLmFwcGVuZCA6IHN0YXJ0ZW5kLnNwbGl0LCBuZWVkaHRtbGVuY29kZSwgc2lkID0gMCwgaW5kdixcblx0XHRcdHN0ciAgPSAoYy51c2UgfHwgYy5kZWZpbmUpID8gcmVzb2x2ZURlZnMoYywgdG1wbCwgZGVmIHx8IHt9KSA6IHRtcGw7XG5cblx0XHRzdHIgPSAoXCJ2YXIgb3V0PSdcIiArIChjLnN0cmlwID8gc3RyLnJlcGxhY2UoLyhefFxccnxcXG4pXFx0KiArfCArXFx0KihcXHJ8XFxufCQpL2csXCIgXCIpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL1xccnxcXG58XFx0fFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vZyxcIlwiKTogc3RyKVxuXHRcdFx0LnJlcGxhY2UoLyd8XFxcXC9nLCBcIlxcXFwkJlwiKVxuXHRcdFx0LnJlcGxhY2UoYy5pbnRlcnBvbGF0ZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRcdHJldHVybiBjc2Uuc3RhcnQgKyB1bmVzY2FwZShjb2RlKSArIGNzZS5lbmQ7XG5cdFx0XHR9KVxuXHRcdFx0LnJlcGxhY2UoYy5lbmNvZGUgfHwgc2tpcCwgZnVuY3Rpb24obSwgY29kZSkge1xuXHRcdFx0XHRuZWVkaHRtbGVuY29kZSA9IHRydWU7XG5cdFx0XHRcdHJldHVybiBjc2Uuc3RhcnRlbmNvZGUgKyB1bmVzY2FwZShjb2RlKSArIGNzZS5lbmQ7XG5cdFx0XHR9KVxuXHRcdFx0LnJlcGxhY2UoYy5jb25kaXRpb25hbCB8fCBza2lwLCBmdW5jdGlvbihtLCBlbHNlY2FzZSwgY29kZSkge1xuXHRcdFx0XHRyZXR1cm4gZWxzZWNhc2UgP1xuXHRcdFx0XHRcdChjb2RlID8gXCInO31lbHNlIGlmKFwiICsgdW5lc2NhcGUoY29kZSkgKyBcIil7b3V0Kz0nXCIgOiBcIic7fWVsc2V7b3V0Kz0nXCIpIDpcblx0XHRcdFx0XHQoY29kZSA/IFwiJztpZihcIiArIHVuZXNjYXBlKGNvZGUpICsgXCIpe291dCs9J1wiIDogXCInO31vdXQrPSdcIik7XG5cdFx0XHR9KVxuXHRcdFx0LnJlcGxhY2UoYy5pdGVyYXRlIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGl0ZXJhdGUsIHZuYW1lLCBpbmFtZSkge1xuXHRcdFx0XHRpZiAoIWl0ZXJhdGUpIHJldHVybiBcIic7fSB9IG91dCs9J1wiO1xuXHRcdFx0XHRzaWQrPTE7IGluZHY9aW5hbWUgfHwgXCJpXCIrc2lkOyBpdGVyYXRlPXVuZXNjYXBlKGl0ZXJhdGUpO1xuXHRcdFx0XHRyZXR1cm4gXCInO3ZhciBhcnJcIitzaWQrXCI9XCIraXRlcmF0ZStcIjtpZihhcnJcIitzaWQrXCIpe3ZhciBcIit2bmFtZStcIixcIitpbmR2K1wiPS0xLGxcIitzaWQrXCI9YXJyXCIrc2lkK1wiLmxlbmd0aC0xO3doaWxlKFwiK2luZHYrXCI8bFwiK3NpZCtcIil7XCJcblx0XHRcdFx0XHQrdm5hbWUrXCI9YXJyXCIrc2lkK1wiW1wiK2luZHYrXCIrPTFdO291dCs9J1wiO1xuXHRcdFx0fSlcblx0XHRcdC5yZXBsYWNlKGMuZXZhbHVhdGUgfHwgc2tpcCwgZnVuY3Rpb24obSwgY29kZSkge1xuXHRcdFx0XHRyZXR1cm4gXCInO1wiICsgdW5lc2NhcGUoY29kZSkgKyBcIm91dCs9J1wiO1xuXHRcdFx0fSlcblx0XHRcdCsgXCInO3JldHVybiBvdXQ7XCIpXG5cdFx0XHQucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIikucmVwbGFjZSgvXFx0L2csICdcXFxcdCcpLnJlcGxhY2UoL1xcci9nLCBcIlxcXFxyXCIpXG5cdFx0XHQucmVwbGFjZSgvKFxcc3w7fFxcfXxefFxceylvdXRcXCs9Jyc7L2csICckMScpLnJlcGxhY2UoL1xcKycnL2csIFwiXCIpO1xuXHRcdFx0Ly8ucmVwbGFjZSgvKFxcc3w7fFxcfXxefFxceylvdXRcXCs9JydcXCsvZywnJDFvdXQrPScpO1xuXG5cdFx0aWYgKG5lZWRodG1sZW5jb2RlKSB7XG5cdFx0XHRpZiAoIWMuc2VsZmNvbnRhaW5lZCAmJiBfZ2xvYmFscyAmJiAhX2dsb2JhbHMuX2VuY29kZUhUTUwpIF9nbG9iYWxzLl9lbmNvZGVIVE1MID0gZG9ULmVuY29kZUhUTUxTb3VyY2UoYy5kb05vdFNraXBFbmNvZGVkKTtcblx0XHRcdHN0ciA9IFwidmFyIGVuY29kZUhUTUwgPSB0eXBlb2YgX2VuY29kZUhUTUwgIT09ICd1bmRlZmluZWQnID8gX2VuY29kZUhUTUwgOiAoXCJcblx0XHRcdFx0KyBkb1QuZW5jb2RlSFRNTFNvdXJjZS50b1N0cmluZygpICsgXCIoXCIgKyAoYy5kb05vdFNraXBFbmNvZGVkIHx8ICcnKSArIFwiKSk7XCJcblx0XHRcdFx0KyBzdHI7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gbmV3IEZ1bmN0aW9uKGMudmFybmFtZSwgc3RyKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIpIGNvbnNvbGUubG9nKFwiQ291bGQgbm90IGNyZWF0ZSBhIHRlbXBsYXRlIGZ1bmN0aW9uOiBcIiArIHN0cik7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblx0fTtcblxuXHRkb1QuY29tcGlsZSA9IGZ1bmN0aW9uKHRtcGwsIGRlZikge1xuXHRcdHJldHVybiBkb1QudGVtcGxhdGUodG1wbCwgbnVsbCwgZGVmKTtcblx0fTtcbn0oKSk7XG4iLCIvKiBkb1QgKyBhdXRvLWNvbXBpbGF0aW9uIG9mIGRvVCB0ZW1wbGF0ZXNcbiAqXG4gKiAyMDEyLCBMYXVyYSBEb2t0b3JvdmEsIGh0dHBzOi8vZ2l0aHViLmNvbS9vbGFkby9kb1RcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICpcbiAqIENvbXBpbGVzIC5kZWYsIC5kb3QsIC5qc3QgZmlsZXMgZm91bmQgdW5kZXIgdGhlIHNwZWNpZmllZCBwYXRoLlxuICogSXQgaWdub3JlcyBzdWItZGlyZWN0b3JpZXMuXG4gKiBUZW1wbGF0ZSBmaWxlcyBjYW4gaGF2ZSBtdWx0aXBsZSBleHRlbnNpb25zIGF0IHRoZSBzYW1lIHRpbWUuXG4gKiBGaWxlcyB3aXRoIC5kZWYgZXh0ZW5zaW9uIGNhbiBiZSBpbmNsdWRlZCBpbiBvdGhlciBmaWxlcyB2aWEge3sjZGVmLm5hbWV9fVxuICogRmlsZXMgd2l0aCAuZG90IGV4dGVuc2lvbiBhcmUgY29tcGlsZWQgaW50byBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZFxuICogY2FuIGJlIGFjY2Vzc2VkIGFzIHJlbmRlcmVyLmZpbGVuYW1lXG4gKiBGaWxlcyB3aXRoIC5qc3QgZXh0ZW5zaW9uIGFyZSBjb21waWxlZCBpbnRvIC5qcyBmaWxlcy4gUHJvZHVjZWQgLmpzIGZpbGUgY2FuIGJlXG4gKiBsb2FkZWQgYXMgYSBjb21tb25KUywgQU1EIG1vZHVsZSwgb3IganVzdCBpbnN0YWxsZWQgaW50byBhIGdsb2JhbCB2YXJpYWJsZVxuICogKGRlZmF1bHQgaXMgc2V0IHRvIHdpbmRvdy5yZW5kZXIpLlxuICogQWxsIGlubGluZSBkZWZpbmVzIGRlZmluZWQgaW4gdGhlIC5qc3QgZmlsZSBhcmVcbiAqIGNvbXBpbGVkIGludG8gc2VwYXJhdGUgZnVuY3Rpb25zIGFuZCBhcmUgYXZhaWxhYmxlIHZpYSBfcmVuZGVyLmZpbGVuYW1lLmRlZmluZW5hbWVcbiAqXG4gKiBCYXNpYyB1c2FnZTpcbiAqIHZhciBkb3RzID0gcmVxdWlyZShcImRvdFwiKS5wcm9jZXNzKHtwYXRoOiBcIi4vdmlld3NcIn0pO1xuICogZG90cy5teXRlbXBsYXRlKHtmb286XCJoZWxsbyB3b3JsZFwifSk7XG4gKlxuICogVGhlIGFib3ZlIHNuaXBwZXQgd2lsbDpcbiAqIDEuIENvbXBpbGUgYWxsIHRlbXBsYXRlcyBpbiB2aWV3cyBmb2xkZXIgKC5kb3QsIC5kZWYsIC5qc3QpXG4gKiAyLiBQbGFjZSAuanMgZmlsZXMgY29tcGlsZWQgZnJvbSAuanN0IHRlbXBsYXRlcyBpbnRvIHRoZSBzYW1lIGZvbGRlci5cbiAqICAgIFRoZXNlIGZpbGVzIGNhbiBiZSB1c2VkIHdpdGggcmVxdWlyZSwgaS5lLiByZXF1aXJlKFwiLi92aWV3cy9teXRlbXBsYXRlXCIpLlxuICogMy4gUmV0dXJuIGFuIG9iamVjdCB3aXRoIGZ1bmN0aW9ucyBjb21waWxlZCBmcm9tIC5kb3QgdGVtcGxhdGVzIGFzIGl0cyBwcm9wZXJ0aWVzLlxuICogNC4gUmVuZGVyIG15dGVtcGxhdGUgdGVtcGxhdGUuXG4gKi9cblxudmFyIGZzID0gcmVxdWlyZShcImZzXCIpLFxuXHRkb1QgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL2RvVFwiKTtcblxuZG9ULnByb2Nlc3MgPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cdC8vcGF0aCwgZGVzdGluYXRpb24sIGdsb2JhbCwgcmVuZGVybW9kdWxlLCB0ZW1wbGF0ZVNldHRpbmdzXG5cdHJldHVybiBuZXcgSW5zdGFsbERvdHMob3B0aW9ucykuY29tcGlsZUFsbCgpO1xufTtcblxuZnVuY3Rpb24gSW5zdGFsbERvdHMobykge1xuXHR0aGlzLl9fcGF0aCBcdFx0PSBvLnBhdGggfHwgXCIuL1wiO1xuXHRpZiAodGhpcy5fX3BhdGhbdGhpcy5fX3BhdGgubGVuZ3RoLTFdICE9PSAnLycpIHRoaXMuX19wYXRoICs9ICcvJztcblx0dGhpcy5fX2Rlc3RpbmF0aW9uXHQ9IG8uZGVzdGluYXRpb24gfHwgdGhpcy5fX3BhdGg7XG5cdGlmICh0aGlzLl9fZGVzdGluYXRpb25bdGhpcy5fX2Rlc3RpbmF0aW9uLmxlbmd0aC0xXSAhPT0gJy8nKSB0aGlzLl9fZGVzdGluYXRpb24gKz0gJy8nO1xuXHR0aGlzLl9fZ2xvYmFsXHRcdD0gby5nbG9iYWwgfHwgXCJ3aW5kb3cucmVuZGVyXCI7XG5cdHRoaXMuX19yZW5kZXJtb2R1bGVcdD0gby5yZW5kZXJtb2R1bGUgfHwge307XG5cdHRoaXMuX19zZXR0aW5ncyBcdD0gby50ZW1wbGF0ZVNldHRpbmdzID8gY29weShvLnRlbXBsYXRlU2V0dGluZ3MsIGNvcHkoZG9ULnRlbXBsYXRlU2V0dGluZ3MpKSA6IHVuZGVmaW5lZDtcblx0dGhpcy5fX2luY2x1ZGVzXHRcdD0ge307XG59XG5cbkluc3RhbGxEb3RzLnByb3RvdHlwZS5jb21waWxlVG9GaWxlID0gZnVuY3Rpb24ocGF0aCwgdGVtcGxhdGUsIGRlZikge1xuXHRkZWYgPSBkZWYgfHwge307XG5cdHZhciBtb2R1bGVuYW1lID0gcGF0aC5zdWJzdHJpbmcocGF0aC5sYXN0SW5kZXhPZihcIi9cIikrMSwgcGF0aC5sYXN0SW5kZXhPZihcIi5cIikpXG5cdFx0LCBkZWZzID0gY29weSh0aGlzLl9faW5jbHVkZXMsIGNvcHkoZGVmKSlcblx0XHQsIHNldHRpbmdzID0gdGhpcy5fX3NldHRpbmdzIHx8IGRvVC50ZW1wbGF0ZVNldHRpbmdzXG5cdFx0LCBjb21waWxlb3B0aW9ucyA9IGNvcHkoc2V0dGluZ3MpXG5cdFx0LCBkZWZhdWx0Y29tcGlsZWQgPSBkb1QudGVtcGxhdGUodGVtcGxhdGUsIHNldHRpbmdzLCBkZWZzKVxuXHRcdCwgZXhwb3J0cyA9IFtdXG5cdFx0LCBjb21waWxlZCA9IFwiXCJcblx0XHQsIGZuO1xuXG5cdGZvciAodmFyIHByb3BlcnR5IGluIGRlZnMpIHtcblx0XHRpZiAoZGVmc1twcm9wZXJ0eV0gIT09IGRlZltwcm9wZXJ0eV0gJiYgZGVmc1twcm9wZXJ0eV0gIT09IHRoaXMuX19pbmNsdWRlc1twcm9wZXJ0eV0pIHtcblx0XHRcdGZuID0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHR5cGVvZiBkZWZzW3Byb3BlcnR5XSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Zm4gPSBkb1QudGVtcGxhdGUoZGVmc1twcm9wZXJ0eV0sIHNldHRpbmdzLCBkZWZzKTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGRlZnNbcHJvcGVydHldID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGZuID0gZGVmc1twcm9wZXJ0eV07XG5cdFx0XHR9IGVsc2UgaWYgKGRlZnNbcHJvcGVydHldLmFyZykge1xuXHRcdFx0XHRjb21waWxlb3B0aW9ucy52YXJuYW1lID0gZGVmc1twcm9wZXJ0eV0uYXJnO1xuXHRcdFx0XHRmbiA9IGRvVC50ZW1wbGF0ZShkZWZzW3Byb3BlcnR5XS50ZXh0LCBjb21waWxlb3B0aW9ucywgZGVmcyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm4pIHtcblx0XHRcdFx0Y29tcGlsZWQgKz0gZm4udG9TdHJpbmcoKS5yZXBsYWNlKCdhbm9ueW1vdXMnLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdGV4cG9ydHMucHVzaChwcm9wZXJ0eSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbXBpbGVkICs9IGRlZmF1bHRjb21waWxlZC50b1N0cmluZygpLnJlcGxhY2UoJ2Fub255bW91cycsIG1vZHVsZW5hbWUpO1xuXHRmcy53cml0ZUZpbGVTeW5jKHBhdGgsIFwiKGZ1bmN0aW9uKCl7XCIgKyBjb21waWxlZFxuXHRcdCsgXCJ2YXIgaXRzZWxmPVwiICsgbW9kdWxlbmFtZSArIFwiLCBfZW5jb2RlSFRNTD0oXCIgKyBkb1QuZW5jb2RlSFRNTFNvdXJjZS50b1N0cmluZygpICsgXCIoXCIgKyAoc2V0dGluZ3MuZG9Ob3RTa2lwRW5jb2RlZCB8fCAnJykgKyBcIikpO1wiXG5cdFx0KyBhZGRleHBvcnRzKGV4cG9ydHMpXG5cdFx0KyBcImlmKHR5cGVvZiBtb2R1bGUhPT0ndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgbW9kdWxlLmV4cG9ydHM9aXRzZWxmO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSdmdW5jdGlvbicpZGVmaW5lKGZ1bmN0aW9uKCl7cmV0dXJuIGl0c2VsZjt9KTtlbHNlIHtcIlxuXHRcdCsgdGhpcy5fX2dsb2JhbCArIFwiPVwiICsgdGhpcy5fX2dsb2JhbCArIFwifHx7fTtcIiArIHRoaXMuX19nbG9iYWwgKyBcIlsnXCIgKyBtb2R1bGVuYW1lICsgXCInXT1pdHNlbGY7fX0oKSk7XCIpO1xufTtcblxuZnVuY3Rpb24gYWRkZXhwb3J0cyhleHBvcnRzKSB7XG5cdGZvciAodmFyIHJldCA9JycsIGk9MDsgaTwgZXhwb3J0cy5sZW5ndGg7IGkrKykge1xuXHRcdHJldCArPSBcIml0c2VsZi5cIiArIGV4cG9ydHNbaV0rIFwiPVwiICsgZXhwb3J0c1tpXStcIjtcIjtcblx0fVxuXHRyZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBjb3B5KG8sIHRvKSB7XG5cdHRvID0gdG8gfHwge307XG5cdGZvciAodmFyIHByb3BlcnR5IGluIG8pIHtcblx0XHR0b1twcm9wZXJ0eV0gPSBvW3Byb3BlcnR5XTtcblx0fVxuXHRyZXR1cm4gdG87XG59XG5cbmZ1bmN0aW9uIHJlYWRkYXRhKHBhdGgpIHtcblx0dmFyIGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMocGF0aCk7XG5cdGlmIChkYXRhKSByZXR1cm4gZGF0YS50b1N0cmluZygpO1xuXHRjb25zb2xlLmxvZyhcInByb2JsZW1zIHdpdGggXCIgKyBwYXRoKTtcbn1cblxuSW5zdGFsbERvdHMucHJvdG90eXBlLmNvbXBpbGVQYXRoID0gZnVuY3Rpb24ocGF0aCkge1xuXHR2YXIgZGF0YSA9IHJlYWRkYXRhKHBhdGgpO1xuXHRpZiAoZGF0YSkge1xuXHRcdHJldHVybiBkb1QudGVtcGxhdGUoZGF0YSxcblx0XHRcdFx0XHR0aGlzLl9fc2V0dGluZ3MgfHwgZG9ULnRlbXBsYXRlU2V0dGluZ3MsXG5cdFx0XHRcdFx0Y29weSh0aGlzLl9faW5jbHVkZXMpKTtcblx0fVxufTtcblxuSW5zdGFsbERvdHMucHJvdG90eXBlLmNvbXBpbGVBbGwgPSBmdW5jdGlvbigpIHtcblx0Y29uc29sZS5sb2coXCJDb21waWxpbmcgYWxsIGRvVCB0ZW1wbGF0ZXMuLi5cIik7XG5cblx0dmFyIGRlZkZvbGRlciA9IHRoaXMuX19wYXRoLFxuXHRcdHNvdXJjZXMgPSBmcy5yZWFkZGlyU3luYyhkZWZGb2xkZXIpLFxuXHRcdGssIGwsIG5hbWU7XG5cblx0Zm9yKCBrID0gMCwgbCA9IHNvdXJjZXMubGVuZ3RoOyBrIDwgbDsgaysrKSB7XG5cdFx0bmFtZSA9IHNvdXJjZXNba107XG5cdFx0aWYgKC9cXC5kZWYoXFwuZG90fFxcLmpzdCk/JC8udGVzdChuYW1lKSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJMb2FkZWQgZGVmIFwiICsgbmFtZSk7XG5cdFx0XHR0aGlzLl9faW5jbHVkZXNbbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5pbmRleE9mKCcuJykpXSA9IHJlYWRkYXRhKGRlZkZvbGRlciArIG5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdGZvciggayA9IDAsIGwgPSBzb3VyY2VzLmxlbmd0aDsgayA8IGw7IGsrKykge1xuXHRcdG5hbWUgPSBzb3VyY2VzW2tdO1xuXHRcdGlmICgvXFwuZG90KFxcLmRlZnxcXC5qc3QpPyQvLnRlc3QobmFtZSkpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiQ29tcGlsaW5nIFwiICsgbmFtZSArIFwiIHRvIGZ1bmN0aW9uXCIpO1xuXHRcdFx0dGhpcy5fX3JlbmRlcm1vZHVsZVtuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoJy4nKSldID0gdGhpcy5jb21waWxlUGF0aChkZWZGb2xkZXIgKyBuYW1lKTtcblx0XHR9XG5cdFx0aWYgKC9cXC5qc3QoXFwuZG90fFxcLmRlZik/JC8udGVzdChuYW1lKSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJDb21waWxpbmcgXCIgKyBuYW1lICsgXCIgdG8gZmlsZVwiKTtcblx0XHRcdHRoaXMuY29tcGlsZVRvRmlsZSh0aGlzLl9fZGVzdGluYXRpb24gKyBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoJy4nKSkgKyAnLmpzJyxcblx0XHRcdFx0XHRyZWFkZGF0YShkZWZGb2xkZXIgKyBuYW1lKSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0aGlzLl9fcmVuZGVybW9kdWxlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5cbi8qKlxuICogW19fUHJvdG90eXBlIGZ1bmN0aW9uc19fXShwcm90b19wcm90b3R5cGUuanMuaHRtbClcbiAqXG4gKiAtIFtleHRlbmRQcm90b10ocHJvdG9fcHJvdG90eXBlLmpzLmh0bWwjZXh0ZW5kUHJvdG8pXG4gKiAtIFtjcmVhdGVTdWJjbGFzc10ocHJvdG9fcHJvdG90eXBlLmpzLmh0bWwjY3JlYXRlU3ViY2xhc3MpXG4gKiAtIFttYWtlU3ViY2xhc3NdKHByb3RvX3Byb3RvdHlwZS5qcy5odG1sI21ha2VTdWJjbGFzcylcbiAqIC0gW25ld0FwcGx5XShwcm90b19wcm90b3R5cGUuanMuaHRtbCNuZXdBcHBseSlcbiAqL1xudmFyIHByb3RvdHlwZU1ldGhvZHMgPSByZXF1aXJlKCcuL3Byb3RvX3Byb3RvdHlwZScpO1xuXG5cbi8qKlxuICogW19fT2JqZWN0IGZ1bmN0aW9uc19fXShwcm90b19vYmplY3QuanMuaHRtbClcbiAqXG4gKiAtIFtleHRlbmRdKHByb3RvX29iamVjdC5qcy5odG1sI2V4dGVuZClcbiAqIC0gW2Nsb25lXShwcm90b19vYmplY3QuanMuaHRtbCNjbG9uZSlcbiAqIC0gW2RlZmluZVByb3BlcnR5XShwcm90b19vYmplY3QuanMuaHRtbCNkZWZpbmVQcm9wZXJ0eSlcbiAqIC0gW2RlZmluZVByb3BlcnRpZXNdKHByb3RvX29iamVjdC5qcy5odG1sI2RlZmluZVByb3BlcnRpZXMpXG4gKiAtIFtkZWVwRXh0ZW5kXShwcm90b19vYmplY3QuanMuaHRtbCNkZWVwRXh0ZW5kKVxuICogLSBbZGVlcENsb25lXShwcm90b19vYmplY3QuanMuaHRtbCNkZWVwQ2xvbmUpXG4gKiAtIFtrZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNrZXlzKVxuICogLSBbYWxsS2V5c10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjYWxsS2V5cylcbiAqIC0gW3ZhbHVlc10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjdmFsdWVzKVxuICogLSBba2V5T2ZdKHByb3RvX29iamVjdC5qcy5odG1sI2tleU9mKVxuICogLSBbYWxsS2V5c09mXShwcm90b19vYmplY3QuanMuaHRtbCNhbGxLZXlzT2YpXG4gKiAtIFtlYWNoS2V5XShwcm90b19vYmplY3QuanMuaHRtbCNlYWNoS2V5KVxuICogLSBbbWFwS2V5c10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjbWFwS2V5cylcbiAqIC0gW3JlZHVjZUtleXNdKHByb3RvX29iamVjdC5qcy5odG1sI3JlZHVjZUtleXMpXG4gKiAtIFtmaWx0ZXJLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNmaWx0ZXJLZXlzKVxuICogLSBbc29tZUtleV0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjc29tZUtleSlcbiAqIC0gW2V2ZXJ5S2V5XShwcm90b19vYmplY3QuanMuaHRtbCNldmVyeUtleSlcbiAqIC0gW2ZpbmRWYWx1ZV0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZmluZFZhbHVlKVxuICogLSBbZmluZEtleV0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZmluZEtleSlcbiAqIC0gW3BpY2tLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNwaWNrS2V5cylcbiAqIC0gW29taXRLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNvbWl0S2V5cylcbiAqIC0gW2lzRXF1YWxdKHByb3RvX29iamVjdC5qcy5odG1sI2lzRXF1YWwpXG4gKiAtIFtpc05vdF0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjaXNOb3QpXG4gKi9cbnZhciBvYmplY3RNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19vYmplY3QnKTtcblxuXG4vKipcbiAqIFtfX0FycmF5IGZ1bmN0aW9uc19fXShwcm90b19hcnJheS5qcy5odG1sKVxuICpcbiAqIC0gW2ZpbmRdKHByb3RvX2FycmF5LmpzLmh0bWwjZmluZClcbiAqIC0gW2ZpbmRJbmRleF0ocHJvdG9fYXJyYXkuanMuaHRtbCNmaW5kSW5kZXgpXG4gKiAtIFthcHBlbmRBcnJheV0ocHJvdG9fYXJyYXkuanMuaHRtbCNhcHBlbmRBcnJheSlcbiAqIC0gW3ByZXBlbmRBcnJheV0ocHJvdG9fYXJyYXkuanMuaHRtbCNwcmVwZW5kQXJyYXkpXG4gKiAtIFtzcGxpY2VJdGVtXShwcm90b19hcnJheS5qcy5odG1sI3NwbGljZUl0ZW0pXG4gKiAtIFt0b0FycmF5XShwcm90b19hcnJheS5qcy5odG1sI3RvQXJyYXkpXG4gKiAtIFtvYmplY3RdKHByb3RvX2FycmF5LmpzLmh0bWwjb2JqZWN0KVxuICogLSBbbWFwVG9PYmplY3RdKHByb3RvX2FycmF5LmpzLmh0bWwjbWFwVG9PYmplY3QpXG4gKiAtIFt1bmlxdWVdKHByb3RvX2FycmF5LmpzLmh0bWwjdW5pcXVlKVxuICogLSBbZGVlcEZvckVhY2hdKHByb3RvX2FycmF5LmpzLmh0bWwjZGVlcEZvckVhY2gpXG4gKlxuICogRnVuY3Rpb25zIHRoYXQgQXJyYXkgW2ltcGxlbWVudHMgbmF0aXZlbHldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3Byb3RvdHlwZSNNZXRob2RzKSBhcmUgYWxzbyBhZGRlZCAtIHRoZXkgY2FuIGJlIHVzZWQgd2l0aCBhcnJheS1saWtlIG9iamVjdHMgYW5kIGZvciBjaGFpbmluZyAobmF0aXZlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGNhbGxlZCkuXG4gKi9cbnZhciBhcnJheU1ldGhvZHMgPSByZXF1aXJlKCcuL3Byb3RvX2FycmF5Jyk7XG5cblxuLyoqXG4gKiBbX19GdW5jdGlvbiBmdW5jdGlvbnNfX10ocHJvdG9fZnVuY3Rpb24uanMuaHRtbClcbiAqXG4gKiAtIFttYWtlRnVuY3Rpb25dKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjbWFrZUZ1bmN0aW9uKVxuICogLSBbcGFydGlhbF0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNwYXJ0aWFsKVxuICogLSBbcGFydGlhbFJpZ2h0XShwcm90b19mdW5jdGlvbi5qcy5odG1sI3BhcnRpYWxSaWdodClcbiAqIC0gW21lbW9pemVdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjbWVtb2l6ZSlcbiAqIC0gW2RlbGF5XShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlbGF5KVxuICogLSBbZGVmZXJdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVmZXIpXG4gKiAtIFtkZWxheWVkXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlbGF5ZWQpXG4gKiAtIFtkZWZlcnJlZF0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlcnJlZClcbiAqIC0gW2RlZmVyVGlja3NdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVmZXJUaWNrcylcbiAqIC0gW2RlbGF5TWV0aG9kXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlbGF5TWV0aG9kKVxuICogLSBbZGVmZXJNZXRob2RdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVmZXJNZXRob2QpXG4gKiAtIFtkZWJvdW5jZV0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWJvdW5jZSlcbiAqIC0gW3Rocm90dGxlXShwcm90b19mdW5jdGlvbi5qcy5odG1sI3Rocm90dGxlKVxuICogLSBbb25jZV0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNvbmNlKVxuICogLSBbd2FpdEZvcl0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCN3YWl0Rm9yKVxuKi9cbnZhciBmdW5jdGlvbk1ldGhvZHMgPSByZXF1aXJlKCcuL3Byb3RvX2Z1bmN0aW9uJyk7XG5cblxuLyoqXG4gKiBbX19TdHJpbmcgZnVuY3Rpb25zX19dKHByb3RvX3N0cmluZy5qcy5odG1sKVxuICpcbiAqIC0gW2ZpcnN0VXBwZXJDYXNlXShwcm90b19zdHJpbmcuanMuaHRtbCNmaXJzdFVwcGVyQ2FzZSlcbiAqIC0gW2ZpcnN0TG93ZXJDYXNlXShwcm90b19zdHJpbmcuanMuaHRtbCNmaXJzdExvd2VyQ2FzZSlcbiAqIC0gW3RvUmVnRXhwXShwcm90b19zdHJpbmcuanMuaHRtbCN0b1JlZ0V4cClcbiAqIC0gW3RvRnVuY3Rpb25dKHByb3RvX3N0cmluZy5qcy5odG1sI3RvRnVuY3Rpb24pXG4gKiAtIFt0b0RhdGVdKHByb3RvX3N0cmluZy5qcy5odG1sI3RvRGF0ZSlcbiAqIC0gW3RvUXVlcnlTdHJpbmddKHByb3RvX3N0cmluZy5qcy5odG1sI3RvUXVlcnlTdHJpbmcpXG4gKiAtIFtmcm9tUXVlcnlTdHJpbmddKHByb3RvX3N0cmluZy5qcy5odG1sI2Zyb21RdWVyeVN0cmluZylcbiAqIC0gW2pzb25QYXJzZV0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjanNvblBhcnNlKVxuICogLSBbaGFzaENvZGVdKHByb3RvX3N0cmluZy5qcy5odG1sI2hhc2hDb2RlKVxuICogLSBbdW5QcmVmaXhdKHByb3RvX3N0cmluZy5qcy5odG1sI3VuUHJlZml4KVxuICovXG52YXIgc3RyaW5nTWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fc3RyaW5nJyk7XG5cblxuLyoqXG4gKiBbX19OdW1iZXIgZnVuY3Rpb25zX19dKHByb3RvX251bWJlci5qcy5odG1sKVxuICpcbiAqIC0gW2lzTnVtZXJpY10ocHJvdG9fbnVtYmVyLmpzLmh0bWwjaXNOdW1lcmljKVxuICovXG52YXIgbnVtYmVyTWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fbnVtYmVyJyk7XG5cblxuLyoqXG4gKiBbX19VdGlsaXR5IGZ1bmN0aW9uc19fXShwcm90b191dGlsLmpzLmh0bWwpXG4gKlxuICogLSBbdGltZXNdKHByb3RvX3V0aWwuanMuaHRtbCN0aW1lcylcbiAqIC0gW3JlcGVhdF0ocHJvdG9fdXRpbC5qcy5odG1sI3JlcGVhdClcbiAqIC0gW3RhcF0ocHJvdG9fdXRpbC5qcy5odG1sI3RhcClcbiAqIC0gW3Jlc3VsdF0ocHJvdG9fdXRpbC5qcy5odG1sI3Jlc3VsdClcbiAqIC0gW2lkZW50aXR5XShwcm90b191dGlsLmpzLmh0bWwjaWRlbnRpdHkpXG4gKiAtIFtwcm9wZXJ0eV0ocHJvdG9fdXRpbC5qcy5odG1sI3Byb3BlcnR5KVxuICogLSBbY29tcGFyZVByb3BlcnR5XShwcm90b191dGlsLmpzLmh0bWwjY29tcGFyZVByb3BlcnR5KVxuICogLSBbbm9vcF0ocHJvdG9fdXRpbC5qcy5odG1sI25vb3ApXG4gKi9cbnZhciB1dGlsTWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fdXRpbCcpO1xuXG5cbi8qKlxuICogQ2hhaW5pbmdcbiAqID09PT09PT09XG4gKlxuICogYF9gIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHdyYXBwZWQgdmFsdWUgKG9iamVjdCwgZnVuY3Rpb24sIGFycmF5LCBldGMuKSB0byBhbGxvdyBjaGFpbmluZyBvZiBQcm90byBmdW5jdGlvbnMuXG4gKiBUbyB1bndyYXAsIGBfYCBtZXRob2Qgb2YgYSB3cmFwcGVkIHZhbHVlIHNob3VsZCBiZSB1c2VkLlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIHZhciBhcnIgPSBfKHsgMDogMywgMTogNCwgMjogNSwgbGVuZ3RoOiAzfSlcbiAqICAgICAgICAgICAgICAudG9BcnJheSgpXG4gKiAgICAgICAgICAgICAgLnByZXBlbmRBcnJheShbMSwgMl0pXG4gKiAgICAgICAgICAgICAgLmFwcGVuZEFycmF5KFs2LCA3LCA4XSlcbiAqICAgICAgICAgICAgICAuXygpO1xuICogYGBgXG4gKiBBIHdyYXBwZWQgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGBfYCAoYFByb3RvYCBjbGFzcykuXG4gKlxuICogQ2hhaW5pbmcgaXMgaW1wbGVtZW50ZWQgZm9yIGRldmVsb3BtZW50IGNvbnZlbmllbmNlLCBidXQgaXQgaGFzIHBlcmZvcm1hbmNlIG92ZXJoZWFkLCBub3Qgb25seSB0byB3cmFwIGFuZCB1bndyYXAgdmFsdWVzIGJ1dCBpbiBlYWNoIGZ1bmN0aW9uIGNhbGwuXG4gKiBBbHRob3VnaCBhbGwgUHJvdG8gZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBhcyBtZXRob2RzIG9wZXJhdGluZyBvbiB0aGlzIGFuZCB0aGUgb3ZlcmhlYWQgdG8gcmVkZWZpbmUgdGhlbSBhcyBmdW5jdGlvbnMgaXMgdmVyeSBzbWFsbCwgdGhlIG92ZXJoZWFkIHRvIHJlZGVmaW5lIHRoZW0gYXMgbWV0aG9kcyBvZiB3cmFwcGVkIHZhbHVlIGlzIHNsaWdodGx5IGhpZ2hlciAtIGNoYWluaW5nIGlzIDE1LTI1JSBzbG93ZXIgdGhhbiB1c2luZyBmdW5jdGlvbnMgKHByb3BlcnRpZXMgb2YgXyB0aGF0IHRha2UgdGhlIGZpcnN0IHBhcmFtZXRlcikuXG4gKiBJbiBjYXNlcyB3aGVuIHBlcmZvcm1hbmNlIGlzIGNyaXRpY2FsLCB5b3UgbWF5IHdhbnQgdG8gYXZvaWQgdXNpbmcgY2hhaW5pbmcuXG4gKlxuICogQHBhcmFtIHtBbnl9IHNlbGYgQSB2YWx1ZSB0byBiZSB3cmFwcGVkXG4gKiBAcmV0dXJuIHtQcm90b31cbiAqL1xuZnVuY3Rpb24gUHJvdG8oc2VsZikge1xuICAgIC8vIHdyYXAgcGFzc2VkIHBhcmFtZXRlciBpbiBfIG9iamVjdFxuICAgIHZhciB3cmFwcGVkID0gT2JqZWN0LmNyZWF0ZShQcm90by5wcm90b3R5cGUpO1xuICAgIHdyYXBwZWQuc2VsZiA9IHNlbGY7XG4gICAgcmV0dXJuIHdyYXBwZWQ7XG59O1xuXG52YXIgXyA9IFByb3RvO1xuXG5cbi8vIHN0b3JlIHJhdyBtZXRob2RzIGZyb20gZGlmZmVyZW50IG1vZHVsZXMgaW4gX18gb2JqZWN0IChkb3VibGUgXCJfXCIpXG52YXIgX18gPSB7fTtcblxub2JqZWN0TWV0aG9kcy5leHRlbmQuY2FsbChfXywgb2JqZWN0TWV0aG9kcyk7XG5fXy5leHRlbmQuY2FsbChfXywgcHJvdG90eXBlTWV0aG9kcyk7XG5fXy5leHRlbmQuY2FsbChfXywgYXJyYXlNZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCBzdHJpbmdNZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCBudW1iZXJNZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCBmdW5jdGlvbk1ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIHV0aWxNZXRob2RzKTtcblxuXG4vLyBhZGQgX18gYXMgcHJvcGVydHkgb2YgUHJvdG8sIHNvIHRoZXkgY2FuIGJlIHVzZWQgYXMgbWl4aW5zIGluIG90aGVyIGNsYXNzZXNcbl9fLmRlZmluZVByb3BlcnR5KFByb3RvLCAnX18nLCBfXyk7XG5cblxuLy8gYWRkIF8gbWV0aG9kIHRvIHVud3JhcCB3cmFwcGVkIHZhbHVlIChQcm90byBpbnN0YW5jZSlcbmZ1bmN0aW9uIHVud3JhcFByb3RvKCkgeyByZXR1cm4gdGhpcy5zZWxmOyB9XG5fXy5leHRlbmRQcm90by5jYWxsKFByb3RvLCB7IF86IHVud3JhcFByb3RvIH0pO1xuXG4vLyBhZGQgY29uc3RhbnRzIChmdW5jdGlvbnMgd2lsbCBiZSBvdmVyd3JpdHRlbilcbl9fLmV4dGVuZC5jYWxsKFByb3RvLCBvYmplY3RNZXRob2RzLl9jb25zdGFudHMpO1xuXG4vLyBhZGQgZnVuY3Rpb25zIHRoYXQgdGFrZSBmaXJzdCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiBcInRoaXNcIiB0byBQcm90b1xudmFyIHByb3RvRnVuY3MgPSBfXy5tYXBLZXlzLmNhbGwoX18sIHV0aWxzLm1ha2VQcm90b0Z1bmN0aW9uLCB0cnVlKTtcbl9fLmV4dGVuZC5jYWxsKFByb3RvLCBwcm90b0Z1bmNzKTtcblxuLy8gYWRkIFByb3RvIHdyYXBwZWQgdmFsdWUgaW5zdGFuY2UgbWV0aG9kcyB0byBQcm90byBwcm90b3R5cGVcbnZhciBwcm90b0luc3RhbmNlTWV0aG9kcyA9IF9fLm1hcEtleXMuY2FsbChfXywgdXRpbHMubWFrZVByb3RvSW5zdGFuY2VNZXRob2QsIHRydWUpO1xuX18uZXh0ZW5kUHJvdG8uY2FsbChQcm90bywgcHJvdG9JbnN0YW5jZU1ldGhvZHMpO1xuXG5cbi8qKlxuICogSW4gd2luZG93cyBlbnZpcm9ubWVudCwgYSBnbG9iYWwgYF9gIHZhbHVlIGlzIHByZXNlcnZlZCBpbiBgXy51bmRlcnNjb3JlYFxuICovXG5pZiAodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0Jykge1xuICAgIC8vIHByZXNlcnZlIGV4aXN0aW5nIF8gb2JqZWN0XG4gICAgaWYgKHdpbmRvdy5fKVxuICAgICAgICBQcm90by51bmRlcnNjb3JlID0gd2luZG93Ll9cblxuICAgIC8vIGV4cG9zZSBnbG9iYWwgXyBhbmQgUHJvdG9cbiAgICB3aW5kb3cuXyA9IFByb3RvO1xufVxuXG5pZiAodHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cylcbiAgICAvLyBleHBvcnQgZm9yIG5vZGUvYnJvd3NlcmlmeVxuICAgIG1vZHVsZS5leHBvcnRzID0gUHJvdG87XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfXyA9IHJlcXVpcmUoJy4vcHJvdG9fb2JqZWN0JylcbiAgICAsIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5cbi8qKlxuICogLSBbZmluZF0oI2ZpbmQpXG4gKiAtIFtmaW5kSW5kZXhdKCNmaW5kSW5kZXgpXG4gKiAtIFthcHBlbmRBcnJheV0oI2FwcGVuZEFycmF5KVxuICogLSBbcHJlcGVuZEFycmF5XSgjcHJlcGVuZEFycmF5KVxuICogLSBbc3BsaWNlSXRlbV0oI3NwbGljZUl0ZW0pXG4gKiAtIFt0b0FycmF5XSgjdG9BcnJheSlcbiAqIC0gW29iamVjdF0oI29iamVjdClcbiAqIC0gW21hcFRvT2JqZWN0XSgjbWFwVG9PYmplY3QpXG4gKiAtIFt1bmlxdWVdKCN1bmlxdWUpXG4gKiAtIFtkZWVwRm9yRWFjaF0oI2RlZXBGb3JFYWNoKVxuICpcbiAqIFRoZXNlIG1ldGhvZHMgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sI1Byb3RvKS5cbiAqL1xudmFyIGFycmF5TWV0aG9kcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8vIGZpbmQ6IHNlZSBiZWxvd1xuICAgIC8vIGZpbmRJbmRleDogc2VlIGJlbG93XG4gICAgYXBwZW5kQXJyYXk6IGFwcGVuZEFycmF5LFxuICAgIHByZXBlbmRBcnJheTogcHJlcGVuZEFycmF5LFxuICAgIHRvQXJyYXk6IHRvQXJyYXksXG4gICAgb2JqZWN0OiBvYmplY3QsXG4gICAgbWFwVG9PYmplY3Q6IG1hcFRvT2JqZWN0LFxuICAgIHVuaXF1ZTogdW5pcXVlLFxuICAgIGRlZXBGb3JFYWNoOiBkZWVwRm9yRWFjaCxcbiAgICBzcGxpY2VJdGVtOiBzcGxpY2VJdGVtXG59O1xuXG5cbi8qKlxuICogRnVuY3Rpb25zIHRoYXQgQXJyYXkgW2ltcGxlbWVudHMgbmF0aXZlbHldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3Byb3RvdHlwZSNNZXRob2RzKSBhcmUgYWxzbyBpbmNsdWRlZCBmb3IgY29udmVuaWVuY2UgLSB0aGV5IGNhbiBiZSB1c2VkIHdpdGggYXJyYXktbGlrZSBvYmplY3RzIGFuZCBmb3IgY2hhaW5pbmcgKG5hdGl2ZSBmdW5jdGlvbnMgYXJlIGFsd2F5cyBjYWxsZWQpLlxuICogVGhlc2UgbWV0aG9kcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwjUHJvdG8pIHRvby5cbiAqL1xudmFyIG5hdGl2ZUFycmF5TWV0aG9kc05hbWVzID0gWyAnam9pbicsICdwb3AnLCAncHVzaCcsICdjb25jYXQnLFxuICAgICdyZXZlcnNlJywgJ3NoaWZ0JywgJ3Vuc2hpZnQnLCAnc2xpY2UnLCAnc3BsaWNlJyxcbiAgICAnc29ydCcsICdmaWx0ZXInLCAnZm9yRWFjaCcsICdzb21lJywgJ2V2ZXJ5JyxcbiAgICAnbWFwJywgJ2luZGV4T2YnLCAnbGFzdEluZGV4T2YnLCAncmVkdWNlJywgJ3JlZHVjZVJpZ2h0J107XG5cbnZhciBuYXRpdmVBcnJheU1ldGhvZHMgPSBtYXBUb09iamVjdC5jYWxsKG5hdGl2ZUFycmF5TWV0aG9kc05hbWVzLFxuICAgICAgICBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlW21ldGhvZE5hbWVdO1xuICAgICAgICB9KTtcblxuX18uZXh0ZW5kLmNhbGwoYXJyYXlNZXRob2RzLCBuYXRpdmVBcnJheU1ldGhvZHMpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgRVM2IFtBcnJheSBfX2ZpbmRfXyBtZXRob2RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbmQpIChuYXRpdmUgbWV0aG9kIGlzIHVzZWQgaWYgYXZhaWxhYmxlKS5cbiAqIFJldHVybnMgYXJyYXkgZWxlbWVudCB0aGF0IHBhc3NlcyBjYWxsYmFjayB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgYXJyYXkgdG8gc2VhcmNoIGluXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGB0cnVlYCBmb3IgaXRlbSB0byBwYXNzIHRoZSB0ZXN0LCBwYXNzZWQgYHZhbHVlYCwgYGluZGV4YCBhbmQgYHNlbGZgIGFzIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIG9wdGlvbmFsIGNvbnRleHQgKGB0aGlzYCkgb2YgY2FsbGJhY2sgY2FsbFxuICogQHJldHVybiB7QW55fVxuICovXG5hcnJheU1ldGhvZHMuZmluZCA9IEFycmF5LnByb3RvdHlwZS5maW5kXG4gICAgfHwgdXRpbHMubWFrZUZpbmRNZXRob2QoYXJyYXlNZXRob2RzLmZvckVhY2gsICd2YWx1ZScpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgRVM2IFtBcnJheSBfX2ZpbmRJbmRleF9fIG1ldGhvZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmluZEluZGV4KSAobmF0aXZlIG1ldGhvZCBpcyB1c2VkIGlmIGF2YWlsYWJsZSkuXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBhcnJheSBlbGVtZW50IHRoYXQgcGFzc2VzIGNhbGxiYWNrIHRlc3QuIFJldHVybnMgYC0xYCBpZiBub3QgZm91bmQuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBhcnJheSB0byBzZWFyY2ggaW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYHRydWVgIGZvciBpdGVtIHRvIHBhc3MgdGhlIHRlc3QsIHBhc3NlZCBgdmFsdWVgLCBgaW5kZXhgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfVxuICovXG5hcnJheU1ldGhvZHMuZmluZEluZGV4ID0gQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleFxuICAgIHx8IHV0aWxzLm1ha2VGaW5kTWV0aG9kKGFycmF5TWV0aG9kcy5mb3JFYWNoLCAnaW5kZXgnKTtcblxuXG4vKipcbiAqIEFwcGVuZHMgYGFycmF5VG9BcHBlbmRgIHRvIHRoZSBlbmQgb2YgYXJyYXkgYHNlbGZgIGluIHBsYWNlIChjYW4gYmUgYW4gaW5zdGFuY2Ugb2YgQXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QpLlxuICogQ2hhbmdlcyB0aGUgdmFsdWUgb2YgYHNlbGZgIChpdCB1c2VzIGBBcnJheS5wcm90b3R5cGUuc3BsaWNlYCkgYW5kIHJldHVybnMgYHNlbGZgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgQW4gYXJyYXkgdGhhdCB3aWxsIGJlIG1vZGlmaWVkXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5LWxpa2V9IGFycmF5VG9BcHBlbmQgQW4gYXJyYXkgdGhhdCB3aWxsIGJlIGFwcGVuZGVkXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gYXBwZW5kQXJyYXkoYXJyYXlUb0FwcGVuZCkge1xuICAgIGlmICghIGFycmF5VG9BcHBlbmQubGVuZ3RoKSByZXR1cm4gdGhpcztcbiAgICBpZiAoISBBcnJheS5pc0FycmF5KGFycmF5VG9BcHBlbmQpKVxuICAgICAgICBhcnJheVRvQXBwZW5kID0gdG9BcnJheS5jYWxsKGFycmF5VG9BcHBlbmQpO1xuICAgIFxuICAgIHZhciBhcmdzID0gW3RoaXMubGVuZ3RoLCAwXS5jb25jYXQoYXJyYXlUb0FwcGVuZCk7XG4gICAgYXJyYXlNZXRob2RzLnNwbGljZS5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogUHJlcGVuZHMgYGFycmF5VG9QcmVwZW5kYCB0byB0aGUgYmVnaW5uaWcgb2YgYXJyYXkgYHNlbGZgIGluIHBsYWNlIChjYW4gYmUgYW4gaW5zdGFuY2Ugb2YgQXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QpLlxuICogQ2hhbmdlcyB0aGUgdmFsdWUgb2YgYHNlbGZgIChpdCB1c2VzIGBBcnJheS5wcm90b3R5cGUuc3BsaWNlYCkgYW5kIHJldHVybnMgYHNlbGZgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgQW4gYXJyYXkgdGhhdCB3aWxsIGJlIG1vZGlmaWVkXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5LWxpa2V9IGFycmF5VG9BcHBlbmQgQW4gYXJyYXkgdGhhdCB3aWxsIGJlIHByZXBlbmRlZFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHByZXBlbmRBcnJheShhcnJheVRvUHJlcGVuZCkge1xuICAgIGlmICghIGFycmF5VG9QcmVwZW5kLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG4gICAgaWYgKCEgQXJyYXkuaXNBcnJheShhcnJheVRvUHJlcGVuZCkpXG4gICAgICAgIGFycmF5VG9QcmVwZW5kID0gdG9BcnJheS5jYWxsKGFycmF5VG9QcmVwZW5kKTtcblxuICAgIHZhciBhcmdzID0gWzAsIDBdLmNvbmNhdChhcnJheVRvUHJlcGVuZCk7XG4gICAgYXJyYXlNZXRob2RzLnNwbGljZS5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBpdGVtIGZyb20gYXJyYXkgdGhhdCBpcyBmb3VuZCB1c2luZyBpbmRleE9mIChpLmUuICc9PT0nKVxuICogTW9kaWZpZXMgb3JpZ2luYWwgYXJyYXkgYW5kIHJldHVybnMgdGhlIHJlZmVyZW5jZSB0byBpdC5cbiAqIFxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBBbiBhcnJheSB0aGF0IHdpbGwgYmUgbW9kaWZpZWRcbiAqIEBwYXJhbSAge0FueX0gaXRlbSBpdGVtIHRvIGJlIHJlbW92ZWRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBzcGxpY2VJdGVtKGl0ZW0pIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4ID49IDApIHRoaXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGNyZWF0ZWQgZnJvbSBhcnJheS1saWtlIG9iamVjdCAoZS5nLiwgYGFyZ3VtZW50c2AgcHNldWRvLWFycmF5KS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5LWxpa2V9IHNlbGYgT2JqZWN0IHdpdGggbnVtZXJpYyBwcm9wZXJ0eSBsZW5ndGhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiB0b0FycmF5KCkge1xuICAgIHJldHVybiBhcnJheU1ldGhvZHMuc2xpY2UuY2FsbCh0aGlzKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgYXJyYXkgb2YgYGtleXNgIGFuZCBvcHRpb25hbCBhcnJheSBvZiBgdmFsdWVzYC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIEFycmF5IG9mIGtleXNcbiAqIEBwYXJhbSB7QXJyYXl8YW55fSB2YWx1ZXMgT3B0aW9uYWwgYXJyYXkgb2YgdmFsdWVzIG9yIHRoZSB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBlYWNoIHByb3BlcnR5LlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBvYmplY3QodmFsdWVzKSB7XG4gICAgdmFyIG9iaiA9IHt9XG4gICAgICAgICwgdmFsdWVzSXNBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWVzKTtcbiAgICBhcnJheU1ldGhvZHMuZm9yRWFjaC5jYWxsKHRoaXMsIGZ1bmN0aW9uKGtleSwgaW5kZXgpIHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZXNJc0FycmF5ID8gdmFsdWVzW2luZGV4XSA6IHZhbHVlcztcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG59XG5cblxuLyoqXG4gKiBNYXBzIGFycmF5IHRvIG9iamVjdC5cbiAqIEFycmF5IGVsZW1lbnRzIGJlY29tZSBrZXlzLCB2YWx1ZSBhcmUgdGFrZW4gZnJvbSBgY2FsbGJhY2tgLlxuICogXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIEFuIGFycmF5IHdoaWNoIHZhbHVlcyB3aWxsIGJlY29tZSBrZXlzIG9mIHRoZSByZXN1bHRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGlzIHBhc3NlZCBgdmFsdWVgLCBgaW5kZXhgIGFuZCBgc2VsZmAgYW5kIHNob3VsZCByZXR1cm4gdmFsdWUgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbWFwVG9PYmplY3QoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0aGlzLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXSA9IGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWUsIGluZGV4LCB0aGlzKTtcbiAgICB9LCB0aGlzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhcnJheSB3aXRob3V0IGR1cGxpY2F0ZXMuIERvZXMgbm90IG1vZGlmeSBvcmlnaW5hbCBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIG9yaWdpbmFsIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjb21wYXJpc29uIGZ1bmN0aW9uLCBzaG91bGQgcmV0dXJuIHRydWUgZm9yIGVxdWFsIGl0ZW1zLCBcIj09PVwiIGlzIHVzZWQgaWYgbm90IHBhc3NlZC5cbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiB1bmlxdWUoY2FsbGJhY2spIHtcbiAgICB2YXIgZmlsdGVyZWQgPSBbXTtcbiAgICBpZiAoISBjYWxsYmFjaylcbiAgICAgICAgaXRlbUluZGV4ID0gaXRlbUluZGV4T2Y7XG5cbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpdGVtSW5kZXgoaXRlbSk7XG4gICAgICAgIGlmIChpbmRleCA9PSAtMSlcbiAgICAgICAgICAgIGZpbHRlcmVkLnB1c2goaXRlbSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG5cblxuICAgIGZ1bmN0aW9uIGl0ZW1JbmRleChpdGVtKSB7XG4gICAgICAgIHJldHVybiBhcnJheU1ldGhvZHMuZmluZEluZGV4LmNhbGwoZmlsdGVyZWQsIGZ1bmN0aW9uKGl0KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soaXRlbSwgaXQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpdGVtSW5kZXhPZihpdGVtKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZC5pbmRleE9mKGl0ZW0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEl0ZXJhdGVzIGFycmF5IGFuZCBlbGVtZW50cyB0aGF0IGFyZSBhcnJheXMgY2FsbGluZyBjYWxsYmFjayB3aXRoIGVhY2ggZWxlbWVudCB0aGF0IGlzIG5vdCBhbiBhcnJheS4gQ2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIGFyZ3VtZW50cyBsaXN0IHRvIGF2b2lkIGNoZWNraW5nIHdoZXRoZXIgYXJyYXkgb3IgbGlzdCBvZiBwYXJhbWV0ZXJzIGlzIHBhc3NlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5LWxpa2V9IHNlbGYgYXJyYXkgb2YgZWxlbWVudHMgYW5kIGFycmF5c3RvIGl0ZXJhdGUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsZWQgZm9yIGVhY2ggaXRlbSB0aGF0IGlzIG5vdCBhbiBhcnJheS4gQ2FsbGJhY2sgaXMgcGFzc2VkIGl0ZW0sIGluZGV4IGFuZCBvcmlnaW5hbCBhcnJheSBhcyBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtBbnl9IHRoaXNBcmcgb3B0aW9uYWwgY2FsbGJhY2sgZW52b2NhdGlvbiBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGRlZXBGb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgdmFyIGluZGV4ID0gMCwgYXJyID0gdGhpcztcbiAgICBfZGVlcEZvckVhY2guY2FsbCh0aGlzKTtcblxuICAgIGZ1bmN0aW9uIF9kZWVwRm9yRWFjaCgpIHtcbiAgICAgICAgYXJyYXlNZXRob2RzLmZvckVhY2guY2FsbCh0aGlzLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICAgICAgICAgIF9kZWVwRm9yRWFjaC5jYWxsKHZhbHVlKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrLCBhcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1ha2VQcm90b0Z1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscycpLm1ha2VQcm90b0Z1bmN0aW9uXG4gICAgLCByZXBlYXQgPSByZXF1aXJlKCcuL3Byb3RvX3V0aWwnKS5yZXBlYXQ7XG5cblxuLyoqXG4gKiAtIFttYWtlRnVuY3Rpb25dKCNtYWtlRnVuY3Rpb24pXG4gKiAtIFtwYXJ0aWFsXSgjcGFydGlhbClcbiAqIC0gW3BhcnRpYWxSaWdodF0oI3BhcnRpYWxSaWdodClcbiAqIC0gW21lbW9pemVdKCNtZW1vaXplKVxuICogLSBbZGVsYXldKCNkZWxheSlcbiAqIC0gW2RlZmVyXSgjZGVmZXIpXG4gKiAtIFtkZWxheWVkXSgjZGVsYXllZClcbiAqIC0gW2RlZmVycmVkXSgjZGVmZXJyZWQpXG4gKiAtIFtkZWZlclRpY2tzXSgjZGVmZXJUaWNrcylcbiAqIC0gW2RlbGF5TWV0aG9kXSgjZGVsYXlNZXRob2QpXG4gKiAtIFtkZWZlck1ldGhvZF0oI2RlZmVyTWV0aG9kKVxuICogLSBbZGVib3VuY2VdKCNkZWJvdW5jZSlcbiAqIC0gW3Rocm90dGxlXSgjdGhyb3R0bGUpXG4gKiAtIFtvbmNlXSgjb25jZSlcbiAqIC0gW3dhaXRGb3JdKCN3YWl0Rm9yKVxuICogLSBbbm90XSgjbm90KVxuICpcbiAqIFRoZXNlIG1ldGhvZHMgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sI1Byb3RvKVxuICovXG52YXIgZnVuY3Rpb25NZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbWFrZUZ1bmN0aW9uOiBtYWtlRnVuY3Rpb24sXG4gICAgcGFydGlhbDogcGFydGlhbCxcbiAgICBwYXJ0aWFsUmlnaHQ6IHBhcnRpYWxSaWdodCxcbiAgICBtZW1vaXplOiBtZW1vaXplLFxuICAgIGRlbGF5OiBkZWxheSxcbiAgICBkZWZlcjogZGVmZXIsXG4gICAgZGVsYXllZDogZGVsYXllZCxcbiAgICBkZWZlcnJlZDogZGVmZXJyZWQsXG4gICAgZGVmZXJUaWNrczogZGVmZXJUaWNrcyxcbiAgICBkZWxheU1ldGhvZDogZGVsYXlNZXRob2QsXG4gICAgZGVmZXJNZXRob2Q6IGRlZmVyTWV0aG9kLFxuICAgIGRlYm91bmNlOiBkZWJvdW5jZSxcbiAgICB0aHJvdHRsZTogdGhyb3R0bGUsXG4gICAgb25jZTogb25jZSxcbiAgICB3YWl0Rm9yOiB3YWl0Rm9yLFxuICAgIG5vdDogbm90XG59O1xuXG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuXG4vKipcbiAqIFNpbWlsYXJseSB0byBGdW5jdGlvbiBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgZnVuY3Rpb24gZnJvbSBjb2RlLlxuICogVW5saWtlIEZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYSBmdW5jdGlvbiBuYW1lXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbmV3IGZ1bmN0aW9uIG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBhcmcxLCBhcmcyLCAuLi4gdGhlIG5hbWVzIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBmdW5jQm9keSBmdW5jdGlvbiBib2R5XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbWFrZUZ1bmN0aW9uKGFyZzEsIGFyZzIsIGZ1bmNCb2R5KSB7XG4gICAgdmFyIG5hbWUgPSB0aGlzXG4gICAgICAgICwgY291bnQgPSBhcmd1bWVudHMubGVuZ3RoIC0gMVxuICAgICAgICAsIGZ1bmNCb2R5ID0gYXJndW1lbnRzW2NvdW50XVxuICAgICAgICAsIGZ1bmNcbiAgICAgICAgLCBjb2RlID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKVxuICAgICAgICBjb2RlICs9ICcsICcgKyBhcmd1bWVudHNbaV07XG4gICAgY29kZSA9IFsnZnVuYyA9IGZ1bmN0aW9uICcsIG5hbWUsICcoJywgY29kZS5zbGljZSgyKSwgJykge1xcbidcbiAgICAgICAgICAgICAgICAsIGZ1bmNCb2R5LCAnXFxufSddLmpvaW4oJycpO1xuICAgIGV2YWwoY29kZSk7XG4gICAgcmV0dXJuIGZ1bmM7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gYXMgYSByZXN1bHQgb2YgcGFydGlhbCBmdW5jdGlvbiBhcHBsaWNhdGlvbiB3aXRoIHRoZSBwYXNzZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIEZ1bmN0aW9uIHRvIGJlIGFwcGxpZWRcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIEFyZ3VtZW50cyBhZnRlciBzZWxmIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBjYWxsIHdoZW4gdGhlIHBhcnRpYWwgZnVuY3Rpb24gaXMgY2FsbGVkLlxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHBhcnRpYWwoKSB7IC8vICwgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBmdW5jID0gdGhpcztcbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gYXMgYSByZXN1bHQgb2YgcGFydGlhbCBmdW5jdGlvbiBhcHBsaWNhdGlvbiB3aXRoIHRoZSBwYXNzZWQgcGFyYW1ldGVycywgYnV0IHBhcmFtZXRlcnMgYXJlIGFwcGVuZGVkIG9uIHRoZSByaWdodC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIEZ1bmN0aW9uIHRvIGJlIGFwcGxpZWRcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIEFyZ3VtZW50cyBhZnRlciBzZWxmIHdpbGwgYmUgYXBwZW5kZWQgb24gdGhlIHJpZ2h0IHRvIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBjYWxsIHdoZW4gdGhlIHBhcnRpYWwgZnVuY3Rpb24gaXMgY2FsbGVkLlxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHBhcnRpYWxSaWdodCgpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGZ1bmMgPSB0aGlzO1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMpLmNvbmNhdChhcmdzKSk7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiB1c2luZyBzdXBwbGllZCBoYXNoIGZ1bmN0aW9uIGFzIGtleS4gSWYgdGhlIGhhc2ggaXMgbm90IHN1cHBsaWVkLCB1c2VzIGl0cyBmaXJzdCBwYXJhbWV0ZXIgYXMgdGhlIGhhc2guXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdG8gYmUgbWVtb2l6ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhc2hGdW5jIG9wdGlvbmFsIGhhc2ggZnVuY3Rpb24gdGhhdCBpcyBwYXNzZWQgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBhbmQgc2hvdWxkIHJldHVybiBjYWNoZSBrZXkuXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGxpbWl0IG9wdGlvbmFsIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gYmUgc3RvcmVkIGluIHRoZSBjYWNoZS4gMTAwMCBieSBkZWZhdWx0LlxuICogQHJldHVybiB7RnVuY3Rpb259IG1lbW9pemVkIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIG1lbW9pemUoaGFzaEZ1bmMsIGxpbWl0KSB7XG4gICAgdmFyIGZ1bmMgPSB0aGlzO1xuICAgIHZhciBjYWNoZSA9IHt9LCBrZXlzTGlzdCA9IFtdO1xuICAgIGxpbWl0ID0gbGltaXQgfHwgMTAwMDtcblxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGtleSA9IGhhc2hGdW5jID8gaGFzaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGFyZ3VtZW50c1swXTtcbiAgICAgICAgaWYgKGNhY2hlLmhhc093blByb3BlcnR5KGtleSkpXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVba2V5XTtcblxuICAgICAgICB2YXIgcmVzdWx0ID0gY2FjaGVba2V5XSA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAga2V5c0xpc3QucHVzaChrZXkpO1xuXG4gICAgICAgIGlmIChrZXlzTGlzdC5sZW5ndGggPiBsaW1pdClcbiAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtrZXlzTGlzdC5zaGlmdCgpXTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBEZWxheXMgZnVuY3Rpb24gZXhlY3V0aW9uIGJ5IGEgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMuXG4gKiBUaGUgY29udGV4dCBpbiBmdW5jdGlvbiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGlzIHNldCB0byBgbnVsbGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0aGF0IGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVsYXllZFxuICogQHBhcmFtIHtOdW1iZXJ9IHdhaXQgYXBwcm94aW1hdGUgZGFsYXkgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIG9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBkZWxheSh3YWl0KSB7IC8vICwgYXJndW1lbnRzXG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgcmV0dXJuIF9kZWxheSh0aGlzLCB3YWl0LCBhcmdzKTtcbn1cbiBcblxuLyoqXG4gKiBEZWZlcnMgZnVuY3Rpb24gZXhlY3V0aW9uIChleGVjdXRlcyBhcyBzb29uIGFzIGV4ZWN1dGlvbiBsb29wIGJlY29tZXMgZnJlZSlcbiAqIFRoZSBjb250ZXh0IGluIGZ1bmN0aW9uIHdoZW4gaXQgaXMgZXhlY3V0ZWQgaXMgc2V0IHRvIGBudWxsYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRoYXQgZXhlY3V0aW9uIGhhcyB0byBiZSBkZWxheWVkXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZGVmZXIoKSB7IC8vICwgYXJndW1lbnRzXG4gICAgcmV0dXJuIF9kZWxheSh0aGlzLCAxLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfZGVsYXkoZnVuYywgd2FpdCwgYXJncywgY29udGV4dCkge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmMuYXBwbHkuYmluZChmdW5jLCBjb250ZXh0IHx8IG51bGwsIGFyZ3MpLCB3YWl0KTtcbn1cblxuLyoqXG4gKiBTYW1lIGFzIF8uZGVmZXIsIHRha2VzIGZpcnN0IGFyZ3VtZW50IGFzIHRoZSBmdW5jdGlvbiB0byBiZSBkZWZlcnJlZFxuICovXG52YXIgZGVmZXJGdW5jID0gbWFrZVByb3RvRnVuY3Rpb24oZGVmZXIpO1xuXG4vKipcbiAqIERlZmVycyBmdW5jdGlvbiBleGVjdXRpb24gZm9yIGB0aW1lc2AgdGlja3MgKGV4ZWN1dGVzIGFmdGVyIGV4ZWN1dGlvbiBsb29wIGJlY29tZXMgZnJlZSBgdGltZXNgIHRpbWVzKVxuICogVGhlIGNvbnRleHQgaW4gZnVuY3Rpb24gd2hlbiBpdCBpcyBleGVjdXRlZCBpcyBzZXQgdG8gYG51bGxgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdGhhdCBleGVjdXRpb24gaGFzIHRvIGJlIGRlbGF5ZWRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gdGlja3MgbnVtYmVyIG9mIHRpbWVzIHRvIGRlZmVyIGV4ZWN1dGlvblxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGRlZmVyVGlja3ModGlja3MpIHsgLy8gLCBhcmd1bWVudHNcbiAgICBpZiAodGlja3MgPCAyKSByZXR1cm4gZGVmZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB2YXIgYXJncyA9IHJlcGVhdC5jYWxsKGRlZmVyRnVuYywgdGlja3MgLSAxKTtcbiAgICBhcmdzID0gYXJncy5jb25jYXQodGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsgXG4gICAgcmV0dXJuIGRlZmVyRnVuYy5hcHBseShudWxsLCBhcmdzKTtcbn1cblxuXG4vKipcbiAqIFdvcmtzIGxpa2UgXy5kZWxheSBidXQgYWxsb3dzIHRvIGRlZmVyIG1ldGhvZCBjYWxsIG9mIGBzZWxmYCB3aGljaCB3aWxsIGJlIHRoZSBmaXJzdCBfLmRlbGF5TWV0aG9kIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIG9iamVjdCB0byBkZWxheSBtZXRob2QgY2FsbCBvZlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGZ1bmNPck1ldGhvZE5hbWUgZnVuY3Rpb24gb3IgbmFtZSBvZiBtZXRob2RcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IGFwcHJveGltYXRlIGRhbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhcmd1bWVudHMgdG8gcGFzcyB0byBtZXRob2RcbiAqL1xuZnVuY3Rpb24gZGVsYXlNZXRob2QoZnVuY09yTWV0aG9kTmFtZSwgd2FpdCkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICByZXR1cm4gX2RlbGF5TWV0aG9kKHRoaXMsIGZ1bmNPck1ldGhvZE5hbWUsIHdhaXQsIGFyZ3MpO1xufVxuXG5cbi8qKlxuICogV29ya3MgbGlrZSBfLmRlZmVyIGJ1dCBhbGxvd3MgdG8gZGVmZXIgbWV0aG9kIGNhbGwgb2YgYHNlbGZgIHdoaWNoIHdpbGwgYmUgdGhlIGZpcnN0IF8uZGVmZXJNZXRob2QgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIGRlZmVyIG1ldGhvZCBjYWxsIG9mXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gZnVuY09yTWV0aG9kTmFtZSBmdW5jdGlvbiBvciBuYW1lIG9mIG1ldGhvZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYXJndW1lbnRzIHRvIHBhc3MgdG8gbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIGRlZmVyTWV0aG9kKGZ1bmNPck1ldGhvZE5hbWUpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgcmV0dXJuIF9kZWxheU1ldGhvZCh0aGlzLCBmdW5jT3JNZXRob2ROYW1lLCAxLCBhcmdzKTtcbn1cblxuZnVuY3Rpb24gX2RlbGF5TWV0aG9kKG9iamVjdCwgZnVuY09yTWV0aG9kTmFtZSwgd2FpdCwgYXJncykge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZnVuYyA9IHR5cGVvZiBmdW5jT3JNZXRob2ROYW1lID09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gb2JqZWN0W2Z1bmNPck1ldGhvZE5hbWVdXG4gICAgICAgICAgICAgICAgICAgIDogZnVuY09yTWV0aG9kTmFtZTtcbiAgICAgICAgZnVuYy5hcHBseShvYmplY3QsIGFyZ3MpO1xuICAgIH0sIHdhaXQpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBmdW5jdGlvbiB0aGF0IHdpbGwgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gYHdhaXRgIG1zIGFmdGVyIGl0IGhhcyBiZWVuIGNhbGxlZFxuICogVGhlIGNvbnRleHQgaW4gZnVuY3Rpb24gd2hlbiBpdCBpcyBleGVjdXRlZCBpcyBzZXQgdG8gYG51bGxgLlxuICogQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGRlbGF5ZWQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB3aGljaCBleGVjdXRpb24gaGFzIHRvIGJlIGRlZmVycmVkXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdCBhcHByb3hpbWF0ZSBkYWxheSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gZGVsYXllZCh3YWl0KSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGZ1bmMgPSB0aGlzXG4gICAgICAgICwgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IC8vIC4uLiBhcmd1bWVudHNcbiAgICAgICAgdmFyIHBhc3NBcmdzID0gYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICAgICAgcmV0dXJuIF9kZWxheShmdW5jLCB3YWl0LCBwYXNzQXJncywgdGhpcyk7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgZnVuY3Rpb24gdGhhdCB3aWxsIGV4ZWN1dGUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIG9uIHRoZSBuZXh0IHRpY2sgb25jZSBpdCBoYXMgYmVlbiBjYWxsZWRcbiAqIFRoZSBjb250ZXh0IGluIGZ1bmN0aW9uIHdoZW4gaXQgaXMgZXhlY3V0ZWQgaXMgc2V0IHRvIGBudWxsYC5cbiAqIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGFyZSBhcHBlbmRlZCB0byB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBkZWZlcnJlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVmZXJyZWRcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIG9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGRlZmVycmVkKCkgeyAvLywgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBmdW5jID0gdGhpc1xuICAgICAgICAsIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyAvLyAuLi4gYXJndW1lbnRzXG4gICAgICAgIHZhciBwYXNzQXJncyA9IGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgICAgIHJldHVybiBfZGVsYXkoZnVuYywgMSwgcGFzc0FyZ3MsIHRoaXMpO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNhbGwgb3JpZ2luYWwgZnVuY3Rpb24gb25jZSBpdCBoYXMgbm90IGJlZW4gY2FsbGVkIGZvciBhIHNwZWNpZmllZCB0aW1lXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0aGF0IGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVsYXllZFxuICogQHBhcmFtIHtOdW1iZXJ9IHdhaXQgYXBwcm94aW1hdGUgZGFsYXkgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaW1tZWRpYXRlIHRydWUgdG8gaW52b2tlIGZ1bmNpdG9uIGltbWVkaWF0ZWx5IGFuZCB0aGVuIGlnbm9yZSBmb2xsb3dpbmcgY2FsbHMgZm9yIHdhaXQgbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gZGVib3VuY2Uod2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgdmFyIGZ1bmMgPSB0aGlzOyAvLyBmaXJzdCBwYXJhbWV0ZXIgb2YgXy5kZWJvdW5jZVxuICAgIHZhciB0aW1lb3V0LCBhcmdzLCBjb250ZXh0LCB0aW1lc3RhbXAsIHJlc3VsdDtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnRleHQgPSB0aGlzOyAvLyBzdG9yZSBvcmlnaW5hbCBjb250ZXh0XG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIHZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICEgdGltZW91dDtcbiAgICAgICAgaWYgKCEgdGltZW91dClcbiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0KTtcbiAgICAgICAgaWYgKGNhbGxOb3cpXG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgIGZ1bmN0aW9uIGxhdGVyKCkge1xuICAgICAgICAgICAgdmFyIGxhc3QgPSBEYXRlLm5vdygpIC0gdGltZXN0YW1wO1xuICAgICAgICAgICAgaWYgKGxhc3QgPCB3YWl0KVxuICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0IC0gbGFzdCk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoISBpbW1lZGlhdGUpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uLCB0aGF0LCB3aGVuIGludm9rZWQsIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYXQgbW9zdCBvbmNlIGR1cmluZyBhIGdpdmVuIHdpbmRvdyBvZiB0aW1lLiBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRoYXQgZXhlY3V0aW9uIGhhcyB0byBiZSBkZWxheWVkXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdCBhcHByb3hpbWF0ZSBkZWxheSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYHtsZWFkaW5nOiBmYWxzZX1gIHRvIGRpc2FibGUgdGhlIGV4ZWN1dGlvbiBvbiB0aGUgbGVhZGluZyBlZGdlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUod2FpdCwgb3B0aW9ucykge1xuICAgIHZhciBmdW5jID0gdGhpczsgLy8gZmlyc3QgcGFyYW1ldGVyIG9mIF8udGhyb3R0bGVcbiAgICB2YXIgY29udGV4dCwgYXJncywgcmVzdWx0O1xuICAgIHZhciB0aW1lb3V0ID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXMgPSAwO1xuICAgIG9wdGlvbnMgfHwgKG9wdGlvbnMgPSB7fSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoIXByZXZpb3VzICYmIG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UpIHByZXZpb3VzID0gbm93O1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgcHJldmlvdXMgPSBub3c7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aW1lb3V0ICYmIG9wdGlvbnMudHJhaWxpbmcgIT09IGZhbHNlKVxuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHJlbWFpbmluZyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbGF0ZXIoKSB7XG4gICAgICAgIHByZXZpb3VzID0gb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSA/IDAgOiBEYXRlLm5vdygpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDYWxsIHBhc3NlZCBmdW5jdGlvbiBvbmx5IG9uY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBzZWxmXG4gKi9cbmZ1bmN0aW9uIG9uY2UoKSB7XG4gICAgdmFyIGZ1bmMgPSB0aGlzXG4gICAgICAgICwgcmFuID0gZmFsc2VcbiAgICAgICAgLCBtZW1vO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHJhbikgcmV0dXJuIG1lbW87XG4gICAgICAgIHJhbiA9IHRydWU7XG4gICAgICAgIG1lbW8gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGZ1bmMgPSBudWxsO1xuICAgICAgICByZXR1cm4gbWVtbztcbiAgICB9O1xufVxuXG5cbi8qKlxuICogRXhlY3V0ZSBhIGZ1bmN0aW9uIHdoZW4gdGhlIGNvbmRpdGlvbiBmdW5jdGlvbiByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlXG4gKiBpdCBydW5zIHRoZSBjb25kaXRpb24gZnVuY3Rpb24gZXZlcnkgYGNoZWNrSW50ZXJ2YWxgIG1pbGxpc2Vjb25kcyAoZGVmYXVsdCA1MClcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uOiBpZiBpdCByZXR1cm5zIHRydWUgdGhlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBydW5zIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyB0cnVlXG4gKiBAcGFyYW0ge051bWJlcn0gbWF4VGltZW91dCB0aW1lb3V0IGJlZm9yZSBnaXZpbmcgdXAgKHRpbWUgaW4gbWlsbGlzZWNvbmRzKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGltZWRPdXRGdW5jIGEgZnVuY3Rpb24gY2FsbGVkIGlmIHRpbWVvdXQgaXMgcmVhY2hlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGNoZWNrSW50ZXJ2YWwgdGltZSBpbnRlcnZhbCB3aGVuIHlvdSBydW4gdGhlIGNvbmRpdGlvbiBmdW5jdGlvbiAodGltZSBpbiBtaWxsaXNlY29uZHMpLCBkZWZhdWx0IDUwIG1zXG4gKi9cbmZ1bmN0aW9uIHdhaXRGb3IoY2FsbGJhY2ssIG1heFRpbWVvdXQsIHRpbWVkT3V0RnVuYywgY2hlY2tJbnRlcnZhbCl7XG4gICAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICB2YXIgY29uZGl0aW9uID0gdGhpcztcbiAgICBjaGVja0ludGVydmFsID0gY2hlY2tJbnRlcnZhbCB8fCA1MDtcbiAgICB2YXIgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh0ZXN0Q29uZGl0aW9uLCBjaGVja0ludGVydmFsKTtcblxuICAgIGZ1bmN0aW9uIHRlc3RDb25kaXRpb24oKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24oKSkgY2FsbGJhY2soKTtcbiAgICAgICAgZWxzZSBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID49IG1heFRpbWVvdXQpXG4gICAgICAgICAgICB0aW1lZE91dEZ1bmMgJiYgdGltZWRPdXRGdW5jKCk7XG4gICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogcmV0dXJucyB0aGUgZnVuY3Rpb24gdGhhdCBuZWdhdGVzICghIG9wZXJhdG9yKSB0aGUgcmVzdWx0IG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0byBuZWdhdGVcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBub3QoKSB7XG4gICAgdmFyIGZ1bmMgPSB0aGlzO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICFmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiAtIFtpc051bWVyaWNdKCNpc051bWVyaWMpXG4gKi9cbnZhciBudW1iZXJNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgaXNOdW1lcmljOiBpc051bWVyaWNcbn07XG5cblxuLyoqXG4gKiBGdW5jdGlvbiB0byB0ZXN0IGlmIGEgdmFsdWUgaXMgbnVtZXJpY1xuICpcbiAqIEBwYXJhbSB7QW55fSBzZWxmIHZhbHVlIHRvIGJlIHRlc3RlZFxuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBpdCBpcyBhIG51bWVyaWMgdmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNOdW1lcmljKCkge1xuICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdCh0aGlzKSkgJiYgaXNGaW5pdGUodGhpcyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuXG4vKipcbiAqIC0gW2V4dGVuZF0oI2V4dGVuZClcbiAqIC0gW2Nsb25lXSgjY2xvbmUpXG4gKiAtIFtkZWZpbmVQcm9wZXJ0eV0oI2RlZmluZVByb3BlcnR5KVxuICogLSBbZGVmaW5lUHJvcGVydGllc10oI2RlZmluZVByb3BlcnRpZXMpXG4gKiAtIFtkZWVwRXh0ZW5kXSgjZGVlcEV4dGVuZClcbiAqIC0gW2RlZXBDbG9uZV0oI2RlZXBDbG9uZSlcbiAqIC0gW2tleXNdKCNrZXlzKVxuICogLSBbYWxsS2V5c10oI2FsbEtleXMpXG4gKiAtIFt2YWx1ZXNdKCN2YWx1ZXMpXG4gKiAtIFtrZXlPZl0oI2tleU9mKVxuICogLSBbYWxsS2V5c09mXSgjYWxsS2V5c09mKVxuICogLSBbZWFjaEtleV0oI2VhY2hLZXkpXG4gKiAtIFttYXBLZXlzXSgjbWFwS2V5cylcbiAqIC0gW3JlZHVjZUtleXNdKCNyZWR1Y2VLZXlzKVxuICogLSBbZmlsdGVyS2V5c10oI2ZpbHRlcktleXMpXG4gKiAtIFtzb21lS2V5XSgjc29tZUtleSlcbiAqIC0gW2V2ZXJ5S2V5XSgjZXZlcnlLZXkpXG4gKiAtIFtmaW5kVmFsdWVdKCNmaW5kVmFsdWUpXG4gKiAtIFtmaW5kS2V5XSgjZmluZEtleSlcbiAqIC0gW3BpY2tLZXlzXSgjcGlja0tleXMpXG4gKiAtIFtvbWl0S2V5c10oI29taXRLZXlzKVxuICogLSBbaXNFcXVhbF0oI2lzRXF1YWwpXG4gKiAtIFtpc05vdF0oI2lzTm90KVxuICpcbiAqIEFsbCB0aGVzZSBtZXRob2RzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCNQcm90bylcbiAqL1xudmFyIG9iamVjdE1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBleHRlbmQ6IGV4dGVuZCxcbiAgICBjbG9uZTogY2xvbmUsXG4gICAgZGVmaW5lUHJvcGVydHk6IGRlZmluZVByb3BlcnR5LFxuICAgIGRlZmluZVByb3BlcnRpZXM6IGRlZmluZVByb3BlcnRpZXMsXG4gICAgZGVlcEV4dGVuZDogZGVlcEV4dGVuZCxcbiAgICBkZWVwQ2xvbmU6IGRlZXBDbG9uZSxcbiAgICBrZXlzOiBrZXlzLFxuICAgIGFsbEtleXM6IGFsbEtleXMsXG4gICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAga2V5T2Y6IGtleU9mLFxuICAgIGFsbEtleXNPZjogYWxsS2V5c09mLFxuICAgIGVhY2hLZXk6IGVhY2hLZXksXG4gICAgbWFwS2V5czogbWFwS2V5cyxcbiAgICByZWR1Y2VLZXlzOiByZWR1Y2VLZXlzLFxuICAgIGZpbHRlcktleXM6IGZpbHRlcktleXMsXG4gICAgc29tZUtleTogc29tZUtleSxcbiAgICBldmVyeUtleTogZXZlcnlLZXksXG4gICAgcGlja0tleXM6IHBpY2tLZXlzLFxuICAgIG9taXRLZXlzOiBvbWl0S2V5cyxcbiAgICBpc0VxdWFsOiBpc0VxdWFsLFxuICAgIGlzTm90OiBpc05vdFxufTtcblxuXG4vKipcbiAqICMjIyNQcm9wZXJ0eSBkZXNjcmlwdG9yIGNvbnN0YW50cyMjIyNcbiAqIFRoZSBzdW0gb2YgdGhlc2UgY29uc3RhbnRzIGNhbiBiZSB1c2VkIGFzIGxhc3QgcGFyYW1ldGVyIG9mIGRlZmluZVByb3BlcnR5IGFuZCBkZWZpbmVQcm9wZXJ0aWVzIHRvIGRldGVybWluZSB0eXBlcyBvZiBwcm9wZXJ0aWVzLlxuICovXG52YXIgY29uc3RhbnRzID0ge1xuICAgIEVOVU1FUkFCTEU6IDEsXG4gICAgRU5VTTogMSxcbiAgICBDT05GSUdVUkFCTEU6IDIsXG4gICAgQ09ORjogMixcbiAgICBXUklUQUJMRTogNCxcbiAgICBXUklUOiA0XG59O1xuXG5kZWZpbmVQcm9wZXJ0eS5jYWxsKG9iamVjdE1ldGhvZHMsICdfY29uc3RhbnRzJywgY29uc3RhbnRzKTtcblxuXG4vKipcbiAqIEFuYWxvZ3VlIG9mIEVTNiBbQXJyYXkgX19maW5kX18gbWV0aG9kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maW5kKS5cbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIG9iamVjdCBwcm9wZXJ0eSB0aGF0IHBhc3NlcyBjYWxsYmFjayB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIG9iamVjdCB0byBzZWFyY2ggaW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYHRydWVgIGZvciBpdGVtIHRvIHBhc3MgdGhlIHRlc3QsIHBhc3NlZCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgIGFzIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIG9wdGlvbmFsIGNvbnRleHQgKGB0aGlzYCkgb2YgY2FsbGJhY2sgY2FsbFxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge0FueX1cbiAqL1xub2JqZWN0TWV0aG9kcy5maW5kVmFsdWUgPSB1dGlscy5tYWtlRmluZE1ldGhvZChlYWNoS2V5LCAndmFsdWUnKTtcblxuXG4vKipcbiAqIEFuYWxvZ3VlIG9mIEVTNiBbQXJyYXkgX19maW5kSW5kZXhfXyBtZXRob2RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbmRJbmRleCkuXG4gKiBSZXR1cm5zIHRoZSBrZXkgb2Ygb2JqZWN0IHByb3BlcnR5IHRoYXQgcGFzc2VzIGNhbGxiYWNrIHRlc3QuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kICh1bmxpa2UgYGZpbmRJbmRleGAsIHRoYXQgcmV0dXJucyAtMSBpbiB0aGlzIGNhc2UpLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIG9iamVjdCB0byBzZWFyY2ggaW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYHRydWVgIGZvciBpdGVtIHRvIHBhc3MgdGhlIHRlc3QsIHBhc3NlZCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgIGFzIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIG9wdGlvbmFsIGNvbnRleHQgKGB0aGlzYCkgb2YgY2FsbGJhY2sgY2FsbFxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge0ludGVnZXJ9XG4gKi9cbm9iamVjdE1ldGhvZHMuZmluZEtleSA9IHV0aWxzLm1ha2VGaW5kTWV0aG9kKGVhY2hLZXksICdrZXknKTtcblxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGBzZWxmYCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgYG9iamAgY29weWluZyBhbGwgb3duIHByb3BlcnRpZXMgKG5vdCB0aG9zZSBpbmhlcml0ZWQgdmlhIHByb3RvdHlwZSBjaGFpbiksIGluY2x1ZGluZyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzICh1bmxlc3MgYG9ubHlFbnVtZXJhYmxlYCBpcyB0cnV0aHkpLlxuICogQ3JlYXRlZCBwcm9wZXJ0aWVzIHdpbGwgaGF2ZSB0aGUgc2FtZSBkZXNjcmlwdG9ycyBhcyB0aGUgcHJvcGVydGlzIG9mIGBvYmpgLlxuICogUmV0dXJucyBgc2VsZmAgdG8gYWxsb3cgY2hhaW5pbmcgd2l0aCBvdGhlciBmdW5jdGlvbnMuXG4gKiBDYW4gYmUgdXNlZCB3aXRoIGZ1bmN0aW9ucywgdG8gY29weSBjbGFzcyBtZXRob2RzLCBlLmcuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIEFuIG9iamVjdCB3aGljaCBwcm9wZXJ0aWVzIHdpbGwgYmUgY29waWVkIHRvIHNlbGZcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgT3B0aW9uYWwgZmxhZyB0byBwcmV2ZW50IGNvcHlpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcywgYGZhbHNlYCBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGV4dGVuZChvYmosIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgdmFyIGRlc2NyaXB0b3JzID0ge307XG5cbiAgICBlYWNoS2V5LmNhbGwob2JqLCBmdW5jdGlvbih2YWx1ZSwgcHJvcCkge1xuICAgICAgICBkZXNjcmlwdG9yc1twcm9wXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcbiAgICB9LCB0aGlzLCBvbmx5RW51bWVyYWJsZSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkZXNjcmlwdG9ycyk7XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIE1ha2VzIGEgc2hhbGxvdyBjbG9uZSBvZiBvYmplY3QgYG9iamAgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhbWUgY2xhc3M7IHRoZSBwcm9wZXJ0aWVzIHdpbGwgaGF2ZSB0aGUgc2FtZSBkZXNjcmlwdG9ycy5cbiAqIFRvIGNsb25lIGFuIGFycmF5IHVzZVxuICogYGBgXG4gKiB2YXIgY2xvbmVkQXJyYXkgPSBbXS5jb25jYXQoYXJyKTtcbiAqIGBgYFxuICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgdG8gY2xvbmUgYW4gYXJyYXksIGJlY2F1c2UgaXQgaXMgaW5lZmZpY2llbnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGJlIGNsb25lZFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBjbG9uZSgpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzKSkgcmV0dXJuIHRoaXMuc2xpY2UoKTtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgRGF0ZSh0aGlzKTtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFJlZ0V4cCkgcmV0dXJuIG5ldyBSZWdFeHAodGhpcyk7XG4gICAgdmFyIGNsb25lZE9iamVjdCA9IE9iamVjdC5jcmVhdGUodGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICAgIGV4dGVuZC5jYWxsKGNsb25lZE9iamVjdCwgdGhpcyk7XG4gICAgcmV0dXJuIGNsb25lZE9iamVjdDtcbn1cblxuXG4vKipcbiAqIFN5bnRheCBzdWdhciB0byBzaG9ydGVuIHVzYWdlIG9mIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgLlxuICogVGhlIHNpbXBsZXN0IHVzYWdlICh0byBhZGQgbm9uLWVudW1lcmFibGUsIG5vbi1jb25maWd1cmFibGUsIG5vbi13cml0YWJsZSBwcm9wZXJ0eSk6XG4gKiBgYGBcbiAqIF8uZGVmaW5lUHJvcGVydHkob2JqLCAna2V5JywgdmFsdWUpO1xuICogYGBgXG4gKlxuICogVG8gZGVmaW5lIHNvbWUgb3RoZXIgcHJvcGVydGllcyB1c2Ugc3VtIG9mIHRoZSBmbGFncyBgXy5FTlVNRVJBQkxFYCAob3IgYF8uRU5VTWApLCBgXy5DT05GSUdVUkFCTEVgIChvciBgXy5DT05GYCkgYW5kIGBfLldSSVRBQkxFYCAob3IgYF8uV1JJVGApOlxuICogYGBgXG4gKiBfLmRlZmluZVByb3BlcnR5KG9iaiwgJ2tleScsIHZhbHVlLCBfLkVOVU0gKyBfLldSSVQpO1xuICogYGBgXG4gKiBSZXR1cm5zIGBzZWxmYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYWRkIGEgcHJvcGVydHkgdG9cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBhZGRlZFxuICogQHBhcmFtIHtBbnl9IHZhbHVlIHRoZSB2YWx1ZSBvZiBhZGRlZCBwcm9wZXJ0eVxuICogQHBhcmFtIHtJbnRlZ2VyfSBkZWNyaXB0b3JGbGFncyBiaXQgbWFzayBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9yIHByb3BlcnRpZXMgY29tcG9zZWQgZnJvbSBgXy5FTlVNRVJBQkxFYCAob3IgYF8uRU5VTWApLCBgXy5DT05GSUdVUkFCTEVgIChvciBgXy5DT05GYCkgYW5kIGBfLldSSVRBQkxFYCAob3IgYF8uV1JJVGApXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUsIGRlY3JpcHRvckZsYWdzKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5TmFtZSxcbiAgICAgICAgX2dldERlc2NyaXB0b3IodmFsdWUsIGRlY3JpcHRvckZsYWdzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuZnVuY3Rpb24gX2dldERlc2NyaXB0b3IodmFsdWUsIGRlY3JpcHRvckZsYWdzKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSB7IHZhbHVlOiB2YWx1ZSB9O1xuICAgIGlmIChkZWNyaXB0b3JGbGFncylcbiAgICAgICAgZXh0ZW5kLmNhbGwoZGVzY3JpcHRvciwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogISEgKGRlY3JpcHRvckZsYWdzICYgY29uc3RhbnRzLkVOVU1FUkFCTEUpLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhISAoZGVjcmlwdG9yRmxhZ3MgJiBjb25zdGFudHMuQ09ORklHVVJBQkxFKSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiAhISAoZGVjcmlwdG9yRmxhZ3MgJiBjb25zdGFudHMuV1JJVEFCTEUpXG4gICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG59XG5cblxuLyoqXG4gKiBTeW50YXggc3VnYXIgdG8gc2hvcnRlbiB1c2FnZSBvZiBgT2JqZWN0LmRlZmluZVByb3BlcnRpZXNgLlxuICogVGhlIHNpbXBsZXN0IHVzYWdlICh0byBhZGQgbm9uLWVudW1lcmFibGUsIG5vbi1jb25maWd1cmFibGUsIG5vbi13cml0YWJsZSBwcm9wZXJ0aWVzKTpcbiAqIGBgYFxuICogXy5kZWZpbmVQcm9wZXJ0aWVzKG9iaiwge1xuICogICAgIGtleTE6IHZhbHVlMSxcbiAqICAgICBrZXkyOiB2YWx1ZTJcbiAqIH0pO1xuICogYGBgXG4gKiBUbyBkZWZpbmUgc29tZSBvdGhlciBwcm9wZXJ0aWVzIHVzZSBzdW0gb2YgdGhlIGZsYWdzIGBfLkVOVU1FUkFCTEVgIChvciBgXy5FTlVNYCksIGBfLkNPTkZJR1VSQUJMRWAgKG9yIGBfLkNPTkZgKSBhbmQgYF8uV1JJVEFCTEVgIChvciBgXy5XUklUYCk6XG4gKiBgYGBcbiAqIF8uZGVmaW5lUHJvcGVydGllcyhvYmosIHtcbiAqICAgICBrZXkxOiB2YWx1ZTEsXG4gKiAgICAga2V5MjogdmFsdWUyXG4gKiB9LCBfLkVOVU0gKyBfLldSSVQpO1xuICogYGBgXG4gKiBSZXR1cm5zIGBzZWxmYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYWRkIGEgcHJvcGVydHkgdG9cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0eVZhbHVlcyBBIG1hcCBvZiBrZXlzIGFuZCB2YWx1ZXMgb2YgcHJvcGVydGllcyB0aGF0d2lsbCBiZSBhZGRlZC4gVGhlIGRlc2NyaXB0b3JzIG9mIHByb3BlcnRpZXMgd2lsbCBiZSBkZWZpbmVkIGJ5IHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7SW50ZWdlcn0gZGVjcmlwdG9yRmxhZ3MgYml0IG1hc2sgb2YgcHJvcGVydHkgZGVzY3JpcHRvciBwcm9wZXJ0aWVzIGNvbXBvc2VkIGZyb20gYF8uRU5VTUVSQUJMRWAgKG9yIGBfLkVOVU1gKSwgYF8uQ09ORklHVVJBQkxFYCAob3IgYF8uQ09ORmApIGFuZCBgXy5XUklUQUJMRWAgKG9yIGBfLldSSVRgKVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHByb3BlcnR5VmFsdWVzLCBkZWNyaXB0b3JGbGFncykge1xuICAgIHZhciBkZXNjcmlwdG9ycyA9IG1hcEtleXMuY2FsbChwcm9wZXJ0eVZhbHVlcywgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9nZXREZXNjcmlwdG9yKHZhbHVlLCBkZWNyaXB0b3JGbGFncyk7XG4gICAgfSwgdHJ1ZSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgZGVzY3JpcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYHNlbGZgIHdpdGggcHJvcGVydGllcyBvZiBgb2JqYCB0byBhbnkgZGVwdGgsIHdpdGhvdXQgb3ZlcndydGl0aW5nIGV4aXN0aW5nIG9iamVjdCBwcm9wZXJ0aWVzIG9mIGBzZWxmYCB3aXRoIG9iamVjdCBwcm9wZXJ0aWVzIG9mIGBvYmpgLlxuICogU2NhbGFyIHByb3BlcnRpZXMgb2YgYG9iamAgd2lsbCBvdmVyd3JpdGUgcHJvcGVydGllcyBvZiBgc2VsZmAuIFNjYWxhciBwb3JwZXJ0aWVzIG9mIGBzZWxmYCB3aWxsIGFsc28gYmUgb3ZlcndyaXR0ZW4uXG4gKiBDb3JyZWN0bHkgd29ya3Mgd2l0aCByZWN1cnNpdmUgb2JqZWN0cy5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiB2YXIgb2JqID0ge1xuICogICAgIGlubmVyOiB7XG4gKiAgICAgICAgIGE6IDFcbiAqICAgICB9XG4gKiB9O1xuICpcbiAqIF8uZGVlcEV4dGVuZChvYmosIHtcbiAqICAgICBpbm5lcjoge1xuICogICAgICAgICBiOiAyXG4gKiAgICAgfVxuICogfSk7XG4gKlxuICogYXNzZXJ0LmRlZXBFcXVhbChvYmosIHtcbiAqICAgICBpbm5lcjoge1xuICogICAgICAgICBhOiAxLFxuICogICAgICAgICBiOiAyXG4gKiAgICAgfVxuICogfSk7IC8vIGFzc2VydCBwYXNzZXNcbiAqIGBgYFxuICogUmV0dXJucyBgc2VsZmAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIEFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgdG8gY29weSB0b1xuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBPcHRpb25hbCBgdHJ1ZWAgdG8gdXNlIG9ubHkgZW51bWVyYWJsZSBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRlZXBFeHRlbmQob2JqLCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHJldHVybiBfZXh0ZW5kVHJlZSh0aGlzLCBvYmosIG9ubHlFbnVtZXJhYmxlLCBbXSk7XG59XG5cblxuZnVuY3Rpb24gX2V4dGVuZFRyZWUoc2VsZk5vZGUsIG9iak5vZGUsIG9ubHlFbnVtZXJhYmxlLCBvYmpUcmF2ZXJzZWQpIHtcbiAgICBpZiAob2JqVHJhdmVyc2VkLmluZGV4T2Yob2JqTm9kZSkgPj0gMCkgcmV0dXJuOyAvLyBub2RlIGFscmVhZHkgdHJhdmVyc2VkLCBvYmogaGFzIHJlY3Vyc2lvblxuXG4gICAgLy8gc3RvcmUgbm9kZSB0byByZWNvZ25pc2UgcmVjdXJzaW9uXG4gICAgb2JqVHJhdmVyc2VkLnB1c2gob2JqTm9kZSk7XG5cbiAgICB2YXIgbG9vcCA9IEFycmF5LmlzQXJyYXkob2JqTm9kZSkgPyBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA6IGVhY2hLZXk7XG5cbiAgICBsb29wLmNhbGwob2JqTm9kZSwgZnVuY3Rpb24odmFsdWUsIHByb3ApIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iak5vZGUsIHByb3ApO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHZhbHVlICE9IG51bGxcbiAgICAgICAgICAgICAgICAmJiAhICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkgJiYgISAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgaWYgKCEgKHNlbGZOb2RlLmhhc093blByb3BlcnR5KHByb3ApXG4gICAgICAgICAgICAgICAgICAgICYmIHR5cGVvZiBzZWxmTm9kZVtwcm9wXSA9PSAnb2JqZWN0JyAmJiBzZWxmTm9kZVtwcm9wXSAhPSBudWxsKSlcbiAgICAgICAgICAgICAgICBzZWxmTm9kZVtwcm9wXSA9IChBcnJheS5pc0FycmF5KHZhbHVlKSkgPyBbXSA6IHt9O1xuICAgICAgICAgICAgX2V4dGVuZFRyZWUoc2VsZk5vZGVbcHJvcF0sIHZhbHVlLCBvbmx5RW51bWVyYWJsZSwgb2JqVHJhdmVyc2VkKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZk5vZGUsIHByb3AsIGRlc2NyaXB0b3IpO1xuICAgIH0sIHRoaXMsIG9ubHlFbnVtZXJhYmxlKTtcblxuICAgIHJldHVybiBzZWxmTm9kZTtcbn1cblxuXG4vKipcbiAqIENsb25lcyBhbGwgb2JqZWN0IHRyZWUuIENsYXNzIG9mIG9yaWdpbmFsIG9iamVjdCBpcyBub3QgcHJlc2VydmVkLiBSZXR1cm5zIGBzZWxmYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBPcHRpb25hbCBgdHJ1ZWAgdG8gdXNlIG9ubHkgZW51bWVyYWJsZSBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRlZXBDbG9uZShvbmx5RW51bWVyYWJsZSkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIG5ldyBEYXRlKHRoaXMpO1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gbmV3IFJlZ0V4cCh0aGlzKTtcbiAgICB2YXIgY2xvbmVkT2JqZWN0ID0gQXJyYXkuaXNBcnJheSh0aGlzKSA/IFtdIDoge307XG4gICAgZGVlcEV4dGVuZC5jYWxsKGNsb25lZE9iamVjdCwgdGhpcywgb25seUVudW1lcmFibGUpO1xuICAgIHJldHVybiBjbG9uZWRPYmplY3Q7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IG9mIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHJldHVybiBrZXlzIG9mXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24ga2V5cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcyk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IG9mIHZhbHVlcyBvZiB0aGUgb2JqZWN0J3Mga2V5c1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIG9iamVjdCB0byByZXR1cm4gdmFsdWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyh0aGlzKVxuICAgICAgICAgICAgICAgIDogYWxsS2V5cy5jYWxsKHRoaXMpO1xuXG4gICAgcmV0dXJuIHByb3BlcnRpZXMubWFwKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbcHJvcF07XG4gICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IG9mIGFsbCBwcm9wZXJ0eSBuYW1lcyBvZiBhbiBvYmplY3QgYHNlbGZgIChpbmNsdWRpbmcgbm9uLWVudW1lcmJhbGUpLlxuICogVG8gZ2V0IG9ubHkgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLCB1c2UgYE9iamVjdC5rZXlzKClgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBnZXQgYWxsIHByb3BlcnRpZXMgb2YuXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuIGZ1bmN0aW9uIGFsbEtleXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpO1xuIH1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIGBpbmRleE9mYCBtZXRob2Qgb2YgQXJyYXkgcHJvdG90eXBlLlxuICogUmV0dXJucyB0aGUgYGtleWAgb2YgYHNlYXJjaEVsZW1lbnRgIGluIHRoZSBvYmplY3QgYHNlbGZgLlxuICogQXMgb2JqZWN0IGtleXMgYXJlIHVuc29ydGVkLCBpZiB0aGVyZSBhcmUgc2V2ZXJhbCBrZXlzIHRoYXQgaG9sZCBgc2VhcmNoRWxlbWVudGAgYW55IG9mIHRoZW0gY2FuIGJlIHJldHVybmVkLiBVc2UgYGFsbEtleXNPZmAgdG8gcmV0dXJuIGFsbCBrZXlzLlxuICogQWxsIG93biBwcm9wZXJ0aWVzIGFyZSBzZWFyY2hlZCAobm90IHRob3NlIGluaGVyaXRlZCB2aWEgcHJvdG90eXBlIGNoYWluKSwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgKHVubGVzcyBgb25seUVudW1lcmFibGVgIGlzIHRydXRoeSkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIHNlYXJjaCBhIHZhbHVlIGluXG4gKiBAcGFyYW0ge0FueX0gc2VhcmNoRWxlbWVudCBBbiBlbGVtZW50IHRoYXQgd2lsbCBiZSBzZWFyY2hlZC4gQW4gZXhhY3QgZXF1YWxpdHkgaXMgdGVzdGVkLCBzbyBgMGAgaXMgbm90IHRoZSBzYW1lIGFzIGAnMCdgLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCB0cnVlIHRvIHNlYXJjaCBhbW9uZyBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24ga2V5T2Yoc2VhcmNoRWxlbWVudCwgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKHNlYXJjaEVsZW1lbnQgPT09IHRoaXNbcHJvcGVydGllc1tpXV0pXG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllc1tpXTtcblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cblxuLyoqXG4gKiBXb3JrcyBzaW1pbGFybHkgdG8gdGhlIHByZXZpb3VzIGZ1bmN0aW9uLCBidXQgcmV0dXJucyB0aGUgYXJyYXkgb2Yga2V5cyBob2xkaW5nIGBzZWFyY2hFbGVtZW50YCBhcyB0aGVpciB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gc2VhcmNoIGEgdmFsdWUgaW5cbiAqIEBwYXJhbSB7QW55fSBzZWFyY2hFbGVtZW50IEFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHNlYXJjaGVkLiBBbiBleGFjdCBlcXVhbGl0eSBpcyB0ZXN0ZWQsIHNvIGAwYCBpcyBub3QgdGhlIHNhbWUgYXMgYCcwJ2AuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIHRydWUgdG8gc2VhcmNoIGFtb25nIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7QXJyYXlbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gYWxsS2V5c09mKHNlYXJjaEVsZW1lbnQsIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBvbmx5RW51bWVyYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhbGxLZXlzLmNhbGwodGhpcyk7XG5cbiAgICB2YXIga2V5cyA9IHByb3BlcnRpZXMuZmlsdGVyKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgcmV0dXJuIHNlYXJjaEVsZW1lbnQgPT09IHRoaXNbcHJvcF07XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4ga2V5cztcbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtmb3JFYWNoXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9mb3JFYWNoKSBtZXRob2Qgb2YgQXJyYXkgcHJvdG90eXBlLlxuICogSXRlcmF0ZXMgYWxsIG93biBwcm9wZXJ0aWVzIG9mIGBzZWxmYCAob3Igb25seSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGlmIGBvbmx5RW51bWVyYWJsZWAgaXMgdHJ1dGh5KSBjYWxsaW5nIGNhbGxiYWNrIGZvciBlYWNoIGtleS5cbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGFycmF5cywgaXQgd2lsbCBpbmNsdWRlIGBsZW5ndGhgIHByb3BlcnR5IGluIGl0ZXJhdGlvbi5cbiAqIFRvIGl0ZXJhdGUgYXJyYXktbGlrZSBvYmplY3RzIChlLmcuLCBgYXJndW1lbnRzYCBwc2V1ZG8tYXJyYXkpIHVzZTpcbiAqIGBgYFxuICogXy5mb3JFYWNoKGFyZ3VtZW50cywgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICogYGBgXG4gKiBGdW5jdGlvbiByZXR1cm5zIGBzZWxmYCB0byBhbGxvdyBbY2hhaW5pbmddKHByb3RvLmpzLmh0bWwpXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBpdGVyYXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAsIGl0cyByZXR1cm4gdmFsdWUgaXMgbm90IHVzZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKi9cbmZ1bmN0aW9uIGVhY2hLZXkoY2FsbGJhY2ssIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBvbmx5RW51bWVyYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhbGxLZXlzLmNhbGwodGhpcyk7XG5cbiAgICBwcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXNbcHJvcF0sIHByb3AsIHRoaXMpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBBbiBhbmFsb2d1ZSBvZiBbbWFwXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9tYXApIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBSZXR1cm5zIHRoZSBvYmplY3QgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBhcHBsaWNhdGlvbiBvZiBjYWxsYmFjayB0byB2YWx1ZXMgaW4gYWxsIG93biBwcm9wZXJ0aWVzIG9mIGBzZWxmYCAob3Igb25seSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGlmIGBvbmx5RW51bWVyYWJsZWAgaXMgdHJ1dGh5KS5cbiAqIFRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgY2xhc3MgYXMgYHNlbGZgLlxuICogUHJvcGVydHkgZGVzY3JpcHRvcnMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGhhdmUgdGhlIHNhbWUgYGVudW1lcmFibGVgLCBgY29uZmlndXJhYmxlYCBhbmQgYHdyaXRhYmxlYCBzZXR0aW5ncyBhcyB0aGUgcHJvcGVydGllcyBvZiBgc2VsZmAuXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBhcnJheXMsIGl0IHdpbGwgaW5jbHVkZSBgbGVuZ3RoYCBwcm9wZXJ0eSBpbiBpdGVyYXRpb24uXG4gKiBUbyBtYXAgYXJyYXktbGlrZSBvYmplY3RzIHVzZTpcbiAqIGBgYFxuICogdmFyIHJlc3VsdCA9IF8ubWFwKGFyZ3VtZW50cywgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBpdGVyYXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAgYW5kIHNob3VsZCByZXR1cm4gdmFsdWUgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBtYXAuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG1hcEtleXMoY2FsbGJhY2ssIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgdmFyIGRlc2NyaXB0b3JzID0ge307XG4gICAgZWFjaEtleS5jYWxsKHRoaXMsIG1hcFByb3BlcnR5LCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGRlc2NyaXB0b3JzKTtcblxuICAgIGZ1bmN0aW9uIG1hcFByb3BlcnR5KHZhbHVlLCBrZXksIHNlbGYpIHtcbiAgICAgICAgZGVzY3JpcHRvcnNba2V5XSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc2VsZiwga2V5KTtcbiAgICAgICAgZGVzY3JpcHRvcnNba2V5XS52YWx1ZSA9IGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZik7XG4gICAgfVxufVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgW3JlZHVjZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvUmVkdWNlKSBtZXRob2Qgb2YgQXJyYXkgcHJvdG90eXBlLlxuICogVGhpcyBtZXRob2QgcmVkdWNlcyB0aGUgb2JqZWN0IHRvIGEgc2luZ2xlIHZhbHVlLiBJdGVyYXRpb24gb3JkZXIgaXMgaW1wb3NzaWJsZSB0byBjb250cm9sIHdpdGggb2JqZWN0LlxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggYXJyYXlzLCBpdCB3aWxsIGluY2x1ZGUgYGxlbmd0aGAgcHJvcGVydHkgaW4gaXRlcmF0aW9uLlxuICogVG8gcmVkdWNlIGFycmF5LWxpa2Ugb2JqZWN0cyB1c2U6XG4gKiBgYGBcbiAqIHZhciByZXN1bHQgPSBfLnJlZHVjZShhcmd1bWVudHMsIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUsIHRoaXNBcmcpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBpdGVyYXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGBwcmV2aW91c1ZhbHVlYCwgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYCBhbmQgc2hvdWxkIHJldHVybiB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgYHByZXZpb3VzVmFsdWVgIGZvciB0aGUgbmV4dCBgY2FsbGJhY2tgIGNhbGwuXG4gKiBAcGFyYW0ge0FueX0gaW5pdGlhbFZhbHVlIFRoZSBpbml0aWFsIHZhbHVlIHBhc3NlZCB0byBjYWxsYmFjayBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIG9uIHRoZSBmaXJzdCBjYWxsLlxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgQW4gb3B0aW9uYWwgY29udGV4dCBvZiBpdGVyYXRpb24gKHRoZSB2YWx1ZW9mIGB0aGlzYCksIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwYXNzZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiByZWR1Y2VLZXlzKGNhbGxiYWNrLCBpbml0aWFsVmFsdWUsIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBvbmx5RW51bWVyYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhbGxLZXlzLmNhbGwodGhpcyk7XG5cbiAgICB2YXIgbWVtbyA9IGluaXRpYWxWYWx1ZTtcblxuICAgIHByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIG1lbW8gPSBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIG1lbW8sIHRoaXNbcHJvcF0sIHByb3AsIHRoaXMpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIG1lbW87XG59XG5cblxuLyoqXG4gKiBBbiBhbmFsb2d1ZSBvZiBbZmlsdGVyXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maWx0ZXIpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0IHdpdGgga2V5cyBmb3Igd2hpY2ggY2FsbGJhY2sgcmV0dXJucyB0cnVlLlxuICogUHJvcGVydHkgZGVzY3JpcHRvcnMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGhhdmUgdGhlIHNhbWUgYGVudW1lcmFibGVgLCBgY29uZmlndXJhYmxlYCBhbmQgYHdyaXRhYmxlYCBzZXR0aW5ncyBhcyB0aGUgcHJvcGVydGllcyBvZiBgc2VsZmAuXG4gKiBUbyBmaWx0ZXIgYXJyYXktbGlrZSBvYmplY3RzIHVzZTpcbiAqIGBgYFxuICogdmFyIHJlc3VsdCA9IF8uZmlsdGVyKGFyZ3VtZW50cywgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBpdGVyYXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAuIElmIGl0IHJldHVybnMgdHJ1dGh5IHZhbHVlLCB0aGUga2V5L3ZhbHVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGZpbHRlcktleXMoY2FsbGJhY2ssIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgdmFyIGRlc2NyaXB0b3JzID0ge307XG4gICAgZWFjaEtleS5jYWxsKHRoaXMsIGZpbHRlclByb3BlcnR5LCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGRlc2NyaXB0b3JzKTs7XG5cbiAgICBmdW5jdGlvbiBmaWx0ZXJQcm9wZXJ0eSh2YWx1ZSwga2V5LCBzZWxmKSB7XG4gICAgICAgIGlmIChjYWxsYmFjay5jYWxsKHRoaXMsIHZhbHVlLCBrZXksIHNlbGYpKVxuICAgICAgICAgICAgZGVzY3JpcHRvcnNba2V5XSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc2VsZiwga2V5KTtcbiAgICB9XG59XG5cblxudmFyIF9wYXNzZWQgPSB7fVxuICAgICwgX2RpZE5vdFBhc3MgPSB7fTtcblxuLyoqXG4gKiBBbiBhbmFsb2d1ZSBvZiBbc29tZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZSkgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYC4gSWYgaXQgcmV0dXJucyB0cnV0aHkgdmFsdWUsIHRoZSBmdW5jdGlvbiBpbW1lYWRpdGVseSByZXR1cm5zIGB0cnVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHNvbWVLZXkoY2FsbGJhY2ssIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgZWFjaEtleS5jYWxsKHRoaXMsIHRlc3RQcm9wZXJ0eSwgdGhpc0FyZywgb25seUVudW1lcmFibGUpO1xuICAgIH0gY2F0Y2ggKHRlc3QpIHtcbiAgICAgICAgaWYgKHRlc3QgPT09IF9wYXNzZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlIHRocm93IHRlc3Q7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIHRlc3RQcm9wZXJ0eSh2YWx1ZSwga2V5LCBzZWxmKSB7XG4gICAgICAgIGlmIChjYWxsYmFjay5jYWxsKHRoaXMsIHZhbHVlLCBrZXksIHNlbGYpKVxuICAgICAgICAgICAgdGhyb3cgX3Bhc3NlZDtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBBbiBhbmFsb2d1ZSBvZiBbZXZlcnldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2V2ZXJ5KSBtZXRob2Qgb2YgQXJyYXkgcHJvdG90eXBlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB3aGljaCBwcm9wZXJ0aWVzIHdpbGwgYmUgaXRlcmF0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGlzIHBhc3NlZCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgLiBJZiBpdCByZXR1cm5zIGZhbHN5IHZhbHVlLCB0aGUgZnVuY3Rpb24gaW1tZWFkaXRlbHkgcmV0dXJucyBgZmFsc2VgLlxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgQW4gb3B0aW9uYWwgY29udGV4dCBvZiBpdGVyYXRpb24gKHRoZSB2YWx1ZW9mIGB0aGlzYCksIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwYXNzZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gZXZlcnlLZXkoY2FsbGJhY2ssIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgZWFjaEtleS5jYWxsKHRoaXMsIHRlc3RQcm9wZXJ0eSwgdGhpc0FyZywgb25seUVudW1lcmFibGUpO1xuICAgIH0gY2F0Y2ggKHRlc3QpIHtcbiAgICAgICAgaWYgKHRlc3QgPT09IF9kaWROb3RQYXNzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGVsc2UgdGhyb3cgdGVzdDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG5cbiAgICBmdW5jdGlvbiB0ZXN0UHJvcGVydHkodmFsdWUsIGtleSwgc2VsZikge1xuICAgICAgICBpZiAoISBjYWxsYmFjay5jYWxsKHRoaXMsIHZhbHVlLCBrZXksIHNlbGYpKVxuICAgICAgICAgICAgdGhyb3cgX2RpZE5vdFBhc3M7XG4gICAgfVxufVxuXG5cbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlXG4gICAgLCBjb25jYXQgPSBBcnJheVByb3RvLmNvbmNhdDtcbi8qKlxuICogUmV0dXJucyBvYmplY3Qgb2YgdGhlIHNhbWUgY2xhc3Mgd2l0aCBvbmx5IHNwZWNpZmllZCBrZXlzLCB0aGF0IGFyZSBwYXNzZWQgYXMgc3RyaW5nIHBhcmFtZXRlcnMgb3IgYXJyYXkocykgb2Yga2V5cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBhbiBvYmplY3QgdG8gcGljayBrZXlzIGZyb21cbiAqIEBwYXJhbSB7TGlzdFtTdHJpbmd8QXJyYXldfSBhcmd1bWVudHMgbGlzdCBvZiBrZXlzIChvciBhcnJheShzKSBvZiBrZXlzKVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBwaWNrS2V5cygpIHsgLy8gLCAuLi4ga2V5c1xuICAgIHZhciBrZXlzID0gY29uY2F0LmFwcGx5KEFycmF5UHJvdG8sIGFyZ3VtZW50cylcbiAgICAgICAgLCBvYmogPSBPYmplY3QuY3JlYXRlKHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpXG4gICAgICAgICAgICBvYmpba2V5XSA9IHRoaXNba2V5XTtcbiAgICB9LCB0aGlzKTtcbiAgICByZXR1cm4gb2JqO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBvYmplY3Qgb2YgdGhlIHNhbWUgY2xhc3Mgd2l0aG91dCBzcGVjaWZpZWQga2V5cywgdGhhdCBhcmUgcGFzc2VkIGFzIHN0cmluZyBwYXJhbWV0ZXJzIG9yIGFycmF5KHMpIG9mIGtleXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgYW4gb2JqZWN0IHRvIG9taXQga2V5cyBpblxuICogQHBhcmFtIHtMaXN0W1N0cmluZ3xBcnJheV19IGFyZ3VtZW50cyBsaXN0IG9mIGtleXMgKG9yIGFycmF5KHMpIG9mIGtleXMpXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG9taXRLZXlzKCkgeyAvLyAsIC4uLiBrZXlzXG4gICAgdmFyIGtleXMgPSBjb25jYXQuYXBwbHkoQXJyYXlQcm90bywgYXJndW1lbnRzKVxuICAgICAgICAsIG9iaiA9IGNsb25lLmNhbGwodGhpcyk7XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7XG4gICAgICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICB9LCB0aGlzKTtcbiAgICByZXR1cm4gb2JqO1xufVxuXG5cbi8qKlxuICogUGVyZm9ybXMgZGVlcCBlcXVhbGl0eSB0ZXN0IG9mIHRoZSBvYmplY3QuIERvZXMgbm90IHdvcmsgd2l0aCByZWN1cnNpdmUgb2JqZWN0c1xuICogQHBhcmFtICB7QW55fSBzZWxmIG9iamVjdCB0byBjb21wYXJlXG4gKiBAcGFyYW0gIHtBbnl9IG9iaiBvYmplY3QgdG8gY29tcGFyZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNFcXVhbChvYmopIHtcbiAgICBpZiAodGhpcyA9PT0gb2JqKSByZXR1cm4gdGhpcyAhPT0gMCB8fCAxL3RoaXMgPT0gMS9vYmo7IC8vIDAgYW5kIC0wIGFyZSBjb25zaWRlcmVkIG5vdCBlcXVhbCwgYWx0aG91Z2ggMCA9PT0gLTAgaXMgdHJ1ZVxuICAgIGlmICh0aGlzID09IG51bGwgfHwgb2JqID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgY2xhc3NOYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIGlmIChjbGFzc05hbWUgIT0gb2JqLmNvbnN0cnVjdG9yLm5hbWUpIHJldHVybiBmYWxzZTtcbiAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gU3RyaW5nKG9iaik7XG4gICAgICAgIGNhc2UgJ051bWJlcic6XG4gICAgICAgICAgICByZXR1cm4gdGhpcyAhPSArdGhpcyA/IG9iaiAhPSArb2JqIDogKHRoaXMgPT0gMCA/IDEvdGhpcyA9PSAxL29iaiA6IHRoaXMgPT0gK29iaik7XG4gICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICBjYXNlICdCb29sZWFuJzpcbiAgICAgICAgICAgIHJldHVybiArdGhpcyA9PSArb2JqO1xuICAgICAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlID09IG9iai5zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5nbG9iYWwgPT0gb2JqLmdsb2JhbFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm11bHRpbGluZSA9PSBvYmoubXVsdGlsaW5lXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuaWdub3JlQ2FzZSA9PSBvYmouaWdub3JlQ2FzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzICE9ICdvYmplY3QnIHx8IHR5cGVvZiBvYmogIT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMpKVxuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT0gb2JqLmxlbmd0aFxuICAgICAgICAgICAgICAgICYmIHRoaXMuZXZlcnkoZnVuY3Rpb24oaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRXF1YWwuY2FsbChpdGVtLCBvYmpbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFsbEtleXMuY2FsbCh0aGlzKS5sZW5ndGggPT0gYWxsS2V5cy5jYWxsKG9iaikubGVuZ3RoXG4gICAgICAgICAgICAgICAgJiYgZXZlcnlLZXkuY2FsbCh0aGlzLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0VxdWFsLmNhbGwodmFsdWUsIG9ialtrZXldKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBUaGUgb3Bwb3NpdGUgb2YgaXNFcXVhbFxuICogQHBhcmFtICB7QW55fSBzZWxmIG9iamVjdCB0byBjb21wYXJlXG4gKiBAcGFyYW0gIHtBbnl9IG9iaiBvYmplY3QgdG8gY29tcGFyZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOb3Qob2JqKSB7XG4gICAgcmV0dXJuICFpc0VxdWFsLmNhbGwodGhpcywgb2JqKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiAtIFtleHRlbmRQcm90b10oI2V4dGVuZFByb3RvKVxuICogLSBbY3JlYXRlU3ViY2xhc3NdKCNjcmVhdGVTdWJjbGFzcylcbiAqIC0gW21ha2VTdWJjbGFzc10oI21ha2VTdWJjbGFzcylcbiAqIC0gW25ld0FwcGx5XSgjbmV3QXBwbHkpXG4gKlxuICogVGhlc2UgbWV0aG9kcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwjUHJvdG8pXG4gKi9cbnZhciBwcm90b3R5cGVNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZXh0ZW5kUHJvdG86IGV4dGVuZFByb3RvLFxuICAgIGNyZWF0ZVN1YmNsYXNzOiBjcmVhdGVTdWJjbGFzcyxcbiAgICBtYWtlU3ViY2xhc3M6IG1ha2VTdWJjbGFzcyxcbiAgICBuZXdBcHBseTogbmV3QXBwbHlcbn07XG5cblxudmFyIF9fID0gcmVxdWlyZSgnLi9wcm90b19vYmplY3QnKTtcblxuX18uZXh0ZW5kLmNhbGwoX18sIHJlcXVpcmUoJy4vcHJvdG9fZnVuY3Rpb24nKSk7XG5cblxuLyoqXG4gKiBBZGRzIG5vbi1lbnVtZXJhYmxlLCBub24tY29uZmlndXJhYmxlIGFuZCBub24td3JpdGFibGUgcHJvcGVydGllcyB0byB0aGUgcHJvdG90eXBlIG9mIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIGZ1bmN0aW9uIE15Q2xhc3MoKSB7fVxuICogXy5leHRlbmRQcm90byhNeUNsYXNzLCB7XG4gKiAgICAgbWV0aG9kMTogZnVuY3Rpb24oKSB7fSxcbiAqICAgICBtZXRob2QyOiBmdW5jdGlvbigpIHt9XG4gKiB9KTtcbiAqIGBgYFxuICogVG8gZXh0ZW5kIGNsYXNzIHZpYSBvYmplY3Q6XG4gKiBgYGBcbiAqIF8uZXh0ZW5kUHJvdG8ob2JqLmNvbnN0cnVjdG9yLCBtZXRob2RzKTtcbiAqIGBgYFxuICogUmV0dXJucyBwYXNzZWQgY29uc3RydWN0b3IsIHNvIGZ1bmN0aW9ucyBfLmV4dGVuZFByb3RvLCBbXy5leHRlbmRdKG9iamVjdC5qcy5odG1sI2V4dGVuZCkgYW5kIF8ubWFrZVN1YmNsYXNzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCkuIFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBtZXRob2RzIGEgbWFwIG9mIGZ1bmN0aW9ucywga2V5cyB3aWxsIGJlIGluc3RhbmNlIG1ldGhvZHMgKHByb3BlcnRpZXMgb2YgdGhlIGNvbnN0cnVjdG9yIHByb3RvdHlwZSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBleHRlbmRQcm90byhtZXRob2RzKSB7XG4gICAgdmFyIHByb3BEZXNjcmlwdG9ycyA9IHt9O1xuXG4gICAgX18uZWFjaEtleS5jYWxsKG1ldGhvZHMsIGZ1bmN0aW9uKG1ldGhvZCwgbmFtZSkge1xuICAgICAgICBwcm9wRGVzY3JpcHRvcnNbbmFtZV0gPSB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogbWV0aG9kXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLnByb3RvdHlwZSwgcHJvcERlc2NyaXB0b3JzKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIE1ha2VzIGEgc3ViY2xhc3Mgb2YgY2xhc3MgYHRoaXNDbGFzc2AuXG4gKiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gd2lsbCBoYXZlIHNwZWNpZmllZCBgbmFtZWAgaWYgc3VwcGxpZWQuXG4gKiBUaGUgY29uc3RydWN0b3Igb2Ygc3VwZXJjbGFzcyB3aWxsIGJlIGNhbGxlZCBpbiBzdWJjbGFzcyBjb25zdHJ1Y3RvciBieSBkZWZhdWx0IHVubGVzcyBgYXBwbHlDb25zdHJ1Y3RvciA9PT0gZmFsc2VgIChub3QganVzdCBmYWxzeSkuXG4gKiBDb3BpZXMgYHRoaXNDbGFzc2AgY2xhc3MgbWV0aG9kcyB0byBjcmVhdGVkIHN1YmNsYXNzLiBGb3IgdGhlbSB0byB3b3JrIGNvcnJlY3RseSB0aGV5IHNob3VsZCB1c2UgYHRoaXNgIHRvIHJlZmVyIHRvIHRoZSBjbGFzcyByYXRoZXIgdGhhbiBleHBsaWNpdCBzdXBlcmNsYXNzIG5hbWUuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGhpc0NsYXNzIEEgY2xhc3MgdG8gbWFrZSBzdWJjbGFzcyBvZlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgT3B0aW9uYWwgbmFtZSBvZiBzdWJjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICogQHBhcmFtIHtCb29sZWFufSBhcHBseUNvbnN0cnVjdG9yIE9wdGlvbmFsIGZhbHNlIHZhbHVlIChub3QgZmFsc3kpIHRvIHByZXZlbnQgY2FsbCBvZiBpbmhlcml0ZWQgY29uc3RydWN0b3IgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHN1YmNsYXNzXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3ViY2xhc3MobmFtZSwgYXBwbHlDb25zdHJ1Y3Rvcikge1xuICAgIHZhciB0aGlzQ2xhc3MgPSB0aGlzO1xuICAgIHZhciBzdWJjbGFzcztcblxuICAgIC8vIG5hbWUgaXMgb3B0aW9uYWxcbiAgICBuYW1lID0gbmFtZSB8fCAnJztcblxuICAgIC8vIGFwcGx5IHN1cGVyY2xhc3MgY29uc3RydWN0b3JcbiAgICB2YXIgY29uc3RydWN0b3JDb2RlID0gYXBwbHlDb25zdHJ1Y3RvciA9PT0gZmFsc2VcbiAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgIDogJ3RoaXNDbGFzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyc7XG5cbiAgICBldmFsKCdzdWJjbGFzcyA9IGZ1bmN0aW9uICcgKyBuYW1lICsgJygpeyAnICsgY29uc3RydWN0b3JDb2RlICsgJyB9Jyk7XG5cbiAgICBtYWtlU3ViY2xhc3MuY2FsbChzdWJjbGFzcywgdGhpc0NsYXNzKTtcblxuICAgIC8vIGNvcHkgY2xhc3MgbWV0aG9kc1xuICAgIC8vIC0gZm9yIHRoZW0gdG8gd29yayBjb3JyZWN0bHkgdGhleSBzaG91bGQgbm90IGV4cGxpY3RseSB1c2Ugc3VwZXJjbGFzcyBuYW1lXG4gICAgLy8gYW5kIHVzZSBcInRoaXNcIiBpbnN0ZWFkXG4gICAgX18uZGVlcEV4dGVuZC5jYWxsKHN1YmNsYXNzLCB0aGlzQ2xhc3MsIHRydWUpO1xuXG4gICAgcmV0dXJuIHN1YmNsYXNzO1xufVxuXG5cbi8qKlxuICogU2V0cyB1cCBwcm90b3R5cGUgY2hhaW4gdG8gY2hhbmdlIGB0aGlzQ2xhc3NgIChhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uKSBzbyB0aGF0IGl0IGJlY29tZXMgYSBzdWJjbGFzcyBvZiBgU3VwZXJjbGFzc2AuXG4gKiBSZXR1cm5zIGB0aGlzQ2xhc3NgIHNvIGl0IGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCkgd2l0aCBfLmV4dGVuZFByb3RvIGFuZCBbXy5leHRlbmRdKG9iamVjdC5qcy5odG1sI2V4dGVuZCkuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGhpc0NsYXNzIEEgY2xhc3MgdGhhdCB3aWxsIGJlY29tZSBhIHN1YmNsYXNzIG9mIFN1cGVyY2xhc3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFN1cGVyY2xhc3MgQSBjbGFzcyB0aGF0IHdpbGwgYmVjb21lIGEgc3VwZXJjbGFzcyBvZiB0aGlzQ2xhc3NcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBtYWtlU3ViY2xhc3MoU3VwZXJjbGFzcykge1xuICAgIC8vIHByb3RvdHlwZSBjaGFpblxuICAgIHRoaXMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdXBlcmNsYXNzLnByb3RvdHlwZSk7XG4gICAgXG4gICAgLy8gc3ViY2xhc3MgaWRlbnRpdHlcbiAgICBleHRlbmRQcm90by5jYWxsKHRoaXMsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHRoaXNcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIENhbGxzIGNvbnN0cnVjdG9yIGB0aGlzYCB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgYXMgYXJyYXlcbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGhpc0NsYXNzIEEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZFxuICogQHJldHVybiB7QXJyYXl8QXJyYXktbGlrZX0gYXJncyBBcnJheSBvZiBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBuZXdBcHBseShhcmdzKSB7XG4gICAgaWYgKCEgQXJyYXkuaXNBcnJheShhcmdzKSlcbiAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpO1xuICAgIC8vIFwibnVsbFwiIGlzIGNvbnRleHQgdG8gcGFzcyB0byBjbGFzcyBjb25zdHJ1Y3RvciwgZmlyc3QgcGFyYW1ldGVyIG9mIGJpbmRcbiAgICB2YXIgYXJncyA9IFtudWxsXS5jb25jYXQoYXJncyk7XG4gICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkodGhpcywgYXJncykpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBfXyA9IHJlcXVpcmUoJy4vcHJvdG9fb2JqZWN0Jyk7XG5cblxuLyoqXG4gKiAtIFtmaXJzdFVwcGVyQ2FzZV0oI2ZpcnN0VXBwZXJDYXNlKVxuICogLSBbZmlyc3RMb3dlckNhc2VdKCNmaXJzdExvd2VyQ2FzZSlcbiAqIC0gW3RvUmVnRXhwXSgjdG9SZWdFeHApXG4gKiAtIFt0b0Z1bmN0aW9uXSgjdG9GdW5jdGlvbilcbiAqIC0gW3RvRGF0ZV0oI3RvRGF0ZSlcbiAqIC0gW3RvUXVlcnlTdHJpbmddKCN0b1F1ZXJ5U3RyaW5nKVxuICogLSBbZnJvbVF1ZXJ5U3RyaW5nXSgjZnJvbVF1ZXJ5U3RyaW5nKVxuICogLSBbanNvblBhcnNlXSgjanNvblBhcnNlKVxuICogLSBbaGFzaENvZGVdKCNoYXNoQ29kZSlcbiAqIC0gW3VuUHJlZml4XSgjdW5QcmVmaXgpXG4gKi9cbiB2YXIgc3RyaW5nTWV0aG9kcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZpcnN0VXBwZXJDYXNlOiBmaXJzdFVwcGVyQ2FzZSxcbiAgICBmaXJzdExvd2VyQ2FzZTogZmlyc3RMb3dlckNhc2UsXG4gICAgdG9SZWdFeHA6IHRvUmVnRXhwLFxuICAgIHRvRnVuY3Rpb246IHRvRnVuY3Rpb24sXG4gICAgdG9EYXRlOiB0b0RhdGUsXG4gICAgdG9RdWVyeVN0cmluZzogdG9RdWVyeVN0cmluZyxcbiAgICBmcm9tUXVlcnlTdHJpbmc6IGZyb21RdWVyeVN0cmluZyxcbiAgICBqc29uUGFyc2U6IGpzb25QYXJzZSxcbiAgICBoYXNoQ29kZTogaGFzaENvZGUsXG4gICAgdW5QcmVmaXg6IHVuUHJlZml4XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyBzdHJpbmcgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyIGNoYW5nZWQgdG8gdXBwZXIgY2FzZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBBIHN0cmluZyB0aGF0IHdpbGwgaGF2ZSBpdHMgZmlyc3QgY2hhcmFjdGVyIHJlcGxhY2VkXG4gKi9cbmZ1bmN0aW9uIGZpcnN0VXBwZXJDYXNlKCkge1xuICAgIHJldHVybiB0aGlzID8gdGhpc1swXS50b1VwcGVyQ2FzZSgpICsgdGhpcy5zbGljZSgxKSA6IHRoaXM7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY2hhbmdlZCB0byBsb3dlciBjYXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIEEgc3RyaW5nIHRoYXQgd2lsbCBoYXZlIGl0cyBmaXJzdCBjaGFyYWN0ZXIgcmVwbGFjZWRcbiAqL1xuZnVuY3Rpb24gZmlyc3RMb3dlckNhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMgPyB0aGlzWzBdLnRvTG93ZXJDYXNlKCkgKyB0aGlzLnNsaWNlKDEpIDogdGhpcztcbn1cblxuXG4vKipcbiAqIENvbnZlcnRzIHN0cmluZyBjcmVhdGVkIGJ5IGB0b1N0cmluZ2AgbWV0aG9kIG9mIFJlZ0V4cCBiYWNrIHRvIFJlZ0V4cFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIHN0cmluZyBjb250YWluaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbmNsdWRpbmcgZW5jbG9zaW5nIFwiL1wiIHN5bWJvbHMgYW5kIGZsYWdzXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHRvUmVnRXhwKCkge1xuICAgIHZhciByeCA9IHRoaXMubWF0Y2gocmVnZXhwU3RyaW5nUGF0dGVybik7XG4gICAgaWYgKHJ4KSByZXR1cm4gbmV3IFJlZ0V4cChyeFsxXSwgcnhbMl0pO1xufVxudmFyIHJlZ2V4cFN0cmluZ1BhdHRlcm4gPSAvXlxcLyguKilcXC8oW2dpbXldKikkLztcblxuXG4vKipcbiAqIENvbnZlcnRzIHN0cmluZyBjcmVhdGVkIGJ5IGB0b1N0cmluZ2AgbWV0aG9kIG9mIGZ1bmN0aW9uIGJhY2sgdG8gZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBzdHJpbmcgY29udGFpbmluZyBmdWxsIGZ1bmN0aW9uIGNvZGVcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiB0b0Z1bmN0aW9uKCkge1xuICAgIHZhciBmdW5jO1xuICAgIHZhciBjb2RlID0gJ2Z1bmMgPSAnICsgdGhpcyArICc7JztcbiAgICB0cnkge1xuICAgICAgICBldmFsKGNvZGUpO1xuICAgICAgICByZXR1cm4gZnVuYztcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIENvbnZlcnRzIHN0cmluZyB0byBkYXRlIGluIGEgc2FmZSB3YXkgc28gdGhhdCB0aGUgcmVzaXVsdCBpcyB1bmRlZmluZWQgaWYgZGF0ZSBpcyBpbnZhbGlkXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8RGF0ZX0gc2VsZiBzdHJpbmcgb3IgZGF0ZSBvYmplY3QgdG8gY29udmVydCB0byBWQUxJRCBkYXRlXG4gKiBAcmV0dXJuIHtbdHlwZV19IFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gdG9EYXRlKCkge1xuICAgIGlmICghIHRoaXMpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRoaXMpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgaWYgKGRhdGUgJiYgZGF0ZS5nZXRUaW1lICYmICFpc05hTihkYXRlLmdldFRpbWUoKSkpXG4gICAgICAgIHJldHVybiBkYXRlO1xufVxuXG5cbi8qKlxuICogQ29udmVydCBwYXJhbXMgb2JqZWN0IHRvIGEgdXJsIHN0eWxlIHF1ZXJ5IHN0cmluZyAod2l0aG91dCBcIj9cIilcbiAqIFxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgVGhlIG9iamVjdCBoYXNoIHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZW5jb2RlIG9wdGlvbmFsIGZ1bmN0aW9uIHVzZWQgdG8gZW5jb2RlIGRhdGEsIGVuY29kZVVSSUNvbXBvbmVudCBpcyB1c2VkIGlmIG5vdCBzcGVjaWZpZWRcbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdGluZyBxdWVyeSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gdG9RdWVyeVN0cmluZyhlbmNvZGUpIHtcbiAgICB2YXIgcXMgPSAnJ1xuICAgICAgICAsIHBhcmFtcyA9IHRoaXMgfHwge31cbiAgICAgICAgLCBlbmNvZGUgPSBlbmNvZGUgfHwgZW5jb2RlVVJJQ29tcG9uZW50O1xuXG4gICAgX18uZWFjaEtleS5jYWxsKHBhcmFtcywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICBxcyArPSBrZXkgKyAnPScgKyBlbmNvZGUodmFsdWUpICsgJyYnO1xuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBxcy5zbGljZSgwLCAtMSk7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0IHVybCBzdHlsZSBxdWVyeSBzdHJpbmcgKHdpdGhvdXQgXCI/XCIpIGludG8gb2JqZWN0IGhhc2hcbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgVGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGRlY29kZSBvcHRpb25hbCBkZWNvZGUgZnVuY3Rpb24sIGRlY29kZVVSSUNvbXBvbmVudCB3aWxsIGJlIHVzZWQgaWYgbm90IHN1cHBsaWVkXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgb2JqZWN0IGhhc2hcbiAqL1xuZnVuY3Rpb24gZnJvbVF1ZXJ5U3RyaW5nKGRlY29kZSkge1xuICAgIHZhciBwYWlycyA9IHRoaXMuc3BsaXQoJyYnKVxuICAgICAgICAsIHJlc3VsdHMgPSB7fVxuICAgICAgICAsIGRlY29kZSA9IGRlY29kZSB8fCBkZWNvZGVVUklDb21wb25lbnQ7XG5cbiAgICBwYWlycy5mb3JFYWNoKGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgdmFyIHNwbGl0UGFpciA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICAgICAgaWYgKHNwbGl0UGFpci5sZW5ndGggPCAyKSByZXR1cm47XG4gICAgICAgIHZhciBrZXkgPSBzcGxpdFBhaXJbMF1cbiAgICAgICAgICAgICwgdmFsdWUgPSBkZWNvZGUoc3BsaXRQYWlyWzFdIHx8ICcnKTtcbiAgICAgICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICAgICAgcmVzdWx0c1trZXldID0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbn1cblxuXG4vKipcbiAqIFNhZmUgSlNPTi5wYXJzZSwgcmV0dXJucyB1bmRlZmluZWQgaWYgSlNPTi5wYXJzZSB0aHJvd3MgYW4gZXhjZXB0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0XG4gKiBAcmV0dXJuIHtPYmplY3R8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBqc29uUGFyc2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcyk7XG4gICAgfSBjYXRjaCAoZSkge31cbn1cblxuXG4vKipcbiAqIERhbiBCZXJuc3RlaW4ncyBhbGdvcnl0aG0gdG8gY3JlYXRlIGhhc2ggZnJvbSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBzdHJpbmcgdG8gY29udmVydCB0byBoYXNoXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGhhc2hDb2RlKCkge1xuICAgIHZhciBoYXNoID0gNTM4MVxuICAgICAgICAsIHN0ciA9IHRoaXNcbiAgICAgICAgLCBsZW4gPSBzdHIubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSArIGhhc2gpICsgY2hhcjsgLyogaGFzaCAqIDMzICsgYyAqL1xuICAgIH1cbiAgICByZXR1cm4gaGFzaDtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgZ2l2ZW4gcHJlZml4IGZyb20gdGhlIHN0cmluZy4gSWYgc3RyaW5nIGRvZXMgbm90IGJlZ2luIGZyb20gdGhlIHByZWZpeCwgcmV0dXJucyB1bmRlZmluZWRcbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGZcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdW5QcmVmaXgoc3RyKSB7XG4gICAgaWYgKHRoaXMuaW5kZXhPZihzdHIpID09IDApXG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2Uoc3RyLCAnJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogLSBbdGltZXNdKCN0aW1lcylcbiAqIC0gW3JlcGVhdF0oI3JlcGVhdClcbiAqIC0gW3RhcF0oI3RhcClcbiAqIC0gW3Jlc3VsdF0oI3Jlc3VsdClcbiAqIC0gW2lkZW50aXR5XSgjaWRlbnRpdHkpXG4gKiAtIFtwcm9wZXJ0eV0oI3Byb3BlcnR5KVxuICogLSBbY29tcGFyZVByb3BlcnR5XSgjY29tcGFyZVByb3BlcnR5KVxuICogLSBbbm9vcF0oI25vb3ApXG4gKi9cbnZhciB1dGlsTWV0aG9kcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIHRpbWVzOiB0aW1lcyxcbiAgICByZXBlYXQ6IHJlcGVhdCxcbiAgICB0YXA6IHRhcCxcbiAgICByZXN1bHQ6IHJlc3VsdCxcbiAgICBpZGVudGl0eTogaWRlbnRpdHksXG4gICAgcHJvcGVydHk6IHByb3BlcnR5LFxuICAgIGNvbXBhcmVQcm9wZXJ0eTogY29tcGFyZVByb3BlcnR5LFxuICAgIG5vb3A6IG5vb3Bcbn07XG5cblxuLyoqXG4gKiBDYWxscyBgY2FsbGJhY2tgIGBzZWxmYCB0aW1lcyB3aXRoIGB0aGlzQXJnYCBhcyBjb250ZXh0LiBDYWxsYmFjayBpcyBwYXNzZWQgaXRlcmF0aW9uIGluZGV4IGZyb20gMCB0byBgc2VsZi0xYFxuICogXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHNlbGZcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0FueX0gdGhpc0FyZ1xuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHRpbWVzKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgdmFyIGFyciA9IEFycmF5KE1hdGgubWF4KDAsIHRoaXMpKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXM7IGkrKylcbiAgICAgICAgYXJyW2ldID0gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBpKTtcbiAgICByZXR1cm4gYXJyO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhcnJheSB3aXRoIHRoZSBmaXJzdCBhcmd1bWVudCByZXBlYXRlZCBgdGltZXNgIHRpbWVzXG4gKiBAcGFyYW0gIHtBbnl9IHNlbGZcbiAqIEBwYXJhbSAge0ludGVnZXJ9IHRpbWVzXG4gKiBAcmV0dXJuIHtBcnJheVtBbnldfVxuICovXG5mdW5jdGlvbiByZXBlYXQodGltZXMpIHtcbiAgICB2YXIgYXJyID0gQXJyYXkoTWF0aC5tYXgoMCwgdGltZXMpKTs7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKVxuICAgICAgICBhcnJbaV0gPSB0aGlzO1xuICAgIHJldHVybiBhcnI7XG59XG5cblxuLyoqXG4gKiBGdW5jdGlvbiB0byB0YXAgaW50byBjaGFpbmVkIG1ldGhvZHMgYW5kIHRvIGluc3BlY3QgaW50ZXJtZWRpYXJ5IHJlc3VsdFxuICpcbiAqIEBwYXJhbSB7QW55fSBzZWxmIHZhbHVlIHRoYXQncyBwYXNzZWQgYmV0d2VlbiBjaGFpbmVkIG1ldGhvZHNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZSAoYm90aCBhcyBjb250ZXh0IGFuZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyKVxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiB0YXAoZnVuYykge1xuICAgIGZ1bmMuY2FsbCh0aGlzLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbn07XG5cblxuLyoqXG4gKiBDYWxscyBmdW5jdGlvbiBgc2VsZmAgKGZpcnN0IHBhcmFtZXRlciBvZiBfLnJlc3VsdCkgd2l0aCBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbnxBbnl9IHNlbGZcbiAqIEBwYXJhbSB7QW55fSB0aGlzQXJnIGNvbnRleHRcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGV4dHJhIGFyZ3VtZW50c1xuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiByZXN1bHQodGhpc0FyZykgeyAvLywgYXJndW1lbnRzXG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHRoaXMuYXBwbHkodGhpc0FyZywgYXJncylcbiAgICAgICAgICAgIDogdGhpcztcbn1cblxuXG4vKipcbiAqIFJldHVybnMgc2VsZi4gVXNlZnVsIGZvciB1c2luZyBhcyBhbiBpdGVyYXRvciBpZiB0aGUgYWN0dWFsIHZhbHVlIG5lZWRzIHRvIGJlIHJldHVybmVkLiBVbmxpa2UgaW4gdW5kZXJzY29yZSBhbmQgbG9kYXNoLCB0aGlzIGZ1bmN0aW9uIGlzIE5PVCB1c2VkIGFzIGRlZmF1bHQgaXRlcmF0b3IuXG4gKlxuICogQHBhcmFtIHtBbnl9IHNlbGYgXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KCkge1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBmdW5jdGlvbiB0aGF0IHBpY2tzIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZlxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHByb3BlcnR5KCkge1xuICAgIHZhciBrZXkgPSB0aGlzO1xuICAgIHJldHVybiBmdW5jdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIG9ialtrZXldO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gYXJyYXkgc29ydCB0byBzb3J0IGJ5IGEgZ2l2ZW4gcHJvcGVydHlcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZlxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVQcm9wZXJ0eSgpIHtcbiAgICB2YXIga2V5ID0gdGhpcztcbiAgICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgICAgICByZXR1cm4gYVtrZXldIDwgYltrZXldXG4gICAgICAgICAgICA/IC0xXG4gICAgICAgICAgICA6IGFba2V5XSA+IGJba2V5XVxuICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgIDogMDtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmdcbiAqL1xuZnVuY3Rpb24gbm9vcCgpIHt9XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIG1ha2VQcm90b0luc3RhbmNlTWV0aG9kOiBtYWtlUHJvdG9JbnN0YW5jZU1ldGhvZCxcbiAgICBtYWtlUHJvdG9GdW5jdGlvbjogbWFrZVByb3RvRnVuY3Rpb24sXG4gICAgbWFrZUZpbmRNZXRob2Q6IG1ha2VGaW5kTWV0aG9kXG59XG5cblxuZnVuY3Rpb24gbWFrZVByb3RvSW5zdGFuY2VNZXRob2QobWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNlbGYgPSBtZXRob2QuYXBwbHkodGhpcy5zZWxmLCBhcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xufVxuXG5cbmZ1bmN0aW9uIG1ha2VQcm90b0Z1bmN0aW9uKG1ldGhvZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gd2hlbiB0aGUgbWV0aG9kIGlzIGV4ZWN1dGVkLCB0aGUgdmFsdWUgb2YgXCJ0aGlzXCIgd2lsbCBiZSBhcmd1bWVudHNbMF0sXG4gICAgICAgIC8vIG90aGVyIGFyZ3VtZW50cyBzdGFydGluZyBmcm9tICMxIHdpbGwgcGFzc2VkIHRvIG1ldGhvZCBhcyBwYXJhbWV0ZXJzLlxuICAgICAgICByZXR1cm4gbWV0aG9kLmNhbGwuYXBwbHkobWV0aG9kLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5cblxudmFyIF9lcnJvciA9IG5ldyBFcnJvcjtcblxuLyoqXG4gKiBSZXR1cm5zIGBmaW5kYCBvciBgZmluZEluZGV4YCBtZXRob2QsIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoTWV0aG9kIC0gbWV0aG9kIHRvIHVzZSBmb3IgaXRlcmF0aW9uIChmb3JFYWNoIGZvciBhcnJheSBvciBlYWNoS2V5IGZvciBvYmplY3QpXG4gKiBAcGFyYW0ge1N0cmluZ30gZmluZFdoYXQgJ3ZhbHVlJyAtIHJldHVybnMgZmluZCBtZXRob2Qgb2YgQXJyYXkgKGltcGxlbWVudGVkIGluIEVTNikgb3IgZmluZFZhbHVlIG1ldGhvZCBvZiBPYmplY3QsIGFueXRoaW5nIGVsc2UgPSByZXR1cm5zIGZpbmRJbmRleC9maW5kS2V5IG1ldGhvZHMuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbWFrZUZpbmRNZXRob2QoZWFjaE1ldGhvZCwgZmluZFdoYXQpIHtcbiAgICB2YXIgYXJnSW5kZXggPSBmaW5kV2hhdCA9PSAndmFsdWUnID8gMCA6IDE7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gZmluZFZhbHVlT3JJbmRleChjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICAgICAgdmFyIGNhdWdodEVycm9yO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZWFjaE1ldGhvZC5jYWxsKHRoaXMsIHRlc3RJdGVtLCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGZvdW5kKSB7XG4gICAgICAgICAgICBpZiAoZm91bmQgPT09IF9lcnJvcikgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gICAgICAgICAgICBlbHNlIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBsb29raW5nIGZvciBpbmRleCBhbmQgbm90IGZvdW5kLCByZXR1cm4gLTFcbiAgICAgICAgaWYgKGFyZ0luZGV4ICYmIGVhY2hNZXRob2QgPT0gQXJyYXkucHJvdG90eXBlLmZvckVhY2gpXG4gICAgICAgICAgICByZXR1cm4gLTE7IFxuXG4gICAgICAgIGZ1bmN0aW9uIHRlc3RJdGVtKHZhbHVlLCBpbmRleCwgc2VsZikge1xuICAgICAgICAgICAgdmFyIHRlc3Q7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRlc3QgPSBjYWxsYmFjay5jYWxsKHRoaXMsIHZhbHVlLCBpbmRleCwgc2VsZik7XG4gICAgICAgICAgICB9IGNhdGNoKGVycikge1xuICAgICAgICAgICAgICAgIGNhdWdodEVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgIHRocm93IF9lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0ZXN0KVxuICAgICAgICAgICAgICAgIHRocm93IGFyZ3VtZW50c1thcmdJbmRleF07XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0= +//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvYWJzdHJhY3QvZmFjZXQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9hYnN0cmFjdC9yZWdpc3RyeS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2JpbmQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvYV9jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2xvYWQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2JpbmRlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY2xhc3Nlcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tbWFuZC9hY3Rpb25zX2hpc3RvcnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbW1hbmQvY21kX3JlZ2lzdHJ5LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21tYW5kL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0NvbnRhaW5lci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0RvbS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EcmFnLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0Ryb3AuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvRXZlbnRzLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0ZyYW1lLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0l0ZW0uanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvTGlzdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9Nb2RlbEZhY2V0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL09wdGlvbnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVGVtcGxhdGUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVHJhbnNmZXIuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvY2ZfcmVnaXN0cnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19pbmZvLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfcmVnaXN0cnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY191dGlscy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jbGFzc2VzL1ZpZXcuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX2FwaS9kYXRhLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19hcGkvZGVfZGF0YS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9tc2dfYXBpL2Ryb3AuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19zcmMvZnJhbWUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvc2NvcGUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvQnV0dG9uLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvTGlzdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9EYXRlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0Ryb3BUYXJnZXQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvRm9sZFRyZWUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvR3JvdXAuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvSHlwZXJsaW5rLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0ltYWdlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0TGlzdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9MaXN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0xpc3RJdGVtLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1JhZGlvR3JvdXAuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvU2VsZWN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1N1cGVyQ29tYm8uanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvVGV4dC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UZXh0YXJlYS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UaW1lLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1dyYXBwZXIuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0FsZXJ0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0Ryb3Bkb3duLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb25maWcuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2xvYWRlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvbWlsby5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvcmVnaXN0cnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RlX2NvbnN0cnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RvbV9zb3VyY2UuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9hcGkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9zb3VyY2UuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL3dpbmRvdy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXNlX2NvbXBvbmVudHMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3VzZV9mYWNldHMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvY29tcG9uZW50X25hbWUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvY3JlYXRlX2NvbXBvbmVudF9jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC9kZXByZWNhdGUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZG9tLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL2RvbV9saXN0ZW5lcnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZG9tcmVhZHkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZHJhZ2Ryb3AuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZXJyb3IuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZnJhZ21lbnQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvanNvbl9wYXJzZS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC9yZXF1ZXN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL3NlbGVjdGlvbi9pbmRleC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC9zdG9yYWdlL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL3N0b3JhZ2UvbW9kZWwuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvc3RvcmFnZS9tc2dfc3JjLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL3VuaXF1ZV9pZC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC93ZWJzb2NrZXQvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvd2Vic29ja2V0L21zZ19hcGkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvd2Vic29ja2V0L21zZ19zcmMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL2Jhc2UzMi9saWIvYmFzZTMyLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLWJ1aWx0aW5zL2J1aWx0aW4vZnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvYWJzdHJhY3QvbWl4aW4uanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvY2xhc3Nlcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9jb25maWcuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWVzc2VuZ2VyL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9tX2FwaS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tZXNzZW5nZXIvbV9hcGlfcnguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWVzc2VuZ2VyL21fc291cmNlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9tc25ncl9zb3VyY2UuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWlsby1jb3JlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21pbmRlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9jaGFuZ2VfZGF0YS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9jb25uZWN0b3IuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvbV9tc2dfYXBpLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21vZGVsL21fcGF0aC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9tb2RlbF91dGlscy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9wYXRoX21zZ19hcGkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvcGF0aF91dGlscy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9zeW50aGVzaXplL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL3V0aWwvY2hlY2suanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvdXRpbC9pbmRleC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi91dGlsL2xvZ2dlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi91dGlsL2xvZ2dlcl9jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9kb3QvZG9ULmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL2RvdC9pbmRleC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL21vbC1wcm90by9saWIvcHJvdG9fYXJyYXkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19mdW5jdGlvbi5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX251bWJlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX29iamVjdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3Byb3RvdHlwZS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3N0cmluZy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3V0aWwuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi91dGlscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3g1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdHFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDblBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9tQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6cUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4YkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdnBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdllBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3puQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0O1xuXG5cbi8qKlxuICogYG1pbG8uY2xhc3Nlcy5GYWNldGBcbiAqIEJhc2UgRmFjZXQgY2xhc3MgaXMgYW4gYW5jZXN0b3Igb2YgW0NvbXBvbmVudEZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgY2xhc3MsIHRoZSBtYWluIGJ1aWxkaW5nIGJsb2NrIGluIG1pbG8uXG4gKiBcbiAqIEBwYXJhbSB7RmFjZXRlZE9iamVjdH0gb3duZXIgYW4gaW5zdGFuY2Ugb2YgRmFjZXRlZE9iamVjdCBzdWJjbGFzcyB0aGF0IHN0b3JlcyB0aGUgZmFjZXQgb24gaXRzIHByb3BlcnR5ICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYG5hbWVgIHByb3BlcnR5IG9mIGZhY2V0XG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb24sIHVzZWQgaW4gc3ViY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBGYWNldChvd25lciwgY29uZmlnKSB7XG4gICAgdGhpcy5uYW1lID0gXy5maXJzdExvd2VyQ2FzZSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMub3duZXIgPSBvd25lcjtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG4vKipcbiAqIGBpbml0YCBtZXRob2Qgb2Ygc3ViY2xhc3Mgd2lsbCBiZSBjYWxsZWQgYnkgRmFjZXQgY29uc3RydWN0b3IuXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXQsIHtcbiAgICBpbml0OiBmdW5jdGlvbigpIHt9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXQgPSByZXF1aXJlKCcuL2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0ZWRPYmplY3Q7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkZhY2V0ZWRPYmplY3RgXG4gKiBDb21wb25lbnQgY2xhc3MgaXMgYmFzZWQgb24gYW4gYWJzdHJhY3QgYGBgRmFjZXRlZE9iamVjdGBgYCBjbGFzcy4gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBhbnkgc2l0dWF0aW9uIHdoZXJlIG9iamVjdHMgY2FuIGJlIHJlcHJlc2VudGVkIHZpYSBjb2xsZWN0aW9uIG9mIGZhY2V0cyAoYSBmYWNldCBpcyBhbiBvYmplY3Qgb2YgYSBjZXJ0YWluIGNsYXNzLCBpdCBob2xkcyBpdHMgb3duIGNvbmZpZ3VyYXRpb24sIGRhdGEgYW5kIG1ldGhvZHMpLlxuICogSW4gYSB3YXksIFwiZmFjZXRzIHBhdHRlcm5cIiBpcyBhbiBpbnZlcnNpb24gb2YgXCJhZGFwdGVyIHBhdHRlcm5cIiAtIHdoaWxlIHRoZSBsYXR0ZXIgYWxsb3dzIGZpbmRpbmcgYSBjbGFzcy9tZXRob2RzIHRoYXQgaGFzIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHksIGZhY2V0ZWQgb2JqZWN0IGlzIHNpbXBseSBjb25zdHJ1Y3RlZCB0byBoYXZlIHRoZXNlIGZ1bmN0aW9uYWxpdGllcy5cbiAqIFdpdGggdGhpcyBhcmNoaXRlY3R1cmUgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEgdmlydHVhbGx5IHVubGltaXRlZCBudW1iZXIgb2YgY29tcG9uZW50IGNsYXNzZXMgd2l0aCBhIHZlcnkgbGltaXRlZCBudW1iZXIgb2YgYnVpbGRpbmcgYmxvY2tzIHdpdGhvdXQgaGF2aW5nIGFueSBoaWVyYXJjaHkgb2YgY2xhc3NlcyAtIGFsbCBjb21wb25lbnRzIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBDb21wb25lbnQgY2xhc3MuXG4gKlxuICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgY2FsbGVkIGJ5IGFsbCBzdWJjbGFzc2VzIGNvbnN0cnVjdG9yIChpdCB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5IGlmIGEgc3ViY2xhc3MgaXMgY3JlYXRlZCB3aXRoIGBfLmNyZWF0ZVN1YmNsYXNzYCkuXG4gKlxuICogQHJldHVybiB7RmFjZXRlZE9iamVjdH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCgpIHtcbiAgICAvLyB0aGlzLmZhY2V0c0NvbmZpZyBhbmQgdGhpcy5mYWNldHNDbGFzc2VzIHdlcmUgc3RvcmVkIG9uIGEgc3BlY2lmaWMgY2xhc3MgcHJvdG90eXBlXG4gICAgLy8gd2hlbiB0aGUgY2xhc3Mgd2FzIGNyZWF0ZWQgYnkgRmFjZXRlZE9iamVjdC5jcmVhdGVGYWNldGVkQ2xhc3NcbiAgICB2YXIgZmFjZXRzQ29uZmlnID0gdGhpcy5mYWNldHNDb25maWcgfHwge307XG5cbiAgICB2YXIgZmFjZXRzRGVzY3JpcHRvcnMgPSB7fVxuICAgICAgICAsIGZhY2V0cyA9IHt9O1xuXG4gICAgLy8gRmFjZXRlZE9iamVjdCBjbGFzcyBpdHNlbGYgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCAtIGl0IGhhcyBubyBmYWNldHNcbiAgICAvLyBJdCBtYXkgY2hhbmdlLCBhcyBhZGRpbmcgZmFjZXRzIGlzIHBvc3NpYmxlIHRvIGluc3RhbmNlc1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09IEZhY2V0ZWRPYmplY3QpICAgICAgXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFjZXRlZE9iamVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcywgY2FuXFwndCBiZSBpbnN0YW50aWF0ZWQnKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGNsYXNzIGZhY2V0c1xuICAgIGlmICh0aGlzLmZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleSh0aGlzLmZhY2V0c0NsYXNzZXMsIGluc3RhbnRpYXRlRmFjZXQsIHRoaXMsIHRydWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0cyB0byB0aGUgY2xhc3MgYXMgcHJvcGVydGllcyB1bmRlciB0aGVpciBvd24gbmFtZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGZhY2V0c0Rlc2NyaXB0b3JzKTtcblxuICAgIC8vIHN0b3JlIGFsbCBmYWNldHMgb24gYGZhY2V0c2AgcHJvcGVydHkgc28gdGhhdCB0aGV5IGNhbiBiZSBlbnVtZXJhdGVkXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmFjZXRzJywgZmFjZXRzKTsgICBcblxuICAgIC8vIGNhbGwgYGluaXRgbWV0aG9kIGlmIGl0IGlzIGRlZmluZWQgaW4gc3ViY2xhc3NcbiAgICBpZiAodGhpcy5pbml0KVxuICAgICAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGZhY2V0IHdpdGggYSBnaXZlbiBjbGFzcyAoRmFjZXRDbGFzcykgYW5kIG5hbWUgKGZhY2V0TmFtZSlcbiAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUZhY2V0KEZhY2V0Q2xhc3MsIGZhY2V0TmFtZSkge1xuICAgICAgICAvLyBnZXQgZmFjZXQgY29uZmlndXJhdGlvblxuICAgICAgICB2YXIgZmN0Q29uZmlnID0gZmFjZXRzQ29uZmlnW2ZhY2V0TmFtZV07XG5cbiAgICAgICAgLy8gaW5zdGF0aWF0ZSBmYWNldHNcbiAgICAgICAgZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmY3RDb25maWcpO1xuXG4gICAgICAgIC8vIGFkZCBmYWNldCB0byBwcm9wZXJ0eSBkZXNjcmlwdG9yc1xuICAgICAgICBmYWNldHNEZXNjcmlwdG9yc1tmYWNldE5hbWVdID0ge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBmYWNldHNbZmFjZXROYW1lXVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG4vKipcbiAqICMjIyNGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbY3JlYXRlRmFjZXRlZENsYXNzXSgjRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKVxuICogLSBbaGFzRmFjZXRdKCNGYWNldGVkT2JqZWN0JCRoYXNGYWNldClcbiAqL1xuXy5leHRlbmQoRmFjZXRlZE9iamVjdCwge1xuICAgIGNyZWF0ZUZhY2V0ZWRDbGFzczogRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzLFxuICAgIGhhc0ZhY2V0OiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldCxcbiAgICBnZXRGYWNldENvbmZpZzogRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWdcbn0pO1xuXG5cbi8qKlxuICogIyMjI0ZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFthZGRGYWNldF0oI0ZhY2V0ZWRPYmplY3QkYWRkRmFjZXQpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXRlZE9iamVjdCwge1xuICAgIGFkZEZhY2V0OiBGYWNldGVkT2JqZWN0JGFkZEZhY2V0XG59KTtcblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBhIGZhY2V0IHRvIHRoZSBpbnN0YW5jZSBvZiBGYWNldGVkT2JqZWN0IHN1YmNsYXNzLlxuICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjZXQgdGhhdCB3YXMgY3JlYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGYWNldENsYXNzIGZhY2V0IGNsYXNzIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gZmFjZXRDb25maWcgb3B0aW9uYWwgZmFjZXQgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSBvcHRpb25hbCBmYWNldCBuYW1lLCBGYWNldENsYXNzLm5hbWUgd2lsbCBiZSB1c2VkIGlmIGZhY2V0TmFtZSBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSB0aHJvd09uRXJyb3JzIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtGYWNldH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCRhZGRGYWNldChGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgY2hlY2soRmFjZXRDbGFzcywgRnVuY3Rpb24pO1xuICAgIGNoZWNrKGZhY2V0TmFtZSwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG5cbiAgICAvLyBmaXJzdCBsZXR0ZXIgb2YgZmFjZXQgbmFtZSBzaG91bGQgYmUgbG93ZXJjYXNlXG4gICAgZmFjZXROYW1lID0gXy5maXJzdExvd2VyQ2FzZShmYWNldE5hbWUgfHwgRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIC8vIGdldCBmYWNldHMgZGVmaW5lZCBpbiBjbGFzc1xuICAgIHZhciBwcm90b0ZhY2V0cyA9IHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmZhY2V0c0NsYXNzZXM7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZXROYW1lIHdhcyBub3QgYWxyZWFkeSB1c2VkIGluIHRoZSBjbGFzc1xuICAgIGlmIChwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgY2xhc3MgJyArIHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZU5hbWUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgZmFjZXRlZCBvYmplY3RcbiAgICBpZiAodGhpc1tmYWNldE5hbWVdKSB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcHJlc2VudCBpbiBvYmplY3QnO1xuICAgICAgICBpZiAodGhyb3dPbkVycm9ycyA9PT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdGYWNldGVkT2JqZWN0IGFkZEZhY2V0OiAnLCBtZXNzYWdlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIGluc3RhbnRpYXRlIHRoZSBmYWNldFxuICAgIHZhciBuZXdGYWNldCA9IHRoaXMuZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmYWNldENvbmZpZyk7XG5cbiAgICAvLyBhZGQgZmFjZXQgdG8gZmFjZXRlZCBvYmplY3RcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsIGZhY2V0TmFtZSwgbmV3RmFjZXQsIF8uRU5VTSk7XG5cbiAgICByZXR1cm4gbmV3RmFjZXQ7XG59XG5cblxuLyoqXG4gKiBGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZFxuICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIGZhY2V0IGNsYXNzIGlmIHRoZSBmYWNldCB3aXRoIGBmYWNldE5hbWVgIGlzIHBhcnQgb2YgdGhlIGNsYXNzLCBgdW5kZWZpbmVkYCBvdGhlcndpc2UuIElmIHN1YmNsYXNzIGlzIGNyZWF0ZWQgdXNpbmcgXy5jcmVhdGVTdWJjbGFzcyAoYXMgaXQgc2hvdWxkIGJlKSBpdCB3aWxsIGFsc28gaGF2ZSB0aGlzIG1ldGhvZC5cbiAqIFxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWVcbiAqIEByZXR1cm4ge1N1YmNsYXNzKEZhY2V0KXx1bmRlZmluZWR9IFxuICovXG5mdW5jdGlvbiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldChmYWNldE5hbWUpIHtcbiAgICAvLyB0aGlzIHJlZmVycyB0byB0aGUgRmFjZXRlZE9iamVjdCBjbGFzcyAob3Igc3ViY2xhc3MpLCBub3QgaW5zdGFuY2VcbiAgICB2YXIgcHJvdG9GYWNldHMgPSB0aGlzLnByb3RvdHlwZS5mYWNldHNDbGFzc2VzO1xuICAgIHJldHVybiBwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdO1xufVxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBmYWNldFxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSB0aGUgZmFjZXQgd2hpY2ggY29uZmlnIHNob3VsZCBiZSByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgZmFjZXRcbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWcoZmFjZXROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRmFjZXQoZmFjZXROYW1lKSA/IHRoaXMucHJvdG90eXBlLmZhY2V0c0NvbmZpZ1tmYWNldE5hbWVdIDogbnVsbDtcbn1cblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBDbGFzcyBmYWN0b3J5IHRoYXQgY3JlYXRlcyBjbGFzc2VzIChjb25zdHJ1Y3RvciBmdW5jdGlvbnMpIGZyb20gdGhlIG1hcHMgb2YgZmFjZXRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9ucy5cbiAqIENyZWF0ZWQgY2xhc3Mgd2lsbCBiZSBzdWJjbGFzcyBvZiBgRmFjZXRlZE9iamVjdGAuXG4gKlxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNsYXNzIG5hbWUgKHdpbGwgYmUgZnVuY3Rpb24gbmFtZSBvZiBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvbilcbiAqIEBwYXJhbSB7T2JqZWN0W1N1YmNsYXNzKEZhY2V0KV19IGZhY2V0c0NsYXNzZXMgbWFwIG9mIGNsYXNzZXMgb2YgZmFjZXRzIHRoYXQgd2lsbCBjb25zdGl0dXRlIHRoZSBjcmVhdGVkIGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdfSBmYWNldHNDb25maWcgbWFwIG9mIGZhY2V0cyBjb25maWd1cmF0aW9uLCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBrZXlzIGFzIHRoZSBtYXAgb2YgY2xhc3Nlcy4gU29tZSBmYWNldHMgbWF5IG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24sIGJ1dCB0aGUgY29uZmlndXJhdGlvbiBmb3IgYSBmYWNldCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiBmYWNldHNDbGFzc2VzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uXG4gKiBAcmV0dXJuIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZykge1xuICAgIGNoZWNrKG5hbWUsIFN0cmluZyk7XG4gICAgY2hlY2soZmFjZXRzQ2xhc3NlcywgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT2JqZWN0SGFzaChNYXRjaC5TdWJjbGFzcyhGYWNldCwgdHJ1ZSkpKSk7XG4gICAgY2hlY2soZmFjZXRzQ29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcblxuICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiBjb25maWcgcGFzc2VkIGZvciBmYWNldCBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gY2xhc3NcbiAgICBpZiAoZmFjZXRzQ29uZmlnKVxuICAgICAgICBfLmVhY2hLZXkoZmFjZXRzQ29uZmlnLCBmdW5jdGlvbihmY3RDb25maWcsIGZjdE5hbWUpIHtcbiAgICAgICAgICAgIGlmICghIGZhY2V0c0NsYXNzZXMuaGFzT3duUHJvcGVydHkoZmN0TmFtZSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25maWd1cmF0aW9uIGZvciBmYWNldCAoJyArIGZjdE5hbWUgKyAnKSBwYXNzZWQgdGhhdCBpcyBub3QgaW4gY2xhc3MnKTtcbiAgICAgICAgfSk7XG5cbiAgICAvLyBjcmVhdGUgc3ViY2xhc3Mgb2YgdGhlIGN1cnJlbnQgY2xhc3MgKHRoaXMgcmVmZXJzIHRvIHRoZSBjbGFzcyB0aGF0IGNhbGxzIHRoaXMgbWV0aG9kKVxuICAgIHZhciBGYWNldGVkQ2xhc3MgPSBfLmNyZWF0ZVN1YmNsYXNzKHRoaXMsIG5hbWUsIHRydWUpO1xuXG4gICAgLy8gZ2V0IGZhY2V0cyBjbGFzc2VzIGFuZCBjb25maWd1cmF0aW9ucyBmcm9tIHBhcmVudCBjbGFzc1xuICAgIGZhY2V0c0NsYXNzZXMgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ2xhc3NlcywgJ2ZhY2V0c0NsYXNzZXMnKTtcbiAgICBmYWNldHNDb25maWcgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ29uZmlnLCAnZmFjZXRzQ29uZmlnJyk7XG5cbiAgICAvLyBzdG9yZSBmYWNldHMgY2xhc3NlcyBhbmQgY29uZmlndXJhdGlvbnMgb2YgY2xhc3MgcHJvdG90eXBlXG4gICAgXy5leHRlbmRQcm90byhGYWNldGVkQ2xhc3MsIHtcbiAgICAgICAgZmFjZXRzQ2xhc3NlczogZmFjZXRzQ2xhc3NlcyxcbiAgICAgICAgZmFjZXRzQ29uZmlnOiBmYWNldHNDb25maWdcbiAgICB9KTtcblxuICAgIHJldHVybiBGYWNldGVkQ2xhc3M7XG5cblxuICAgIGZ1bmN0aW9uIGFkZEluaGVyaXRlZEZhY2V0cyhzdXBlckNsYXNzLCBmYWNldHNJbmZvLCBmYWNldHNJbmZvTmFtZSkge1xuICAgICAgICB2YXIgaW5oZXJpdGVkRmFjZXRzSW5mbyA9IHN1cGVyQ2xhc3MucHJvdG90eXBlW2ZhY2V0c0luZm9OYW1lXTtcbiAgICAgICAgaWYgKGluaGVyaXRlZEZhY2V0c0luZm8pXG4gICAgICAgICAgICByZXR1cm4gXyhpbmhlcml0ZWRGYWNldHNJbmZvKVxuICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kKGZhY2V0c0luZm8gfHwge30pLl8oKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGZhY2V0c0luZm87XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENsYXNzUmVnaXN0cnk7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkNsYXNzUmVnaXN0cnlgIC0gdGhlIHJlZ2lzdHJ5IG9mIGNsYXNzZXMgY2xhc3MuXG4gKiBDb21wb25lbnRzIGFuZCBGYWNldHMgcmVnaXN0ZXIgdGhlbXNlbHZlcyBpbiByZWdpc3RyaWVzLiBJdCBhbGxvd3MgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZW0gZnJvbSBvbmUgbW9kdWxlIGFuZCBwcmV2ZW50cyBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmV0d2VlbiBtb2R1bGVzLlxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQWxsIGNsYXNzZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgdGhlIEZvdW5kYXRpb25DbGFzc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDbGFzc1JlZ2lzdHJ5IChGb3VuZGF0aW9uQ2xhc3MpIHtcbiAgICBpZiAoRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICB0aGlzLnNldENsYXNzKEZvdW5kYXRpb25DbGFzcyk7XG5cbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn1cblxuXG4vKipcbiAqICMjIyNDbGFzc1JlZ2lzdHJ5IGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbYWRkXSgjYWRkKVxuICogLSBbZ2V0XSgjZ2V0KVxuICogLSBbcmVtb3ZlXSgjcmVtb3ZlKVxuICogLSBbY2xlYW5dKCNjbGVhbilcbiAqIC0gW3NldENsYXNzXSgjc2V0Q2xhc3MpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oQ2xhc3NSZWdpc3RyeSwge1xuICAgIGFkZDogYWRkLFxuICAgIGdldDogZ2V0LFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGNsZWFuOiBjbGVhbixcbiAgICBzZXRDbGFzczogc2V0Q2xhc3Ncbn0pO1xuXG5cbi8qKlxuICogQ2xhc3NSZWdpc3RyeSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZWdpc3RlcnMgYSBjbGFzcyBpbiB0aGUgcmVnaXN0cnkuXG4gKiBUaGUgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGEgY2xhc3MgaXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc2FtZSBuYW1lIGFzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjbGFzcy5cbiAqIFRoZSBtZXRob2QgYWxsb3dzIHJlZ2lzdGVyaW5nIHRoZSBzYW1lIGNsYXNzIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUsIHNvIGNsYXNzIGFsaWFzZXMgY2FuIGJlIGNyZWF0ZWQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYUNsYXNzIGNsYXNzIHRvIHJlZ2lzdGVyIGluIHRoZSByZWdpc3RyeS4gU2hvdWxkIGJlIHN1YmNsYXNzIG9mIGB0aGlzLkZvdW5kYXRpb25DbGFzc2AuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBjbGFzcyBuYW1lLiBJZiBjbGFzcyBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdGFrZW4gZnJvbSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBuYW1lLiBDbGFzcyBuYW1lIHNob3VsZCBiZSBhIHZhbGlkIGlkZW50aWZpZXIgYW5kIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGFkZChhQ2xhc3MsIG5hbWUpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBhQ2xhc3MubmFtZTtcblxuICAgIGNoZWNrKG5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcsICdjbGFzcyBuYW1lIG11c3QgYmUgaWRlbnRpZmllciBzdHJpbmcnKTtcblxuICAgIGlmICh0aGlzLkZvdW5kYXRpb25DbGFzcykge1xuICAgICAgICBpZiAoYUNsYXNzICE9IHRoaXMuRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICAgICAgY2hlY2soYUNsYXNzLCBNYXRjaC5TdWJjbGFzcyh0aGlzLkZvdW5kYXRpb25DbGFzcyksICdjbGFzcyBtdXN0IGJlIGEgc3ViKGNsYXNzKSBvZiBhIGZvdW5kYXRpb24gY2xhc3MnKTtcbiAgICB9IGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3VuZGF0aW9uIGNsYXNzIG11c3QgYmUgc2V0IGJlZm9yZSBhZGRpbmcgY2xhc3NlcyB0byByZWdpc3RyeScpO1xuXG4gICAgaWYgKHRoaXMuX19yZWdpc3RlcmVkQ2xhc3Nlc1tuYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGFzcyBcIicgKyBuYW1lICsgJ1wiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCcpO1xuXG4gICAgdGhpcy5fX3JlZ2lzdGVyZWRDbGFzc2VzW25hbWVdID0gYUNsYXNzO1xufTtcblxuXG4vKipcbiAqIEdldHMgY2xhc3MgZnJvbSByZWdpc3RyeSBieSBuYW1lXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgQ2xhc3MgbmFtZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgY2hlY2sobmFtZSwgU3RyaW5nLCAnY2xhc3MgbmFtZSBtdXN0IGJlIHN0cmluZycpO1xuICAgIHJldHVybiB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIGZyb20gcmVnaXN0cnkgYnkgaXRzIG5hbWUuXG4gKiBJZiBjbGFzcyBpcyBub3QgcmVnaXN0ZXJlZCwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBuYW1lT3JDbGFzcyBDbGFzcyBuYW1lLiBJZiBjbGFzcyBjb25zdHJ1Y3RvciBpcyBzdXBwbGllZCwgaXRzIG5hbWUgd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiByZW1vdmUobmFtZU9yQ2xhc3MpIHtcbiAgICBjaGVjayhuYW1lT3JDbGFzcywgTWF0Y2guT25lT2YoU3RyaW5nLCBGdW5jdGlvbiksICdjbGFzcyBvciBuYW1lIG11c3QgYmUgc3VwcGxpZWQnKTtcblxuICAgIHZhciBuYW1lID0gdHlwZW9mIG5hbWVPckNsYXNzID09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5hbWVPckNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5hbWVPckNsYXNzLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICBpZiAoISB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2xhc3MgaXMgbm90IHJlZ2lzdGVyZWQnKTtcblxuICAgIGRlbGV0ZSB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgY2xhc3NlcyBmcm9tIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiBjbGVhbigpIHtcbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn07XG5cblxuLyoqXG4gKiBTZXRzIGBGb3VuZGF0aW9uQ2xhc3NgIG9mIHRoZSByZWdpc3RyeS4gSXQgc2hvdWxkIGJlIHNldCBiZWZvcmUgYW55IGNsYXNzIGNhbiBiZSBhZGRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQW55IGNsYXNzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcy4gRm91bmRhdGlvbkNsYXNzIGl0c2VsZiBjYW4gYmUgYWRkZWQgdG8gdGhlIHJlZ2lzdHJ5IHRvby5cbiAqL1xuZnVuY3Rpb24gc2V0Q2xhc3MoRm91bmRhdGlvbkNsYXNzKSB7XG4gICAgY2hlY2soRm91bmRhdGlvbkNsYXNzLCBGdW5jdGlvbik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRm91bmRhdGlvbkNsYXNzJywgRm91bmRhdGlvbkNsYXNzLCBfLkVOVU0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hX2NsYXNzJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgQVRUUklCVVRFX1JFR0VYUD0gL14oW15cXDpcXFtcXF1dKikoPzpcXFsoW15cXDpcXFtcXF1dKilcXF0pP1xcOj8oW146XSopJC9cbiAgICAsIEZBQ0VUU19TUExJVF9SRUdFWFAgPSAvXFxzKig/OlxcLHxcXHMpXFxzKi9cbiAgICAsIEFUVFJJQlVURV9URU1QTEFURSA9ICclY29tcENsYXNzJWNvbXBGYWNldHM6JWNvbXBOYW1lJztcblxuXG4vKipcbiAqIGBtaWxvLmF0dHJpYnV0ZXMuYmluZGBcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgcGFyc2VzL3ZhbGlkYXRlcy9ldGMuIGFuIGF0dHJpYnV0ZSB0aGF0IGJpbmRzIERPTSBlbGVtZW50cyB0byBtaWxvIGNvbXBvbmVudHMuXG4gKiBQb3NzaWJsZSBhdHRyaWJ1dGUgdmFsdWVzIGFyZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXc6bXlWaWV3YCAtIGNsYXNzIGFuZCBjb21wb25lbnQgbmFtZVxuICogLSBgW0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGZhY2V0cyBhbmQgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXdbRXZlbnRzXTpteVZpZXdgIC0gY2xhc3MsIGZhY2V0KHMpIGFuZCBjb21wb25lbnQgbmFtZVxuICpcbiAqIFNlZSBbYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBCaW5kQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdCaW5kQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhCaW5kQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBjbGFzcyBtZXRob2RzXG4gKlxuICogLSBbc2V0SW5mb10oI0JpbmRBdHRyaWJ1dGUkJHNldEluZm8pXG4gKi9cbl8uZXh0ZW5kKEJpbmRBdHRyaWJ1dGUsIHtcbiAgICBzZXRJbmZvOiBCaW5kQXR0cmlidXRlJCRzZXRJbmZvXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEJpbmRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWJpbmQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBiaW5kIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBiaW5kOiAnY2MtYmluZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWJpbmQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMuYmluZDtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGJpbmQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnRpZXMgYGNvbXBDbGFzc2AsIGBjb21wRmFjZXRzYCBhbmQgYGNvbXBOYW1lYCBvbiBCaW5kQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtCaW5kQXR0cmlidXRlfVxuICovXG4gZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgaWYgKCEgdGhpcy5ub2RlKSByZXR1cm47XG5cbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpO1xuXG4gICAgaWYgKHZhbHVlKVxuICAgICAgICB2YXIgYmluZFRvID0gdmFsdWUubWF0Y2goQVRUUklCVVRFX1JFR0VYUCk7XG5cbiAgICBpZiAoISBiaW5kVG8pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiaW5kIGF0dHJpYnV0ZSAnICsgdmFsdWUpO1xuXG4gICAgdGhpcy5jb21wQ2xhc3MgPSBiaW5kVG9bMV0gfHwgJ0NvbXBvbmVudCc7XG4gICAgdGhpcy5jb21wRmFjZXRzID0gKGJpbmRUb1syXSAmJiBiaW5kVG9bMl0uc3BsaXQoRkFDRVRTX1NQTElUX1JFR0VYUCkpIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbXBOYW1lID0gYmluZFRvWzNdIHx8IHVuZGVmaW5lZDsgLy8gdW5kZWZpbmVkIGlzIG5vdCBzYW1lIGFzICcnXG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgdmFsaWRhdGVzIGJpbmQgYXR0cmlidXRlLCB0aHJvd3MgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICpcbiAqIEByZXR1cm4ge0JpbmRBdHRyaWJ1dGV9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICAgIGNoZWNrKHRoaXMuY29tcE5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcpO1xuXG4gICAgaWYgKCEgdGhpcy5jb21wQ2xhc3MpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgY29tcG9uZW50IGNsYXNzIG5hbWUgJyArIHRoaXMuY29tcENsYXNzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIGdpdmVuIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIGBjb21wQ2xhc3NgLCBgY29tcE5hbWVgIGFuZCBgY29tcEZhY2V0c2AuXG4gKiBJZiBgdGhpcy5jb21wTmFtZWAgaXMgbm90IHNldCBpdCB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHRoaXMuY29tcE5hbWUgPSB0aGlzLmNvbXBOYW1lIHx8IG1pbG8udXRpbC5jb21wb25lbnROYW1lKCk7XG4gICAgcmV0dXJuIEFUVFJJQlVURV9URU1QTEFURVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcENsYXNzJywgdGhpcy5jb21wQ2xhc3MgfHwgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyVjb21wRmFjZXRzJywgdGhpcy5jb21wRmFjZXRzICYmIHRoaXMuY29tcEZhY2V0cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnWycgKyB0aGlzLmNvbXBGYWNldHMuam9pbignLCAnKSArICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcE5hbWUnLCB0aGlzLmNvbXBOYW1lKTtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgbWV0aG9kXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1N0cmluZ30gY29tcG9uZW50Q2xhc3Mgb3B0aW9uYWwgY2xhc3MgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGNvbXBvbmVudE5hbWUgb3B0aW9uYWxcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gY29tcG9uZW50RmFjZXRzIG9wdGlvbmFsIGV4dHJhIGZhY2V0IHRvIGFkZCB0byB0aGUgY2xhc3NcbiAqL1xuZnVuY3Rpb24gQmluZEF0dHJpYnV0ZSQkc2V0SW5mbyhlbCwgY29tcG9uZW50Q2xhc3MsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudEZhY2V0cykge1xuICAgIHZhciBhdHRyID0gbmV3IEJpbmRBdHRyaWJ1dGUoZWwpO1xuICAgIF8uZXh0ZW5kKGF0dHIsIHtcbiAgICAgICAgY29tcENsYXNzOiBjb21wb25lbnRDbGFzcyxcbiAgICAgICAgY29tcE5hbWU6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgIGNvbXBGYWNldHM6IGNvbXBvbmVudEZhY2V0c1xuICAgIH0pO1xuICAgIGF0dHIuZGVjb3JhdGUoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQXR0cmlidXRlO1xuXG5cbi8qKlxuICogQW4gYWJzY3RyYWN0IGNsYXNzIGZvciBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uIG9mIGVsZW1lbnQgYXR0cmlidXRlcy5cbiAqIFN1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBtZXRob2RzIGBhdHRyTmFtZWAsIGBwYXJzZWAsIGB2YWxpZGF0ZWAgYW5kIGByZW5kZXJgLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnQgd2hlcmUgYXR0cmlidXRlIGlzIGF0dGFjaGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHVzdWFsbHkgc3VwcGxpZWQgYnkgc3ViY2xhc3MgdmlhIGBhdHRyTmFtZWAgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIEF0dHJpYnV0ZShlbCwgbmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgdGhpcy5hdHRyTmFtZSgpO1xuICAgIHRoaXMuZWwgPSBlbDtcblxuICAgIC8vIGF0dHJpYnV0ZSBub2RlXG4gICAgdGhpcy5ub2RlID0gZWwuYXR0cmlidXRlc1t0aGlzLm5hbWVdO1xufVxuXG5cbl8uZXh0ZW5kKEF0dHJpYnV0ZSwge1xuICAgIHJlbW92ZTogQXR0cmlidXRlJCRyZW1vdmVcbn0pO1xuXG5cbi8qKlxuICogIyMjI0F0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2dldF0oI0F0dHJpYnV0ZSRnZXQpXG4gKiAtIFtzZXRdKCNBdHRyaWJ1dGUkc2V0KVxuICogLSBbZGVjb3JhdGVdKCNBdHRyaWJ1dGUkZGVjb3JhdGUpXG4gKlxuICogVGhlIGZvbGxvd2luZyBpbnN0YW5jZSBtZXRob2RzIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHN1YmNsYXNzXG4gKlxuICogLSBhdHRyTmFtZSAtIHNob3VsZCByZXR1cm4gYXR0cmlidXRlIG5hbWVcbiAqIC0gcGFyc2UgLSBzaG91bGQgcGFyc2UgYXR0cmlidXRlIHZhbHVlXG4gKiAtIHZhbGlkYXRlIC0gc2hvdWxkIHZhbGlkYXRlIGF0dHJpYnV0ZSB2YWx1ZSwgdGhyb3dpbmcgZXhjZXB0aW9uIGlmIGl0IGlzIGluY29ycmVjdCBcbiAqIC0gcmVuZGVyIC0gc2hvdWxkIHJldHVybiBhdHRyaWJ1dGUgdmFsdWUgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlIHN0YXRlIChvdGhlciBwcm9wZXJ0aWVzLCBhcyBkZWZpbmVkIGluIHN1YmNsYXNzKVxuICovXG5fLmV4dGVuZFByb3RvKEF0dHJpYnV0ZSwge1xuICAgIGdldDogQXR0cmlidXRlJGdldCxcbiAgICBzZXQ6IEF0dHJpYnV0ZSRzZXQsXG4gICAgcmVtb3ZlOiBBdHRyaWJ1dGUkcmVtb3ZlLFxuICAgIGRlY29yYXRlOiBBdHRyaWJ1dGUkZGVjb3JhdGUsXG5cbiAgICBkZXN0cm95OiBBdHRyaWJ1dGUkZGVzdHJveSxcblxuICAgIC8vIHNob3VsZCBiZSBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgYXR0ck5hbWU6IHRvQmVJbXBsZW1lbnRlZCxcbiAgICBwYXJzZTogdG9CZUltcGxlbWVudGVkLFxuICAgIHZhbGlkYXRlOiB0b0JlSW1wbGVtZW50ZWQsXG4gICAgcmVuZGVyOiB0b0JlSW1wbGVtZW50ZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIEF0dHJpYnV0ZSQkcmVtb3ZlKGVsLCBkZWVwKSB7XG4gICAgdmFyIG5hbWUgPSB0aGlzLnByb3RvdHlwZS5hdHRyTmFtZSgpO1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblxuICAgIGlmIChkZWVwKSB7XG4gICAgICAgIHZhciBzZWxlY3RvciA9ICdbJyArIG5hbWUgKyAnXSc7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkRWwpIHtcbiAgICAgICAgICAgIGNoaWxkRWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBBdHRyaWJ1dGUkcmVtb3ZlKCkge1xuICAgIGRlbGV0ZSB0aGlzLm5vZGU7XG59XG5cblxuZnVuY3Rpb24gQXR0cmlidXRlJGRlc3Ryb3koKSB7XG4gICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgZGVsZXRlIHRoaXMubm9kZTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcmV0dXJucyBhdHRyaWJ1dGUgdmFsdWUgYXMgc3RyaW5nLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5nZXRBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbn1cblxuXG4vKipcbiAqIEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCBzZXRzIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJHNldCh2YWx1ZSkge1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKHRoaXMubmFtZSwgdmFsdWUpO1xufVxuXG5cbi8qKlxuICogQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IGRlY29yYXRlcyBlbGVtZW50IHdpdGggaXRzIHJlbmRlcmVkIHZhbHVlLlxuICogVXNlcyBgcmVuZGVyYCBtZXRob2QgdGhhdCBzaG91bGQgYmUgZGVmaWVuZCBpbiBzdWJjbGFzcy5cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGRlY29yYXRlKCkge1xuICAgIHRoaXMuc2V0KHRoaXMucmVuZGVyKCkpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQmVJbXBsZW1lbnRlZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIG1ldGhvZCBvZiBhbiBhYnNjdHJhY3QgY2xhc3MnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEF0dHJpYnV0ZSA9IHJlcXVpcmUoJy4vYV9jbGFzcycpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8uYXR0cmlidXRlcy5sb2FkYFxuICogTG9hZEF0dHJpYnV0ZSBjbGFzcyBwYXJzZXMvdmFsaWRhdGVzL2V0Yy4gYW4gYXR0cmlidXRlIHRoYXQgbG9hZHMgc3ViLXZpZXdzIGludG8gdGhlIHBhZ2UuXG4gKiBBdHRyaWJ1dGUgdmFsdWUgc2hvdWxkIGJlIFVSTCBvZiB0aGUgZmlsZSB0byBsb2FkIHN1YnZpZXcgZnJvbS5cbiAqIFNlZSBbbG9hZGVyXSguLi9sb2FkZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBMb2FkQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdMb2FkQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjTG9hZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhMb2FkQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExvYWRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWxvYWQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBsb2FkIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBsb2FkOiAnY2MtbG9hZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWxvYWQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMubG9hZDtcbn1cblxuXG4vKipcbiAqIExvYWRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGxvYWQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnR5IGBsb2FkVXJsYCBvbiBMb2FkQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiBwYXJzZSgpIHtcbiAgICBpZiAoISB0aGlzLm5vZGUpIHJldHVybjtcblxuICAgIHRoaXMubG9hZFVybCA9IHRoaXMuZ2V0KCk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHNob3VsZCB2YWxpZGF0ZSBsb2FkIGF0dHJpYnV0ZSBhbmQgdGhyb3cgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBUT0RPIC0gaW1wbGVtZW50IHVybCB2YWxpZGF0aW9uLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgICAvLyBUT0RPIHVybCB2YWxpZGF0aW9uXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCAtIHJldHVybnMgVVJMXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZFVybDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTdWJjbGFzc2VzIG9mIFtBdHRyaWJ1dGVdKC4vYV9jbGFzcy5qcy5odG1sKSBjbGFzc1xuICpcbiAqIC0gW0JpbmRBdHRyaWJ1dGVdKC4vYV9iaW5kLmpzLmh0bWwpXG4gKiAtIFtMb2FkQXR0cmlidXRlXSguL2FfbG9hZC5qcy5odG1sKVxuICovXG52YXIgYXR0cmlidXRlcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGJpbmQ6IHJlcXVpcmUoJy4vYV9iaW5kJyksXG4gICAgbG9hZDogcmVxdWlyZSgnLi9hX2xvYWQnKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9NYWlsID0gcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX3JlZ2lzdHJ5JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudCA9IGNvbXBvbmVudHNSZWdpc3RyeS5nZXQoJ0NvbXBvbmVudCcpXG4gICAgLCBDb21wb25lbnRJbmZvID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfaW5mbycpXG4gICAgLCBTY29wZSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9zY29wZScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgdXRpbERvbSA9IHJlcXVpcmUoJy4vdXRpbC9kb20nKVxuICAgICwgTWF0Y2ggPSAgY2hlY2suTWF0Y2g7XG5cblxuYmluZGVyLnNjYW4gPSBzY2FuO1xuYmluZGVyLmNyZWF0ZSA9IGNyZWF0ZTtcbmJpbmRlci50d29QYXNzID0gdHdvUGFzcztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmRlcjtcblxuXG4vKipcbiAqIGBtaWxvLmJpbmRlcmBcbiAqXG4gKiBSZWN1cnNpdmVseSBzY2FucyB0aGUgZG9jdW1lbnQgdHJlZSBpbnNpZGUgYHNjb3BlRWxgIChkb2N1bWVudC5ib2R5IGJ5IGRlZmF1bHQpIGxvb2tpbmcgZm9yIF9fbWwtYmluZF9fIGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBjb250YWluIHRoZSBjbGFzcywgYWRkaXRpb25hbCBmYWNldHMgYW5kIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBhbmQgYm91bmQgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogUG9zc2libGUgdmFsdWVzIG9mIF9fbWwtYmluZF9fIGF0dHJpYnV0ZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIENvbXBvbmVudCBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dCBhbnkgZmFjZXRzLlxuICogLSBgVmlldzpteVZpZXdgIC0gY2xhc3MgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBWaWV3IGNsYXNzIHdpbGwgYmUgY3JlYXRlZC5cbiAqIC0gYFtFdmVudHMsIERhdGFdOm15Vmlld2AgLSBmYWNldHMgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBDb21wb25lbnQgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKiAtIGBWaWV3W0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGNsYXNzLCBmYWNldChzKSBhbmQgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIFZpZXcgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKlxuICogRnVuY3Rpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBbYFNjb3BlYF0oLi9jb21wb25lbnRzL3Njb3BlLmpzLmh0bWwpIGNsYXNzIGNvbnRhaW5pbmcgYWxsIGNvbXBvbmVudHMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBzY2FubmluZyBET00uXG4gKlxuICogSWYgdGhlIGNvbXBvbmVudCBoYXMgW2BDb250YWluZXJgXSguL2NvbXBvbmVudHMvY19mYWNldHMvQ29udGFpbmVyLmpzKSBmYWNldCwgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBgc2NvcGVgIG9iamVjdCwgYXZhaWxhYmxlIGFzIHNjb3BlIHByb3BlcnR5IG9uIHRoZSBDb250YWluZXIgZmFjZXQgb2YgdGhpcyBjb21wb25lbnQuIE5hbWVzIG9mIGNvbXBvbmVudHMgd2l0aGluIHRoZSBzY29wZSBzaG91bGQgYmUgdW5pcXVlLCBidXQgdGhleSBjYW4gYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWVzIG9mIGNvbXBvbmVudHMgaW4gb3V0ZXIgc2NvcGUgKG9yIHNvbWUgb3RoZXIgc2NvcGUpLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gc2NvcGVFbCByb290IGVsZW1lbnQgaW5zaWRlIHdoaWNoIERPTSB3aWxsIGJlIHNjYW5uZWQgYW5kIGJvdW5kXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgT3B0aW9uYWwgUm9vdCBzY29wZSBvYmplY3Qgd2hlcmUgdG9wIGxldmVsIGNvbXBvbmVudHMgd2lsbCBiZSBzYXZlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYmluZFJvb3RFbGVtZW50IElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqIEByZXR1cm4ge1Njb3BlfVxuICovXG5mdW5jdGlvbiBiaW5kZXIoc2NvcGVFbCwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpIHtcbiAgICByZXR1cm4gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgICAgIHZhciBpbmZvID0gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGUoaW5mbywgdGhyb3dPbkVycm9ycyk7XG4gICAgfSwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIGJpbmQgaW4gdHdvIHBhc3Nlc1xuZnVuY3Rpb24gdHdvUGFzcyhzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY2FuU2NvcGUgPSBiaW5kZXIuc2NhbihzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG4gICAgcmV0dXJuIGJpbmRlci5jcmVhdGUoc2NhblNjb3BlLCB1bmRlZmluZWQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIHNjYW4gRE9NIGZvciBCaW5kQXR0cmlidXRlXG5mdW5jdGlvbiBzY2FuKHNjb3BlRWwsIHJvb3RTY29wZSwgYmluZFJvb3RFbGVtZW50LCB0aHJvd09uRXJyb3JzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJpbmRlclNjb3BlKHNjb3BlRWwsIGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0ciwgdGhyb3dPbkVycm9ycykge1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICB9LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG59XG5cblxuLy8gY3JlYXRlIGJvdW5kIGNvbXBvbmVudHNcbmZ1bmN0aW9uIGNyZWF0ZShzY2FuU2NvcGUsIGhvc3RPYmplY3QsIHRocm93T25FcnJvcnMpIHtcbiAgICB2YXIgc2NvcGUgPSBuZXcgU2NvcGUoc2NhblNjb3BlLl9yb290RWwsIGhvc3RPYmplY3QpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgc2NhblNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBJbmZvKSB7XG4gICAgICAgIC8vIHNldCBjb3JyZWN0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgICAgIHZhciBpbmZvID0gXy5jbG9uZShjb21wSW5mbylcbiAgICAgICAgaW5mby5zY29wZSA9IHNjb3BlO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBjb21wb25lbnRcbiAgICAgICAgdmFyIGFDb21wb25lbnQgPSBDb21wb25lbnQuY3JlYXRlKGluZm8sIHRocm93T25FcnJvcnMpO1xuXG4gICAgICAgIHNjb3BlW2FkZE1ldGhvZF0oYUNvbXBvbmVudCwgYUNvbXBvbmVudC5uYW1lKTtcbiAgICAgICAgaWYgKGFDb21wb25lbnQuY29udGFpbmVyKVxuICAgICAgICAgICAgYUNvbXBvbmVudC5jb250YWluZXIuc2NvcGUgPSBjcmVhdGUoY29tcEluZm8uY29udGFpbmVyLnNjb3BlLCBhQ29tcG9uZW50LmNvbnRhaW5lciwgdGhyb3dPbkVycm9ycyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2NvcGU7XG59XG5cbi8qKlxuICogYGNyZWF0ZUJpbmRlclNjb3BlYFxuICogQHBhcmFtICB7RWxlbWVudH0gc2NvcGVFbCAgICAgICAgICAgICBzY29wZUVsIHJvb3QgZWxlbWVudCBpbnNpZGUgd2hpY2ggRE9NIHdpbGwgYmUgc2Nhbm5lZCBhbmQgYm91bmQgKGRvY3VtZW50LmJvZHkgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gc2NvcGVPYmplY3RGYWN0b3J5IFNlZSBbYmluZGVyXSgjbWlsby5iaW5kZXIpXG4gKiBAcGFyYW0gIHtTY29wZX0gcm9vdFNjb3BlICAgICAgICAgICAgIE9wdGlvbmFsIFJvb3Qgc2NvcGUgb2JqZWN0IHdoZXJlIHRvcCBsZXZlbCBjb21wb25lbnRzIHdpbGwgYmUgc2F2ZWQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBiaW5kUm9vdEVsZW1lbnQgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSB0aHJvd09uRXJyb3JzICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtTY29wZX0gICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgc2NvcGVPYmplY3RGYWN0b3J5LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY29wZUVsID0gc2NvcGVFbCB8fCBkb2N1bWVudC5ib2R5XG4gICAgICAgICwgc2NvcGUgPSByb290U2NvcGUgfHwgbmV3IFNjb3BlKHNjb3BlRWwpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgY3JlYXRlU2NvcGVGb3JFbGVtZW50KHNjb3BlLCBzY29wZUVsLCBiaW5kUm9vdEVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIHNjb3BlO1xuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckVsZW1lbnQoc2NvcGUsIGVsLCBiaW5kUm9vdEVsZW1lbnQpIHtcbiAgICAgICAgLy8gZ2V0IGVsZW1lbnQncyBiaW5kaW5nIGF0dHJpYnV0ZSAobWwtYmluZCBieSBkZWZhdWx0KVxuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcblxuICAgICAgICAvLyBpZiBlbGVtZW50IGhhcyBiaW5kIGF0dHJpYnV0ZSBjcmF0ZSBzY29wZSBvYmplY3QgKENvbXBvbmVudCBvciBDb21wb25lbnRJbmZvKVxuICAgICAgICBpZiAoYXR0ci5ub2RlICYmIGJpbmRSb290RWxlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHZhciBzY29wZWRPYmplY3QgPSBzY29wZU9iamVjdEZhY3Rvcnkoc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKVxuICAgICAgICAgICAgICAgICwgaXNDb250YWluZXIgPSB0eXBlb2Ygc2NvcGVkT2JqZWN0ICE9ICd1bmRlZmluZWQnICYmIHNjb3BlZE9iamVjdC5jb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgY2hpbGROb2RlcyBhZGQgY2hpbGRyZW4gdG8gbmV3IHNjb3BlIGlmIHRoaXMgZWxlbWVudCBoYXMgY29tcG9uZW50IHdpdGggQ29udGFpbmVyIGZhY2V0XG4gICAgICAgIC8vIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgc2NvcGVcbiAgICAgICAgaWYgKGVsLmNoaWxkTm9kZXMgJiYgZWwuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHZhciBpbm5lclNjb3BlID0gbmV3IFNjb3BlKGVsKTtcbiAgICAgICAgICAgICAgICBzY29wZWRPYmplY3QuY29udGFpbmVyLnNjb3BlID0gaW5uZXJTY29wZTtcbiAgICAgICAgICAgICAgICBpbm5lclNjb3BlLl9ob3N0T2JqZWN0ID0gc2NvcGVkT2JqZWN0LmNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3JlYXRlU2NvcGVGb3JDaGlsZHJlbihlbCwgaXNDb250YWluZXIgPyBpbm5lclNjb3BlIDogc2NvcGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2NvcGUgd2Fzbid0IHByZXZpb3VzbHkgY3JlYXRlZCBvbiBjb250YWluZXIgZmFjZXQsIGNyZWF0ZSBlbXB0eSBzY29wZSBhbnl3YXlcbiAgICAgICAgaWYgKGlzQ29udGFpbmVyICYmICEgc2NvcGVkT2JqZWN0LmNvbnRhaW5lci5zY29wZSlcbiAgICAgICAgICAgIHNjb3BlZE9iamVjdC5jb250YWluZXIuc2NvcGUgPSBuZXcgU2NvcGUoZWwpO1xuXG5cbiAgICAgICAgLy8gVE9ETyBjb25kaXRpb24gYWZ0ZXIgJiYgaXMgYSBoYWNrLCBzaG91bGQgbm90IGJlIHVzZWQhXG4gICAgICAgIGlmIChzY29wZWRPYmplY3QpIC8vICYmICEgc2NvcGVbYXR0ci5jb21wTmFtZV0pXG4gICAgICAgICAgICBzY29wZVthZGRNZXRob2RdKHNjb3BlZE9iamVjdCwgYXR0ci5jb21wTmFtZSk7XG5cbiAgICAgICAgLy8gXy5kZWZlcihwb3N0Q2hpbGRyZW5Cb3VuZE1lc3NhZ2UsIGVsKTtcbiAgICAgICAgcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKTtcblxuICAgICAgICByZXR1cm4gc2NvcGVkT2JqZWN0O1xuXG5cbiAgICAgICAgZnVuY3Rpb24gcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKSB7XG4gICAgICAgICAgICB2YXIgZWxDb21wID0gQ29tcG9uZW50LmdldENvbXBvbmVudChlbCk7XG5cbiAgICAgICAgICAgIGlmIChlbENvbXApXG4gICAgICAgICAgICAgICAgZWxDb21wLnBvc3RNZXNzYWdlU3luYygnY2hpbGRyZW5ib3VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckNoaWxkcmVuKGNvbnRhaW5lckVsLCBzY29wZSkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB1dGlsRG9tLmNoaWxkcmVuKGNvbnRhaW5lckVsKTtcblxuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGNyZWF0ZVNjb3BlRm9yRWxlbWVudChzY29wZSwgbm9kZSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29yZUNsYXNzZXMgPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5jbGFzc2VzO1xuXG4vLyA8YSBuYW1lPVwiY2xhc3Nlc1wiPjwvYT5cbi8vIG1pbG8uY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gVGhpcyBtb2R1bGUgY29udGFpbnMgZm91bmRhdGlvbiBjbGFzc2VzIGFuZCBjbGFzcyByZWdpc3RyaWVzLlxuXG52YXIgY2xhc3NlcyA9IHtcbiAgICBGYWNldDogcmVxdWlyZSgnLi9hYnN0cmFjdC9mYWNldCcpLFxuICAgIEZhY2V0ZWRPYmplY3Q6IHJlcXVpcmUoJy4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QnKSxcbiAgICBTY29wZTogcmVxdWlyZSgnLi9jb21wb25lbnRzL3Njb3BlJyksXG4gICAgQ2xhc3NSZWdpc3RyeTogcmVxdWlyZSgnLi9hYnN0cmFjdC9yZWdpc3RyeScpLFxuICAgIE1peGluOiBjb3JlQ2xhc3Nlcy5NaXhpbixcbiAgICBNZXNzYWdlU291cmNlOiBjb3JlQ2xhc3Nlcy5NZXNzYWdlU291cmNlLFxuICAgIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2U6IGNvcmVDbGFzc2VzLk1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UsXG4gICAgTWVzc2VuZ2VyQVBJOiBjb3JlQ2xhc3Nlcy5NZXNzZW5nZXJBUEksXG4gICAgRE9NRXZlbnRzU291cmNlOiByZXF1aXJlKCcuL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzJyksXG4gICAgVHJhbnNhY3Rpb246IHJlcXVpcmUoJy4vY29tbWFuZC90cmFuc2FjdGlvbicpLFxuICAgIFRyYW5zYWN0aW9uSGlzdG9yeTogcmVxdWlyZSgnLi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnknKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc2VzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQWN0aW9uc0hpc3Rvcnk7XG5cblxuLyoqXG4gKiBTdG9yZXMgbGlzdCBvZiBjb21tYW5kcyBvciB0cmFuc2FjdGlvbnNcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhMZW5ndGhcbiAqL1xuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gbWF4TGVuZ3RoIHx8IEluZmluaXR5O1xuICAgIHRoaXMuYWN0aW9ucyA9IFtdO1xuICAgIHRoaXMucG9zaXRpb24gPSAwO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oQWN0aW9uc0hpc3RvcnksIHtcbiAgICBzdG9yZTogQWN0aW9uc0hpc3Rvcnkkc3RvcmUsXG4gICAgZGVsZXRlTGFzdDogQWN0aW9uc0hpc3RvcnkkZGVsZXRlTGFzdCxcbiAgICB1bmRvOiBBY3Rpb25zSGlzdG9yeSR1bmRvLFxuICAgIHJlZG86IEFjdGlvbnNIaXN0b3J5JHJlZG8sXG4gICAgdW5kb0FsbDogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbCxcbiAgICByZWRvQWxsOiBBY3Rpb25zSGlzdG9yeSRyZWRvQWxsLFxuICAgIHVuZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbEFzeW5jLFxuICAgIHJlZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkcmVkb0FsbEFzeW5jLFxuICAgIGVhY2g6IEFjdGlvbnNIaXN0b3J5JGVhY2gsXG4gICAgZWFjaFJldmVyc2U6IEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlLFxuICAgIGdldExhc3RBY3Rpb246IEFjdGlvbnNIaXN0b3J5JGdldExhc3RBY3Rpb24sXG5cbiAgICBnZXREZXNjcmlwdGlvbjogQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb25cbn0pO1xuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHN0b3JlKGNvbW1hbmQpIHtcbiAgICBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbi5jYWxsKHRoaXMpO1xuICAgIHRoaXMuYWN0aW9ucy5wdXNoKGNvbW1hbmQpO1xuXG4gICAgaWYgKHRoaXMuYWN0aW9ucy5sZW5ndGggPiB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICBhY3QuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSB0aGlzLmFjdGlvbnMubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uIC0gMVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGRlbGV0ZUxhc3QoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGlvbnMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5wb3NpdGlvbi0tO1xuICAgIHRoaXMuYWN0aW9ucy5sZW5ndGgtLTtcbn1cblxuXG5mdW5jdGlvbiBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbigpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5wb3NpdGlvbjsgaSA8IHRoaXMuYWN0aW9ucy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGhpcy5hY3Rpb25zW2ldLmRlc3Ryb3koKTtcbiAgICB0aGlzLmFjdGlvbnMubGVuZ3RoID0gdGhpcy5wb3NpdGlvbjtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvKGNiKSB7XG4gICAgaWYgKHRoaXMucG9zaXRpb24gPT0gMCkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIHVuZG9cbiAgICB2YXIgYWN0ID0gdGhpcy5hY3Rpb25zWy0tdGhpcy5wb3NpdGlvbl07XG4gICAgYWN0LnVuZG8oY2IpO1xuICAgIHJldHVybiBhY3Q7XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkcmVkbyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uID09IHRoaXMuYWN0aW9ucy5sZW5ndGgpIHJldHVybjsgLy8gbm90aGluZyB0byByZWRvXG4gICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uKytdO1xuICAgIGFjdC5yZWRvKGNiKTtcbiAgICByZXR1cm4gYWN0O1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHVuZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24pIHRoaXMudW5kbygpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSB0aGlzLnJlZG8oKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvQWxsQXN5bmMoY2IpIHtcbiAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuICAgICAgICB0aGlzLnVuZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24pXG4gICAgICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICd1bmRvQWxsQXN5bmMnLCBjYik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGxBc3luYyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIDwgdGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSBcbiAgICAgICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgJ3JlZG9BbGxBc3luYycsIGNiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZWFjaChmdW5jT3JNZXRob2QsIHRoaXNBcmcpIHtcbiAgICB2YXIgZnVuYyA9IHR5cGVvZiBmdW5jT3JNZXRob2QgPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKGFjdCkgeyBhY3RbZnVuY09yTWV0aG9kXSgpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jT3JNZXRob2Q7XG5cbiAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaChmdW5jLCB0aGlzQXJnIHx8IHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlKGZ1bmNPck1ldGhvZCwgdGhpc0FyZykge1xuICAgIHRoaXMuYWN0aW9ucy5yZXZlcnNlKCk7XG4gICAgdGhpcy5lYWNoKGZ1bmNPck1ldGhvZCwgdGhpc0FyZyk7XG4gICAgdGhpcy5hY3Rpb25zLnJldmVyc2UoKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSRnZXRMYXN0QWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uICYmIHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uIC0gMV07XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnMubWFwKGZ1bmN0aW9uKGFjdCkge1xuICAgICAgICByZXR1cm4gYWN0LmdldERlc2NyaXB0aW9uKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uczogYWN0aW9ucyxcbiAgICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXG4gICAgICAgIGxlbmd0aDogYWN0aW9ucy5sZW5ndGhcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2xhc3NSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L3JlZ2lzdHJ5JylcbiAgICAsIENvbW1hbmQgPSByZXF1aXJlKCcuL2luZGV4Jyk7XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuY29tcG9uZW50c2BcbiAqIEFuIGluc3RhbmNlIG9mIFtDbGFzc1JlZ2lzdHJ5XSguLi9hYnN0cmFjdC9yZWdpc3RyeS5qcy5odG1sKSBjbGFzcyB0aGF0IGlzIHVzZWQgYnkgbWlsbyB0byByZWdpc3RlciBhbmQgZmluZCBjb21wb25lbnRzLlxuICovXG52YXIgY29tbWFuZHNSZWdpc3RyeSA9IG5ldyBDbGFzc1JlZ2lzdHJ5KENvbW1hbmQpO1xuXG4vLyBhZGQgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBjb21wb25lbnRzIHRvIHRoZSByZWdpc3RyeS5cbmNvbW1hbmRzUmVnaXN0cnkuYWRkKENvbW1hbmQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbW1hbmRzUmVnaXN0cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG52YXIgVU5ET19DT01NQU5EID0gJ191bmRvQ29tbWFuZCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb21tYW5kO1xuXG5cbi8qKlxuICogQ29tbWFuZCBjbGFzcyB0byBpbXBsZW1lbnQgXCJjb21tYW5kIHBhdHRlcm5cIiAtIHBhY2thZ2luZyBsbCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGRlbGF5ZWQgbWV0aG9kIGV4ZWN1dGlvblxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBDb21tYW5kKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb21tYW5kIGluc3RhbmNlIG1ldGhvZHNcbiAqIFxuICogLSBbaW5pdF0oI0NvbW1hbmQkZXhlY3V0ZSkgLSBpbml0aWFsaXplIGNvbW1hbmQsIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBzdWJjbGFzc2VzXG4gKiAtIFtleGVjdXRlXSgjQ29tbWFuZCRleGVjdXRlKSAtIGV4ZWN1dGUgY29tbWFuZFxuICogLSBbc2V0VW5kb10oI0NvbW1hbmQkc2V0VW5kbykgLSBzZXQgdW5kbyBjb21tYW5kIGZvciB0aGlzIGNvbW1hbmRcbiAqIC0gW2dldFVuZG9dKCNDb21tYW5kJGdldFVuZG8pIC0gZ2V0IHVuZG8gY29tbWFuZCBvZiB0aGlzIGNvbW1hbmRcbiAqIC0gW3NldEFyZ3VtZW50c10oI0NvbW1hbmQkc2V0QXJndW1lbnRzKSAtIHNldCBjb21tYW5kcyBhcmd1bWVudHNcbiAqIC0gW2FkZEFyZ3VtZW50c10oI0NvbW1hbmQkYWRkQXJndW1lbnRzKSAtIGFkZCBhcmd1bWVudHMgdG8gY29tbWFuZFxuICogLSBbZGVzdHJveV0oI0NvbW1hbmQkZGVzdHJveSlcbiAqL1xuXy5leHRlbmRQcm90byhDb21tYW5kLCB7XG4gICAgaW5pdDogQ29tbWFuZCRpbml0LFxuICAgIGV4ZWN1dGU6IENvbW1hbmQkZXhlY3V0ZSxcbiAgICBzZXRVbmRvOiBDb21tYW5kJHNldFVuZG8sXG4gICAgZ2V0VW5kbzogQ29tbWFuZCRnZXRVbmRvLFxuICAgIHVuZG86IENvbW1hbmQkdW5kbyxcbiAgICByZWRvOiBDb21tYW5kJGV4ZWN1dGUsIC8vIHNhbWUgZm9yIGNvbW1hbmQsIGRpZmZlcmVudCBmb3IgdHJhbnNhY3Rpb25cbiAgICBzZXRBcmd1bWVudHM6IENvbW1hbmQkc2V0QXJndW1lbnRzLFxuICAgIGFkZEFyZ3VtZW50czogQ29tbWFuZCRhZGRBcmd1bWVudHMsXG4gICAgZ2V0QXJndW1lbnRzOiBDb21tYW5kJGdldEFyZ3VtZW50cyxcbiAgICBjaGFuZ2VBcmd1bWVudHM6IENvbW1hbmQkY2hhbmdlQXJndW1lbnRzLFxuICAgIGRlc3Ryb3k6IENvbW1hbmQkZGVzdHJveSxcblxuICAgIHNldENvbW1lbnQ6IENvbW1hbmQkc2V0Q29tbWVudCxcbiAgICBnZXREZXNjcmlwdGlvbjogQ29tbWFuZCRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuLyoqXG4gKiBDb21tYW5kIGNsYXNzIG1ldGhvZHNcbiAqXG4gKiAtIFtjcmVhdGVdKCNDb21tYW5kJCRjcmVhdGUpIC0gY29tbWFuZHMgZmFjdG9yeVxuICovXG5fLmV4dGVuZChDb21tYW5kLCB7XG4gICAgY3JlYXRlOiBDb21tYW5kJCRjcmVhdGUsXG4gICAgY3JlYXRlV2l0aFVuZG86IENvbW1hbmQkJGNyZWF0ZVdpdGhVbmRvXG59KTtcblxuXG5mdW5jdGlvbiBDb21tYW5kJGluaXQoZnVuYykgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICBjaGVjayhmdW5jLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuICAgIHRoaXMuZnVuYyA9IGZ1bmMgfHwgZnVuY3Rpb24oKXt9O1xuICAgIHRoaXMuYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTsgICAgXG59XG5cblxuLyoqXG4gKiBFeGVjdXRlIGNvbW1hbmQgbWFraW5nIGNvbW1hbmQgb2JqZWN0IGF2YWlsYWJsZSB2aWEgZnVuY3Rpb24gcHJvcGVydHkuIFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGV4ZWN1dGUoY2IpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5mdW5jLmFwcGx5KHRoaXMsIHRoaXMuYXJncyk7XG4gICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8qKlxuICogU2V0IHVuZG8gY29tbWFuZCBmb3IgdGhpcyBjb21tYW5kLiBUaGlzIGNvbW1hbmQgYmVjb21lcyB1bmRvIGNvbW1hbmQgZm9yIHVuZG8gY29tbWFuZCAoc28gdW5kbyBjb21tYW5kIGNhbiBjaGFuZ2UgdGhpcyBjb21tYW5kIGR1cmluZyBpdHMgZXhlY3V0aW9uKS5cbiAqIFxuICogQHBhcmFtIHtDb21tYW5kfSB1bmRvQ29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJHNldFVuZG8odW5kb0NvbW1hbmQpIHtcbiAgICBpZiAodGhpc1tVTkRPX0NPTU1BTkRdKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRVbmRvOiB1bmRvIGNvbW1hbmQgaXMgYWxyZWFkeSBzZXQnKTtcblxuICAgIHRoaXNbVU5ET19DT01NQU5EXSA9IHVuZG9Db21tYW5kO1xuICAgIHVuZG9Db21tYW5kW1VORE9fQ09NTUFORF0gPSB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB1bmRvIGNvbW1hbmQgb2YgYSBnaXZlbiBjb21tYW5kXG4gKlxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRnZXRVbmRvKCkge1xuICAgIHJldHVybiB0aGlzW1VORE9fQ09NTUFORF07XG59XG5cblxuLyoqXG4gKiBFeGVjdXRlcyB1bmRvIGNvbW1hbmQgb2YgY3VycmVudCBjb21tYW5kXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkdW5kbyhjYikge1xuICAgIHZhciB1bmRvQ21kID0gdGhpcy5nZXRVbmRvKCk7XG4gICAgaWYgKCEgdW5kb0NtZCkgcmV0dXJuIGxvZ2dlci5lcnJvcignQ29tbWFuZCB1bmRvIGNhbGxlZCB3aXRob3V0IHVuZG8gY29tbWFuZCBwcmVzZW50Jyk7XG4gICAgdmFyIHJlc3VsdCA9IHVuZG9DbWQuZXhlY3V0ZSgpO1xuICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vKipcbiAqIFNldCBjb21tYW5kJ3MgYXJndW1lbnRzLiBJZiBhcmd1bWVudHMgd2VyZSBzZXQgZHVyaW5nIGNvbW1hbmQncyBjcmVhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBvdmVyd3JpdGUgYXJndW1lbnRzIGFuZCBsb2cgd2FybmluZy5cbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHNcbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRzZXRBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgaWYgKHRoaXMuYXJncyAmJiB0aGlzLmFyZ3MubGVuZ3RoKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRBcmd1bWVudHM6IGNvbW1hbmQgYXJndW1lbnRzIGFyZSBhbHJlYWR5IHNldCcpO1xuICAgIHRoaXMuYXJncyA9IF8udG9BcnJheShhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0QXJndW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmFyZ3M7XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRjaGFuZ2VBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5hcmdzID0gXy50b0FycmF5KGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBBZGQgKGFwcGVuZCkgYXJndW1lbnRzIHRvIGNvbW1hbmRcbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHMgYXJndW1lbnRzIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gY29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGFkZEFyZ3VtZW50cygpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICBpZiAoISB0aGlzLmFyZ3MpIHRoaXMuYXJncyA9IFtdO1xuICAgIF8uYXBwZW5kQXJyYXkodGhpcy5hcmdzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogQ29tbWFuZHMgZmFjdG9yeS4gTGlrZWx5IG90IGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgY3VzdG9tIGxvZ2ljIG9mIGNvbW1hbmQgY29uc3RydWN0aW9uXG4gKiBcbiAqIEB0aGlzIHtGdW5jdGlvbn0gQ2xhc3Mgb2YgY29tbWFuZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCQkY3JlYXRlKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgcmV0dXJuIF8ubmV3QXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21tYW5kJCRjcmVhdGVXaXRoVW5kbygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVdpdGhVbmRvIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBzdWJzY2xhc3MnKTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY3VycmVudCBjb21tYW5kICh0byBwcmV2ZW50IHBvdGVudGlhbCBtZW1vcnkgbGVha3Mgd2hlbiBjb21tYW5kcyBwb2ludCB0byBET00gZWxlbWVudHMpXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkZGVzdHJveSgpIHtcbiAgICBkZWxldGUgdGhpcy5mdW5jO1xuICAgIGRlbGV0ZSB0aGlzLmFyZ3M7XG4gICAgdmFyIHVuZG9DbWQgPSB0aGlzW1VORE9fQ09NTUFORF07XG4gICAgaWYgKHVuZG9DbWQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbVU5ET19DT01NQU5EXVtVTkRPX0NPTU1BTkRdO1xuICAgICAgICBkZWxldGUgdGhpc1tVTkRPX0NPTU1BTkRdO1xuICAgICAgICB1bmRvQ21kLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRzZXRDb21tZW50KGNvbW1lbnQpIHtcbiAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50O1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnVuYzogdGhpcy5mdW5jLm5hbWUsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuY29tbWVudFxuICAgIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIEFjdGlvbnNIaXN0b3J5ID0gcmVxdWlyZSgnLi9hY3Rpb25zX2hpc3RvcnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNhY3Rpb247XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24oKSB7XG4gICAgdGhpcy5jb21tYW5kcyA9IG5ldyBBY3Rpb25zSGlzdG9yeTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uLCB7XG4gICAgZXhlY3V0ZTogVHJhbnNhY3Rpb24kZXhlY3V0ZSxcbiAgICB1bmRvOiBUcmFuc2FjdGlvbiR1bmRvLFxuICAgIHJlZG86IFRyYW5zYWN0aW9uJHJlZG8sXG4gICAgZGVzdHJveTogVHJhbnNhY3Rpb24kZGVzdHJveSxcbiAgICBzdG9yZUNvbW1hbmQ6IFRyYW5zYWN0aW9uJHN0b3JlQ29tbWFuZCxcbiAgICBtZXJnZTogVHJhbnNhY3Rpb24kbWVyZ2UsXG5cbiAgICBzZXRDb21tZW50OiBUcmFuc2FjdGlvbiRzZXRDb21tZW50LFxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbiRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZXhlY3V0ZSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2V4ZWN1dGUnKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiR1bmRvKGNiKSB7XG4gICAgdGhpcy5jb21tYW5kcy51bmRvQWxsQXN5bmMoY2IpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJHJlZG8oY2IpIHtcbiAgICB0aGlzLmNvbW1hbmRzLnJlZG9BbGxBc3luYyhjYik7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2Rlc3Ryb3knKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiRzdG9yZUNvbW1hbmQoY29tbWFuZCkge1xuICAgIHRoaXMuY29tbWFuZHMuc3RvcmUoY29tbWFuZCk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kbWVyZ2UodHJhbnNhY3Rpb24pIHtcbiAgICB0cmFuc2FjdGlvbi5jb21tYW5kcy5lYWNoKGZ1bmN0aW9uKGNtZCkge1xuICAgICAgICB0aGlzLmNvbW1hbmRzLnN0b3JlKGNtZCk7XG4gICAgfSwgdGhpcyk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kc2V0Q29tbWVudChjb21tZW50KSB7XG4gICAgdGhpcy5jb21tZW50ID0gY29tbWVudFxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJGdldERlc2NyaXB0aW9uKCkge1xuICAgIHZhciBjb21tYW5kcyA9IHRoaXMuY29tbWFuZHMuZ2V0RGVzY3JpcHRpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogY29tbWFuZHMuYWN0aW9ucyxcbiAgICAgICAgY29tbWVudDogdGhpcy5jb21tZW50XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBBY3Rpb25zSGlzdG9yeSA9IHJlcXVpcmUoJy4vYWN0aW9uc19oaXN0b3J5JylcbiAgICAsIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi90cmFuc2FjdGlvbicpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2FjdGlvbkhpc3Rvcnk7XG5cblxudmFyIFNDSEVEVUxFRCA9ICdfc2NoZWR1bGVkJztcblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy50cmFuc2FjdGlvbnMgPSBuZXcgQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKTtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzW1NDSEVEVUxFRF0gPSBmYWxzZTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uSGlzdG9yeSwge1xuICAgIHN0b3JlQ29tbWFuZDogVHJhbnNhY3Rpb25IaXN0b3J5JHN0b3JlQ29tbWFuZCxcbiAgICBlbmRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGVuZFRyYW5zYWN0aW9uLFxuICAgIHN0b3JlVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uLFxuICAgIGRlbGV0ZUxhc3RUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGRlbGV0ZUxhc3RUcmFuc2FjdGlvbixcbiAgICB1bmRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkdW5kbyxcbiAgICByZWRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyxcbiAgICBpblRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkaW5UcmFuc2FjdGlvbixcblxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkZ2V0RGVzY3JpcHRpb24sXG4gICAgdXNlTWVzc2VuZ2VyOiBUcmFuc2FjdGlvbkhpc3RvcnkkdXNlTWVzc2VuZ2VyLFxuICAgIGRlc3Ryb3k6IFRyYW5zYWN0aW9uSGlzdG9yeSRkZXN0cm95XG59KTtcblxuXG4vKipcbiAqIFN0b3JlcyBjb21tYW5kIGluIHRoZSBoaXN0b3J5LiBcbiAqIEBwYXJhbSB7Q29tbWFuZH0gY29tbWFuZCAgICAgICAgICAgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGVuZFRyYW5zYWN0aW9uIElmIGB0cnVlYCwgYXBwZW5kcyB0byB0aGUgY3VycmVudCBvciBwcmV2aW91cyB0cmFuc2FjdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHRyYW5zYWN0aW9uLlxuICovXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3Rvcnkkc3RvcmVDb21tYW5kKGNvbW1hbmQsIGFwcGVuZFRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKGFwcGVuZFRyYW5zYWN0aW9uICYmICEodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gfHwgdGhpcy5jdXJyZW50QmF0Y2gpKSB7XG4gICAgICAgIHZhciB0cmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb25zLmdldExhc3RBY3Rpb24oKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc3RvcmVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICdhcHBlbmRlZCcsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghIHRoaXMuY3VycmVudEJhdGNoKSB0aGlzLmN1cnJlbnRCYXRjaCA9IG5ldyBUcmFuc2FjdGlvbjtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaC5zdG9yZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgaWYgKCEgdGhpc1tTQ0hFRFVMRURdKSB7XG4gICAgICAgIHRoaXNbU0NIRURVTEVEXSA9IHRydWU7XG4gICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgX3N0b3JlVHJhbnNhY3Rpb24pO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVsZXRlTGFzdFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRCYXRjaCB8fCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMuZGVsZXRlTGFzdCgpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfc3RvcmVUcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgX2FkZEJhdGNoVG9UcmFuc2FjdGlvbi5jYWxsKHRoaXMpO1xuICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsIF9zdG9yZVRyYW5zYWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfc3RvcmVDdXJyZW50VHJhbnNhY3Rpb24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpc1tTQ0hFRFVMRURdID0gZmFsc2U7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRlbmRUcmFuc2FjdGlvbigpIHtcbiAgICBfYWRkQmF0Y2hUb1RyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG4gICAgX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG59XG5cblxuZnVuY3Rpb24gX2FkZEJhdGNoVG9UcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgaWYgKCEgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24pIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi5tZXJnZSh0aGlzLmN1cnJlbnRCYXRjaCk7XG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gdW5kZWZpbmVkO1xuICAgIH0gXG59XG5cblxuZnVuY3Rpb24gX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB2YXIgdCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5zdG9yZSh0KTtcbiAgICAgICAgX3Bvc3RUcmFuc2FjdGlvbk1lc3NhZ2UuY2FsbCh0aGlzLCAnc3RvcmVkJywgdCk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5lbmRUcmFuc2FjdGlvbigpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbnMuc3RvcmUodHJhbnNhY3Rpb24pO1xuICAgIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3N0b3JlZCcsIHRyYW5zYWN0aW9uKTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZShtc2csIHRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKHRoaXMuX21lc3NlbmdlcilcbiAgICAgICAgdGhpcy5fbWVzc2VuZ2VyLnBvc3RNZXNzYWdlKG1zZywgeyB0cmFuc2FjdGlvbjogdHJhbnNhY3Rpb24gfSk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JHVuZG8oY2IpIHtcbiAgICB2YXIgdCA9IHRoaXMudHJhbnNhY3Rpb25zLnVuZG8oY2IpO1xuICAgIGlmICh0KSBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICd1bmRvbmUnLCB0KTtcbiAgICByZXR1cm4gdDtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyhjYikge1xuICAgIHZhciB0ID0gdGhpcy50cmFuc2FjdGlvbnMucmVkbyhjYik7XG4gICAgaWYgKHQpIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3JlZG9uZScsIHQpO1xuICAgIHJldHVybiB0O1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRpblRyYW5zYWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzW1NDSEVEVUxFRF07XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JGdldERlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5nZXREZXNjcmlwdGlvbigpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSR1c2VNZXNzZW5nZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2VuZ2VyKSB0aGlzLl9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLnRyYW5zYWN0aW9ucztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXRlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jX2ZhY2V0cy9jZl9yZWdpc3RyeScpXG4gICAgLCBDb21wb25lbnRGYWNldCA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnQ29tcG9uZW50RmFjZXQnKVxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIG1pbG9Db21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZG9tVXRpbHMgPSByZXF1aXJlKCcuLi91dGlsL2RvbScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi4vYXR0cmlidXRlcy9hX2JpbmQnKVxuICAgICwgU2NvcGUgPSByZXF1aXJlKCcuL3Njb3BlJylcbiAgICAsIERPTVN0b3JhZ2UgPSByZXF1aXJlKCcuLi91dGlsL3N0b3JhZ2UnKTtcblxudmFyIF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYyA9IGNvbXBvbmVudFV0aWxzLl9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYztcblxuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudGBcbiAqIEJhc2UgQ29tcG9uZW50IGNsYXNzLiBTdWJjbGFzcyBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCksIGJ1dCBub25lIG9mIHRoaXMgY2xhc3MgbWV0aG9kcyBzaG91bGQgYmUgZGlyZWN0bHkgdXNlZCB3aXRoIGNvbXBvbmVudC5cbiAqIEl0cyBjb25zdHJ1Y3RvciBwYXNzZXMgaXRzIHBhcmFtZXRlcnMsIGluY2x1ZGluZyBpdHMgW3Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLCBET00gZWxlbWVudCBhbmQgbmFtZSB0byBbYGluaXRgXSgjaW5pdCkgbWV0aG9kLlxuICogVGhlIGNvbnN0cnVjdG9yIG9mIENvbXBvbmVudCBjbGFzcyByYXJlbHkgbmVlZHMgdG8gYmUgdXNlZCBkaXJlY3RseSwgYXMgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgY3JlYXRlcyBjb21wb25lbnRzIHdoZW4gaXQgc2NhbnMgRE9NIHRyZWUuXG4gKiBbYENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzc2BdKCNjcmVhdGVDb21wb25lbnRDbGFzcykgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGEgc3ViY2xhc3Mgb2YgQ29tcG9uZW50IGNsYXNzIHdpdGggY29uZmlndXJlZCBmYWNldHMuXG4gKlxuICpcbiAqICMjIyNDb21wb25lbnQgaW5zdGFuY2UgcHJvcGVydGllcyMjIyNcbiAqXG4gKiAtIGVsIC0gRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG8uIElmIHRoZSBzZWNvbmQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvIHRoZSBzYW1lIERPTSBlbGVtZW50LCB0aGUgd2FybmluZyB3aWxsIGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUbyBnZXQgY29tcG9uZW50IHJlZmVyZW5jZSBmcm9tIERPTSBlbGVtZW50IHVzZSBbQ29tcG9uZW50LmdldENvbXBvbmVudF0oLi9jX3V0aWxzLmpzLmh0bWwjZ2V0Q29tcG9uZW50KSBjbGFzcyBtZXRob2QuIFRvIGluc3BlY3QgY29tcG9uZW50IHZpYSBlbGVtZW50IGluIGJyb3dzZXIgY2hlY2sgYF9fX21pbG9fY29tcG9uZW50YCBwcm9wZXJ0eSBvZiBlbGVtZW50IChwcm9wZXJ0eSBuYW1lIGJlIGNoYW5nZWQgdXNpbmcgYG1pbG8uY29uZmlnYCkuXG4gKiAtIHNjb3BlIC0gcGFyZW50IHNjb3BlIG9iamVjdCwgYW4gaW5zdGFuY2Ugb2YgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpIGNsYXNzLiBUbyBnZXQgcGFyZW50IGNvbXBvbmVudCB1c2UgW2dldFNjb3BlUGFyZW50XSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KSBpbnN0YW5jZSBtZXRob2Qgb2YgY29tcG9uZW50LiBUaGUgYWN0dWFsIHBhdGggdG8gZ2V0IHBhcmVudCBvZiBjb25wb25lbnQgaXMgYGNvbXBvbmVudC5zY29wZS5faG9zdE9iamVjdC5vd25lcmAsIHdoZXJlIGBfaG9zdE9iamVjdGAgcmVmZXJzIHRvIFtDb250YWluZXJdKGNfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldCBvZiBwYXJlbnQgY29tcG9uZW50IGFuZCBgb3duZXJgIHRvIHRoZSBwYXJlbnQgaXRzZWxmLiBUaGUgY2hpbGRyZW4gb2YgY29tcG9uZW50IGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgc2NvcGUgb2YgaXRzIGNvbnRhaW5lciBmYWNldDogYGNvbXBvbmVudC5jb250YWluZXIuc2NvcGVgLiBUaGUgc2NvcGUgaGllcmFyY2h5IGNhbiBiZSB0aGUgc2FtZSBvciBkaWZmZXJlbnQgYXMgdGhlIERPTSBoaWVyYXJjaHkgLSBET00gY2hpbGRyZW4gb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIG9uIHRoZSBzYW1lIHNjb3BlIGFzIGNvbXBvbmVudCBpZiBpdCBkb2VzIG5vdCBoYXZlIGBDb250YWluZXJgIGZhY2V0IGFuZCBpbiB0aGUgc2NvcGUgb2YgaXRzIENvbnRhaW5lciBmYWNldCBpZiBpdCBoYXMgaXQuIFNlZSBbU2NvcGVdKC4vc2NvcGUuanMuaHRtbCkuXG4gKiAtIG5hbWUgLSB0aGUgbmFtZSBvZiBjb21wb25lbnQsIHNob3VsZCBiZSB1bmlxdWUgZm9yIHRoZSBzY29wZSB3aGVyZSBjb21wb25lbnQgYmVsb25ncy4gVG8gZmluZCBjb21wb25lbnQgaW4gc2NvcGUgdGhlIGNvbXBvbmVudCdzIG5hbWUgc2hvdWxkIGJlIHVzZWQgYXMgcHJvcGVydHkgb2Ygc2NvcGUgb2JqZWN0LiBTZWUgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLlxuICogLSBmYWNldHMgLSBtYXAgb2YgcmVmZXJlbmNlcyBvZiBhbGwgY29tcG9uZW50J3MgZmFjZXRzIChmYWNldCBuYW1lcyBhcmUgbG93ZXJjYXNlIGluIHRoaXMgbWFwKS4gQWxsIGZhY2V0cyBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgYXMgcHJvcGVydGllcyBvZiBjb21wb25lbnQsIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBmYWNldHMgKGl0IGlzIHVzZWQgaW4gdGhpcyB3YXkgaW4gW2FsbEZhY2V0c10oI0NvbXBvbmVudCRhbGxGYWNldHMpIGNvbXBvbmVudCdzIGluc3RhbmNlIG1ldGhvZCB0aGF0IGFsbG93cyB0byBjYWxsIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgb24gYWxsIGZhY2V0cykuXG4gKiAtIGV4dHJhRmFjZXRzIC0gYW4gYXJyYXkgb2YgbmFtZXMgb2YgZmFjZXRzIHRoYXQgYXJlIGFkZGVkIHRvIGNvbXBvbmVudCBhbmQgZG8gbm90IGZvcm0gdGhlIHBhcnQgb2YgY29tcG9uZW50J3MgY2xhc3MuXG4gKiAtIF9tZXNzZW5nZXIgLSB0aGUgcmVmZXJlbmNlIHRvIGNvbXBvbmVudCdzIFttZXNzZW5nZXJdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKS4gUmFyZWx5IG5lZWRzIHRvIGJlIHVzZWQgZGlyZWN0bHkgYXMgYWxsIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBvZiBtZXNlbmdlciBhcmUgYXZhaWxhYmxlIGRpcmVjdGx5IG9uIGNvbXBvbmVudC5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBldmVudHMjIyMjXG4gKlxuICogLSAnY2hpbGRyZW5ib3VuZCcgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjaGlsZHJlbiBvZiBET00gZWxlbWVudCB3aGljaCBjb21wbmVudCBpcyBjb25uZWN0ZWQgdG8gYXJlIGNvbm5lY3RlZCB0byBjb21wb25lbnRzLiBUaGUgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGVkIHdpdGggYG1pbG8uYmluZGVyYCAoYXMgaXMgYWxtb3N0IGFsd2F5cyB0aGUgY2FzZSwgYXMgYWxsIENvbXBvbmVudCBjbGFzcyBtZXRob2RzIHRoYXQgY3JlYXRlL2NvcHkgY29tcG9uZW50cyB1c2UgYG1pbG8uYmluZGVyYCBpbnRlcm5hbGx5IC0gY29tcG9uZW50IGNvbnN0cnVjdG9yIGFuZCBDb21wb25lbnQuY3JlYXRlIG1ldGhvZHMgYXJlIG5vdCB1c2VkIGluIGZyYW1ld29yayBvdXRzaWRlIG9mIGBtaWxvLmJpbmRlcmAgYW5kIHJhcmVseSBpZiBldmVyIG5lZWQgdG8gYmUgdXNlZCBpbiBhcGxpY2F0aW9uKS5cbiAqIC0gJ2FkZGVkdG9zY29wZScgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gc2NvcGUuXG4gKiAtICdzdGF0ZXJlYWR5JyAtIGF5bmNocm9ub3VzbHkgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCAodG9nZXRoZXIgd2l0aCBpdHMgc2NvcGUgY2hpbGRyZW4pIGlzIGNyZWF0ZWQgd2l0aCBbQ29tcG9uZW50LmNyZWF0ZUZyb21TdGF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlRnJvbVN0YXRlKSAob3IgYGNyZWF0ZUZyb21EYXRhVHJhbnNmZXJgKSBtZXRob2QuIENhbiBiZSBkaXNwYXRjaGVkIGJ5IGFwcGxpY2F0aW9uIGlmIHRoZSBjb21wb25lbnQncyBzdGF0ZSBpcyBzZXQgd2l0aCBzb21lIG90aGVyIG1lY2hhbmlzbS4gVGhpcyBldmVudCBpcyBub3QgdXNlZCBpbiBgbWlsb2AsIGl0IGNhbiBiZSB1c2VkIGluIGFwcGxpY2F0aW9uIGluIHBhcnRpY3VsYXIgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQuXG4gKiAtICdnZXRzdGF0ZXN0YXJ0ZWQnIC0gZW1pdHRlZCBzeW5jaHJvbm91c2x5IGp1c3QgYmVmb3JlIGdldFN0YXRlIGV4ZWN1dGVzIHNvIGNvbXBvbmVudHMgYW5kIGZhY2V0cyBjYW4gY2xlYW4gdXAgdGhlaXIgc3RhdGUgZm9yIHNlcmlhbGl6YXRpb24uIFxuICogLSAnZ2V0c3RhdGVjb21wbGV0ZWQnIC0gZW1pdHRlZCBhc3luY2hyb25vdXNseSBhZnRlciBnZXRTdGF0ZSBleGVjdXRlcyBzbyBjb21wb25lbnRzIGFuZCBmYWNldHMgY2FuIHJlc3RvcmUgdGhlaXIgc3RhdGUgYWZ0ZXIgc2VyaWFsaXphdGlvbi5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBcImxpZmVjeWNsZVwiIyMjI1xuICpcbiAqIDEuIENvbXBvbmVudCBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuIENvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHNpbXBseSBjYWxscyBjb25zdHJ1Y3RvciBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCkgdGhhdCBpcyBhIHN1cGVyY2xhc3Mgb2YgQ29tcG9uZW50LiBTdWJjbGFzc2VzIG9mIENvbXBvbmVudCBzaG91bGQgbm90IGltcGxlbWVudCB0aGVpciBvd24gY29uc3RydWN0b3IsIHRoZXkgY2FuIG9wdGlvbmFsbHkgaW1wbGVtZW50IGBpbml0YCBtZXRob2QsIGJ1dCBtb3N0IGNvbXBvbmVudHMgZG8gbm90IG5lZWQgdG8gZG8gaXQuXG4gKiAyLiBjb25zdHJ1Y3RvcnMgYW5kIGBpbml0YCBtZXRob2RzIG9mIGFsbCBmYWNldHMgYXJlIGNhbGxlZCBpbiBzZXF1ZW5jZS4gU2FtZSBhcyBjb21wb25lbnRzLCBmYWNldCBkbyBub3QgaW1wbGVtZW50IHRoZWlyIGNvbnN0cnVjdG9ycywgdGhleSBjYW4gb3B0aW9uYWxseSBpbXBsZW1lbnQgYGluaXRgIGFuZCBgc3RhcnRgIG1ldGhvZHMgKHNlZSBiZWxvdykuIEluc2lkZSBgaW5pdGAgbWV0aG9kIHRoZXJlIHNob3VsZCBiZSBvbmx5IGdlbmVyYWwgaW5pdGlhbGl6YXRpb24gY29kZSB3aXRob3V0IGFueSBkZXBlbmRlbmN5IG9uIGNvbXBvbmVudCBpdHNlbGYgKGl0IGlzIG5vdCByZWFkeSB5ZXQpIGFuZCBvdGhlciBmYWNldHMgKGFzIHRoZXJlIGlzIG5vIHNwZWNpZmljIGZhY2V0cyBjcmVhdGlvbiBvcmRlcikuIElmIGZhY2V0IGltcGxlbWVudHMgYGluaXRgIG1ldGhvZCBpdCBNVVNUIGNhbGwgaW5oZXJpdGVkIGluaXQgd2l0aCBgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKWAuXG4gKiAzLiBgaW5pdGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIEF0IHRoaXMgcG9pbnQgYWxsIGZhY2V0cyBhcmUgY3JlYXRlZCBidXQgZmFjZXRzIHN0aWxsIGNhbiBiZSBub3QgcmVhZHkgYXMgdGhleSBjYW4gaGF2ZSBpbml0aWFsaXphdGlvbiBjb2RlIGluIGBzdGFydGAgbWV0aG9kLiBJZiBjb21wb25lbnQgc3ViY2xhc3MgaW1wbGVtZW50cyBgaW5pdGAgbWV0aG9kIGl0IE1VU1QgY2FsbCBpbmhlcml0ZWQgbWV0aG9kIHdpdGggYDxTdXBlcmNsYXNzPi5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpYCwgd2hlcmUgPFN1cGVyY2xhc3M+IGlzIENvbXBvbmVudCBvciBhbm90aGVyIHN1cGVyY2xhc3MgdGhlIGNvbXBvbmVudCBpcyBhIHN1YmNsYXNzIG9mLlxuICogNC4gYGNoZWNrYCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGFkZHMgZmFjZXRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjb21wb25lbnQgZGVjbGFyYXRpb24gKGJlaW5nIHBhcnQgb2YgdGhlIGNsYXNzIG9yIGV4cGxpY2l0ZWx5IGxpc3RlZCBpbiBiaW5kIGF0dHJpYnV0ZSkgYnV0IGFyZSByZXF1aXJlZCBieSBmYWNldHMgdGhhdCB0aGUgY29tcG5lbnQgYWxyZWFkeSBoYXMuIFN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbCkgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLlxuICogNS4gYHN0YXJ0YCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgaW1wbGVtZW50ZWQgYnkgQ29tcG9uZW50RmFjZXQgc3ViY2xhc3NlcyBhbmQgaXQgY2FuIGhhdmUgYW55IGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIGNvbXBvbmVudCBvciBvbiBvdGhlciBmYWNldHMgdGhhdCBhcmUgdGhlIGRlcGVuZGVuY2llcyBvZiBhIGZhY2V0LiBJbmhlcml0ZWQgYHN0YXJ0YCBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnQgaGUgc2FtZSB3YXkgYXMgd3JpdHRlbiBhYm92ZS5cbiAqIDYuIGBzdGFydGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIFRoaXMgY29tcG9uZW50IG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBpZiB0aGV5IG5lZWQgdG8gaGF2ZSBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHNvbWUgZmFjZXRzIGFuZCByZXF1aXJlcyB0aGF0IHRoZXNlIGZhY2V0cyBhcmUgZnVsbHkgaW5pYWxpemVkLiBPZnRlbiBzdWNoIGNvZGUgYWxzbyBkZXBlbmRzIG9uIGNvbXBvbmVudCdzIHNjb3BlIGNoaWxkcmVuIGFzIHdlbGwgc28gdGhpcyBjb2RlIHNob3VsZCBiZSBpbnNpZGUgYCdjaGlsZHJlbmJvdW5kJ2AgZXZlbnQgc3Vic2NyaWJlci5cbiAqIDcuICdhZGRlZHRvc2NvcGUnIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gaXRzIHBhcmVudCdzIHNjb3BlIG9yIHRvIHRvcCBsZXZlbCBzY29wZSBjcmVhdGVkIGJ5IGBtaWxvLmJpbmRlcmAuXG4gKiA4LiBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCAoc3RlcHMgMS02IGFib3ZlIGFyZSBmb2xsb3dlZCBmb3IgZWFjaCBjaGlsZCkuXG4gKiA5LiAnY2hpbGRyZW5ib3VuZCcgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGFsbCBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlaXIgc2NvcGUgKHNlZSBldmVudCBkZXNjcmlwdGlvbiBiZWxvdykuXG4gKiAxMC4gJ3N0YXRlcmVhZHknIGV2ZW50IGlzIGRpc3BhdGNoZWQgZm9yIGNvbXBvbmVudCBhbmQgYWxsIGl0cyBjaGlsZHJlbiB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGUgZnJvbSBzdGF0ZSAoc2VlIGV2ZW50IGRlc2NyaXB0aW9uIGJlbG93KS5cbiAqIDExLiBhdCB0aGlzIHBvaW50IGNvbXBvbmVudCBpcyBpbiB0aGUgXCJpbnRlcmFjdGl2ZVwiIHN0YXRlIHdoZW4gaXQgYW5kIGl0cyBmYWNldHMgd2lsbCBvbmx5IHJlc3BvbmQgdG8gbWVzc2FnZXMvZXZlbnRzIHRoYXQgdGhleSBzdWJzY3JpYmVkIHRvIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAqXG4gKlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmVsb25nLiBJdCBpcyB1c3VhbGx5IGEgdG9wIGxldmVsIHNjb3BlIG9iamVjdCByZXR1cm5lZCBieSBgbWlsby5iaW5kZXJgIG9yIGBzY29wZWAgcHJvcGVydHkgb2YgQ29udGFpbmVyIGZhY2V0LlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IERPTSBlbGVtZW50IHRoYXQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjb21wb25lbnQgbmFtZSwgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgc2NvcGUgb2YgY29tcG9uZW50XG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGNvbXBvbmVudEluZm8gaW5zdGFuY2Ugb2YgQ29tcG9uZW50SW5mbyBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50XG4gKiAgVE9ETyB0cnkgcmVtb3ZpbmcgaXRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIENvbXBvbmVudCA9IF8uY3JlYXRlU3ViY2xhc3MoRmFjZXRlZE9iamVjdCwgJ0NvbXBvbmVudCcsIHRydWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvbmVudDtcblxuX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoJ0NvbXBvbmVudCcpO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBjbGFzcyBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2NyZWF0ZUNvbXBvbmVudENsYXNzXSgjQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcylcbiAqIC0gW2NyZWF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlKVxuICogLSBbY29weV0oI0NvbXBvbmVudCQkY29weSlcbiAqIC0gW2NyZWF0ZU9uRWxlbWVudF0oI0NvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50KVxuICogLSBbaXNDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNpc0NvbXBvbmVudClcbiAqIC0gW2dldENvbXBvbmVudF0oY191dGlscy5qcy5odG1sI2dldENvbXBvbmVudClcbiAqIC0gW2dldENvbnRhaW5pbmdDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNnZXRDb250YWluaW5nQ29tcG9uZW50KVxuICogLSBbY3JlYXRlRnJvbVN0YXRlXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUpXG4gKiAtIFtjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyKVxuICovXG5fLmV4dGVuZChDb21wb25lbnQsIHtcbiAgICBjcmVhdGVDb21wb25lbnRDbGFzczogQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcyxcbiAgICBjcmVhdGU6IENvbXBvbmVudCQkY3JlYXRlLFxuICAgIGNvcHk6IENvbXBvbmVudCQkY29weSxcbiAgICBjcmVhdGVPbkVsZW1lbnQ6IENvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50LFxuICAgIGlzQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5pc0NvbXBvbmVudCxcbiAgICBnZXRDb21wb25lbnQ6IGNvbXBvbmVudFV0aWxzLmdldENvbXBvbmVudCxcbiAgICBnZXRDb250YWluaW5nQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5nZXRDb250YWluaW5nQ29tcG9uZW50LFxuICAgIGNyZWF0ZUZyb21TdGF0ZTogQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUsXG4gICAgY3JlYXRlRnJvbURhdGFUcmFuc2ZlcjogQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXG59KTtcbmRlbGV0ZSBDb21wb25lbnQuY3JlYXRlRmFjZXRlZENsYXNzO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNDb21wb25lbnQkaW5pdClcbiAqIC0gW2NyZWF0ZUVsZW1lbnRdKCNDb21wb25lbnQkY3JlYXRlRWxlbWVudClcbiAqIC0gW2hhc0ZhY2V0XSgjQ29tcG9uZW50JGhhc0ZhY2V0KVxuICogLSBbYWRkRmFjZXRdKCNDb21wb25lbnQkYWRkRmFjZXQpXG4gKiAtIFthbGxGYWNldHNdKCNDb21wb25lbnQkYWxsRmFjZXRzKVxuICogLSBbcmVuYW1lXSgjQ29tcG9uZW50JHJlbmFtZSlcbiAqIC0gW3JlbW92ZV0oI0NvbXBvbmVudCRyZW1vdmUpXG4gKiAtIFtnZXRTdGF0ZV0oI0NvbXBvbmVudCRnZXRTdGF0ZSlcbiAqIC0gW2dldFRyYW5zZmVyU3RhdGVdKCNDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSlcbiAqIC0gW3NldFN0YXRlXSgjQ29tcG9uZW50JHNldFN0YXRlKVxuICogLSBbZ2V0U2NvcGVQYXJlbnRdKCNDb21wb25lbnQkZ2V0U2NvcGVQYXJlbnQpXG4gKiAtIFtnZXRUb3BTY29wZVBhcmVudF0oI0NvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudClcbiAqIC0gW2dldFNjb3BlUGFyZW50V2l0aENsYXNzXSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKVxuICogLSBbZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3NdKCNDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MpXG4gKiAtIFt3YWxrU2NvcGVUcmVlXSgjQ29tcG9uZW50JHdhbGtTY29wZVRyZWUpXG4gKiAtIFticm9hZGNhc3RdKCNDb21wb25lbnQkYnJvYWRjYXN0KVxuICogLSBbZGVzdHJveV0oI0NvbXBvbmVudCRkZXN0cm95KVxuICogLSBbaXNEZXN0cm95ZWRdKCNDb21wb25lbnQkaXNEZXN0cm95ZWQpXG4gKlxuICpcbiAqICMjIyMjW01lc3Nlbmdlcl0oLi4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIG1ldGhvZHMgYXZhaWxhYmxlIG9uIGNvbXBvbmVudCMjIyMjXG4gKlxuICogLSBbb25dKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvbikgLSBzaW5nbGUgc3Vic2NyaWJlXG4gKiAtIFtvZmZdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvZmYpIC0gc2luZ2xlIHVuc3Vic2NyaWJlXG4gKiAtIFtvbk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb25NZXNzYWdlcykgLSBtdWx0aXBsZSBzdWJzY3JpYmVcbiAqIC0gW29mZk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb2ZmTWVzc2FnZXMpIC0gbXVsdGlwbGUgdW5zdWJzY3JpYmVcbiAqIC0gW3Bvc3RNZXNzYWdlXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkcG9zdE1lc3NhZ2UpIC0gcG9zdCBtZXNzYWdlIG9uIGNvbXBvbmVudFxuICogLSBbZ2V0U3Vic2NyaWJlcnNdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRnZXRTdWJzY3JpYmVycykgLSBnZXQgc3Vic2NyaWJlcnMgZm9yIGEgZ2l2ZW4gbWVzc2FnZVxuICovXG5fLmV4dGVuZFByb3RvKENvbXBvbmVudCwge1xuICAgIGluaXQ6IENvbXBvbmVudCRpbml0LFxuICAgIHN0YXJ0OiBDb21wb25lbnQkc3RhcnQsXG4gICAgY3JlYXRlRWxlbWVudDogQ29tcG9uZW50JGNyZWF0ZUVsZW1lbnQsXG4gICAgaGFzRmFjZXQ6IENvbXBvbmVudCRoYXNGYWNldCxcbiAgICBhZGRGYWNldDogQ29tcG9uZW50JGFkZEZhY2V0LFxuICAgIGFsbEZhY2V0czogQ29tcG9uZW50JGFsbEZhY2V0cyxcbiAgICByZW5hbWU6IENvbXBvbmVudCRyZW5hbWUsXG4gICAgcmVtb3ZlOiBDb21wb25lbnQkcmVtb3ZlLFxuICAgIGluc2VydEludG86IENvbXBvbmVudCRpbnNlcnRJbnRvLFxuXG4gICAgZ2V0U3RhdGU6IENvbXBvbmVudCRnZXRTdGF0ZSxcbiAgICBnZXRUcmFuc2ZlclN0YXRlOiBDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSxcbiAgICBfZ2V0U3RhdGU6IENvbXBvbmVudCRfZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IENvbXBvbmVudCRzZXRTdGF0ZSxcbiAgICBcbiAgICBnZXRTY29wZVBhcmVudDogQ29tcG9uZW50JGdldFNjb3BlUGFyZW50LFxuICAgIGdldFRvcFNjb3BlUGFyZW50OiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnQsXG4gICAgZ2V0U2NvcGVQYXJlbnRXaXRoQ2xhc3M6IENvbXBvbmVudCRnZXRTY29wZVBhcmVudFdpdGhDbGFzcyxcbiAgICBnZXRUb3BTY29wZVBhcmVudFdpdGhDbGFzczogQ29tcG9uZW50JGdldFRvcFNjb3BlUGFyZW50V2l0aENsYXNzLFxuXG4gICAgc2V0U2NvcGVQYXJlbnRGcm9tRE9NOiBDb21wb25lbnQkc2V0U2NvcGVQYXJlbnRGcm9tRE9NLFxuXG4gICAgd2Fsa1Njb3BlVHJlZTogQ29tcG9uZW50JHdhbGtTY29wZVRyZWUsXG5cbiAgICB0cmVlUGF0aE9mOiBDb21wb25lbnQkdHJlZVBhdGhPZixcbiAgICBnZXRDb21wb25lbnRBdFRyZWVQYXRoOiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCxcbiAgICBpbnNlcnRBdFRyZWVQYXRoOiBDb21wb25lbnQkaW5zZXJ0QXRUcmVlUGF0aCxcblxuICAgIGJyb2FkY2FzdDogQ29tcG9uZW50JGJyb2FkY2FzdCxcbiAgICBkZXN0cm95OiBDb21wb25lbnQkZGVzdHJveSxcbiAgICBpc0Rlc3Ryb3llZDogQ29tcG9uZW50JGlzRGVzdHJveWVkXG59KTtcblxuXG4vKipcbiAqIEV4cG9zZSBNZXNzZW5nZXIgbWV0aG9kcyBvbiBDb21wb25lbnQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChDb21wb25lbnQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9QUkVGSVggPSAneC1hcHBsaWNhdGlvbi9taWxvLWNvbXBvbmVudCc7XG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9SRUdFWCA9IC94LWFwcGxpY2F0aW9uXFwvbWlsby1jb21wb25lbnRcXC8oW2Etel8kXVswLTlhLXpfJF0qKSg/OlxcLygpKS9pO1xuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZXMgYSBzdWJjbGFzcyBvZiBjb21wb25lbnQgZnJvbSB0aGUgbWFwIG9mIGNvbmZpZ3VyZWQgZmFjZXRzLlxuICogVGhpcyBtZXRob2Qgd3JhcHMgYW5kIHJlcGxhY2VzIFtgY3JlYXRlRmFjZXRlZENsYXNzYF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCNjcmVhdGVGYWNldGVkQ2xhc3MpIGNsYXNzIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0LlxuICogVW5saWtlIGNyZWF0ZUZhY2V0ZWRDbGFzcywgdGhpcyBtZXRob2QgdGFrZSBmYWNldCBjbGFzc2VzIGZyb20gcmVnaXN0cnkgYnkgdGhlaXIgbmFtZSwgc28gb25seSBtYXAgb2YgZmFjZXRzIGNvbmZpZ3VyYXRpb24gbmVlZHMgdG8gYmUgcGFzc2VkLiBBbGwgZmFjZXRzIGNsYXNzZXMgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjbGFzcyBuYW1lXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdIHwgQXJyYXlbU3RyaW5nXX0gZmFjZXRzQ29uZmlnIG1hcCBvZiBmYWNldHMgY29uZmlndXJhdGlvbi5cbiAqICBJZiBzb21lIGZhY2V0IGRvZXMgbm90IHJlcXVpcmUgY29uZmlndXJhdGlvbiwgYHVuZGVmaW5lZGAgc2hvdWxkIGJlIHBhc3NlZCBhcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZhY2V0LlxuICogIElmIG5vIGZhY2V0IHJlcXVpcmVzIGNvbmZpZ3VyYXRpb24sIHRoZSBhcnJheSBvZiBmYWNldHMgbmFtZXMgY2FuIGJlIHBhc3NlZC5cbiAqIEByZXR1cm4ge1N1YmNsYXNzKENvbXBvbmVudCl9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCQkY3JlYXRlQ29tcG9uZW50Q2xhc3MobmFtZSwgZmFjZXRzQ29uZmlnKSB7XG4gICAgLy8gY29udmVydCBhcnJheSBvZiBmYWNldCBuYW1lcyB0byBtYXAgb2YgZW1wdHkgZmFjZXRzIGNvbmZpZ3VyYXRpb25zXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFjZXRzQ29uZmlnKSkge1xuICAgICAgICB2YXIgY29uZmlnTWFwID0ge307XG4gICAgICAgIGZhY2V0c0NvbmZpZy5mb3JFYWNoKGZ1bmN0aW9uKGZjdCkge1xuICAgICAgICAgICAgdmFyIGZjdE5hbWUgPSBfLmZpcnN0TG93ZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBjb25maWdNYXBbZmN0TmFtZV0gPSB7fTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZhY2V0c0NvbmZpZyA9IGNvbmZpZ01hcDtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgbWFwIG9mIGZhY2V0cyBjbGFzc2VzIGZyb20gZmFjZXRSZWdpc3RyeVxuICAgIHZhciBmYWNldHNDbGFzc2VzO1xuICAgIGlmICh0eXBlb2YgZmFjZXRzQ29uZmlnID09ICdvYmplY3QnICYmIF8ua2V5cyhmYWNldHNDb25maWcpLmxlbmd0aCkge1xuICAgICAgICBmYWNldHNDbGFzc2VzID0ge307XG4gICAgICAgIF8uZWFjaEtleShmYWNldHNDb25maWcsIGZ1bmN0aW9uKGZjdENvbmZpZywgZmN0KSB7XG4gICAgICAgICAgICB2YXIgZmN0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoZmN0KTtcbiAgICAgICAgICAgIHZhciBmY3RDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBmYWNldHNDbGFzc2VzW2ZjdE5hbWVdID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZjdENsYXNzTmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBzdWJjbGFzcyBvZiBDb21wb25lbnQgdXNpbmcgbWV0aG9kIG9mIEZhY2V0ZWRPYmplY3RcbiAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBGYWNldGVkT2JqZWN0LmNyZWF0ZUZhY2V0ZWRDbGFzcy5jYWxsKHRoaXMsIG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZyk7XG4gICAgXG4gICAgX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UobmFtZSk7XG5cbiAgICByZXR1cm4gQ29tcG9uZW50Q2xhc3M7XG59XG5cblxuZnVuY3Rpb24gX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoY2xhc3NOYW1lKSB7XG4gICAgRE9NU3RvcmFnZS5yZWdpc3RlckRhdGFUeXBlKGNsYXNzTmFtZSwgQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyLCBDb21wb25lbnRfZG9tU3RvcmFnZVBhcnNlcik7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyKGNvbXBvbmVudCkge1xuICAgIHZhciBzdGF0ZSA9IGNvbXBvbmVudC5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0ZSk7ICAgXG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VQYXJzZXIoY29tcFN0ciwgY29tcENsYXNzTmFtZSkge1xuICAgIHZhciBzdGF0ZSA9IF8uanNvblBhcnNlKGNvbXBTdHIpO1xuICAgIGlmIChzdGF0ZSlcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGUoc3RhdGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBjb21wb25lbnQgZnJvbSBbQ29tcG9uZW50SW5mb10oLi9jX2luZm8uanMuaHRtbCkgKHVzZWQgYnkgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgYW5kIHRvIGNvcHkgY29tcG9uZW50KVxuICogQ29tcG9uZW50IG9mIGFueSByZWdpc3RlcmVkIGNsYXNzIChzZWUgW2NvbXBvbmVudHNSZWdpc3RyeV0oLi9jX3JlZ2lzdHJ5LmpzLmh0bWwpKSB3aXRoIGFueSBhZGRpdGlvbmFsIHJlZ2lzdGVyZWQgZmFjZXRzIChzZWUgW2ZhY2V0c1JlZ2lzdHJ5XSguL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5LmpzLmh0bWwpKSBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGluZm9cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuIEAgQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZShpbmZvLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gaW5mby5Db21wb25lbnRDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50Q2xhc3MgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbWVzc2FnZSA9ICdjcmVhdGU6IGNvbXBvbmVudCBjbGFzcyBzaG91bGQgYmUgZnVuY3Rpb24sIFwiJyArIHR5cGVvZiBDb21wb25lbnRDbGFzcyArICdcIiBwYXNzZWQnOyBcbiAgICAgICAgaWYgKHRocm93T25FcnJvcnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbXBvbmVudCcsIG1lc3NhZ2UsICc7dXNpbmcgYmFzZSBDb21wb25lbnQgY2xhc3MgaW5zdGVhZCcpO1xuICAgICAgICAgICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHZhciBhQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudENsYXNzKGluZm8uc2NvcGUsIGluZm8uZWwsIGluZm8ubmFtZSwgaW5mbyk7XG5cbiAgICBpZiAoaW5mby5leHRyYUZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleShpbmZvLmV4dHJhRmFjZXRzQ2xhc3NlcywgZnVuY3Rpb24oRmFjZXRDbGFzcykge1xuICAgICAgICAgICAgaWYgKCEgYUNvbXBvbmVudC5oYXNGYWNldChGYWNldENsYXNzKSlcbiAgICAgICAgICAgICAgICBhQ29tcG9uZW50LmFkZEZhY2V0KEZhY2V0Q2xhc3MsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gYUNvbXBvbmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50LCBpbmNsdWRpbmcgYSBjb3B5IG9mIERPTSBlbGVtZW50LiBSZXR1cm5zIGEgY29weSBvZiBgY29tcG9uZW50YCAob2YgdGhlIHNhbWUgY2xhc3MpIHdpdGggbmV3IERPTSBlbGVtZW50IChub3QgaW5zZXJ0ZWQgaW50byBwYWdlKS5cbiAqIENvbXBvbmVudCBpcyBhZGRlZCB0byB0aGUgc2FtZSBzY29wZSBhcyB0aGUgb3JpZ2luYWwgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgYW4gaW5zdGFuY2Ugb2YgQ29tcG9uZW50IGNsYXNzIG9yIHN1YmNsYXNzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBDb3B5IG9wdGlvbmFsIGB0cnVlYCB0byBtYWtlIGRlZXAgY29weSBvZiBET00gZWxlbWVudCwgb3RoZXJ3aXNlIG9ubHkgZWxlbWVudCB3aXRob3V0IGNoaWxkcmVuIGlzIGNvcGllZFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNvcHkoY29tcG9uZW50LCBkZWVwQ29weSkge1xuICAgIGNoZWNrKGNvbXBvbmVudCwgQ29tcG9uZW50KTtcbiAgICBjaGVjayhkZWVwQ29weSwgTWF0Y2guT3B0aW9uYWwoQm9vbGVhbikpO1xuXG4gICAgaWYgKGRlZXBDb3B5ICYmICFjb21wb25lbnQuY29udGFpbmVyKSBcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGVlcCBjb3B5IGNvbXBvbmVudCB3aXRob3V0IGNvbnRhaW5lciBmYWNldCcpO1xuXG4gICAgLy8gY29weSBET00gZWxlbWVudCwgdXNpbmcgRG9tIGZhY2V0IGlmIGl0IGlzIGF2YWlsYWJsZVxuICAgIHZhciBuZXdFbCA9IGNvbXBvbmVudC5kb20gXG4gICAgICAgICAgICAgICAgICAgID8gY29tcG9uZW50LmRvbS5jb3B5KGRlZXBDb3B5KVxuICAgICAgICAgICAgICAgICAgICA6IGNvbXBvbmVudC5lbC5jbG9uZU5vZGUoZGVlcENvcHkpO1xuXG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gY3JlYXRlIGNvbXBvbmVudCBvZiB0aGUgc2FtZSBjbGFzcyBvbiB0aGUgZWxlbWVudFxuICAgIHZhciBhQ29tcG9uZW50ID0gQ29tcG9uZW50Q2xhc3MuY3JlYXRlT25FbGVtZW50KG5ld0VsLCB1bmRlZmluZWQsIGNvbXBvbmVudC5zY29wZSwgY29tcG9uZW50LmV4dHJhRmFjZXRzKTtcbiAgICB2YXIgc3RhdGUgPSBjb21wb25lbnQuX2dldFN0YXRlKGRlZXBDb3B5IHx8IGZhbHNlKTtcbiAgICBhQ29tcG9uZW50LnNldFN0YXRlKHN0YXRlKTtcbiAgICBfLmRlZmVyTWV0aG9kKGFDb21wb25lbnQsICdicm9hZGNhc3QnLCAnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBjb21wb25lbnQgYXRhY2hlZCB0byBlbGVtZW50LiBBbGwgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQgaW5oZXJpdCB0aGlzIG1ldGhvZC5cbiAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBvZiB0aGUgY2xhc3MgdGhpcyBtZXRob2QgaXMgdXNlZCB3aXRoICh0aGVjb250ZXh0IG9mIHRoZSBtZXRob2QgY2FsbCkuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBvcHRpb25hbCBlbGVtZW50IHRvIGF0dGFjaCBjb21wb25lbnQgdG8uIElmIGVsZW1lbnQgaXMgbm90IHBhc3NlZCwgaXQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5uZXJIVE1MIG9wdGlvbmFsIGlubmVyIGh0bWwgdG8gaW5zZXJ0IGluIGVsZW1lbnQgYmVmb3JlIGJpbmRpbmcuXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgb3B0aW9uYWwgc2NvcGUgdG8gcHV0IGNvbXBvbmVudCBpbi4gSWYgbm90IHBhc3NlZCwgY29tcG9uZW50IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQuIElmIHN1Y2ggc2NvcGUgZG9lcyBub3QgZXhpc3QsIG5ldyBzY29wZSB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IGV4dHJhRmFjZXRzIGxpc3Qgb2YgZXh0cmEgZmFjZXQgdG8gYWRkIHRvIGNvbXBvbmVudFxuICogQHJldHVybiB7U3ViY2xhc3MoQ29tcG9uZW50KX1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVPbkVsZW1lbnQoZWwsIGlubmVySFRNTCwgcm9vdFNjb3BlLCBleHRyYUZhY2V0cykge1xuICAgIGNoZWNrKGlubmVySFRNTCwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG4gICAgY2hlY2socm9vdFNjb3BlLCBNYXRjaC5PcHRpb25hbChTY29wZSkpO1xuICAgIGNoZWNrKGV4dHJhRmFjZXRzLCBNYXRjaC5PcHRpb25hbChbU3RyaW5nXSkpO1xuXG4gICAgLy8gXCJ0aGlzXCIgcmVmZXJzIHRvIHRoZSBjbGFzcyBvZiBjb21wb25lbnQgaGVyZSwgYXMgdGhpcyBpcyBhIGNsYXNzIG1ldGhvZFxuICAgIGlmIChlbCAmJiBpbm5lckhUTUwpIGVsLmlubmVySFRNTCA9IGlubmVySFRNTDtcbiAgICBlbCA9IGVsIHx8IF9jcmVhdGVDb21wb25lbnRFbGVtZW50LmNhbGwodGhpcywgaW5uZXJIVE1MKTtcbiAgICByb290U2NvcGUgPSByb290U2NvcGUgfHwgX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCk7XG4gICAgdmFyIGFDb21wb25lbnQgPSBfYWRkQXR0cmlidXRlQW5kQmluZENvbXBvbmVudC5jYWxsKHRoaXMsIGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKTtcbiAgICBhQ29tcG9uZW50LmJyb2FkY2FzdCgnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ29tcG9uZW50RWxlbWVudChpbm5lckhUTUwpIHtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgdmFyIERvbSA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnRG9tJylcbiAgICAgICAgLCBkb21GYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ2RvbScpXG4gICAgICAgICwgdGVtcGxhdGVGYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ3RlbXBsYXRlJylcbiAgICAgICAgLCB0ZW1wbGF0ZSA9IHRlbXBsYXRlRmFjZXRDb25maWcgJiYgdGVtcGxhdGVGYWNldENvbmZpZy50ZW1wbGF0ZTtcblxuICAgIHZhciBlbENvbmZpZyA9IHtcbiAgICAgICAgZG9tQ29uZmlnOiBkb21GYWNldENvbmZpZyxcbiAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuICAgICAgICBjb250ZW50OiBpbm5lckhUTUxcbiAgICB9O1xuXG4gICAgcmV0dXJuIERvbS5jcmVhdGVFbGVtZW50KGVsQ29uZmlnKTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCkge1xuICAgIHZhciBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbCwgZmFsc2UsICdDb250YWluZXInKTtcbiAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50LmNvbnRhaW5lci5zY29wZSA6IG5ldyBTY29wZShlbCk7XG59XG5cbmZ1bmN0aW9uIF9hZGRBdHRyaWJ1dGVBbmRCaW5kQ29tcG9uZW50KGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKSB7XG4gICAgLy8gYWRkIGJpbmQgYXR0cmlidXRlIHRvIGVsZW1lbnRcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgYXR0ci5jb21wQ2xhc3MgPSB0aGlzLm5hbWU7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgLy8gc2hvdWxkIGJlIHJlcXVpcmVkIGhlcmUgdG8gcmVzb2x2ZSBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcbiAgICBtaWxvQmluZGVyKGVsLCByb290U2NvcGUpO1xuXG4gICAgcmV0dXJuIHJvb3RTY29wZVthdHRyLmNvbXBOYW1lXTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGNvbXBvbmVudCBmcm9tIGNvbXBvbmVudCBzdGF0ZSwgdGhhdCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgY2xhc3MsIGV4dHJhIGZhY2V0cywgZmFjZXRzIGRhdGEgYW5kIGFsbCBzY29wZSBjaGlsZHJlbi5cbiAqIFRoaXMgaXMgdXNlZCB0byBzYXZlL2xvYWQsIGNvcHkvcGFzdGUgYW5kIGRyYWcvZHJvcCBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgc3RhdGUgZnJvbSB3aGljaCBjb21wb25lbnQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYWRkZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbmV3VW5pcXVlTmFtZSBvcHRpb25hbCBgdHJ1ZWAgdG8gY3JlYXRlIGNvbXBvbmVudCB3aXRoIHRoZSBuYW1lIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvbmUuIGBGYWxzZWAgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICogQHJldHVybiB7Q29tcG9uZW50fSBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUoc3RhdGUsIHJvb3RTY29wZSwgbmV3VW5pcXVlTmFtZSwgdGhyb3dPbkVycm9ycykge1xuICAgIGNoZWNrKHN0YXRlLCBNYXRjaC5PYmplY3RJbmNsdWRpbmcoe1xuICAgICAgICBjb21wTmFtZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY29tcENsYXNzOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBleHRyYUZhY2V0czogTWF0Y2guT3B0aW9uYWwoW1N0cmluZ10pLFxuICAgICAgICBmYWNldHNTdGF0ZXM6IE1hdGNoLk9wdGlvbmFsKE9iamVjdCksXG4gICAgICAgIG91dGVySFRNTDogU3RyaW5nXG4gICAgfSkpO1xuXG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcblxuICAgIC8vIGNyZWF0ZSB3cmFwcGVyIGVsZW1lbnQgb3B0aW9uYWxseSByZW5hbWluZyBjb21wb25lbnRcbiAgICB2YXIgd3JhcEVsID0gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGFsbCBjb21wb25lbnRzIGZyb20gSFRNTFxuICAgIHZhciBzY29wZSA9IG1pbG9CaW5kZXIod3JhcEVsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhyb3dPbkVycm9ycyk7XG5cbiAgICAvLyBhcyB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgY29tcG9uZW50LCBjYWxsIHRvIF9hbnkgd2lsbCByZXR1cm4gaXRcbiAgICB2YXIgY29tcG9uZW50ID0gc2NvcGUuX2FueSgpO1xuXG4gICAgLy8gc2V0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgaWYgKHJvb3RTY29wZSkge1xuICAgICAgICBjb21wb25lbnQuc2NvcGUgPSByb290U2NvcGU7XG4gICAgICAgIHJvb3RTY29wZS5fYWRkKGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yZSBjb21wb25lbnQgc3RhdGVcbiAgICBjb21wb25lbnQuc2V0U3RhdGUoc3RhdGUpO1xuICAgIF8uZGVmZXJNZXRob2QoY29tcG9uZW50LCAnYnJvYWRjYXN0JywgJ3N0YXRlcmVhZHknKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7ICAgXG59XG5cblxuLy8gdXNlZCBieSBDb21wb25lbnQkJGNyZWF0ZUZyb21TdGF0ZVxuZnVuY3Rpb24gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKSB7XG4gICAgdmFyIHdyYXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdyYXBFbC5pbm5lckhUTUwgPSBzdGF0ZS5vdXRlckhUTUw7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSBkb21VdGlscy5jaGlsZHJlbih3cmFwRWwpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggIT0gMSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgY3JlYXRlIGNvbXBvbmVudDogaW5jb3JyZWN0IEhUTUwsIGVsZW1lbnRzIG51bWJlcjogJyArIGNoaWxkcmVuLmxlbmd0aCArICcgKHNob3VsZCBiZSAxKScpO1xuICAgIHZhciBjb21wRWwgPSBjaGlsZHJlblswXTtcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGNvbXBFbCk7XG4gICAgYXR0ci5jb21wTmFtZSA9IG5ld1VuaXF1ZU5hbWUgPyBtaWxvQ29tcG9uZW50TmFtZSgpIDogc3RhdGUuY29tcE5hbWU7XG4gICAgYXR0ci5jb21wQ2xhc3MgPSBzdGF0ZS5jb21wQ2xhc3M7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gc3RhdGUuZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgcmV0dXJuIHdyYXBFbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcG9uZW50IGZyb20gYSBEYXRhVHJhbnNmZXIgb2JqZWN0IChpZiBwb3NzaWJsZSlcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9EYXRhVHJhbnNmZXJcbiAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBkYXRhVHJhbnNmZXIgRGF0YSB0cmFuc2ZlclxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZUZyb21EYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyKSB7XG4gICAgdmFyIGRhdGFUeXBlID0gXy5maW5kKGRhdGFUcmFuc2Zlci50eXBlcywgZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIENPTVBPTkVOVF9EQVRBX1RZUEVfUkVHRVgudGVzdCh0eXBlKTtcbiAgICB9KTtcbiAgICBpZiAoIWRhdGFUeXBlKSByZXR1cm47XG5cbiAgICB2YXIgc3RhdGUgPSBfLmpzb25QYXJzZShkYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSkpO1xuICAgIGlmICghc3RhdGUpIHJldHVybjtcblxuICAgIHJldHVybiBDb21wb25lbnQuY3JlYXRlRnJvbVN0YXRlKHN0YXRlLCB1bmRlZmluZWQsIHRydWUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluaXRpYWxpemVzIGNvbXBvbmVudC4gQXV0b21hdGljYWxseSBjYWxsZWQgYnkgaW5oZXJpdGVkIGNvbnN0cnVjdG9yIG9mIEZhY2V0ZWRPYmplY3QuXG4gKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIGluaGVyaXRlZCBpbml0IG1ldGhvZHM6XG4gKiBgYGBcbiAqIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSBzY29wZSB0byB3aGljaCBjb21wb25lbnQgd2lsbCBiZWxvbmcuIEl0IGlzIHVzdWFsbHkgYSB0b3AgbGV2ZWwgc2NvcGUgb2JqZWN0IHJldHVybmVkIGJ5IGBtaWxvLmJpbmRlcmAgb3IgYHNjb3BlYCBwcm9wZXJ0eSBvZiBDb250YWluZXIgZmFjZXQuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG9cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNvbXBvbmVudCBuYW1lLCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzY29wZSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50SW5mb30gY29tcG9uZW50SW5mbyBpbnN0YW5jZSBvZiBDb21wb25lbnRJbmZvIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgY29weSBvZiBjb21wb25lbnRcbiAqICBUT0RPIHRyeSByZW1vdmluZyBpdFxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5pdChzY29wZSwgZWxlbWVudCwgbmFtZSwgY29tcG9uZW50SW5mbykge1xuICAgIC8vIGNyZWF0ZSBET00gZWxlbWVudCBpZiBpdCB3YXNuJ3QgcGFzc2VkIHRvIENvbnN0cnVjdG9yXG4gICAgdGhpcy5lbCA9IGVsZW1lbnQgfHwgdGhpcy5jcmVhdGVFbGVtZW50KCk7XG5cbiAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gY29tcG9uZW50IG9uIERPTSBlbGVtZW50XG4gICAgaWYgKHRoaXMuZWwpIHtcbiAgICAgICAgLy8gY2hlY2sgdGhhdCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBjb21wb25lbnQgYWxyZWFkeSBhdGFjaGVkXG4gICAgICAgIHZhciBlbENvbXAgPSB0aGlzLmVsW2NvbmZpZy5jb21wb25lbnRSZWZdO1xuICAgICAgICBpZiAoZWxDb21wKVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2NvbXBvbmVudCAnICsgbmFtZSArICcgYXR0YWNoZWQgdG8gZWxlbWVudCB0aGF0IGFscmVhZHkgaGFzIGNvbXBvbmVudCAnICsgZWxDb21wLm5hbWUpO1xuXG4gICAgICAgIHRoaXMuZWxbY29uZmlnLmNvbXBvbmVudFJlZl0gPSB0aGlzO1xuICAgIH1cblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIGNvbXBvbmVudEluZm86IGNvbXBvbmVudEluZm8sXG4gICAgICAgIGV4dHJhRmFjZXRzOiBbXVxuICAgIH0sIF8uRU5VTSk7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcblxuICAgIC8vIGNyZWF0ZSBjb21wb25lbnQgbWVzc2VuZ2VyXG4gICAgdmFyIG1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG1lc3Nlbmdlcik7XG5cbiAgICAvLyBjaGVjayBhbGwgZmFjZXRzIGRlcGVuZGVuY2llcyAocmVxdWlyZWQgZmFjZXRzKVxuICAgIHRoaXMuYWxsRmFjZXRzKCdjaGVjaycpO1xuXG4gICAgLy8gc3RhcnQgYWxsIGZhY2V0c1xuICAgIHRoaXMuYWxsRmFjZXRzKCdzdGFydCcpO1xuXG4gICAgLy8gY2FsbCBzdGFydCBtZXRob2QgaWYgaXQncyBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgaWYgKHRoaXMuc3RhcnQpIHRoaXMuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIFRoaXMgaXMgYSBzdHViIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aGV0aGVyIHRoZSBtZXRob2Qgb2Ygc3VwZXJjbGFzcyBzaG91bGQgYmUgY2FsbGVkIGluIHN1YmNsYXNzZXNcbiAqIFRoZSBzdGFydCBtZXRob2Qgb2Ygc3ViY2xhc3MgaW5zdGFuY2UgaXMgY2FsbGVkIG9uY2UgYWxsIHRoZSBmYWNldHMgYXJlIGNyZWF0ZWQsIGluaXRpYWxpemVkIGFuZCBzdGFydGVkIChzZWUgYWJvdmUpXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzdGFydCgpIHt9XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogSW5pdGlhbGl6ZXMgdGhlIGVsZW1lbnQgd2hpY2ggdGhpcyBjb21wb25lbnQgaXMgYm91bmQgdG9cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgb3V0c2lkZSB0aGUgRE9NIGFuZFxuICogd2lsbCBnZW5lcmF0ZSBhIG5ldyBlbGVtZW50IGZvciB0aGUgY29tcG9uZW50LlxuICogXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkY3JlYXRlRWxlbWVudCgpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm47XG5cbiAgICB0aGlzLmVsID0gdGhpcy5kb21cbiAgICAgICAgICAgICAgICA/IHRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoKVxuICAgICAgICAgICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICByZXR1cm4gdGhpcy5lbDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgaGFzIGZhY2V0XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGZhY2V0TmFtZU9yQ2xhc3NcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRoYXNGYWNldChmYWNldE5hbWVPckNsYXNzKSB7XG4gICAgdmFyIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UodHlwZW9mIGZhY2V0TmFtZU9yQ2xhc3MgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFjZXROYW1lT3JDbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWNldE5hbWVPckNsYXNzKTtcblxuICAgIHZhciBmYWNldCA9IHRoaXNbZmFjZXROYW1lXTtcbiAgICBpZiAoISBmYWNldCBpbnN0YW5jZW9mIENvbXBvbmVudEZhY2V0KVxuICAgICAgICBsb2dnZXIud2FybignZXhwZWN0ZWQgZmFjZXQnLCBmYWNldE5hbWUsICdidXQgdGhpcyBwcm9wZXJ0eSBuYW1lIGlzIHVzZWQgZm9yIHNvbWV0aGluZyBlbHNlJyk7XG5cbiAgICByZXR1cm4gISEgZmFjZXQ7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBmYWNldCB3aXRoIGdpdmVuIG5hbWUgb3IgY2xhc3MgdG8gdGhlIGluc3RhbmNlIG9mIENvbXBvbmVudCAob3IgaXRzIHN1YmNsYXNzKS5cbiAqIFxuICogQHBhcmFtIHtTdHJpbmd8U3ViY2xhc3MoQ29tcG9uZW50KX0gZmFjZXROYW1lT3JDbGFzcyBuYW1lIG9mIGZhY2V0IGNsYXNzIG9yIHRoZSBjbGFzcyBpdHNlbGYuIElmIG5hbWUgaXMgcGFzc2VkLCB0aGUgY2xhc3Mgd2lsbCBiZSByZXRpcmV2ZWQgZnJvbSBmYWNldHNSZWdpc3RyeVxuICogQHBhcmFtIHtPYmplY3R9IGZhY2V0Q29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWUgb3B0aW9uYWwgZmFjZXQgbmFtZS4gQWxsb3dzIHRvIGFkZCBmYWNldCB1bmRlciBhIG5hbWUgZGlmZmVyZW50IGZyb20gdGhlIGNsYXNzIG5hbWUgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGFkZEZhY2V0KGZhY2V0TmFtZU9yQ2xhc3MsIGZhY2V0Q29uZmlnLCBmYWNldE5hbWUsIHRocm93T25FcnJvcnMpIHtcbiAgICBjaGVjayhmYWNldE5hbWVPckNsYXNzLCBNYXRjaC5PbmVPZihTdHJpbmcsIE1hdGNoLlN1YmNsYXNzKENvbXBvbmVudEZhY2V0KSkpO1xuICAgIGNoZWNrKGZhY2V0Q29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgICBjaGVjayhmYWNldE5hbWUsIE1hdGNoLk9wdGlvbmFsKFN0cmluZykpO1xuXG4gICAgdmFyIEZhY2V0Q2xhc3M7XG4gICAgLy8gaWYgb25seSBuYW1lIHBhc3NlZCwgcmV0cmlldmUgZmFjZXQgY2xhc3MgZnJvbSByZWdpc3RyeVxuICAgIGlmICh0eXBlb2YgZmFjZXROYW1lT3JDbGFzcyA9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgZmFjZXRDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZU9yQ2xhc3MpO1xuICAgICAgICBGYWNldENsYXNzID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZhY2V0Q2xhc3NOYW1lKTtcbiAgICB9IGVsc2UgXG4gICAgICAgIEZhY2V0Q2xhc3MgPSBmYWNldE5hbWVPckNsYXNzO1xuXG4gICAgaWYgKCFmYWNldE5hbWUpXG4gICAgICAgIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIHRoaXMuZXh0cmFGYWNldHMucHVzaChmYWNldE5hbWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0IHVzaW5nIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0XG4gICAgdmFyIG5ld0ZhY2V0ID0gRmFjZXRlZE9iamVjdC5wcm90b3R5cGUuYWRkRmFjZXQuY2FsbCh0aGlzLCBGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKTtcblxuICAgIC8vIGNoZWNrIGRlcGVuZWRlbmNpZXMgYW5kIHN0YXJ0IGZhY2V0XG4gICAgaWYgKG5ld0ZhY2V0LmNoZWNrKSBuZXdGYWNldC5jaGVjaygpO1xuICAgIGlmIChuZXdGYWNldC5zdGFydCkgbmV3RmFjZXQuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2QuXG4gKiBFbnZva2UgZ2l2ZW4gbWV0aG9kIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBvbiBhbGwgZmFjZXRzLlxuICogUmV0dXJucyB0aGUgbWFwIG9mIHZhbHVlcyByZXR1cm5lZCBieSBhbGwgZmFjZXRzLiBJZiB0aGUgZmFjZXQgZG9lc24ndCBoYXZlIHRoZSBtZXRob2QgaXQgaXMgc2ltcGx5IG5vdCBjYWxsZWQgYW5kIHRoZSB2YWx1ZSBpbiB0aGUgbWFwIHdpbGwgYmUgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2QgbWV0aG9kIG5hbWUgdG8gZW52b2tlIG9uIHRoZSBmYWNldFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkYWxsRmFjZXRzKG1ldGhvZCkgeyAvLyAsLi4uIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuXG4gICAgcmV0dXJuIF8ubWFwS2V5cyh0aGlzLmZhY2V0cywgZnVuY3Rpb24oZmFjZXQsIGZjdE5hbWUpIHtcbiAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldFttZXRob2RdID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICByZXR1cm4gZmFjZXRbbWV0aG9kXS5hcHBseShmYWNldCwgYXJncyk7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogXG4gKiBAcGFyYW0ge1tTdHJpbmddfSBuYW1lIG9wdGlvbmFsIG5ldyBuYW1lIG9mIGNvbXBvbmVudCwgXG4gKiBAcGFyYW0ge1tCb29sZWFuXX0gcmVuYW1lSW5TY29wZSBvcHRpb25hbCBmYWxzZSB0byBub3QgcmVuYW1lIENvbXBvbmVudEluZm8gb2JqZWN0IGluIGl0cyBzY29wZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW5hbWUobmFtZSwgcmVuYW1lSW5TY29wZSkge1xuICAgIG5hbWUgPSBuYW1lIHx8IG1pbG9Db21wb25lbnROYW1lKCk7XG4gICAgdGhpcy5jb21wb25lbnRJbmZvLnJlbmFtZShuYW1lLCBmYWxzZSk7XG4gICAgU2NvcGUucmVuYW1lKHRoaXMsIG5hbWUsIHJlbmFtZUluU2NvcGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIFJlbW92ZXMgY29tcG9uZW50IGZyb20gaXRzIHNjb3BlLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJlc2VydmVTY29wZVByb3BlcnR5IHRydWUgbm90IHRvIGRlbGV0ZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVpZXQgb3B0aW9uYWwgdHJ1ZSB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGluIHNjb3BlXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW1vdmUocHJlc2VydmVTY29wZVByb3BlcnR5LCBxdWlldCkge1xuICAgIGlmICh0aGlzLnNjb3BlKSB7XG4gICAgICAgIHRoaXMuc2NvcGUuX3JlbW92ZSh0aGlzLm5hbWUsIHF1aWV0KTtcbiAgICAgICAgaWYgKCEgcHJlc2VydmVTY29wZVByb3BlcnR5KVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NvcGU7XG4gICAgfVxufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluc2VydHMgdGhlIGNvbXBvbmVudCBpbnRvIHRoZSBET00gYW5kIGF0dGVtcHRzIHRvIGFkanVzdCB0aGUgc2NvcGUgdHJlZSBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudEVsICAgIFRoZSBlbGVtZW50IGludG8gd2hpY2ggdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2VFbCAob3B0aW9uYWwpIFRoZSByZWZlcmVuY2UgZWxlbWVudCBpdCBzaG91bGQgYmUgaW5zZXJ0ZWQgYmVmb3JlLlxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5zZXJ0SW50byhwYXJlbnRFbCwgcmVmZXJlbmNlRWwpIHtcbiAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUodGhpcy5lbCwgcmVmZXJlbmNlRWwpO1xuICAgIHRoaXMuc2V0U2NvcGVQYXJlbnRGcm9tRE9NKCk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIFJldHVybnMgY29tcG9uZW50IHN0YXRlXG4gKlxuICogQHRoaXMge0NvbXBvbmVudH0gY29tcG9uZW50IHdoaWNoIHN0YXRlIHdpbGwgYmUgc2F2ZWRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFN0YXRlKCkge1xuICAgIHRoaXMuYnJvYWRjYXN0KCdnZXRzdGF0ZXN0YXJ0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9nZXRTdGF0ZSh0cnVlKTtcbiAgICBzdGF0ZS5vdXRlckhUTUwgPSB0aGlzLmVsLm91dGVySFRNTDtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICdicm9hZGNhc3QnLCAnZ2V0c3RhdGVjb21wbGV0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm4gc3RhdGU7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIElmIGNvbXBvbmVudCBoYXMgW1RyYW5zZmVyXSguL2NfZmFjZXRzL1RyYW5zZmVyLmpzLmh0bWwpIGZhY2V0IG9uIGl0LCB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgc3RhdGUgZnJvbSB0aGlzIGZhY2V0XG4gKiBSZXR1cm5zIGNvbXBvbmVudCBzdGF0ZVxuICpcbiAqIEB0aGlzIHtDb21wb25lbnR9IGNvbXBvbmVudCB3aGljaCBzdGF0ZSB3aWxsIGJlIHNhdmVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzLiBcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFRyYW5zZmVyU3RhdGUob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZmVyXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNmZXIuZ2V0U3RhdGUob3B0aW9ucylcbiAgICAgICAgICAgIDogdGhpcy5nZXRTdGF0ZShvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudFxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5nZXRTdGF0ZWAgYW5kIGJ5IFtDb250YWluZXJdKC4vY19mYWNldHMvQ29udGFpbmVyLmpzLmh0bWwpIGZhY2V0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSBmYWxzZSB0byBnZXQgc2hhbGxvdyBzdGF0ZSBmcm9tIGFsbCBmYWNldHMgKHRydWUgYnkgZGVmYXVsdClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JF9nZXRTdGF0ZShkZWVwU3RhdGUpe1xuXG4gICAgdmFyIGZhY2V0c1N0YXRlcyA9IHRoaXMuYWxsRmFjZXRzKCdnZXRTdGF0ZScsIGRlZXBTdGF0ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUpO1xuICAgIGZhY2V0c1N0YXRlcyA9IF8uZmlsdGVyS2V5cyhmYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlKSB7XG4gICAgICAgIHJldHVybiAhISBmY3RTdGF0ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBOYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGNvbXBDbGFzczogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICBleHRyYUZhY2V0czogdGhpcy5leHRyYUZhY2V0cyxcbiAgICAgICAgZmFjZXRzU3RhdGVzOiBmYWNldHNTdGF0ZXNcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgc3RhdGUgb2YgY29tcG9uZW50LlxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGVgIGFuZCBieSBbQ29udGFpbmVyXSguL2NfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIHN0YXRlIHRvIHNldCB0aGUgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5mYWNldHNTdGF0ZXMpXG4gICAgICAgIF8uZWFjaEtleShzdGF0ZS5mYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlLCBmY3ROYW1lKSB7XG4gICAgICAgICAgICB2YXIgZmFjZXQgPSB0aGlzW2ZjdE5hbWVdO1xuICAgICAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldC5zZXRTdGF0ZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIGZhY2V0LnNldFN0YXRlKGZjdFN0YXRlKTtcbiAgICAgICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgc2NvcGUgcGFyZW50IG9mIGEgY29tcG9uZW50LlxuICogSWYgYGNvbmRpdGlvbk9yRmFjZXRgIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCBhbiBpbW1lZGlhdGUgcGFyZW50IHdpbGwgYmUgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgY2xvc2VzdCBhbmNlc3RvciB3aXRoIGEgc3BlY2lmaWVkIGZhY2V0IG9yIHBhc3NpbmcgY29uZGl0aW9uIHRlc3QuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGNvbmRpdGlvbk9yRmFjZXQgb3B0aW9uYWwgY29uZGl0aW9uIHRoYXQgY29tcG9uZW50IHNob3VsZCBwYXNzIChvciBmYWNldCBuYW1lIGl0IHNob3VsZCBjb250YWluKVxuICogQHJldHVybiB7Q29tcG9uZW50fHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KGNvbmRpdGlvbk9yRmFjZXQpIHtcbiAgICByZXR1cm4gX2NhbGxHZXRTY29wZVBhcmVudC5jYWxsKHRoaXMsIF9nZXRTY29wZVBhcmVudCwgY29uZGl0aW9uT3JGYWNldCk7XG59XG5cbmZ1bmN0aW9uIF9jYWxsR2V0U2NvcGVQYXJlbnQoX2dldFNjb3BlUGFyZW50RnVuYywgY29uZGl0aW9uT3JGYWNldCkge1xuICAgIGNoZWNrKGNvbmRpdGlvbk9yRmFjZXQsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKSk7XG4gICAgdmFyIGNvbmRpdGlvbkZ1bmMgPSBjb21wb25lbnRVdGlscy5fbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmMoY29uZGl0aW9uT3JGYWNldCk7XG4gICAgcmV0dXJuIF9nZXRTY29wZVBhcmVudEZ1bmMuY2FsbCh0aGlzLCBjb25kaXRpb25GdW5jKTsgICBcbn1cblxuZnVuY3Rpb24gX2dldFNjb3BlUGFyZW50KGNvbmRpdGlvbkZ1bmMpIHtcbiAgICB2YXIgcGFyZW50O1xuICAgIHRyeSB7IHBhcmVudCA9IHRoaXMuc2NvcGUuX2hvc3RPYmplY3Qub3duZXI7IH0gY2F0Y2goZSkge31cblxuICAgIC8vIFdoZXJlIHRoZXJlIGlzIG5vIHBhcmVudCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICAvLyBUaGUgcGFyZW50IGNvbXBvbmVudCBpcyBjaGVja2VkIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBpZiAoISBjb25kaXRpb25GdW5jIHx8IGNvbmRpdGlvbkZ1bmMocGFyZW50KSApXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNjb3BlIHBhcmVudCB3aXRoIGEgZ2l2ZW4gY2xhc3MsIHdpdGggc2FtZSBjbGFzcyBpZiBub3Qgc3BlY2lmaWVkXG4gKlxuICogQHBhcmFtIHtbRnVuY3Rpb25dfSBDb21wb25lbnRDbGFzcyBjb21wb25lbnQgY2xhc3MgdGhhdCB0aGUgcGFyZW50IHNob3VsZCBoYXZlLCBzYW1lIGNsYXNzIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKENvbXBvbmVudENsYXNzKSB7XG4gICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnRDbGFzcyB8fCB0aGlzLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBfZ2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBmdW5jdGlvbihjb21wKSB7XG4gICAgICAgIHJldHVybiBjb21wIGluc3RhbmNlb2YgQ29tcG9uZW50Q2xhc3M7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgdG9wbW9zdCBzY29wZSBwYXJlbnQgb2YgYSBjb21wb25lbnQuXG4gKiBJZiBgY29uZGl0aW9uT3JGYWNldGAgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0b3Btb3N0IHNjb3BlIHBhcmVudCB3aWxsIGJlIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHRvcG1vc3QgYW5jZXN0b3Igd2l0aCBhIHNwZWNpZmllZCBmYWNldCBvciBwYXNzaW5nIGNvbmRpdGlvbiB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBjb25kaXRpb25PckZhY2V0IG9wdGlvbmFsIGNvbmRpdGlvbiB0aGF0IGNvbXBvbmVudCBzaG91bGQgcGFzcyAob3IgZmFjZXQgbmFtZSBpdCBzaG91bGQgY29udGFpbilcbiAqIEByZXR1cm4ge0NvbXBvbmVudHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudChjb25kaXRpb25PckZhY2V0KSB7XG4gICAgcmV0dXJuIF9jYWxsR2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBfZ2V0VG9wU2NvcGVQYXJlbnQsIGNvbmRpdGlvbk9yRmFjZXQpO1xufVxuXG5mdW5jdGlvbiBfZ2V0VG9wU2NvcGVQYXJlbnQoY29uZGl0aW9uRnVuYykge1xuICAgIHZhciB0b3BQYXJlbnRcbiAgICAgICAgLCBwYXJlbnQgPSB0aGlzO1xuICAgIGRvIHtcbiAgICAgICAgcGFyZW50ID0gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIHRvcFBhcmVudCA9IHBhcmVudDtcbiAgICB9IHdoaWxlIChwYXJlbnQpO1xuXG4gICAgcmV0dXJuIHRvcFBhcmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgc2NvcGUgcGFyZW50IHdpdGggYSBnaXZlbiBjbGFzcywgd2l0aCBzYW1lIGNsYXNzIGlmIG5vdCBzcGVjaWZpZWRcbiAqXG4gKiBAcGFyYW0ge1tGdW5jdGlvbl19IENvbXBvbmVudENsYXNzIGNvbXBvbmVudCBjbGFzcyB0aGF0IHRoZSBwYXJlbnQgc2hvdWxkIGhhdmUsIHNhbWUgY2xhc3MgYnkgZGVmYXVsdFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MoQ29tcG9uZW50Q2xhc3MpIHtcbiAgICBDb21wb25lbnRDbGFzcyA9IENvbXBvbmVudENsYXNzIHx8IHRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIF9nZXRUb3BTY29wZVBhcmVudC5jYWxsKHRoaXMsIGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgcmV0dXJuIGNvbXAgaW5zdGFuY2VvZiBDb21wb25lbnRDbGFzcztcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEZpbmRzIHNjb3BlIHBhcmVudCBvZiBjb21wb25lbnQgdXNpbmcgRE9NIHRyZWUgKHVubGlrZSBnZXRTY29wZVBhcmVudCB0aGF0IHNpbXBseSBnb2VzIHVwIHRoZSBzY29wZSB0cmVlKS5cbiAqIFdoaWxlIGdldFNjb3BlUGFyZW50IGlzIGZhc3RlciBpdCBtYXkgZmFpbCBpZiBzY29wZSBjaGFpbiBpcyBub3Qgc2V0dXAgeWV0IChlLmcuLCB3aGVuIGNvbXBvbmVudCBoYXMgYmVlbiBqdXN0IGluc2VydGVkKS5cbiAqIFRoZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnQgd2lsbCBiZSBjaGFuZ2VkIHRvIHBvaW50IHRvIHNjb3BlIG9iamVjdCBvZiBjb250YWluZXIgZmFjZXQgb2YgdGhhdCBwYXJlbnQuXG4gKiBSZXR1cm5lZCBzY29wZSBwYXJlbnQgb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIHVuZGVmaW5lZCAoYXMgd2VsbCBhcyBjb21wb25lbnQncyBzY29wZSBwcm9wZXJ0eSkgaWYgbm8gcGFyZW50IGluIHRoZSBET00gdHJlZSBoYXMgY29udGFpbmVyIGZhY2V0LlxuICogVE9ETyBNZXRob2Qgd2lsbCBub3QgYmluZCBET00gY2hpbGRyZW4gY29ycmVjdGx5IGlmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIGZhY2V0LlxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JHNldFNjb3BlUGFyZW50RnJvbURPTSgpIHtcbiAgICB2YXIgcGFyZW50RWwgPSB0aGlzLmVsLnBhcmVudE5vZGU7XG5cbiAgICB2YXIgcGFyZW50LCBmb3VuZFBhcmVudDtcbiAgICB3aGlsZSAocGFyZW50RWwgJiYgISBmb3VuZFBhcmVudCkge1xuICAgICAgICBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KHBhcmVudEVsKTtcbiAgICAgICAgZm91bmRQYXJlbnQgPSBwYXJlbnQgJiYgcGFyZW50LmNvbnRhaW5lcjtcbiAgICAgICAgcGFyZW50RWwgPSBwYXJlbnRFbC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlKCk7IC8vIHJlbW92ZSBjb21wb25lbnQgZnJvbSBpdHMgY3VycmVudCBzY29wZSAoaWYgaXQgaXMgZGVmaW5lZClcbiAgICBpZiAoZm91bmRQYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yZW5hbWUodW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgIHBhcmVudC5jb250YWluZXIuc2NvcGUuX2FkZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9ICAgICAgICBcbn1cblxuXG4vKipcbiAqIFdhbGtzIGNvbXBvbmVudCB0cmVlLCBjYWxsaW5nIHByb3ZpZGVkIGNhbGxiYWNrIG9uIGVhY2ggY29tcG9uZW50XG4gKlxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcGFyYW0gdGhpc0FyZ1xuICovXG5mdW5jdGlvbiBDb21wb25lbnQkd2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcyk7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuICAgIHRoaXMuY29udGFpbmVyLnNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBvbmVudCkge1xuICAgICAgICBjb21wb25lbnQud2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50JHRyZWVQYXRoT2YoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGRvbVV0aWxzLnRyZWVQYXRoT2YodGhpcy5lbCwgY29tcG9uZW50LmVsKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCh0cmVlUGF0aCwgbmVhcmVzdCkge1xuICAgIHZhciBub2RlID0gZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgodGhpcy5lbCwgdHJlZVBhdGgsIG5lYXJlc3QpO1xuICAgIHJldHVybiBDb21wb25lbnQuZ2V0Q29tcG9uZW50KG5vZGUpO1xufVxuXG5cbmZ1bmN0aW9uIENvbXBvbmVudCRpbnNlcnRBdFRyZWVQYXRoKHRyZWVQYXRoLCBjb21wb25lbnQsIG5lYXJlc3QpIHtcbiAgICB2YXIgd2FzSW5zZXJ0ZWQgPSBkb21VdGlscy5pbnNlcnRBdFRyZWVQYXRoKHRoaXMuZWwsIHRyZWVQYXRoLCBjb21wb25lbnQuZWwpO1xuICAgIGlmICh3YXNJbnNlcnRlZCkgY29tcG9uZW50LnNldFNjb3BlUGFyZW50RnJvbURPTSgpO1xuICAgIHJldHVybiB3YXNJbnNlcnRlZDtcbn1cblxuXG4vKipcbiAqIEJyb2FkY2FzdCBtZXNzYWdlIHRvIGNvbXBvbmVudCBhbmQgdG8gYWxsIGl0cyBzY29wZSBjaGlsZHJlblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbXNnIG1lc3NhZ2UgdG8gYmUgc2VudFxuICogQHBhcmFtIHtbQW55XX0gZGF0YSBvcHRpb25hbCBtZXNzYWdlIGRhdGFcbiAqIEBwYXJhbSB7W0Z1bmN0aW9uXX0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7W0Jvb2xlYW5dfSBzeW5jaHJvbm91c2x5IGlmIGl0IHNob3VsZCB1c2UgcG9zdE1lc3NhZ2VTeW5jXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRicm9hZGNhc3QobXNnLCBkYXRhLCBjYWxsYmFjaywgc3luY2hyb25vdXNseSkge1xuICAgIHZhciBwb3N0TWV0aG9kID0gc3luY2hyb25vdXNseSA/ICdwb3N0TWVzc2FnZVN5bmMnIDogJ3Bvc3RNZXNzYWdlJztcbiAgICB0aGlzLndhbGtTY29wZVRyZWUoZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudFtwb3N0TWV0aG9kXShtc2csIGRhdGEsIGNhbGxiYWNrKTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY29tcG9uZW50OiByZW1vdmVzIGNvbXBvbmVudCBmcm9tIERPTSwgcmVtb3ZlcyBpdCBmcm9tIHNjb3BlLCBkZWxldGVzIGFsbCByZWZlcmVuY2VzIHRvIERPTSBub2RlcyBhbmQgdW5zdWJzY3JpYmVzIGZyb20gYWxsIG1lc3NhZ2VzIGJvdGggY29tcG9uZW50IGFuZCBhbGwgZmFjZXRzXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRkZXN0cm95KHF1aWV0KSB7XG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICBpZiAoIXF1aWV0KSBsb2dnZXIud2FybignQ29tcG9uZW50IGRlc3Ryb3k6IGNvbXBvbmVudCBpcyBhbHJlYWR5IGRlc3Ryb3llZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlKGZhbHNlLCBxdWlldCk7XG4gICAgdGhpcy5hbGxGYWNldHMoJ2Rlc3Ryb3knKTtcbiAgICB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLmVsKSB7XG4gICAgICAgIGRvbVV0aWxzLmRldGFjaENvbXBvbmVudCh0aGlzLmVsKTtcbiAgICAgICAgZG9tVXRpbHMucmVtb3ZlRWxlbWVudCh0aGlzLmVsKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50SW5mby5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgd2FzIGRlc3Ryb3llZFxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudC5GYWNldGBcbiAqXG4gKiBUaGUgY2xhc3MgZm90IHRoZSBmYWNldCBvZiBjb21wb25lbnQuIFdoZW4gYSBjb21wb25lbnQgaXMgY3JlYXRlZCwgaXRcbiAqIGNyZWF0ZXMgYWxsIGl0cyBmYWNldHMuXG4gKlxuICogU2VlIEZhY2V0cyBzZWN0aW9uIG9uIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBmYWNldHMgYW5kIG9uXG4gKiBob3cgdG8gY3JlYXRlIG5ldyBmYWNldHMgY2xhc3Nlcy5cbiAqXG4gKiAtIENvbXBvbmVudCAtIGJhc2ljIGNvbXBwb25lbnQgY2xhc3NcbiAqIC0gQ29tcG9uZW50RmFjZXQgLSBiYXNpY1xuICovXG5cbnZhciBGYWNldCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSBfLmNyZWF0ZVN1YmNsYXNzKEZhY2V0LCAnQ29tcG9uZW50RmFjZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb21wb25lbnRGYWNldDtcblxuXG4vKipcbiAqIHBvc3REb21QYXJlbnRcbiAqXG4gKiBJZiBmYWNldCBoYXMgRE9NIHBhcmVudCBmYWNldCAoc2VlIGBkb21QYXJlbnRgIG1ldGhvZCksIHBvc3RzIHRoZSBtZXNzYWdlIHRvIHRoaXMgZmFjZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZURhdGFcbiAqL1xudmFyIHBvc3REb21QYXJlbnQgPSBfLnBhcnRpYWwoX3Bvc3RQYXJlbnQsIGRvbVBhcmVudCk7XG5cbi8qKlxuICogcG9zdFNjb3BlUGFyZW50XG4gKlxuICogSWYgZmFjZXQgaGFzIHNjb3BlIHBhcmVudCBmYWNldCAoc2VlIGBzY29wZVBhcmVudGAgbWV0aG9kKSwgcG9zdHMgdGhlIG1lc3NhZ2UgdG8gdGhpcyBmYWNldC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlRGF0YVxuICovXG52YXIgcG9zdFNjb3BlUGFyZW50ID0gXy5wYXJ0aWFsKF9wb3N0UGFyZW50LCBzY29wZVBhcmVudCk7XG5cblxuXy5leHRlbmRQcm90byhDb21wb25lbnRGYWNldCwge1xuICAgIGluaXQ6IENvbXBvbmVudEZhY2V0JGluaXQsXG4gICAgc3RhcnQ6IENvbXBvbmVudEZhY2V0JHN0YXJ0LFxuICAgIGNoZWNrOiBDb21wb25lbnRGYWNldCRjaGVjayxcbiAgICBkZXN0cm95OiBDb21wb25lbnRGYWNldCRkZXN0cm95LFxuICAgIG9uQ29uZmlnTWVzc2FnZXM6IENvbXBvbmVudEZhY2V0JG9uQ29uZmlnTWVzc2FnZXMsXG4gICAgZG9tUGFyZW50OiBkb21QYXJlbnQsXG4gICAgcG9zdERvbVBhcmVudDogcG9zdERvbVBhcmVudCxcbiAgICBzY29wZVBhcmVudDogc2NvcGVQYXJlbnQsXG4gICAgcG9zdFNjb3BlUGFyZW50OiBwb3N0U2NvcGVQYXJlbnQsXG4gICAgZ2V0TWVzc2FnZVNvdXJjZTogZ2V0TWVzc2FnZVNvdXJjZSxcbiAgICBkaXNwYXRjaFNvdXJjZU1lc3NhZ2U6IGRpc3BhdGNoU291cmNlTWVzc2FnZSxcbiAgICBfY3JlYXRlTWVzc2VuZ2VyOiBfY3JlYXRlTWVzc2VuZ2VyLFxuICAgIF9zZXRNZXNzYWdlU291cmNlOiBfc2V0TWVzc2FnZVNvdXJjZSxcbiAgICBfY3JlYXRlTWVzc2FnZVNvdXJjZTogX2NyZWF0ZU1lc3NhZ2VTb3VyY2UsXG4gICAgX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJOiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUElcbn0pO1xuXG5fLmV4dGVuZChDb21wb25lbnRGYWNldCwge1xuICAgIHJlcXVpcmVzRmFjZXQ6IHJlcXVpcmVzRmFjZXRcbn0pO1xuXG5cbi8qKlxuICogRXhwb3NlIE1lc3NlbmdlciBtZXRob2RzIG9uIEZhY2V0IHByb3RvdHlwZVxuICovXG52YXIgTUVTU0VOR0VSX1BST1BFUlRZID0gJ19tZXNzZW5nZXInO1xuTWVzc2VuZ2VyLnVzZVdpdGgoQ29tcG9uZW50RmFjZXQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG4vLyBpbml0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JGluaXQoKSB7XG4gICAgdGhpcy5fY3JlYXRlTWVzc2VuZ2VyKCk7XG59XG5cblxuLy8gc29tZSBzdWJjbGFzc2VzIChlLmcuIE1vZGVsRmFjZXQpIG92ZXJycmlkZSB0aGlzIG1ldGhvZCBhbmQgZG8gbm90IGNyZWF0ZSB0aGVpciBvd24gbWVzc2VuZ2VyXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2VuZ2VyKCl7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG5ldyBNZXNzZW5nZXIodGhpcykpO1xufVxuXG5cbi8vIHN0YXJ0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tZXNzYWdlcylcbiAgICAgICAgdGhpcy5vbkNvbmZpZ01lc3NhZ2VzKHRoaXMuY29uZmlnLm1lc3NhZ2VzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnRGYWNldCRvbkNvbmZpZ01lc3NhZ2VzKG1lc3NhZ2VTdWJzY3JpYmVycykge1xuICAgIHZhciBub3RZZXRSZWdpc3RlcmVkTWFwID0gXy5tYXBLZXlzKG1lc3NhZ2VTdWJzY3JpYmVycywgZnVuY3Rpb24oc3Vic2NyaWJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgdmFyIHN1YnNjcmliZXJUeXBlID0gdHlwZW9mIHN1YnNjcmliZXI7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub24obWVzc2FnZXMsIHN1YnNjcmliZXIpO1xuXG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdmFyIGNvbnRleHRUeXBlID0gdHlwZW9mIHN1YnNjcmliZXIuY29udGV4dDtcbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vbihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNvbnRleHQgPT0gdGhpcy5uYW1lIHx8IHN1YnNjcmliZXIuY29udGV4dCA9PSAnZmFjZXQnKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1YnNjcmliZXIuY29udGV4dCA9PSAnb3duZXInKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5vd25lclxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCBpbiBjb25maWd1cmF0aW9uOiAnICsgc3Vic2NyaWJlci5jb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBjb250ZXh0VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gc3Vic2NyaWJlciB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBzdWJzY3JpYmVyVHlwZSk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbm90WWV0UmVnaXN0ZXJlZE1hcDtcbn1cblxuXG4vLyBjaGVja0RlcGVuZGVuY2llc1xuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkY2hlY2soKSB7XG4gICAgaWYgKHRoaXMucmVxdWlyZSkge1xuICAgICAgICB0aGlzLnJlcXVpcmUuZm9yRWFjaChmdW5jdGlvbihyZXFGYWNldCkge1xuICAgICAgICAgICAgaWYgKCEgdGhpcy5vd25lci5oYXNGYWNldChyZXFGYWNldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5vd25lci5hZGRGYWNldChyZXFGYWNldCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbn1cblxuXG4vLyBkZXN0cm95cyBmYWNldFxuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldKSB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBkb21QYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBvZiB0aGUgY2xvc2VzdCBwYXJlbnQgRE9NIGVsZW1lbnQsIHRoYXQgaGFzIGEgY29tcG9uZW50IHdpdGggdGhlIHNhbWUgZmFjZXQgY2xhc3MgYXR0YWNoZWQgdG8gaXQuIElmIHN1Y2ggZWxlbWVudCBkb2Vzbid0IGV4aXN0IG1ldGhvZCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGRvbVBhcmVudCgpIHtcbiAgICB2YXIgcGFyZW50Q29tcG9uZW50ID0gY29tcG9uZW50VXRpbHMuZ2V0Q29udGFpbmluZ0NvbXBvbmVudCh0aGlzLm93bmVyLmVsLCBmYWxzZSwgdGhpcy5uYW1lKTtcbiAgICByZXR1cm4gcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudFt0aGlzLm5hbWVdO1xufVxuXG5cbi8qKlxuICogc2NvcGVQYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBhcyBgdGhpc2AgZmFjZXQgb2YgdGhlIGNsb3Nlc3Qgc2NvcGUgcGFyZW50IChpLmUuLCB0aGUgY29tcG9uZW50IHRoYXQgaGFzIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCBjb21wb25lbnQgaW4gaXRzIGNvbnRhaW5lciBmYWNldCkuXG4gKi9cbmZ1bmN0aW9uIHNjb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KHRoaXMubmFtZSk7XG4gICAgcmV0dXJuIHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnRbdGhpcy5uYW1lXTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFBhcmVudChnZXRQYXJlbnRNZXRob2QsIG1lc3NhZ2VUeXBlLCBtZXNzYWdlRGF0YSkge1xuICAgIHZhciBwYXJlbnRGYWNldCA9IGdldFBhcmVudE1ldGhvZC5jYWxsKHRoaXMpO1xuICAgIGlmIChwYXJlbnRGYWNldClcbiAgICAgICAgcGFyZW50RmFjZXQucG9zdE1lc3NhZ2UobWVzc2FnZVR5cGUsIG1lc3NhZ2VEYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBfc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLl9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpO1xufVxuXG5cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXS5nZXRNZXNzYWdlU291cmNlKCk7XG59XG5cblxuZnVuY3Rpb24gZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlU291cmNlKCkuZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVNZXNzYWdlU291cmNlKE1lc3NhZ2VTb3VyY2VDbGFzcywgb3B0aW9ucykge1xuICAgIHZhciBtZXNzYWdlU291cmNlID0gbmV3IE1lc3NhZ2VTb3VyY2VDbGFzcyh0aGlzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUEkoTWVzc2FnZVNvdXJjZUNsYXNzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBvcHRpb25zKSB7XG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSBuZXcgTWVzc2FnZVNvdXJjZUNsYXNzKHRoaXMsIHVuZGVmaW5lZCwgbWVzc2VuZ2VyQVBJT3JDbGFzcywgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1aXJlc0ZhY2V0KGZhY2V0TmFtZSkge1xuICAgIC8vICd0aGlzJyByZWZlcnMgdG8gdGhlIEZhY2V0IENsYXNzXG4gICAgdmFyIGZhY2V0UmVxdWlyZSA9IHRoaXMucHJvdG90eXBlLnJlcXVpcmU7XG5cbiAgICByZXR1cm4gZmFjZXRSZXF1aXJlICYmIChmYWNldFJlcXVpcmUuaW5kZXhPZihfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZSkpID49IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZhY2V0UmVxdWlyZS5pbmRleE9mKF8uZmlyc3RMb3dlckNhc2UoZmFjZXROYW1lKSkgPj0gMCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBtaWxvQmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIFNjb3BlID0gcmVxdWlyZSgnLi4vc2NvcGUnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcblxuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmZhY2V0cy5nZXQoJ0NvbnRhaW5lcicpYFxuICogQSBzcGVjaWFsIGNvbXBvbmVudCBmYWNldCB0aGF0IG1ha2VzIGNvbXBvbmVudCBjcmVhdGUgaXRzIG93biBpbm5lciBzY29wZS5cbiAqIFdoZW4gW21pbG8uYmluZGVyXSguLi8uLi9iaW5kZXIuanMuaHRtbCkgYmluZHMgRE9NIHRyZWUgYW5kIGNyZWF0ZXMgY29tcG9uZW50cywgaWYgY29tcG9uZW50cyBhcmUgaW5zaWRlIGNvbXBvbmVudCBXSVRIIENvbnRhaW5lciBmYWNldCwgdGhleSBhcmUgcHV0IG9uIHRoZSBgc2NvcGVgIG9mIGl0IChjb21wb25lbnQuY29udGFpbmVyLnNjb3BlIC0gc2VlIFtTY29wZV0oLi4vc2NvcGUuanMuaHRtbCkpLCBvdGhlcndpc2UgdGhleSBhcmUgcHV0IG9uIHRoZSBzYW1lIHNjb3BlIGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGJlIGRlZXBlciBpbiBET00gdHJlZS5cbiAqIEl0IGFsbG93cyBjcmVhdGluZyBuYW1lc3BhY2VzIGF2b2lkaW5nIGNvbXBvbmVudHMgbmFtZXMgY29uZmxpY3RzLCBhdCB0aGUgc2FtZSB0aW1lIGNyZWF0aW5nIG1vcmUgc2hhbGxvdyBjb21wb25lbnRzIHRyZWUgdGhhbiB0aGUgRE9NIHRyZWUuXG4gKiBUbyBjcmVhdGUgY29tcG9uZW50cyBmb3IgZWxlbWVudHMgaW5zaWRlIHRoZSBjdXJyZW50IGNvbXBvbmVudCB1c2U6XG4gKiBgYGBcbiAqIGNvbXBvbmVudC5jb250YWluZXIuYmluZGVyKCk7XG4gKiBgYGBcbiAqIFNlZSBbbWlsby5iaW5kZXJdKC4uLy4uL2JpbmRlci5qcy5odG1sKVxuICovXG52YXIgQ29udGFpbmVyID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0NvbnRhaW5lcicpO1xuXG5cbi8qKlxuICogIyMjI0NvbnRhaW5lciBmYWNldCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2JpbmRlcl0oI0NvbnRhaW5lciRiaW5kZXIpIC0gY3JlYXRlIGNvbXBvbmVudHMgZnJvbSBET00gaW5zaWRlIHRoZSBjdXJyZW50IG9uZVxuICovXG5fLmV4dGVuZFByb3RvKENvbnRhaW5lciwge1xuICAgIHN0YXJ0OiBDb250YWluZXIkc3RhcnQsXG4gICAgcGF0aDogQ29udGFpbmVyJHBhdGgsXG4gICAgZ2V0U3RhdGU6IENvbnRhaW5lciRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogQ29udGFpbmVyJHNldFN0YXRlLFxuICAgIGJpbmRlcjogQ29udGFpbmVyJGJpbmRlcixcbiAgICBkZXN0cm95OiBDb250YWluZXIkZGVzdHJveSxcbiAgICB1bndyYXA6IENvbnRhaW5lciR1bndyYXAsXG5cbiAgICBhcHBlbmQ6IENvbnRhaW5lciRhcHBlbmQsXG4gICAgaW5zZXJ0QmVmb3JlOiBDb250YWluZXIkaW5zZXJ0QmVmb3JlLFxuICAgIHJlbW92ZTogQ29udGFpbmVyJHJlbW92ZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChDb250YWluZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRhaW5lcjtcblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTY2FucyBET00sIGNyZWF0ZXMgY29tcG9uZW50cyBhbmQgYWRkcyB0byBzY29wZSBjaGlsZHJlbiBvZiBjb21wb25lbnQgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGJpbmRlcigpIHtcbiAgICByZXR1cm4gbWlsb0JpbmRlcih0aGlzLm93bmVyLmVsLCB0aGlzLnNjb3BlLCBmYWxzZSk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogU2V0dXAgZW1wdHkgc2NvcGUgb2JqZWN0IG9uIHN0YXJ0XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnNjb3BlID0gbmV3IFNjb3BlKHRoaXMub3duZXIuZWwsIHRoaXMpO1xufVxuXG5cbnZhciBhbGxvd2VkTmFtZVBhdHRlcm4gPSAvXltBLVphLXpdW0EtWmEtejAtOVxcX1xcJF0qJC87XG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTYWZlbHkgdHJhdmVyc2VzIGNvbXBvbmVudCBzY29wZVxuICogUmV0dXJucyBjb21wb25lbnQgaW4gc2NvcGUgZm9yIGEgZ2l2ZW4gcGF0aFxuICogSWYgcGF0aCBpcyBpbnZhbGlkIHRoZSBtZXRob2Qgd2lsbCB0aHJvdywgaWYgdGhlcmUgaXMgbm8gY29tcG9uZW50IGF0IGEgZ2l2ZW4gcGF0aCBvciBzb21lIG9mIHRoZSBjb21wb25lbnRzIGFsb25nIHRoZSBwYXRoIGRvZXMgbm90IGhhdmUgQ29udGFpbmVyIGZhY2V0IHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gdW5kZWZpbmVkLCBcbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggcGF0aCBvZiBjaGlsZCBjb21wb25lbnQgaW4gc2NvcGUsIGVhY2ggbmFtZSBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnLicsIGUuZy46ICcuY2hpbGQuc3ViY2hpbGQnXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRwYXRoKHBhdGgpIHtcbiAgICBwYXRoID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIHZhciBsZW4gPSBwYXRoLmxlbmd0aDtcbiAgICBpZiAocGF0aFswXSB8fCBsZW4gPCAyKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgdmFyIGNvbXAgPSB0aGlzLm93bmVyO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIG5hbWUgPSBwYXRoW2ldO1xuICAgICAgICBpZiAoIWFsbG93ZWROYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgICAgIGlmICghY29tcC5jb250YWluZXIpIHJldHVybjtcbiAgICAgICAgY29tcCA9IGNvbXAuY29udGFpbmVyLnNjb3BlW25hbWVdO1xuICAgICAgICBpZiAoIWNvbXApIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXA7XG5cbiAgICBmdW5jdGlvbiB0aHJvd0ludmFsaWRQYXRoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhdGggJyArIHBhdGggKyAnIGlzIGludmFsaWQnKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuZ2V0U3RhdGVgIHRvIGdldCBmYWNldCdzIHN0YXRlXG4gKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBjb21wb25lbnRzIGluIHRoZSBzY29wZVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVlcENvcHkgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRnZXRTdGF0ZShkZWVwQ29weSkge1xuICAgIHZhciBzdGF0ZSA9IHsgc2NvcGU6IHt9IH07XG4gICAgaWYgKGRlZXBDb3B5ICE9PSBmYWxzZSlcbiAgICAgICAgdGhpcy5zY29wZS5fZWFjaChmdW5jdGlvbihjb21wb25lbnQsIGNvbXBOYW1lKSB7XG4gICAgICAgICAgICBzdGF0ZS5zY29wZVtjb21wTmFtZV0gPSBjb21wb25lbnQuX2dldFN0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZWAgdG8gc2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFNldHMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudHMgaW4gdGhlIHNjb3BlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgZGF0YSB0byBzZXQgb24gZmFjZXQncyBtb2RlbFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkc2V0U3RhdGUoc3RhdGUpIHtcbiAgICBfLmVhY2hLZXkoc3RhdGUuc2NvcGUsIGZ1bmN0aW9uKGNvbXBEYXRhLCBjb21wTmFtZSkge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5zY29wZVtjb21wTmFtZV07XG4gICAgICAgIGlmIChjb21wb25lbnQpXG4gICAgICAgICAgICBjb21wb25lbnQuc2V0U3RhdGUoY29tcERhdGEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignY29tcG9uZW50IFwiJyArIGNvbXBOYW1lICsgJ1wiIGRvZXMgbm90IGV4aXN0IG9uIHNjb3BlJyk7XG4gICAgfSwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRkZXN0cm95KCkge1xuICAgIHRoaXMuc2NvcGUuX2VhY2goZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5zY29wZS5fZGV0YWNoRWxlbWVudCgpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBNb3ZlcyBhbGwgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBvd25lciBpbnRvIHRoZSBwYXJlbnQgc2NvcGVcbiAqIFxuICogQHBhcmFtIHtCb29sZWFufSByZW5hbWVDaGlsZHJlbiBwYXNzIGZhbHNlIHRvIG5vdCByZW5hbWUgc2NvcGUgY2hpbGRyZW4gKGRlZmF1bHQgaXMgdHJ1ZSlcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVzdHJveSBJZiBub3QgZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBiZSBkZXN0cm95ZWQgYXQgdGhlIGVuZCAoZGVmYXVsdCBpcyB0cnVlKS5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJHVud3JhcChyZW5hbWVDaGlsZHJlbiwgZGVzdHJveSkge1xuICAgIGRvbVV0aWxzLnVud3JhcEVsZW1lbnQodGhpcy5vd25lci5lbCk7XG4gICAgdGhpcy5zY29wZSAmJiB0aGlzLnNjb3BlLl9lYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBjaGlsZC5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHJlbmFtZUNoaWxkcmVuICE9PSBmYWxzZSkgY2hpbGQucmVuYW1lKHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICB0aGlzLm93bmVyLnNjb3BlICYmIHRoaXMub3duZXIuc2NvcGUuX2FkZChjaGlsZCk7XG4gICAgfSwgdGhpcyk7XG4gICAgaWYgKGRlc3Ryb3kgIT09IGZhbHNlKSB0aGlzLm93bmVyLmRlc3Ryb3koKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEFwcGVuZCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZVxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXAgY29tcG9uZW50IHRoYXQgd2lsbCBiZSBhcHBlbmRlZFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkYXBwZW5kKGNvbXApIHtcbiAgICB0aGlzLnNjb3BlLl9hZGQoY29tcCk7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChjb21wLmVsKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEluc2VydCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZSBiZWZvcmUgYW5vdGhlciBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wIGNvbXBvbmVudCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBzaWJsaW5nIGNvbXBvbmVudCBiZWZvcmUgd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYXBwZW5kZWRcbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGluc2VydEJlZm9yZShjb21wLCBzaWJsaW5nKSB7XG4gICAgdGhpcy5zY29wZS5fYWRkKGNvbXApO1xuICAgIHRoaXMuZWwuaW5zZXJ0QmVmb3JlKGNvbXAuZWwsIHNpYmxpbmcgJiYgc2libGluZy5lbCk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRyZW1vdmUoY29tcCkge1xuICAgIHRoaXMuc2NvcGUuX3JlbW92ZShjb21wKTtcbiAgICB0aGlzLm93bmVyLmVsLnJlbW92ZUNoaWxkKGNvbXAuZWwpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWl4aW4gPSBtaWxvQ29yZS5jbGFzc2VzLk1peGluXG4gICAgLCBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcblxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBET01FdmVudHNTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2RvbV9ldmVudHMnKVxuICAgICwgRGF0YU1zZ0FQSSA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGF0YScpXG4gICAgLCBnZXRFbGVtZW50RGF0YUFjY2VzcyA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGVfZGF0YScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBwYXRoVXRpbHMgPSBNb2RlbC5fdXRpbHMucGF0aFxuICAgICwgbW9kZWxVdGlscyA9IE1vZGVsLl91dGlscy5tb2RlbFxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSBNb2RlbC5fdXRpbHMuY2hhbmdlRGF0YUhhbmRsZXJcbiAgICAsIGdldFRyYW5zYWN0aW9uRmxhZyA9IGNoYW5nZURhdGFIYW5kbGVyLmdldFRyYW5zYWN0aW9uRmxhZ1xuICAgICwgc2V0VHJhbnNhY3Rpb25GbGFnID0gY2hhbmdlRGF0YUhhbmRsZXIuc2V0VHJhbnNhY3Rpb25GbGFnXG4gICAgLCBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZCA9IGNoYW5nZURhdGFIYW5kbGVyLnBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkXG5cbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdEYXRhJylgXG4gKiBGYWNldCB0byBnaXZlIGFjY2VzcyB0byBET00gZGF0YVxuICovXG52YXIgRGF0YSA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdEYXRhJyk7XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZHNcbiAqXG4gKiAtIFtzdGFydF0oI0RhdGEkc3RhcnQpIC0gc3RhcnQgRGF0YSBmYWNldFxuICogLSBbZ2V0XSgjRGF0YSRnZXQpIC0gZ2V0IERPTSBkYXRhIGZyb20gRE9NIHRyZWVcbiAqIC0gW3NldF0oI0RhdGEkc2V0KSAtIHNldCBET00gZGF0YSB0byBET00gdHJlZVxuICogLSBbcGF0aF0oI0RhdGEkcGF0aCkgLSBnZXQgcmVmZXJlbmNlIHRvIERhdGEgZmFjZXQgYnkgcGF0aFxuICovXG5fLmV4dGVuZFByb3RvKERhdGEsIHtcbiAgICBzdGFydDogRGF0YSRzdGFydCxcbiAgICBnZXRTdGF0ZTogRGF0YSRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogRGF0YSRzZXRTdGF0ZSxcblxuICAgIGdldDogRGF0YSRnZXQsXG4gICAgc2V0OiBEYXRhJHNldCxcbiAgICBkZWw6IERhdGEkZGVsLFxuICAgIHNwbGljZTogRGF0YSRzcGxpY2UsXG4gICAgbGVuOiBEYXRhJGxlbixcbiAgICBwYXRoOiBEYXRhJHBhdGgsXG4gICAgZ2V0UGF0aDogRGF0YSRnZXRQYXRoLFxuICAgIGdldEtleTogRGF0YSRnZXRLZXksXG5cbiAgICBfZ2V0OiBEYXRhJF9nZXQsXG4gICAgX3NldDogRGF0YSRfc2V0LFxuICAgIF9kZWw6IERhdGEkX2RlbCxcbiAgICBfc3BsaWNlOiBEYXRhJF9zcGxpY2UsXG4gICAgX2xlbjogRGF0YSRfbGVuLFxuXG4gICAgX3NldFNjYWxhclZhbHVlOiBEYXRhJF9zZXRTY2FsYXJWYWx1ZSxcbiAgICBfZ2V0U2NhbGFyVmFsdWU6IERhdGEkX2dldFNjYWxhclZhbHVlLFxuICAgIF9idWJibGVVcERhdGFDaGFuZ2U6IERhdGEkX2J1YmJsZVVwRGF0YUNoYW5nZSxcbiAgICBfcXVldWVEYXRhQ2hhbmdlOiBEYXRhJF9xdWV1ZURhdGFDaGFuZ2UsXG4gICAgX3Bvc3REYXRhQ2hhbmdlczogRGF0YSRfcG9zdERhdGFDaGFuZ2VzLFxuICAgIF9wcmVwYXJlTWVzc2FnZVNvdXJjZTogX3ByZXBhcmVNZXNzYWdlU291cmNlXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKERhdGEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGE7XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggbWV0aG9kcyBhZGRlZCB0byBEYXRhIHByb3RvdHlwZVxuICovXG5bJ3B1c2gnLCAncG9wJywgJ3Vuc2hpZnQnLCAnc2hpZnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gTW9kZWwuUGF0aC5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG4gICAgXy5kZWZpbmVQcm9wZXJ0eShEYXRhLnByb3RvdHlwZSwgbWV0aG9kTmFtZSwgbWV0aG9kKTtcbn0pO1xuXG5cblxuLy8gdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHdyYXBwZWQgdG8gc3VwcG9ydCBcIipcIiBwYXR0ZXJuIHN1YnNjcmlwdGlvbnNcbnZhciBwcm94eURhdGFTb3VyY2VNZXRob2RzID0ge1xuICAgICAgICAvLyB2YWx1ZTogJ3ZhbHVlJyxcbiAgICAgICAgdHJpZ2dlcjogJ3RyaWdnZXInXG4gICAgfTtcblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdGFydHMgRGF0YSBmYWNldFxuICogQ2FsbGVkIGJ5IGNvbXBvbmVudCBhZnRlciBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIERhdGEkc3RhcnQoKSB7XG4gICAgLy8gY2hhbmdlIG1lc3NlbmdlciBtZXRob2RzIHRvIHdvcmsgd2l0aCBcIipcIiBzdWJzY3JpcHRpb25zIChsaWtlIE1vZGVsIGNsYXNzKVxuICAgIHBhdGhVdGlscy53cmFwTWVzc2VuZ2VyTWV0aG9kcy5jYWxsKHRoaXMpO1xuXG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBnZXQvc2V0IG1ldGhvZHMgdG8gc2V0IGRhdGEgb2YgZWxlbWVudFxuICAgIHRoaXMuZWxEYXRhID0gZ2V0RWxlbWVudERhdGFBY2Nlc3ModGhpcy5vd25lci5lbCk7XG5cbiAgICB0aGlzLl9kYXRhQ2hhbmdlc1F1ZXVlID0gW107XG5cbiAgICB0aGlzLl9wcmVwYXJlTWVzc2FnZVNvdXJjZSgpO1xuXG4gICAgLy8gc3RvcmUgZmFjZXQgZGF0YSBwYXRoXG4gICAgdGhpcy5fcGF0aCA9ICcuJyArIHRoaXMub3duZXIubmFtZTtcblxuICAgIC8vIGN1cnJlbnQgdmFsdWVcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuZ2V0KCk7XG5cbiAgICAvLyBwcmVwYXJlIGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzXG4gICAgLy8gdGhpcy5fcHJlcGFyZU1lc3NlbmdlcnMoKTtcblxuICAgIC8vIHN1YnNjcmliZSB0byBET00gZXZlbnQgYW5kIGFjY2Vzc29ycycgbWVzc2FnZXNcbiAgICB0aGlzLm9uU3luYygnJywgb25Pd25EYXRhQ2hhbmdlKTtcblxuICAgIC8vIG1lc3NhZ2UgdG8gbWFyayB0aGUgZW5kIG9mIGJhdGNoIG9uIHRoZSBjdXJyZW50IGxldmVsXG4gICAgdGhpcy5vblN5bmMoJ2RhdGFjaGFuZ2VzZmluaXNoZWQnLCBvbkRhdGFDaGFuZ2VzRmluaXNoZWQpO1xuXG4gICAgLy8gY2hhbmdlcyBpbiBzY29wZSBjaGlsZHJlbiB3aXRoIERhdGEgZmFjZXRcbiAgICB0aGlzLm9uU3luYygnY2hpbGRkYXRhJywgb25DaGlsZERhdGEpO1xuXG4gICAgLy8gdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgdGhpcy5vblN5bmMoJ2NoYW5nZWRhdGEnLCBjaGFuZ2VEYXRhSGFuZGxlcik7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQ3JlYXRlIGFuZCBjb25uZWN0IGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzIG9mIERhdGEgZmFjZXQuXG4gKiBFeHRlcm5hbCBtZXNzZW5nZXIncyBtZXRob2RzIGFyZSBwcm94aWVkIG9uIHRoZSBEYXRhIGZhY2V0IGFuZCB0aGV5IGFsbG93cyBcIipcIiBzdWJzY3JpcHRpb25zLlxuICovXG4vLyBmdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcnMoKSB7XG4gICAgLy8gRGF0YSBmYWNldCB3aWxsIHBvc3QgYWxsIGl0cyBjaGFuZ2VzIG9uIGludGVybmFsIG1lc3NlbmdlclxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG5cbiAgICAvLyBtZXNzYWdlIHNvdXJjZSB0byBjb25uZWN0IGludGVybmFsIG1lc3NlbmdlciB0byBleHRlcm5hbFxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSA9IG5ldyBNZXNzZW5nZXJNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgbmV3IE1vZGVsTXNnQVBJLCBpbnRlcm5hbE1lc3Nlbmdlcik7XG5cbiAgICAvLyBleHRlcm5hbCBtZXNzZW5nZXIgdG8gd2hpY2ggYWxsIG1vZGVsIHVzZXJzIHdpbGwgc3Vic2NyaWJlLFxuICAgIC8vIHRoYXQgd2lsbCBhbGxvdyBcIipcIiBzdWJzY3JpcHRpb25zIGFuZCBzdXBwb3J0IFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgYXBpLlxuICAgIC8vIHZhciBleHRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzLCBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSk7XG5cbi8vICAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuLy8gICAgICAgICBfbWVzc2VuZ2VyOiBleHRlcm5hbE1lc3Nlbmdlcixcbi8vICAgICAgICAgX2ludGVybmFsTWVzc2VuZ2VyOiBpbnRlcm5hbE1lc3NlbmdlclxuLy8gICAgIH0pO1xuLy8gfVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpemVzIERPTUV2ZW50c1NvdXJjZSBhbmQgY29ubmVjdHMgaXQgdG8gRGF0YSBmYWNldCBtZXNzZW5nZXJcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgdmFyIGRhdGFBUEkgPSBuZXcgRGF0YU1zZ0FQSSh0aGlzLm93bmVyKVxuICAgICAgICAsIGRhdGFFdmVudHNTb3VyY2UgPSBuZXcgRE9NRXZlbnRzU291cmNlKHRoaXMsIHByb3h5RGF0YVNvdXJjZU1ldGhvZHMsIGRhdGFBUEksIHRoaXMub3duZXIpO1xuICAgIHRoaXMuX3NldE1lc3NhZ2VTb3VyY2UoZGF0YUV2ZW50c1NvdXJjZSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfZGF0YUV2ZW50c1NvdXJjZScsIGRhdGFFdmVudHNTb3VyY2UpO1xuXG4gICAgLy8gbWFrZSB2YWx1ZSBtZXRob2Qgb2YgRGF0YU1zZ0FQSSBhdmFpbGFibGUgb24gRGF0YSBmYWNldFxuICAgIC8vIHRoaXMgaXMgYSBwcml2YXRlIG1ldGhvZCwgZ2V0KCkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGRhdGEuXG4gICAgTWl4aW4ucHJvdG90eXBlLl9jcmVhdGVQcm94eU1ldGhvZC5jYWxsKGRhdGFBUEksICd2YWx1ZScsICd2YWx1ZScsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnVHlwZSBpbiB0aGlzIGluc3RhbmNlIHdpbGwgYmUgJydcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIGRhdGEgY2hhbmdlIGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIG9uT3duRGF0YUNoYW5nZShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5fYnViYmxlVXBEYXRhQ2hhbmdlKGRhdGEpO1xuICAgIHRoaXMuX3F1ZXVlRGF0YUNoYW5nZShkYXRhKTtcbiAgICBpZiAoZGF0YS5wYXRoID09PSAnJykge1xuICAgICAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhkYXRhKTtcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSgnZGF0YWNoYW5nZXNmaW5pc2hlZCcsIHsgdHJhbnNhY3Rpb246IGluVHJhbnNhY3Rpb24gfSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNlbmRzIGRhdGEgYG1lc3NhZ2VgIHRvIERPTSBwYXJlbnRcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1zZ0RhdGEgZGF0YSBjaGFuZ2UgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBEYXRhJF9idWJibGVVcERhdGFDaGFuZ2UobXNnRGF0YSkge1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuXG4gICAgaWYgKHBhcmVudERhdGEpIHtcbiAgICAgICAgdmFyIHBhcmVudE1zZyA9IF8uY2xvbmUobXNnRGF0YSk7XG4gICAgICAgIHBhcmVudE1zZy5wYXRoID0gKHRoaXMuX3BhdGggfHwgKCcuJyArIHRoaXMub3duZXIubmFtZSkpICArIHBhcmVudE1zZy5wYXRoO1xuICAgICAgICBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdjaGlsZGRhdGEnLCBwYXJlbnRNc2cgfHwgbXNnRGF0YSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFF1ZXVlcyBkYXRhIG1lc3NhZ2VzIHRvIGJlIGRpc3BhdGNoZWQgdG8gY29ubmVjdG9yXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaGFuZ2UgZGF0YSBjaGFuZ2UgZGVzY3JpcHRpb25cbiAqL1xuZnVuY3Rpb24gRGF0YSRfcXVldWVEYXRhQ2hhbmdlKGNoYW5nZSkge1xuICAgIHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucHVzaChjaGFuZ2UpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhY2hhbmdlc2ZpbmlzaGVkIGV2ZW50LlxuICogQ2FsbHMgdGhlIG1ldGhvZCB0byBwb3N0IGNoYW5nZXMgYmF0Y2ggYW5kIGJ1YmJsZXMgdXAgdGhlIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0gIHtbdHlwZV19IG1zZyAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7W3R5cGVdfSBkYXRhIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gb25EYXRhQ2hhbmdlc0ZpbmlzaGVkKG1zZywgZGF0YSkge1xuICAgIHRoaXMuX3Bvc3REYXRhQ2hhbmdlcyhkYXRhLmluVHJhbnNhY3Rpb24pO1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuICAgIGlmIChwYXJlbnREYXRhKSBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdkYXRhY2hhbmdlc2ZpbmlzaGVkJywgZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEaXNwYXRjaGVzIGFsbCBjaGFuZ2VzIGNvbGxlY3RlZCBpbiB0aGUgYmF0Y2hcbiAqIFVzZWQgZm9yIGRhdGEgcHJvcGFnYXRpb24gLSBjb25uZWN0b3Igc3Vic2NyaWJlcyB0byB0aGlzIG1lc3NhZ2VcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBEYXRhJF9wb3N0RGF0YUNoYW5nZXMoaW5UcmFuc2FjdGlvbikge1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucmV2ZXJzZSgpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2VTeW5jKCdkYXRhY2hhbmdlcycsIHtcbiAgICAgICAgY2hhbmdlczogcXVldWUsXG4gICAgICAgIHRyYW5zYWN0aW9uOiBpblRyYW5zYWN0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5fZGF0YUNoYW5nZXNRdWV1ZSA9IFtdOyAvLyBpdCBjYW4ndCBiZSAubGVuZ3RoID0gMCwgYXMgdGhlIGFjdHVhbCBhcnJheSBtYXkgc3RpbGwgYmUgdXNlZFxufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudCBpbiBjaGlsZCBEYXRhIGZhY2V0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2dUeXBlXG4gKiBAcGFyYW0ge09iZWpjdH0gZGF0YSBkYXRhIGNoYW5nZSBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBvbkNoaWxkRGF0YShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShkYXRhLnBhdGgsIGRhdGEpO1xuICAgIHRoaXMuX2J1YmJsZVVwRGF0YUNoYW5nZShkYXRhKTtcbiAgICB0aGlzLl9xdWV1ZURhdGFDaGFuZ2UoZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyBkYXRhIGluIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHkuXG4gKiBSZXR1cm5zIHRoZSBvYmplY3Qgd2l0aCB0aGUgZGF0YSBhY3R1YWxseSBzZXQgKGNhbiBiZSBkaWZmZXJlbnQsIGlmIGNvbXBvbmVudHMgbWF0Y2hpbmcgc29tZSBwcm9wZXJ0aWVzIGFyZSBtaXNzaW5nKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd8TnVtYmVyfSB2YWx1ZSB2YWx1ZSB0byBiZSBzZXQuIElmIHRoZSB2YWx1ZSBpZiBzY2FsYXIsIGl0IHdpbGwgYmUgc2V0IG9uIGNvbXBvbmVudCdzIGVsZW1lbnQsIGlmIHRoZSB2YWx1ZSBpcyBvYmplY3QgLSBvbiBET00gdHJlZSBpbnNpZGUgY29tcG9uZW50XG4gKiBAcmV0dXJuIHtPYmplY3R8U3RyaW5nfE51bWJlcn1cbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJHNldCk7XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUhvb2suY2FsbCh0aGlzLCAnc2V0JywgYXJndW1lbnRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcodGhpcy5fc2V0LCBpblRyYW5zYWN0aW9uKTtcblxuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlXG4gICAgICAgICwgbmV3VmFsdWUgPSB0aGlzLl9zZXQodmFsdWUpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2NoYW5nZWQnLFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiBuZXdWYWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zZXQpO1xuXG4gICAgdmFyIHZhbHVlU2V0O1xuICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlU2V0ID0gW107XG5cbiAgICAgICAgICAgIHZhciBsaXN0RmFjZXQgPSB0aGlzLm93bmVyLmxpc3Q7XG4gICAgICAgICAgICBpZiAobGlzdEZhY2V0KXtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdExlbmd0aCA9IGxpc3RGYWNldC5jb3VudCgpXG4gICAgICAgICAgICAgICAgICAgICwgbmV3SXRlbXNDb3VudCA9IHZhbHVlLmxlbmd0aCAtIGxpc3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW1zQ291bnQgPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX2FkZEl0ZW1zKG5ld0l0ZW1zQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhsaXN0TGVuZ3RoLCBsaXN0RmFjZXQuY291bnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihjaGlsZFZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDaGlsZERhdGEuY2FsbCh0aGlzLCB2YWx1ZVNldCwgY2hpbGRWYWx1ZSwgaW5kZXgsICdbJCRdJyk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGlzdENvdW50ID0gbGlzdEZhY2V0LmNvdW50KClcbiAgICAgICAgICAgICAgICAgICAgLCByZW1vdmVDb3VudCA9IGxpc3RDb3VudCAtIHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChyZW1vdmVDb3VudC0tID4gMClcbiAgICAgICAgICAgICAgICAgICAgbGlzdEZhY2V0Ll9yZW1vdmVJdGVtKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRGF0YTogc2V0dGluZyBhcnJheSBkYXRhIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVTZXQgPSB7fTtcbiAgICAgICAgICAgIF8uZWFjaEtleSh2YWx1ZSwgZnVuY3Rpb24oY2hpbGRWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgc2V0Q2hpbGREYXRhLmNhbGwodGhpcywgdmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgJy4kJCcpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2VcbiAgICAgICAgdmFsdWVTZXQgPSB0aGlzLl9zZXRTY2FsYXJWYWx1ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlU2V0O1xuXG4gICAgcmV0dXJuIHZhbHVlU2V0O1xuXG5cbiAgICBmdW5jdGlvbiBzZXRDaGlsZERhdGEodmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgcGF0aFN5bnRheCkge1xuICAgICAgICB2YXIgY2hpbGRQYXRoID0gcGF0aFN5bnRheC5yZXBsYWNlKCckJCcsIGtleSk7XG4gICAgICAgIHZhciBjaGlsZERhdGFGYWNldCA9IHRoaXMucGF0aChjaGlsZFBhdGgsIHR5cGVvZiBjaGlsZFZhbHVlICE9ICd1bmRlZmluZWQnKTtcbiAgICAgICAgaWYgKGNoaWxkRGF0YUZhY2V0KSB7XG4gICAgICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWcoY2hpbGREYXRhRmFjZXQuc2V0LCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgIHZhbHVlU2V0W2tleV0gPSBjaGlsZERhdGFGYWNldC5zZXQoY2hpbGRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogRGVsZXRlcyBjb21wb25lbnQgZnJvbSB2aWV3IGFuZCBzY29wZSwgb25seSBpbiBjYXNlIGl0IGhhcyBJdGVtIGZhY2V0IG9uIGl0XG4gKi9cbmZ1bmN0aW9uIERhdGEkZGVsKCkge1xuICAgIHZhciBpblRyYW5zYWN0aW9uID0gZ2V0VHJhbnNhY3Rpb25GbGFnKERhdGEkZGVsKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBleGVjdXRlSG9vay5jYWxsKHRoaXMsICdkZWwnKTtcbiAgICAgICAgcG9zdFRyYW5zYWN0aW9uRmluaXNoZWQuY2FsbCh0aGlzLCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcblxuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9kZWwsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX2RlbCgpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2RlbGV0ZWQnLCBvbGRWYWx1ZTogb2xkVmFsdWUgfTtcbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcobXNnLCBpblRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCcnLCBtc2cpO1xufVxuXG5cbmZ1bmN0aW9uIERhdGEkX2RlbCgpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9kZWwpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX3NldCgpO1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgc2NhbGFyIHZhbHVlIHRvIERPTSBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsdWUgdmFsdWUgdG8gc2V0IHRvIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIERhdGEkX3NldFNjYWxhclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxEYXRhLnNldCh0aGlzLm93bmVyLmVsLCB2YWx1ZSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogR2V0IHN0cnVjdHVyZWQgZGF0YSBmcm9tIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHlcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBHZXQgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0KGRlZXBHZXQpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUhvb2suY2FsbCh0aGlzLCAnZ2V0JywgYXJndW1lbnRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2V0KGRlZXBHZXQpO1xufVxuXG5mdW5jdGlvbiBEYXRhJF9nZXQoZGVlcEdldCkge1xuICAgIGlmIChkZWVwR2V0ID09PSBmYWxzZSkgLy8gYSBoYWNrIHRvIGVuYWJsZSBnZXR0aW5nIHNoYWxsb3cgc3RhdGVcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIGNvbXAgPSB0aGlzLm93bmVyXG4gICAgICAgICwgc2NvcGVEYXRhO1xuXG4gICAgaWYgKGNvbXAubGlzdCkge1xuICAgICAgICBzY29wZURhdGEgPSBbXTtcbiAgICAgICAgY29tcC5saXN0LmVhY2goZnVuY3Rpb24obGlzdEl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICBzY29wZURhdGFbaW5kZXhdID0gbGlzdEl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbXAuY29udGFpbmVyKVxuICAgICAgICAgICAgY29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24oc2NvcGVJdGVtLCBuYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEgY29tcC5saXN0LmNvbnRhaW5zKHNjb3BlSXRlbSkgJiYgc2NvcGVJdGVtLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlRGF0YVtuYW1lXSA9IHNjb3BlSXRlbS5kYXRhLmdldCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjb21wLmNvbnRhaW5lcikge1xuICAgICAgICBzY29wZURhdGEgPSB7fTtcbiAgICAgICAgY29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24oc2NvcGVJdGVtLCBuYW1lKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGVJdGVtLmRhdGEpXG4gICAgICAgICAgICAgICAgc2NvcGVEYXRhW25hbWVdID0gc2NvcGVJdGVtLmRhdGEuZ2V0KCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZVxuICAgICAgICBzY29wZURhdGEgPSB0aGlzLl9nZXRTY2FsYXJWYWx1ZSgpO1xuXG4gICAgdGhpcy5fdmFsdWUgPSBzY29wZURhdGE7XG5cbiAgICByZXR1cm4gc2NvcGVEYXRhO1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEdldHMgc2NhbGFyIGRhdGEgZnJvbSBET00gZWxlbWVudFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIERhdGEkX2dldFNjYWxhclZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmVsRGF0YS5nZXQodGhpcy5vd25lci5lbCk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU3BsaWNlcyBMaXN0IGl0ZW1zLiBSZXF1aXJlcyBMaXN0IGZhY2V0IHRvIGJlIHByZXNlbnQgb24gY29tcG9uZW50LiBXb3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgYXJyYXkgc3BsaWNlLlxuICogUmV0dXJucyBkYXRhIHJldHJpZXZlZCBmcm9tIHJlbW92ZWQgaXRlbXNcbiAqXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHNwbGljZUluZGV4IGluZGV4IHRvIGRlbGV0ZS9pbnNlcnQgYXRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc3BsaWNlSG93TWFueSBudW1iZXIgb2YgaXRlbXMgdG8gZGVsZXRlXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBpdGVtcyB0byBpbnNlcnRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBEYXRhJHNwbGljZShzcGxpY2VJbmRleCwgc3BsaWNlSG93TWFueSkgeyAvLywgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBpblRyYW5zYWN0aW9uID0gZ2V0VHJhbnNhY3Rpb25GbGFnKERhdGEkc3BsaWNlKTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGV4ZWN1dGVIb29rLmNhbGwodGhpcywgJ3NwbGljZScsIGFyZ3VtZW50cyk7XG4gICAgICAgIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkLmNhbGwodGhpcywgaW5UcmFuc2FjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSAhPSBub0hvb2spIHRocm93IGU7XG4gICAgfVxuXG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKHRoaXMuX3NwbGljZSwgaW5UcmFuc2FjdGlvbik7XG4gICAgcmVzdWx0ID0gdGhpcy5fc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgdmFyIG1zZyA9IHsgcGF0aDogJycsIHR5cGU6ICdzcGxpY2UnLFxuICAgICAgICAgICAgICAgIGluZGV4OiByZXN1bHQuc3BsaWNlSW5kZXgsXG4gICAgICAgICAgICAgICAgcmVtb3ZlZDogcmVzdWx0LnJlbW92ZWQsXG4gICAgICAgICAgICAgICAgYWRkZWRDb3VudDogcmVzdWx0LmFkZGVkQ291bnQsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHRoaXMuX3ZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiByZXN1bHQucmVtb3ZlZDtcbn1cblxuXG52YXIgbm9Ib29rID0ge307XG5mdW5jdGlvbiBleGVjdXRlSG9vayhtZXRob2ROYW1lLCBhcmdzKSB7XG4gICAgdmFyIGhvb2sgPSB0aGlzLmNvbmZpZ1ttZXRob2ROYW1lXTtcbiAgICBzd2l0Y2ggKHR5cGVvZiBob29rKSB7XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiBob29rLmFwcGx5KHRoaXMub3duZXIsIGFyZ3MpO1xuXG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vd25lcltob29rXS5hcHBseSh0aGlzLm93bmVyLCBhcmdzKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbm9Ib29rO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zcGxpY2Uoc3BsaWNlSW5kZXgsIHNwbGljZUhvd01hbnkpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zcGxpY2UpO1xuXG4gICAgdmFyIGxpc3RGYWNldCA9IHRoaXMub3duZXIubGlzdDtcbiAgICBpZiAoISBsaXN0RmFjZXQpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignRGF0YTogY2Fubm90IHVzZSBzcGxpY2UgbWV0aG9kIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuXG4gICAgdmFyIHJlbW92ZWQgPSBbXTtcblxuICAgIHZhciBsaXN0TGVuZ3RoID0gbGlzdEZhY2V0LmNvdW50KCk7XG4gICAgYXJndW1lbnRzWzBdID0gc3BsaWNlSW5kZXggPVxuICAgICAgICBtb2RlbFV0aWxzLm5vcm1hbGl6ZVNwbGljZUluZGV4KHNwbGljZUluZGV4LCBsaXN0TGVuZ3RoKTtcblxuICAgIGlmIChzcGxpY2VIb3dNYW55ID4gMCAmJiBsaXN0TGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gc3BsaWNlSW5kZXg7IGkgPCBzcGxpY2VJbmRleCArIHNwbGljZUhvd01hbnk7IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShzcGxpY2VJbmRleCk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3JlbW92ZUl0ZW0oc3BsaWNlSW5kZXgpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0RhdGE6IG5vIGl0ZW0gZm9yIGluZGV4JywgaSk7XG5cbiAgICAgICAgICAgIHJlbW92ZWQucHVzaChpdGVtRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhzcGxpY2VJbmRleCwgbGlzdEZhY2V0LmNvdW50KCkpO1xuICAgIH1cblxuICAgIHZhciBhZGRlZCA9IFtdO1xuXG4gICAgdmFyIGFyZ3NMZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAgICwgYWRkSXRlbXMgPSBhcmdzTGVuID4gMlxuICAgICAgICAsIGFkZGVkQ291bnQgPSBhcmdzTGVuIC0gMjtcbiAgICBpZiAoYWRkSXRlbXMpIHtcbiAgICAgICAgbGlzdEZhY2V0Ll9hZGRJdGVtcyhhZGRlZENvdW50LCBzcGxpY2VJbmRleCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAyLCBqID0gc3BsaWNlSW5kZXg7IGkgPCBhcmdzTGVuOyBpKyssIGorKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShqKTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25GbGFnKGl0ZW0uZGF0YS5zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5zZXQoYXJndW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdEYXRhOiBubyBpdGVtIGZvciBpbmRleCcsIGopO1xuXG4gICAgICAgICAgICBhZGRlZC5wdXNoKGl0ZW1EYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoYW5nZSBwYXRocyBvZiBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgYW5kIGl0ZW1zIGFmdGVyIHRoZW1cbiAgICAgICAgbGlzdEZhY2V0Ll91cGRhdGVEYXRhUGF0aHMoc3BsaWNlSW5kZXgsIGxpc3RGYWNldC5jb3VudCgpKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAvLyAgICAgXy5wcmVwZW5kQXJyYXkoYWRkZWQsIFtzcGxpY2VJbmRleCwgc3BsaWNlSG93TWFueV0pO1xuICAgIC8vICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KHRoaXMuX3ZhbHVlLCBhZGRlZCk7XG4gICAgLy8gfSBlbHNlXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5nZXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHNwbGljZUluZGV4OiBzcGxpY2VJbmRleCxcbiAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZCxcbiAgICAgICAgYWRkZWRDb3VudDogYWRkSXRlbXMgPyBhZGRlZENvdW50IDogMFxuICAgIH07XG59XG5cblxuZnVuY3Rpb24gRGF0YSRsZW4oKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVIb29rLmNhbGwodGhpcywgJ2xlbicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgIT0gbm9Ib29rKSB0aHJvdyBlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5fbGVuKCk7XG59XG5cblxuZnVuY3Rpb24gRGF0YSRfbGVuKCkge1xuICAgIGlmICh0aGlzLm93bmVyLmxpc3QpIHJldHVybiB0aGlzLm93bmVyLmxpc3QuY291bnQoKTtcbiAgICBlbHNlIGxvZ2dlci5lcnJvcignRGF0YTogbGVuIGNhbGxlZCB3aXRob3V0IGxpc3QgZmFjZXQnKTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGRhdGEgZmFjZXQgb2YgYSBjaGlsZCBjb21wb25lbnQgKGJ5IHNjb3BlcykgY29ycmVzcG9uZGluZyB0byB0aGUgcGF0aFxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc1BhdGggZGF0YSBhY2Nlc3MgcGF0aFxuICovXG5mdW5jdGlvbiBEYXRhJHBhdGgoYWNjZXNzUGF0aCwgY3JlYXRlSXRlbSkge1xuICAgIC8vIGNyZWF0ZUl0ZW0gPSB0cnVlOyAvLyB0aGlzIGhhY2sgc2VlbXMgdG8gYmUgbm8gbG9uZ2VyIG5lZWRlZC4uLlxuXG4gICAgaWYgKCEgYWNjZXNzUGF0aClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoYWNjZXNzUGF0aCk7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcnNlZFBhdGgubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHBhdGhOb2RlID0gcGFyc2VkUGF0aFtpXVxuICAgICAgICAgICAgLCBub2RlS2V5ID0gcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5KHBhdGhOb2RlKTtcbiAgICAgICAgaWYgKHBhdGhOb2RlLnN5bnRheCA9PSAnYXJyYXknICYmIGN1cnJlbnRDb21wb25lbnQubGlzdCkge1xuICAgICAgICAgICAgdmFyIGl0ZW1Db21wb25lbnQgPSBjdXJyZW50Q29tcG9uZW50Lmxpc3QuaXRlbShub2RlS2V5KTtcbiAgICAgICAgICAgIGlmICghIGl0ZW1Db21wb25lbnQgJiYgY3JlYXRlSXRlbSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpdGVtQ29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5saXN0Ll9hZGRJdGVtKG5vZGVLZXkpO1xuICAgICAgICAgICAgICAgIGl0ZW1Db21wb25lbnQuZGF0YS5fcGF0aCA9IHBhdGhOb2RlLnByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudCA9IGl0ZW1Db21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbXBvbmVudC5jb250YWluZXIpXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5jb250YWluZXIuc2NvcGVbbm9kZUtleV07XG5cbiAgICAgICAgdmFyIGN1cnJlbnREYXRhRmFjZXQgPSBjdXJyZW50Q29tcG9uZW50ICYmIGN1cnJlbnRDb21wb25lbnQuZGF0YTtcbiAgICAgICAgaWYgKCEgY3VycmVudERhdGFGYWNldClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RGF0YUZhY2V0O1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgcGF0aCB0byBhY2Nlc3MgdGhpcyBkYXRhIGZhY2V0IGZyb20gcGFyZW50ICh1c2luZyBwYXRoIG1ldGhvZClcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGF0aDtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGtleSB0byBhY2Nlc3MgdGhlIHZhbHVlIHJlbGF0ZWQgdG8gdGhpcyBkYXRhIGZhY2V0IG9uIHRoZSB2YWx1ZSByZWxhdGVkIHRvIHBhcmVudCBkYXRhIGZhY2V0LlxuICogSWYgY29tcG9uZW50IGhhcyBMaXN0IGZhY2V0LCByZXR1cm5zIGluZGV4XG4gKlxuICogQHJldHVybiB7U3RyaW5nfEludGVnZXJ9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0S2V5KCkge1xuICAgIHZhciBwYXRoID0gdGhpcy5fcGF0aDtcbiAgICByZXR1cm4gcGF0aFswXSA9PSAnWydcbiAgICAgICAgICAgID8gK3BhdGguc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBcIltcIiBhbmQgXCJdXCJcbiAgICAgICAgICAgIDogcGF0aC5zbGljZSgxKSAvLyByZW1vdmUgbGVhZGluZyBcIi5cIlxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5nZXRTdGF0ZWAgdG8gZ2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0U3RhdGUoZGVlcFN0YXRlKSB7XG4gICAgcmV0dXJuIHsgc3RhdGU6IHRoaXMuZ2V0KGRlZXBTdGF0ZSkgfTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGVgIHRvIHNldCBmYWNldCdzIHN0YXRlXG4gKiBTaW1wbHkgc2V0cyBtb2RlbCBkYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGRhdGEgdG8gc2V0IG9uIGZhY2V0J3MgbW9kZWxcbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiB0aGlzLnNldChzdGF0ZS5zdGF0ZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKSBcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBkb1QgPSBtaWxvQ29yZS51dGlsLmRvVFxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIEJpbmRBdHRyaWJ1dGUgPSByZXF1aXJlKCcuLi8uLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBkb21VdGlscyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRG9tJylgXG4gKiBGYWNldCB3aXRoIGNvbXBvbmVudCByZWxhdGVkIGRvbSB1dGlsc1xuICovXG52YXIgRG9tID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0RvbScpO1xuXG5fLmV4dGVuZChEb20sIHtcbiAgICBjcmVhdGVFbGVtZW50OiBEb20kJGNyZWF0ZUVsZW1lbnRcbn0pO1xuXG5cbi8qKlxuICogRmFjZXQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgZnJvbSBhIHBhc3NlZCBjb25maWd1YXRpb24gb2JqZWN0XG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgd2l0aCB0aGUgcHJvcGVydGllcyBgZG9tQ29uZmlnYCwgYGNvbnRlbnRgLCBgdGVtcGxhdGVgXG4gKiBAcmV0dXJuIHtFbGVtZW50fSBhbiBodG1sIGVsZW1lbnQgXG4gKi9cbmZ1bmN0aW9uIERvbSQkY3JlYXRlRWxlbWVudChjb25maWcpIHtcbiAgICB2YXIgZG9tQ29uZmlnID0gY29uZmlnLmRvbUNvbmZpZyB8fCB7fVxuICAgICAgICAsIHRhZ05hbWUgPSBkb21Db25maWcudGFnTmFtZSB8fCAnZGl2J1xuICAgICAgICAsIG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKVxuICAgICAgICAsIGNvbnRlbnQgPSBjb25maWcuY29udGVudFxuICAgICAgICAsIHRlbXBsYXRlID0gY29uZmlnLnRlbXBsYXRlO1xuXG4gICAgLy8gVE9ETyBpdCB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aGVuL2lmIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWRcbiAgICAvLyBTaG91bGQgYmUgc29tZXByb3BlcnR5IG9uIGVsZW1lbnQgdG8gaW5kaWNhdGUgaXQncyBiZWVuIGNhbGxlZD9cbiAgICBfYXBwbHlDb25maWdUb0VsZW1lbnQobmV3RWwsIGRvbUNvbmZpZyk7XG5cbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHRlbXBsYXRlKVxuICAgICAgICAgICAgbmV3RWwuaW5uZXJIVE1MID0gZG9ULnRlbXBsYXRlKHRlbXBsYXRlKSh7Y29udGVudDogY29udGVudH0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdFbC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gbmV3RWw7XG59XG5cblxuZnVuY3Rpb24gX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCBjb25maWcpIHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IGNvbmZpZyAmJiBjb25maWcuY2xzXG4gICAgICAgICwgY29uZmlnQXR0cmlidXRlcyA9IGNvbmZpZyAmJiBjb25maWcuYXR0cmlidXRlcztcblxuICAgIGlmIChjb25maWdBdHRyaWJ1dGVzKVxuICAgICAgICBfLmVhY2hLZXkoY29uZmlnQXR0cmlidXRlcywgZnVuY3Rpb24oYXR0clZhbHVlLCBhdHRyTmFtZSkge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgIGlmIChjc3NDbGFzc2VzKVxuICAgICAgICBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgJ2FkZCcsIGNzc0NsYXNzZXMpO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oRG9tLCB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuXG4gICAgc2hvdzogc2hvdyxcbiAgICBoaWRlOiBoaWRlLFxuICAgIHRvZ2dsZTogdG9nZ2xlLFxuICAgIGRldGFjaDogZGV0YWNoLFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGFwcGVuZDogYXBwZW5kLFxuICAgIHByZXBlbmQ6IHByZXBlbmQsXG4gICAgYXBwZW5kQ2hpbGRyZW46IGFwcGVuZENoaWxkcmVuLFxuICAgIHByZXBlbmRDaGlsZHJlbjogcHJlcGVuZENoaWxkcmVuLFxuICAgIGluc2VydEFmdGVyOiBpbnNlcnRBZnRlcixcbiAgICBpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZSxcbiAgICBhcHBlbmRUb1Njb3BlUGFyZW50OiBhcHBlbmRUb1Njb3BlUGFyZW50LFxuICAgIGNoaWxkcmVuOiBEb20kY2hpbGRyZW4sXG4gICAgc2V0U3R5bGU6IHNldFN0eWxlLFxuICAgIHNldFN0eWxlczogc2V0U3R5bGVzLFxuICAgIGNvcHk6IGNvcHksXG4gICAgY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCxcblxuICAgIGFkZENzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ2FkZCcpLFxuICAgIHJlbW92ZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3JlbW92ZScpLFxuICAgIHRvZ2dsZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3RvZ2dsZScpLFxuXG4gICAgZmluZDogZmluZCxcbiAgICBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uOiBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uLFxuICAgIGhhc1RleHRBZnRlclNlbGVjdGlvbjogaGFzVGV4dEFmdGVyU2VsZWN0aW9uLFxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChEb20pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvbTtcblxuXG4vLyBzdGFydCBEb20gZmFjZXRcbmZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWw7XG4gICAgX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCB0aGlzLmNvbmZpZyk7XG4gICAgdmFyIGN1cnJlbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKVxuICAgIHRoaXMuX3Zpc2libGUgPSBjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnO1xufVxuXG4vLyBzaG93IEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHNob3coKSB7XG4gICAgdGhpcy50b2dnbGUodHJ1ZSk7XG59XG5cbi8vIGhpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gaGlkZSgpIHtcbiAgICB0aGlzLnRvZ2dsZShmYWxzZSk7XG59XG5cbi8vIHNob3cvaGlkZVxuZnVuY3Rpb24gdG9nZ2xlKGRvU2hvdykge1xuICAgIGRvU2hvdyA9IHR5cGVvZiBkb1Nob3cgPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/ICEgdGhpcy5fdmlzaWJsZVxuICAgICAgICAgICAgICAgIDogISEgZG9TaG93O1xuXG4gICAgdGhpcy5fdmlzaWJsZSA9IGRvU2hvdztcbiAgICB2YXIgZWwgPSB0aGlzLm93bmVyLmVsO1xuXG4gICAgZWwuc3R5bGUuZGlzcGxheSA9IGRvU2hvdyA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICByZXR1cm4gZG9TaG93O1xufVxuXG5cbmZ1bmN0aW9uIF9tYW5hZ2VDc3NDbGFzc2VzKG1ldGhvZE5hbWUsIGNzc0NsYXNzZXMsIGVuZm9yY2UpIHtcbiAgICBfYXR0YWNoQ3NzQ2xhc3Nlcyh0aGlzLm93bmVyLmVsLCBtZXRob2ROYW1lLCBjc3NDbGFzc2VzLCBlbmZvcmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgbWV0aG9kTmFtZSwgY3NzQ2xhc3NlcywgZW5mb3JjZSkge1xuICAgIHZhciBjbGFzc0xpc3QgPSBlbC5jbGFzc0xpc3RcbiAgICAgICAgLCBkb1RvZ2dsZSA9IG1ldGhvZE5hbWUgPT0gJ3RvZ2dsZSc7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjc3NDbGFzc2VzKSlcbiAgICAgICAgY3NzQ2xhc3Nlcy5mb3JFYWNoKGNhbGxNZXRob2QpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjc3NDbGFzc2VzID09ICdzdHJpbmcnKVxuICAgICAgICBjYWxsTWV0aG9kKGNzc0NsYXNzZXMpO1xuICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHR5cGUgb2YgQ1NTIGNsYXNzZXMgcGFyYW1ldGVyJyk7XG5cbiAgICBmdW5jdGlvbiBjYWxsTWV0aG9kKGNzc0Nscykge1xuICAgICAgICBkb1RvZ2dsZVxuICAgICAgICAgICAgLy8gT25seSBwYXNzICdlbmZvcmNlJyBpZiBhIHZhbHVlIGhhcyBiZWVuIHByb3ZpZGVkIChUaGUgJ3RvZ2dsZScgZnVuY3Rpb24gb2YgdGhlIGNsYXNzTGlzdCB3aWxsIHRyZWF0IHVuZGVmaW5lZCA9PT0gZmFsc2UgcmVzdWx0aW5nIGluIG9ubHkgYWxsb3dpbmcgY2xhc3NlcyB0byBiZSByZW1vdmVkKVxuICAgICAgICAgICAgPyBlbmZvcmNlID09PSB1bmRlZmluZWQgPyBjbGFzc0xpc3RbbWV0aG9kTmFtZV0oY3NzQ2xzKSA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMsIGVuZm9yY2UpXG4gICAgICAgICAgICA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpICBcbiAgICAgICAgZG9tVXRpbHMuZGV0YWNoQ29tcG9uZW50KHRoaXMub3duZXIuZWwpO1xufVxuXG5cbmZ1bmN0aW9uIHNldFN0eWxlKHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy5vd25lci5lbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2FsbCBzZXRTdHlsZSBvbiBvd25lciB3aXRoIG5vIGVsZW1lbnQ6IFwiICsgdGhpcy5vd25lci5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5vd25lci5lbC5zdHlsZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gc2V0U3R5bGVzKHByb3BlcnRpZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKVxuICAgICAgICB0aGlzLm93bmVyLmVsLnN0eWxlW3Byb3BlcnR5XSA9IHByb3BlcnRpZXNbcHJvcGVydHldO1xufVxuXG5cbi8vIGNyZWF0ZSBhIGNvcHkgb2YgRE9NIGVsZW1lbnQgdXNpbmcgZmFjZXQgY29uZmlnIGlmIHNldFxuZnVuY3Rpb24gY29weShpc0RlZXApIHtcbiAgICByZXR1cm4gdGhpcy5vd25lci5lbCAmJiB0aGlzLm93bmVyLmVsLmNsb25lTm9kZShpc0RlZXApO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG4gICAgdmFyIG5ld0VsID0gRG9tLmNyZWF0ZUVsZW1lbnQodGhpcy5jb25maWcpO1xuICAgIHJldHVybiBuZXdFbDtcbn1cblxuXG4vLyByZW1vdmUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIGRvbVV0aWxzLnJlbW92ZUVsZW1lbnQodGhpcy5vd25lci5lbCk7XG59XG5cbi8vIGFwcGVuZCBpbnNpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gYXBwZW5kKGVsKSB7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChlbCk7XG59XG5cbi8vIHByZXBlbmQgaW5zaWRlIEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHByZXBlbmQoZWwpIHtcbiAgICB2YXIgdGhpc0VsID0gdGhpcy5vd25lci5lbFxuICAgICAgICAsIGZpcnN0Q2hpbGQgPSB0aGlzRWwuZmlyc3RDaGlsZDtcbiAgICBpZiAoZmlyc3RDaGlsZClcbiAgICAgICAgdGhpc0VsLmluc2VydEJlZm9yZShlbCwgZmlyc3RDaGlsZCk7XG4gICAgZWxzZVxuICAgICAgICB0aGlzRWwuYXBwZW5kQ2hpbGQoZWwpO1xufVxuXG4vLyBhcHBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4oZWwpIHtcbiAgICB3aGlsZShlbC5jaGlsZE5vZGVzLmxlbmd0aClcbiAgICAgICAgdGhpcy5hcHBlbmQoZWwuY2hpbGROb2Rlc1swXSk7XG59XG5cbi8vIHByZXBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gcHJlcGVuZENoaWxkcmVuKGVsKSB7XG4gICAgd2hpbGUoZWwuY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgIHRoaXMucHJlcGVuZChlbC5jaGlsZE5vZGVzW2VsLmNoaWxkTm9kZXMubGVuZ3RoIC0gMV0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRBZnRlcihlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7ICAgIFxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZWwsIHRoaXNFbC5uZXh0U2libGluZyk7XG59XG5cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShlbCwgdGhpc0VsKTtcbn1cblxuXG4vLyBhcHBlbmRzIGNvbXBvbmVudCdzIGVsZW1lbnQgdG8gc2NvcGUgcGFyZW50LiBJZiBpdCB3YXMgYWxyZWR5IGluIERPTSBpdCB3aWxsIGJlIG1vdmVkXG5mdW5jdGlvbiBhcHBlbmRUb1Njb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KCk7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVsLmFwcGVuZENoaWxkKHRoaXMub3duZXIuZWwpO1xufVxuXG5cbi8qKlxuICogRG9tIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29tcG9uZW50IGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtBcnJheVtFbGVtZW50XX1cbiAqL1xuZnVuY3Rpb24gRG9tJGNoaWxkcmVuKCkge1xuICAgIHJldHVybiBkb21VdGlscy5jaGlsZHJlbih0aGlzLm93bmVyLmVsKTtcbn1cblxuXG52YXIgZmluZERpcmVjdGlvbnMgPSB7XG4gICAgJ3VwJzogJ3ByZXZpb3VzTm9kZScsXG4gICAgJ2Rvd24nOiAnbmV4dE5vZGUnXG59O1xuXG4vLyBGaW5kcyBjb21wb25lbnQgcGFzc2luZyBvcHRpb25hbCBpdGVyYXRvcidzIHRlc3Rcbi8vIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSBjdXJyZW50IGNvbXBvbmVudCAodGhpcylcbi8vIGJ5IHRyYXZlcnNpbmcgRE9NIHRyZWUgdXB3YXJkcyAoZGlyZWN0aW9uID0gXCJ1cFwiKVxuLy8gb3IgZG93bndhcmRzIChkaXJlY3Rpb24gPSBcImRvd25cIilcbmZ1bmN0aW9uIGZpbmQoZGlyZWN0aW9uLCBpdGVyYXRvcikge1xuICAgIGlmICghIGZpbmREaXJlY3Rpb25zLmhhc093blByb3BlcnR5KGRpcmVjdGlvbikpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW5jb3JyZWN0IGZpbmQgZGlyZWN0aW9uOiAnICsgZGlyZWN0aW9uKTtcblxuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWxcbiAgICAgICAgLCBzY29wZSA9IHRoaXMub3duZXIuc2NvcGVcbiAgICAgICAgLCB0cmVlV2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihzY29wZS5fcm9vdEVsLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG5cbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gZWw7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpXG4gICAgICAgICwgY29tcG9uZW50c05hbWVzID0gT2JqZWN0LmtleXMoc2NvcGUpXG4gICAgICAgICwgZm91bmQgPSBmYWxzZTtcblxuICAgIHdoaWxlIChuZXh0Tm9kZSkge1xuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKG5leHROb2RlKTtcbiAgICAgICAgaWYgKGF0dHIubm9kZSkge1xuICAgICAgICAgICAgYXR0ci5wYXJzZSgpLnZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUuaGFzT3duUHJvcGVydHkoYXR0ci5jb21wTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gc2NvcGVbYXR0ci5jb21wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKCEgaXRlcmF0b3IgfHwgaXRlcmF0b3IoY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gbmV4dE5vZGU7XG4gICAgICAgIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpO1xuICAgIH1cblxuICAgIGlmIChmb3VuZCkgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuXG4vLyByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIHRleHQgYmVmb3JlIHNlbGVjdGlvblxuZnVuY3Rpb24gaGFzVGV4dEJlZm9yZVNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG4gICAgXG4gICAgdmFyIHRleHQgPSBzZWxlY3Rpb24uZm9jdXNOb2RlICYmIHNlbGVjdGlvbi5mb2N1c05vZGUudGV4dENvbnRlbnQ7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGV4dCAmJiB0ZXh0LmNoYXJBdCgwKSA9PSAnICcgPyAxIDogMDtcbiAgICBpZiAoc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPSBzdGFydFBvcykgcmV0dXJuIHRydWU7XG5cbiAgICAvLyB3YWxrIHVwIHRoZSBET00gdHJlZSB0byBjaGVjayBpZiB0aGVyZSBhcmUgdGV4dCBub2RlcyBiZWZvcmUgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIHByZXZOb2RlID0gdHJlZVdhbGtlci5wcmV2aW91c05vZGUoKTtcblxuICAgIHZhciBpc1RleHQgPSBwcmV2Tm9kZSA/ICFwcmV2Tm9kZS5ub2RlVmFsdWUudHJpbSgpID09ICcnIDogZmFsc2U7XG5cbiAgICByZXR1cm4gaXNUZXh0O1xufVxuXG5cbmZ1bmN0aW9uIGhhc1RleHRBZnRlclNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG5cbiAgICB2YXIgdGV4dCA9IHNlbGVjdGlvbi5mb2N1c05vZGUgJiYgc2VsZWN0aW9uLmZvY3VzTm9kZS50ZXh0Q29udGVudDtcbiAgICB2YXIgc3RhcnRQb3MgPSB0ZXh0ICYmIHRleHQuY2hhckF0KHRleHQubGVuZ3RoLTEpID09ICcgJyA/IHNlbGVjdGlvbi5hbmNob3JOb2RlLmxlbmd0aC0xIDogc2VsZWN0aW9uLmFuY2hvck5vZGUubGVuZ3RoO1xuICAgIGlmIChzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0IDwgc3RhcnRQb3MpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gd2FsayB1cCB0aGUgRE9NIHRyZWUgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIHRleHQgbm9kZXMgYWZ0ZXIgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xuICAgIFxuICAgIC8vVG8gY2FwdHVyZSB3aGVuIHRyZWV3YWxrZXIgZ2l2ZXMgdXMgYW4gZW1wdHkgdGV4dCBub2RlICh1bmtub3duIHJlYXNvbilcbiAgICB2YXIgaXNUZXh0ID0gbmV4dE5vZGUgPyAhbmV4dE5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PSAnJyA6IGZhbHNlO1xuXG4gICAgcmV0dXJuIGlzVGV4dDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZmFjZXRzLWRyYWdcIj48L2E+XG4vLyAjIyNkcmFnIGZhY2V0XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIERPTUV2ZW50c1NvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZG9tX2V2ZW50cycpXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIERyYWdEcm9wID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kcmFnZHJvcCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRHJhZycpYFxuICogRmFjZXQgZm9yIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgZHJhZ2dlZFxuICogRHJhZyBmYWNldCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczpcbiAqXG4gKiAgLSBtZXRhOiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzXG4gKiAgICAgIC0gcGFyYW1zOiBvYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRoYXQgd2lsbCBiZSBwYXNzZWQgaW4gbWV0YWRhdGEgZGF0YSB0eXBlIChjYW4gYWxzbyBiZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0aGF0IHJldHVybnMgdGhpcyBvYmplY3QpLiBTZWUgY29uZmlnLmRyYWdEcm9wLmRhdGFUeXBlcy5jb21wb25lbnRNZXRhVGVtcGxhdGVcbiAqICAgICAgLSBkYXRhOiBkYXRhIHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGFib3ZlIG1ldGEgZGF0YSB0eXBlIChvciBmdW5jdGlvbilcbiAqICAtIGFsbG93ZWRFZmZlY3RzOiBzdHJpbmcgKG9yIGZ1bmN0aW9uKSBhcyBzcGVjaWZpZWQgaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9EcmFnRHJvcC9EcmFnX09wZXJhdGlvbnMjZHJhZ3N0YXJ0XG4gKiAgLSBkcmFnSW1hZ2U6XG4gKiAgICAgIC0gdXJsOiBwYXRoIHRvIGltYWdlIHRvIGRpc3BsYXkgd2hlbiBkcmFnZ2luZywgaW5zdGVhZCBvZiB0aGUgb3duZXIgZWxlbWVudFxuICogICAgICAtIHg6IHggb2Zmc2V0IGZvciB0aGUgaW1hZ2VcbiAqICAgICAgLSB5OiB5IG9mZnNldCBmb3IgdGhlIGltYWdlXG4gKiAgLSBkcmFnQ2xzOiBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gdGhlIGNvbXBvbmVudCBiZWluZyBkcmFnZ2VkXG4gKiAgLSBkYXRhVHlwZXM6IG1hcCBvZiBhZGRpdGlvbmFsIGRhdGEgdHlwZXMgdGhlIGNvbXBvbmVudCB3aWxsIHN1cHBseSB0byBkYXRhIHRyYW5zZmVyIG9iamVjdCwga2V5IGlzIGRhdGEgdHlwZSwgdmFsdWUgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgaXQsIGNvbXBvbmVudCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgY29udGV4dCB0byB0aGlzIGZ1bmN0aW9uXG4gKlxuICogSWYgZnVuY3Rpb24gaXMgc3BlY2lmaWVkIGluIGFueSBwYXJhbWV0ZXIgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgY29tcG9uZW50IGFzIHRoZSBjb250ZXh0XG4gKi9cbnZhciBEcmFnID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0RyYWcnKTtcblxuXy5leHRlbmRQcm90byhEcmFnLCB7XG4gICAgaW5pdDogRHJhZyRpbml0LFxuICAgIHN0YXJ0OiBEcmFnJHN0YXJ0LFxuICAgIHNldEhhbmRsZTogRHJhZyRzZXRIYW5kbGVcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoRHJhZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRHJhZztcblxuXG5mdW5jdGlvbiBEcmFnJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgICBcblxuICAgIHRoaXMuX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJKERPTUV2ZW50c1NvdXJjZSk7XG4gICAgdGhpcy5fZHJhZ0RhdGEgPSB7fTtcblxuICAgIHZhciBkYXRhVHlwZUluZm8gPSB0aGlzLmNvbmZpZy5fZGF0YVR5cGVJbmZvIHx8ICcnO1xuICAgIHRoaXMuX2RhdGFUeXBlSW5mbyA9IHR5cGVvZiBkYXRhVHlwZUluZm8gPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGF0YVR5cGVJbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsgcmV0dXJuIGRhdGFUeXBlSW5mbzsgfTtcbn1cblxuXG4vKipcbiAqIERyYWcgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBkcmFnIGhhbmRsZSBlbGVtZW50IG9mIGNvbXBvbmVudC4gVGhpcyBlbGVtZW50IGhhcyB0byBiZSBkcmFnZ2VkIGZvciB0aGUgY29tcG9uZW50IHRvIGJlIGRyYWdnZWQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBoYW5kbGVFbFxuICovXG5mdW5jdGlvbiBEcmFnJHNldEhhbmRsZShoYW5kbGVFbCkge1xuICAgIGlmICghIHRoaXMub3duZXIuZWwuY29udGFpbnMoaGFuZGxlRWwpKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ2RyYWcgaGFuZGxlIHNob3VsZCBiZSBpbnNpZGUgZWxlbWVudCB0byBiZSBkcmFnZ2VkJylcbiAgICB0aGlzLl9kcmFnSGFuZGxlID0gaGFuZGxlRWw7XG59XG5cblxuZnVuY3Rpb24gRHJhZyRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfYWRkRHJhZ0F0dHJpYnV0ZS5jYWxsKHRoaXMpO1xuICAgIF9jcmVhdGVEcmFnSW1hZ2UuY2FsbCh0aGlzKTtcblxuICAgIHRoaXMub25NZXNzYWdlcyh7XG4gICAgICAgICdtb3VzZWRvd24nOiBvbk1vdXNlRG93bixcbiAgICAgICAgJ21vdXNlZW50ZXIgbW91c2VsZWF2ZSBtb3VzZW1vdmUnOiBvbk1vdXNlTW92ZW1lbnQsXG4gICAgICAgICdkcmFnc3RhcnQnOiBvbkRyYWdTdGFydCxcbiAgICAgICAgJ2RyYWcnOiBvbkRyYWdnaW5nLFxuICAgICAgICAnZHJhZ2VuZCc6IG9uRHJhZ0VuZFxuICAgIH0pO1xuXG4gICAgdGhpcy5vd25lci5vbk1lc3NhZ2VzKHtcbiAgICAgICAgJ2dldHN0YXRlc3RhcnRlZCc6XG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9yZW1vdmVEcmFnQXR0cmlidXRlLCBjb250ZXh0OiB0aGlzIH0sXG4gICAgICAgICdnZXRzdGF0ZWNvbXBsZXRlZCc6XG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9hZGREcmFnQXR0cmlidXRlLCBjb250ZXh0OiB0aGlzIH1cbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZHMgZHJhZ2dhYmxlIGF0dHJpYnV0ZSB0byBjb21wb25lbnQncyBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX2FkZERyYWdBdHRyaWJ1dGUoKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpXG4gICAgICAgIHRoaXMub3duZXIuZWwuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCB0cnVlKTtcbn1cblxuXG5mdW5jdGlvbiBfcmVtb3ZlRHJhZ0F0dHJpYnV0ZSgpIHtcbiAgICBpZiAodGhpcy5vd25lci5lbClcbiAgICAgICAgdGhpcy5vd25lci5lbC5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVEcmFnSW1hZ2UoKSB7XG4gICAgdmFyIGRyYWdJbWFnZSA9IHRoaXMuY29uZmlnLmRyYWdJbWFnZTtcbiAgICBpZiAoZHJhZ0ltYWdlKSB7XG4gICAgICAgIHRoaXMuX2RyYWdFbGVtZW50ID0gbmV3IEltYWdlKCk7XG4gICAgICAgIHRoaXMuX2RyYWdFbGVtZW50LnNyYyA9IGRyYWdJbWFnZS51cmw7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLl9fbW91c2VEb3duVGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGlmICh0YXJnZXRJbkRyYWdIYW5kbGUuY2FsbCh0aGlzKSkge1xuICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuZW1wdHkoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uTW91c2VNb3ZlbWVudChldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIHNob3VsZEJlRHJhZ2dhYmxlID0gdGFyZ2V0SW5EcmFnSGFuZGxlLmNhbGwodGhpcyk7XG4gICAgdGhpcy5vd25lci5lbC5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsIHNob3VsZEJlRHJhZ2dhYmxlKTtcbiAgICBpZiAoZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZHJhZ0VuYWJsZUV2ZW50JykgIT0gJ2ZhbHNlJylcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnU3RhcnQoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9mZiB8fCAhIHRhcmdldEluRHJhZ0hhbmRsZS5jYWxsKHRoaXMpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZHJhZ0ltYWdlID0gdGhpcy5jb25maWcuZHJhZ0ltYWdlO1xuICAgIGlmIChkcmFnSW1hZ2UpXG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UodGhpcy5fZHJhZ0VsZW1lbnQsIGRyYWdJbWFnZS54IHx8IDAsIGRyYWdJbWFnZS55IHx8IDApO1xuXG4gICAgdmFyIG93bmVyID0gdGhpcy5vd25lcjtcbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuXG4gICAgdGhpcy5fZHJhZ0RhdGEgPSBkdC5zZXRDb21wb25lbnRTdGF0ZShvd25lcik7XG4gICAgc2V0TWV0YS5jYWxsKHRoaXMpO1xuICAgIHNldEFkZGl0aW9uYWxEYXRhVHlwZXMuY2FsbCh0aGlzKTtcbiAgICBfc2V0QWxsb3dlZEVmZmVjdHMuY2FsbCh0aGlzLCBkdCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuZHJhZ0NscylcbiAgICAgICAgdGhpcy5vd25lci5lbC5jbGFzc0xpc3QudG9nZ2xlKHRoaXMuY29uZmlnLmRyYWdDbHMsIHRydWUpO1xuXG4gICAgRHJhZ0Ryb3Auc2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wc3RhcnRlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnZHJhZ3N0YXJ0JyxcbiAgICAgICAgZHJhZ0Ryb3A6IGR0LFxuICAgICAgICBkcmFnRmFjZXQ6IHRoaXNcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNldE1ldGEoKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBnZXRNZXRhRGF0YS5jYWxsKHRoaXMsICdwYXJhbXMnKVxuICAgICAgICAgICAgLCBkYXRhID0gZ2V0TWV0YURhdGEuY2FsbCh0aGlzLCAnZGF0YScpO1xuXG4gICAgICAgIHRoaXMuX2RyYWdNZXRhRGF0YVR5cGUgPSBkdC5zZXRDb21wb25lbnRNZXRhKG93bmVyLCBwYXJhbXMsIGRhdGEpO1xuICAgICAgICB0aGlzLl9kcmFnTWV0YURhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE1ldGFEYXRhKHByb3BlcnR5KSB7XG4gICAgICAgIHRyeSB7IHZhciBmdW5jID0gdGhpcy5jb25maWcubWV0YVtwcm9wZXJ0eV07IH0gY2F0Y2goZSkge31cbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09ICdzdHJpbmcnKSBmdW5jID0gb3duZXJbZnVuY107XG4gICAgICAgIHJldHVybiBfLnJlc3VsdChmdW5jLCBvd25lcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0QWRkaXRpb25hbERhdGFUeXBlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmRhdGFUeXBlcykge1xuICAgICAgICAgICAgdGhpcy5fZGF0YVR5cGVzRGF0YSA9IF8ubWFwS2V5cyh0aGlzLmNvbmZpZy5kYXRhVHlwZXMsIGZ1bmN0aW9uIChnZXREYXRhRnVuYywgZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldERhdGFGdW5jLmNhbGwodGhpcy5vd25lciwgZGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSBkdC5zZXREYXRhKGRhdGFUeXBlLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ2dpbmcoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGlmIChfZHJhZ0lzRGlzYWJsZWQuY2FsbCh0aGlzLCBldmVudCkpIHJldHVybjtcblxuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgZHQuc2V0Q29tcG9uZW50U3RhdGUodGhpcy5vd25lciwgdGhpcy5fZHJhZ0RhdGEpO1xuICAgIGR0LnNldERhdGEodGhpcy5fZHJhZ01ldGFEYXRhVHlwZSwgdGhpcy5fZHJhZ01ldGFEYXRhKTtcbiAgICBpZiAodGhpcy5fZGF0YVR5cGVzRGF0YSkge1xuICAgICAgICBfLmVhY2hLZXkodGhpcy5fZGF0YVR5cGVzRGF0YSwgZnVuY3Rpb24oZGF0YSwgZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIGlmIChkYXRhKSBkdC5zZXREYXRhKGRhdGFUeXBlLCBkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3NldEFsbG93ZWRFZmZlY3RzLmNhbGwodGhpcywgZHQpO1xufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ0VuZChldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgaWYgKF9kcmFnSXNEaXNhYmxlZC5jYWxsKHRoaXMsIGV2ZW50KSkgcmV0dXJuO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmRyYWdDbHMpXG4gICAgICAgIHRoaXMub3duZXIuZWwuY2xhc3NMaXN0LnRvZ2dsZSh0aGlzLmNvbmZpZy5kcmFnQ2xzLCBmYWxzZSk7XG5cbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICAgIERyYWdEcm9wLnNlcnZpY2UucG9zdE1lc3NhZ2VTeW5jKCdjb21wbGV0ZWRyYWdkcm9wJywge1xuICAgICAgICBldmVudFR5cGU6ICdkcmFnZW5kJyxcbiAgICAgICAgZHJhZ0Ryb3A6IGR0LFxuICAgICAgICBkcmFnRmFjZXQ6IHRoaXNcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBfc2V0QWxsb3dlZEVmZmVjdHMoRHJhZ0Ryb3ApIHtcbiAgICB2YXIgZWZmZWN0cyA9IF8ucmVzdWx0KHRoaXMuY29uZmlnLmFsbG93ZWRFZmZlY3RzLCB0aGlzLm93bmVyKTtcbiAgICBEcmFnRHJvcC5zZXRBbGxvd2VkRWZmZWN0cyhlZmZlY3RzKTtcbn1cblxuXG5mdW5jdGlvbiB0YXJnZXRJbkRyYWdIYW5kbGUoKSB7XG4gICAgcmV0dXJuICEgdGhpcy5fZHJhZ0hhbmRsZSB8fCB0aGlzLl9kcmFnSGFuZGxlLmNvbnRhaW5zKHRoaXMuX19tb3VzZURvd25UYXJnZXQpO1xufVxuXG5cbmZ1bmN0aW9uIF9kcmFnSXNEaXNhYmxlZChldmVudCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vZmYpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZmFjZXRzLWRyb3BcIj48L2E+XG4vLyAjIyNkcm9wIGZhY2V0XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIERPTUV2ZW50c1NvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZG9tX2V2ZW50cycpXG4gICAgLCBEcm9wTXNnQVBJID0gcmVxdWlyZSgnLi4vbXNnX2FwaS9kcm9wJylcbiAgICAsIERyYWdEcm9wID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kcmFnZHJvcCcpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRHJvcCcpYFxuICogRmFjZXQgZm9yIGNvbXBvbmVudHMgdGhhdCBjYW4gYWNjZXB0IGRyb3BzXG4gKiBEcm9wIGZhY2V0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICpcbiAqICAtIGFsbG93IC0gYW4gb2JqZWN0IHRoYXQgd2lsbCBkZWZpbmUgYWxsb3dlZCBkYXRhIHR5cGVzIGR1cmluZyBkcmFnIChgZHJhZ2VudGVyYCBhbmQgYGRyYWdvdmVyYCBldmVudHMpIHdpdGggdGhlc2UgcHJvcGVydGllczpcbiAqICAgICAgLSBjb21wb25lbnRzOiBgdHJ1ZWAgYnkgZGVmYXVsdCAoYWxsIGNvbXBvbmVudHMgd2lsbCBiZSBhY2NlcHRlZClcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1Igc3RyaW5nIHdpdGggYWxsb3dlZCBjb21wb25lbnQgY2xhc3NcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgbGlzdCBvZiBhbGxvd2VkIGNvbXBvbmVudHMgY2xhc3NlcyAoc3RyaW5ncylcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgbWFwIHdpdGggYWxsb3dlZCBjbGFzc2VzIGluIGtleXMgYW5kIGB0cnVlYC90ZXN0IGZ1bmN0aW9ucyBpbiB2YWx1ZXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgdGVzdCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcGFzc2VkIG9iamVjdCBkZWZpbmVkIGJlbG93XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIGBmYWxzZWAgdG8gTk9UIGFjY2VwdCBjb21wb25lbnRzXG4gKiAgICAgIC0gZGF0YVR5cGVzOiAgYGZhbHNlYCBieSBkZWZhdWx0IChubyBvdGhlciBkYXRhIHR5cGVzIHdpbGwgYmUgYWNjZXB0ZWQpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIHN0cmluZyB3aXRoIGFsbG93ZWQgZGF0YSB0eXBlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIGxpc3Qgb2YgYWRkaXRpb25hbCBkYXRhIHR5cGVzIHRoYXQgYSBkcm9wIHRhcmdldCB3b3VsZCBhY2NlcHRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgdGVzdCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcGFzc2VkIERyYWdEcm9wIG9iamVjdFxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBgdHJ1ZWAgdG8gYWNjZXB0IGFsbCBkYXRhIHR5cGVzXG4gKiAgICAgIC0gY2hlY2tQYXJlbnQ6IGBmYWxzZWAgYnkgZGVmYXVsdFxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBgdHJ1ZWAgd2lsbCBjYWxsIHBhcmVudCBjb21wb25lbnQgZHJvcCBhbGxvdyB0byBjaGVjayBpZiBwYXJlbnQgY29tcG9uZW50IHdpbGwgYWNjZXB0IHRoZSBjb21wb25lbnRcbiAqICAgICAgSWYgdGVzdCBmdW5jdGlvbnMgYXJlIHVzZWQsIHRoZXkgc2hvdWxkIHJldHVybiBib29sZWFuLiBFYWNoIHRlc3QgZnVuY3Rpb24gY2FuIGFsc28gc2V0IGRyb3AgZWZmZWN0IGFzIGRlZmluZWQgaGVyZTpcbiAqICAgICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2ZlciNkcm9wRWZmZWN0LjI4LjI5XG4gKiAgICAgIFNldHRpbmcgZHJvcCBlZmZlY3QgdGhhdCBpcyBub3QgYWxsb3dlZCBieSBkcmFnZ2VkIG9iamVjdCB3aWxsIHByZXZlbnQgZHJvcC5cbiAqICAgICAgVGVzdCBmdW5jdGlvbnMgZm9yIGNvbXBvbmVudHMgd2lsbCBiZSBwYXNzZWQgdGhlIG93bmVyIG9mIERyb3AgZmFjZXQgYXMgY29udGV4dCwgdGhlIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgcHJvcGVydGllcyBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyOlxuICogICAgICAgICAgY29tcENsYXNzIC0gbmFtZSBvZiBjb21wb25lbnQgY2xhc3MgYXMgc3RvcmVkIGluIHJlZ2lzdHJ5XG4gKiAgICAgICAgICBjb21wTmFtZSAtIG5hbWUgb2YgY29tcG9uZW50IChhbGwgbG93ZXJjYXNlKVxuICogICAgICAgICAgcGFyYW1zIC0gcGFyYW1ldGVycyBhcyBlbmNvZGVkIGluIGRhdGFUeXBlLCBwYXNzZWQgdG8gYG1pbG8udXRpbC5kcmFnRHJvcC5zZXRDb21wb25lbnRNZXRhYCBieSBEcmFnIGZhY2V0XG4gKiAgICAgICAgICBtZXRhRGF0YVR5cGUgLSBkYXRhIHR5cGUgb2YgdGhlIGRhdGEgdGhhdCBoYXMgY29tcENsYXNzLCBjb21wTmFtZSBhbmQgcGFyYW1zIGVuY29kZWRcbiAqXG4gKiAgICAgIC4uLiBhbmQgRHJhZ0Ryb3AgaW5zdGFuY2UgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAqXG4gKiAgICAgIFRlc3QgZnVuY3Rpb24gZm9yIG90aGVyIGRhdGEgdHlwZXMgd2lsbCBiZSBwYXNzZWQgdGhlIG93bmVyIG9mIERyb3AgZmFjZXQgYXMgY29udGV4dCBhbmQgRHJhZ0Ryb3AgaW5zdGFuY2UgYXMgdGhlIGZpcnN0IHBhcmFtZXRlclxuICpcbiAqICMjIyNFdmVudHMjIyMjXG4gKlxuICogSW4gYWRkaXRpb24gdG8gY29uZmlndXJpbmcgYWxsb3dlZCBjb21wb25lbnRzIGFuZCBkYXRhIHR5cGVzLCBjb21wb25lbnRzIGNsYXNzZXMgc2hvdWxkIHN1YnNjcmliZSB0byBldmVudHMuXG4gKiBBdCB0aGUgdmVyeSBsZWFzdCwgdGhleSBzaG91bGQgc3Vic2NyaWJlIHRvIGBkcm9wYCBldmVudC5cbiAqXG4gKiBEcm9wIGZhY2V0IGVtaXRzIGRyYWdpbi9kcmFnb3V0IG1lc3NhZ2VzIHRoYXQgYXJlIGVtaXR0ZWQgd2hlbmV2ZXIgYWN0dWFsIGNvbXBvbmVudCBlbGVtZW50IGlzIGVudGVyZWQgb3IgbGVmdFxuICogKHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIGRyYWdlbnRlciBhbmQgZHJhZ2xlYXZlIG1lc3NhZ2VzIHRoYXQgYXJlIGVtaXR0ZWQgd2hlbmV2ZXIgYW55IGNoaWxkIGVsZW1lbnQgaXMgZW50ZXJlZCBvciBsZWZ0LCBhcyBsb25nIGFzIGV2ZW50IGJ1YmJsZXMgdXApXG4gKiBJZiBjaGlsZCBjb21wb25lbnQgaGFzIGRyb3AgZmFjZXQgYXR0YWNoZWQsIGRyYWdvdXQgd2lsbCBiZSBlbWl0dGVkIG9uIHRoZSBjdXJyZW50IGNvbXBvbmVudCB3aGVuIHRoZSBjaGlsZCBpcyBlbnRlcmVkLlxuICpcbiAqIFlvdSBjYW4gc2VlIHRoZSBkZW1vbnN0cmF0aW9uIG9mIHdoZW4gbWVzc2FnZXMgYXJlIGVtaXR0ZWQgW2hlcmVdKGh0dHA6Ly9qc2Jpbi5jb20vYnVxb3YvNilcbiAqIFxuICovXG52YXIgRHJvcCA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdEcm9wJyk7XG5cblxuXy5leHRlbmRQcm90byhEcm9wLCB7XG4gICAgaW5pdDogRHJvcCRpbml0LFxuICAgIHN0YXJ0OiBEcm9wJHN0YXJ0XG4gICAgLy8gX3JlYXR0YWNoOiBfcmVhdHRhY2hFdmVudHNPbkVsZW1lbnRDaGFuZ2Vcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoRHJvcCk7XG5cbm1vZHVsZS5leHBvcnRzID0gRHJvcDtcblxuXG5mdW5jdGlvbiBEcm9wJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLl9jcmVhdGVNZXNzYWdlU291cmNlV2l0aEFQSShET01FdmVudHNTb3VyY2UsIG5ldyBEcm9wTXNnQVBJKTtcbn1cblxuXG5mdW5jdGlvbiBEcm9wJHN0YXJ0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5zdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub3duZXIuZWwuY2xhc3NMaXN0LmFkZCgnY2MtbW9kdWxlLXJlbGF0aXZlJyk7XG4gICAgdGhpcy5vbk1lc3NhZ2VzKHtcbiAgICAgICAgJ2RyYWdlbnRlciBkcmFnb3Zlcic6IG9uRHJhZ2dpbmcsXG4gICAgICAgICdkcm9wJzogb25Ecm9wLFxuICAgICAgICAnZHJhZ2VudGVyIGRyYWdvdmVyIGRyYWdsZWF2ZSBkcm9wIGRyYWdpbiBkcmFnb3V0JzogcG9zdFRvU2VydmljZVxuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ2dpbmcoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKCEgX2hhbmRsZURyb3BEZXBlbmRlbmN5LmNhbGwodGhpcywgZHQpKVxuICAgICAgICBkdC5zZXREcm9wRWZmZWN0KCdub25lJyk7XG59XG5cblxuZnVuY3Rpb24gb25Ecm9wKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICAgIERyYWdEcm9wLnNlcnZpY2UucG9zdE1lc3NhZ2VTeW5jKCdkcmFnZHJvcGNvbXBsZXRlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnZHJvcCcsXG4gICAgICAgIGRyYWdEcm9wOiBkdCxcbiAgICAgICAgZHJvcEZhY2V0OiB0aGlzLFxuICAgICAgICBjb21wb25lbnQ6IHRoaXMub3duZXJcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBwb3N0VG9TZXJ2aWNlKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBEcmFnRHJvcC5zZXJ2aWNlLnBvc3RNZXNzYWdlU3luYyhldmVudFR5cGUsIHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBkcm9wRmFjZXQ6IHRoaXMsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5vd25lclxuICAgIH0pO1xufVxuXG5cbnZhciBfaGFuZGxlRHJvcERlcGVuZGVuY3kgPSBfLnRocm90dGxlKF9oYW5kbGVEcm9wRGVwZW5kZW5jeU5vdGhyb3R0bGUsIDUwKTtcbmZ1bmN0aW9uIF9oYW5kbGVEcm9wRGVwZW5kZW5jeU5vdGhyb3R0bGUoZHQsIG9yaWdpbmFsRHJvcENvbXBvbmVudCkge1xuICAgIHZhciBhbGxvdyA9IHRoaXMuY29uZmlnLmFsbG93XG4gICAgICAgICwgcGFyZW50QWxsb3dlZCA9IHRydWU7XG5cbiAgICBvcmlnaW5hbERyb3BDb21wb25lbnQgPSBvcmlnaW5hbERyb3BDb21wb25lbnQgfHwgdGhpcy5vd25lcjtcblxuICAgIGlmIChhbGxvdyAmJiBhbGxvdy5jaGVja1BhcmVudCkge1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5vd25lci5nZXRTY29wZVBhcmVudCgnRHJvcCcpO1xuICAgICAgICBpZiAocGFyZW50KVxuICAgICAgICAgICAgcGFyZW50QWxsb3dlZCA9IF9oYW5kbGVEcm9wRGVwZW5kZW5jeU5vdGhyb3R0bGUuY2FsbChwYXJlbnQuZHJvcCwgZHQsIG9yaWdpbmFsRHJvcENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudEFsbG93ZWQgJiYgX2lzRHJvcEFsbG93ZWQuY2FsbCh0aGlzLCBkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KTtcbn1cblxuXG4vKipcbiAqIENoZWNrcyBpZiBkcm9wIGlzIGFsbG93ZWQgYmFzZWQgb24gZmFjZXQgY29uZmlndXJhdGlvbiAoc2VlIGFib3ZlKVxuICogXG4gKiBAcGFyYW0ge0RyYWdEcm9wfSBkdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gX2lzRHJvcEFsbG93ZWQoZHQsIG9yaWdpbmFsRHJvcENvbXBvbmVudCkge1xuICAgIHZhciBhbGxvdyA9IHRoaXMuY29uZmlnLmFsbG93O1xuXG4gICAgaWYgKGR0LmlzQ29tcG9uZW50KCkpIHtcbiAgICAgICAgdmFyIGFsbG93Q29tcHMgPSBhbGxvdyAmJiBhbGxvdy5jb21wb25lbnRzXG4gICAgICAgICAgICAsIG1ldGEgPSBkdC5nZXRDb21wb25lbnRNZXRhKCk7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlb2YgYWxsb3dDb21wcykge1xuICAgICAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd0NvbXBzO1xuICAgICAgICAgICAgLy8gY29tcG9uZW50IGNsYXNzXG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhICYmIG1ldGEuY29tcENsYXNzID09IGFsbG93Q29tcHM7XG4gICAgICAgICAgICAvLyB0ZXN0IGZ1bmN0aW9uXG4gICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93Q29tcHMuY2FsbCh0aGlzLm93bmVyLCBtZXRhLCBkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWxsb3dDb21wcykpXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYWxsb3dlZCBjbGFzc2VzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd0NvbXBzLmluZGV4T2YobWV0YSAmJiBtZXRhLmNvbXBDbGFzcykgPj0gMDtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFwIG9mIGNsYXNzOiBib29sZWFufHRlc3QgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlc3QgPSBhbGxvd0NvbXBzW21ldGEgJiYgbWV0YS5jb21wQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISEgXy5yZXN1bHQodGVzdCwgdGhpcy5vd25lciwgbWV0YSwgZHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgYWxsb3dlZCBjb21wb25lbnRzIGluIGNvbmZpZycpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGRhdGFUeXBlcyA9IGFsbG93ICYmIGFsbG93LmRhdGFUeXBlc1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBkYXRhVHlwZXMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZHQudHlwZXMuaW5kZXhPZihkYXRhVHlwZXMpID49IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPIHRlc3QgZm9yIG90aGVyIGRhdGEgdHlwZXNcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBET01FdmVudHNTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2RvbV9ldmVudHMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRXZlbnRzJylgXG4gKiBDb21wb25lbnQgZmFjZXQgdGhhdCBtYW5hZ2VzIHN1YnNjcmlwdGlvbnMgdG8gRE9NIGV2ZW50cyB1c2luZyBbTWVzc2VuZ2VyXSguLi8uLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkgd2l0aCBbRE9NRXZlbnRzU291cmNlXSguLi9tc2dfc3JjL2RvbV9ldmVudHMuanMuaHRtbCkuXG4gKiBBbGwgcHVibGljIG1ldGhvZHMgb2YgTWVzc2VuZ2VyIGFuZCBgdHJpZ2dlcmAgbWV0aG9kIG9mIFtET01FdmVudHNTb3VyY2VdKC4uL21zZ19zcmMvZG9tX2V2ZW50cy5qcy5odG1sKSBhcmUgcHJveGllZCBkaXJlY3RseSB0byB0aGlzIGZhY2V0LlxuICogRm9yIGV4YW1wbGUsIHRvIHN1YnNjcmliZSB0byBgY2xpY2tgIGV2ZW50IHVzZTpcbiAqIGBgYFxuICogY29tcG9uZW50LmZyYW1lLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICogICAgIC8vIC4uLlxuICogfSk7XG4gKiBgYGBcbiAqIFNlZSBbTWVzc2VuZ2VyXSguLi8uLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbClcbiAqL1xudmFyIEV2ZW50cyA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdFdmVudHMnKTtcblxuXG4vKipcbiAqICMjIyNFdmVudHMgZmFjZXQgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjRXZlbnRzJGluaXQpIC0gY2FsbGVkIGJ5IGNvbnN0cnVjdG9yIGF1dG9tYXRpY2FsbHlcbiAqL1xuXy5leHRlbmRQcm90byhFdmVudHMsIHtcbiAgICBpbml0OiBFdmVudHMkaW5pdFxuICAgIC8vIF9yZWF0dGFjaDogX3JlYXR0YWNoRXZlbnRzT25FbGVtZW50Q2hhbmdlXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKEV2ZW50cyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRzO1xuXG5cbi8qKlxuICogRXhwb3NlIERPTUV2ZW50c1NvdXJjZSB0cmlnZ2VyIG1ldGhvZCBvbiBFdmVudHMgcHJvdG90eXBlXG4gKi9cbnZhciBNU0dfU09VUkNFX0tFWSA9ICdfZG9tRXZlbnRzU291cmNlJ1xuRE9NRXZlbnRzU291cmNlLnVzZVdpdGgoRXZlbnRzLCBNU0dfU09VUkNFX0tFWSwgWyd0cmlnZ2VyJ10pO1xuXG5cbi8qKlxuICogRXZlbnRzIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbHplcyBmYWNldCwgY29ubmVjdHMgRE9NRXZlbnRzU291cmNlIHRvIGZhY2V0J3MgbWVzc2VuZ2VyXG4gKi9cbmZ1bmN0aW9uIEV2ZW50cyRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB2YXIgZG9tRXZlbnRzU291cmNlID0gbmV3IERPTUV2ZW50c1NvdXJjZSh0aGlzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhpcy5vd25lcik7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShkb21FdmVudHNTb3VyY2UpO1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTVNHX1NPVVJDRV9LRVksIGRvbUV2ZW50c1NvdXJjZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBGcmFtZU1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2ZyYW1lJylcbiAgICAsIGRvbUV2ZW50c0NvbnN0cnVjdG9ycyA9IHJlcXVpcmUoJy4uLy4uL3NlcnZpY2VzL2RlX2NvbnN0cnMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRnJhbWUnKWBcbiAqIENvbXBvbmVudCBmYWNldCB0aGF0IHNpbXBsaWZpZXMgc2VuZGluZyB3aW5kb3cgbWVzc2FnZXMgdG8gaWZyYW1lIGFuZCBzdWJzY3JpYmluZyB0byBtZXNzYWdlcyBvbiBpbm5lciB3aW5kb3cgb2YgaWZyYW1lLlxuICogQWxsIHB1YmxpYyBtZXRob2RzIG9mIE1lc3NlbmdlciBhbmQgYHRyaWdnZXJgIG1ldGhvZCBvZiBbRnJhbWVNZXNzYWdlU291cmNlXSguLi9tc2dfc3JjL2ZyYW1lLmpzLmh0bWwpIGFyZSBwcm94aWVkIGRpcmVjdGx5IHRvIHRoaXMgZmFjZXQuXG4gKiBGb3IgZXhhbXBsZSwgdG8gc2VuZCBjdXN0b20gbWVzc2FnZSB0byBpZnJhbWUgd2luZG93IHVzZTpcbiAqIGBgYFxuICogaWZyYW1lQ29tcG9uZW50LmZyYW1lLnRyaWdnZXIoJ215bWVzc2FnZScsIG15RGF0YSk7XG4gKiBgYGBcbiAqIFRvIHN1YnNjcmliZSB0byB0aGlzIG1lc3NhZ2VzIGluc2lkZSBmcmFtZSB1c2UgKHdpdGggbWlsbyAtIHNlZSBbbWlsby5tYWlsXSguLi8uLi9tYWlsL2luZGV4LmpzLmh0bWwpKTpcbiAqIGBgYFxuICogbWlsby5tYWlsLm9uKCdtZXNzYWdlOm15bWVzc2FnZScsIGZ1bmN0aW9uKG1zZ1R5cGUsIG1zZ0RhdGEpIHtcbiAqICAgICAvLyBkYXRhIGlzIGluc2lkZSBvZiB3aW5kb3cgbWVzc2FnZSBkYXRhXG4gKiAgICAgLy8gbXNnVHlwZSA9PSAnbWVzc2FnZTpteW1lc3NhZ2UnXG4gKiAgICAgdmFyIG15RGF0YSA9IG1zZ0RhdGEuZGF0YTtcbiAqICAgICAvLyAuLi4gYXBwIGxvZ2ljIGhlcmVcbiAqIH0pO1xuICogYGBgXG4gKiBvciB3aXRob3V0IG1pbG86XG4gKiBgYGBcbiAqIHdpbmRvdy5hdHRhY2hFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24obWVzc2FnZSkge1xuICogICAgIHZhciBtc2dUeXBlID0gbWVzc2FnZS50eXBlOyAvLyBlLmcuLCAnbXltZXNzYWdlJ1xuICogICAgIHZhciBteURhdGEgPSBtZXNzYWdlLmRhdGE7XG4gKiAgICAgLy8gLi4uIG1lc3NhZ2Ugcm91dGluZyBhbmQgY29kZSBoZXJlXG4gKiB9KTtcbiAqIGBgYFxuICogTWlsbyBkb2VzIHJvdXRpbmcgYmFzZWQgb24gc2VudCBtZXNzYWdlIHR5cGUgYXV0b21hdGljYWxseS5cbiAqIFNlZSBbTWVzc2VuZ2VyXSguLi8uLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkgYW5kIFttaWxvLm1haWxdKC4uLy4uL21haWwvaW5kZXguanMuaHRtbCkuXG4gKi9cbiB2YXIgRnJhbWUgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnRnJhbWUnKTtcblxuXG4vKipcbiAqIENhbGxzIHBhc3NlZCBmdW5jdGlvbiB3aGVuIGZyYW1lIERPTSBiZWNvbWVzIHJlYWR5LiBJZiBhbHJlYWR5IHJlYWR5IGNhbGxzIGltbWVkaWF0ZWx5XG4gKi9cbnZhciBGcmFtZSR3aGVuUmVhZHkgPSBfbWFrZVdoZW5SZWFkeUZ1bmMoRnJhbWUkaXNSZWFkeSwgJ2RvbXJlYWR5Jyk7XG5cbi8qKlxuICogQ2FsbHMgcGFzc2VkIGZ1bmN0aW9uIHdoZW4gZnJhbWUgbWlsbyBiZWNvbWVzIHJlYWR5LiBJZiBhbHJlYWR5IHJlYWR5IGNhbGxzIGltbWVkaWF0ZWx5XG4gKi9cbnZhciBGcmFtZSR3aGVuTWlsb1JlYWR5ID0gX21ha2VXaGVuUmVhZHlGdW5jKEZyYW1lJGlzTWlsb1JlYWR5LCAnbWVzc2FnZTptaWxvcmVhZHknKTtcblxuXG4vKipcbiAqICMjIyNFdmVudHMgZmFjZXQgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjRnJhbWUkaW5pdCkgLSBjYWxsZWQgYnkgY29uc3RydWN0b3IgYXV0b21hdGljYWxseVxuICovXG5fLmV4dGVuZFByb3RvKEZyYW1lLCB7XG4gICAgaW5pdDogRnJhbWUkaW5pdCxcbiAgICBzdGFydDogRnJhbWUkc3RhcnQsXG4gICAgZGVzdHJveTogRnJhbWUkZGVzdHJveSxcbiAgICBnZXRXaW5kb3c6IEZyYW1lJGdldFdpbmRvdyxcbiAgICBpc1JlYWR5OiBGcmFtZSRpc1JlYWR5LFxuICAgIHdoZW5SZWFkeTogRnJhbWUkd2hlblJlYWR5LFxuICAgIGlzTWlsb1JlYWR5OiBGcmFtZSRpc01pbG9SZWFkeSxcbiAgICB3aGVuTWlsb1JlYWR5OiBGcmFtZSR3aGVuTWlsb1JlYWR5LFxuICAgIG1pbG86IEZyYW1lJG1pbG9cbiAgICAvLyBfcmVhdHRhY2g6IF9yZWF0dGFjaEV2ZW50c09uRWxlbWVudENoYW5nZVxufSk7XG5cblxuZmFjZXRzUmVnaXN0cnkuYWRkKEZyYW1lKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGcmFtZTtcblxuXG4vKipcbiAqIEV4cG9zZSBGcmFtZU1lc3NhZ2VTb3VyY2UgdHJpZ2dlciBtZXRob2Qgb24gRXZlbnRzIHByb3RvdHlwZVxuICovXG52YXIgTVNHX1NPVVJDRV9LRVkgPSAnX21lc3NhZ2VTb3VyY2UnO1xuRnJhbWVNZXNzYWdlU291cmNlLnVzZVdpdGgoRnJhbWUsIE1TR19TT1VSQ0VfS0VZLCBbJ3RyaWdnZXInXSk7XG5cblxuLyoqXG4gKiBGcmFtZSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWx6ZXMgZmFjZXQsIGNvbm5lY3RzIEZyYW1lTWVzc2FnZVNvdXJjZSB0byBmYWNldCdzIG1lc3NlbmdlclxuICovXG5mdW5jdGlvbiBGcmFtZSRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgXG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSBuZXcgRnJhbWVNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aGlzLm93bmVyKTtcbiAgICB0aGlzLl9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNU0dfU09VUkNFX0tFWSwgbWVzc2FnZVNvdXJjZSk7XG59XG5cblxuLyoqXG4gKiBGcmFtZSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEVtaXRzIGZyYW1lbG9hZGVkIGV2ZW50IHdoZW4gcmVhZHkuXG4gKi9cbmZ1bmN0aW9uIEZyYW1lJHN0YXJ0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5zdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBtaWxvKHBvc3REb21SZWFkeSk7XG5cbiAgICBmdW5jdGlvbiBwb3N0RG9tUmVhZHkoZXZlbnQpIHtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSgnZG9tcmVhZHknLCBldmVudCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIEZyYW1lJGRlc3Ryb3koKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG4vKipcbiAqIEZyYW1lIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0cmlldmVzIHRoZSBpbnRlcm5hbCB3aW5kb3cgb2YgdGhlIGZyYW1lIFxuICpcbiAqIEBwYXJhbSB7V2luZG93fVxuICovXG5mdW5jdGlvbiBGcmFtZSRnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXIuZWwuY29udGVudFdpbmRvdztcbn1cblxuXG4vKipcbiAqIEZyYW1lIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBkb2N1bWVudC5yZWFkeVN0YXRlIGlmIGZyYW1lIGRvdW1lbnQgc3RhdGUgaXMgJ2ludGVyYWN0aXZlJyBvciAnY29tcGxldGUnLCBmYWxzZSBvdGhlcndpc2VcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd8Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gRnJhbWUkaXNSZWFkeSgpIHtcbiAgICB2YXIgcmVhZHlTdGF0ZSA9IHRoaXMuZ2V0V2luZG93KCkuZG9jdW1lbnQucmVhZHlTdGF0ZTtcbiAgICByZXR1cm4gIHJlYWR5U3RhdGUgIT0gJ2xvYWRpbmcnID8gcmVhZHlTdGF0ZSA6IGZhbHNlO1xufVxuXG5cbi8qKlxuICogRnJhbWUgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRydWUgaWYgbWlsbyBpcyBsb2FkZWQgYW5kIGhhcyBmaW5pc2hlZCBpbml0aWFsaXppbmcgaW5zaWRlIHRoZSBmcmFtZVxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIEZyYW1lJGlzTWlsb1JlYWR5KCkge1xuICAgIHZhciBmcmFtZU1pbG8gPSB0aGlzLmdldFdpbmRvdygpLm1pbG87XG4gICAgcmV0dXJuIHRoaXMuaXNSZWFkeSgpICYmIGZyYW1lTWlsbyAmJiBmcmFtZU1pbG8ubWlsb192ZXJzaW9uO1xufVxuXG5cbi8qKlxuICogR2l2ZXMgYWNjZXNzIHRvIG1pbG8gaW4gdGhlIGZyYW1lIChhc3N1bWluZyBpdCBpcyBsb2FkZWQgdGhlcmUpXG4gKiBDYWxscyBmdW5jdGlvbiB3aGVuIGJvdGggbWlsbyBhbmQgRE9NIGFyZSByZWFkeSBpZiBmdW5jdGlvbiBpcyBwYXNzZWQuXG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gbWlsbyBpbnNpZGUgdGhlIGZyYW1lIGlmIHRoZSB3aW5kb3cgaXMgYWxyZWFkeSBhdmFpbGFibGUuXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gbWlsbyBhbmQgRE9NIGFyZSByZWFkeSBpbiB0aGUgZnJhbWVcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSByZWZlcmVuY2UgdG8gbWlsbyBpbiB0aGUgZnJhbWUgXG4gKi9cbmZ1bmN0aW9uIEZyYW1lJG1pbG8oZnVuYykge1xuICAgIGlmICh0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy53aGVuTWlsb1JlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5nZXRXaW5kb3coKS5taWxvKGZ1bmMpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgd2luID0gdGhpcy5nZXRXaW5kb3coKTtcbiAgICByZXR1cm4gd2luICYmIHdpbi5taWxvO1xufVxuXG5cbmZ1bmN0aW9uIF9tYWtlV2hlblJlYWR5RnVuYyhpc1JlYWR5RnVuYywgZXZlbnQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gRnJhbWVfd2hlblJlYWR5RnVuYyhmdW5jKSB7IC8vICwgYXJndW1lbnRzXG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICAgICAgLCBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuICAgICAgICBpZiAoaXNSZWFkeUZ1bmMuY2FsbCh0aGlzKSlcbiAgICAgICAgICAgIGNhbGxGdW5jKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMub24oZXZlbnQsIGNhbGxGdW5jKTtcblxuICAgICAgICBmdW5jdGlvbiBjYWxsRnVuYygpIHtcbiAgICAgICAgICAgIGZ1bmMuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTW9kZWwgPSBtaWxvQ29yZS5Nb2RlbFxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBtaWxvTWFpbCA9IHJlcXVpcmUoJy4uLy4uL3NlcnZpY2VzL21haWwnKTtcblxuXG52YXIgSXRlbUZhY2V0ID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0l0ZW0nKTtcblxuXy5leHRlbmRQcm90byhJdGVtRmFjZXQsIHtcbiAgICBnZXRTdGF0ZTogSXRlbUZhY2V0JGdldFN0YXRlLFxuICAgIHNldFN0YXRlOiBJdGVtRmFjZXQkc2V0U3RhdGUsXG4gICAgZ2V0SW5kZXg6IEl0ZW1GYWNldCRnZXRJbmRleCxcbiAgICBzZXRJbmRleDogSXRlbUZhY2V0JHNldEluZGV4LFxuICAgIHJlbW92ZUl0ZW06IEl0ZW1GYWNldCRyZW1vdmVJdGVtLFxuICAgIGV4dHJhY3RJdGVtOiBJdGVtRmFjZXQkZXh0cmFjdEl0ZW0sXG4gICAgcmVxdWlyZTogWydDb250YWluZXInLCAnRG9tJywgJ0RhdGEnXVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChJdGVtRmFjZXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEl0ZW1GYWNldDtcblxuXG5mdW5jdGlvbiBJdGVtRmFjZXQkZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHsgc3RhdGU6IHtcbiAgICAgICAgaW5kZXg6IHRoaXMuZ2V0SW5kZXgoKVxuICAgIH19O1xufVxuXG5cbmZ1bmN0aW9uIEl0ZW1GYWNldCRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHRoaXMuc2V0SW5kZXgoc3RhdGUuc3RhdGUuaW5kZXgpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgb3duZXIgY29tcG9uZW50IGluIGl0J3MgcGFyZW50IGxpc3QgY29tcG9uZW50XG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSBUaGUgaW5kZXhcbiAqL1xuZnVuY3Rpb24gSXRlbUZhY2V0JGdldEluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLmluZGV4O1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBpbmRleCBvZiB0aGlzIGNvbXBvbmVudFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggdG8gYmUgc2V0XG4gKi9cbmZ1bmN0aW9uIEl0ZW1GYWNldCRzZXRJbmRleChpbmRleCkge1xuICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbn1cblxuXG4vKipcbiAqIEl0ZW1GYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbW92ZXMgY29tcG9uZW50IGZyb20gdGhlIGxpc3QsIGNvbXBvbmVudCBnZXRzIGRlc3Ryb3llZFxuICovXG5mdW5jdGlvbiBJdGVtRmFjZXQkcmVtb3ZlSXRlbSgpIHtcbiAgICAvLyB0aGlzLmxpc3QgYW5kIHRoaXMuaW5kZXggYXJlIHNldCBieSB0aGUgbGlzdCB3aGVuIHRoZSBpdGVtIGlzIGFkZGVkXG4gICAgdGhpcy5saXN0LnJlbW92ZUl0ZW0odGhpcy5pbmRleCk7XG59XG5cblxuLyoqXG4gKiBJdGVtRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGNvbXBvbmVudCBmcm9tIHRoZSBsaXN0LCBjb21wb25lbnQgaXMgTk9UIGRlc3Ryb3llZFxuICovXG5mdW5jdGlvbiBJdGVtRmFjZXQkZXh0cmFjdEl0ZW0oKSB7XG4gICAgdGhpcy5saXN0LmV4dHJhY3RJdGVtKHRoaXMuaW5kZXgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbWlsb01haWwgPSByZXF1aXJlKCcuLi8uLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi8uLi9iaW5kZXInKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIGRvVCA9IG1pbG9Db3JlLnV0aWwuZG9UXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKVxuICAgICwgY29tcG9uZW50TmFtZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvY29tcG9uZW50X25hbWUnKVxuICAgICwgbWlsb0NvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpO1xuXG5cbnZhciBMSVNUX1NBTVBMRV9DU1NfQ0xBU1MgPSAnbWwtbGlzdC1pdGVtLXNhbXBsZSc7XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnTGlzdCcpYFxuICogRmFjZXQgZW5hYmxpbmcgbGlzdCBmdW5jdGlvbmFsaXR5XG4gKi9cbnZhciBMaXN0ID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0xpc3QnKTtcblxuXy5leHRlbmRQcm90byhMaXN0LCB7XG4gICAgaW5pdDogTGlzdCRpbml0LFxuICAgIHN0YXJ0OiBMaXN0JHN0YXJ0LFxuICAgIGRlc3Ryb3k6IExpc3QkZGVzdHJveSxcblxuICAgIHJlcXVpcmU6IFsnQ29udGFpbmVyJywgJ0RvbScsICdEYXRhJ10sXG4gICAgX2l0ZW1QcmV2aW91c0NvbXBvbmVudDogX2l0ZW1QcmV2aW91c0NvbXBvbmVudCxcblxuICAgIGl0ZW06IExpc3QkaXRlbSxcbiAgICBjb3VudDogTGlzdCRjb3VudCxcbiAgICBjb250YWluczogTGlzdCRjb250YWlucyxcbiAgICBhZGRJdGVtOiBMaXN0JGFkZEl0ZW0sXG4gICAgYWRkSXRlbXM6IExpc3QkYWRkSXRlbXMsXG4gICAgcmVwbGFjZUl0ZW06IExpc3QkcmVwbGFjZUl0ZW0sXG4gICAgcmVtb3ZlSXRlbTogTGlzdCRyZW1vdmVJdGVtLFxuICAgIGV4dHJhY3RJdGVtOiBMaXN0JGV4dHJhY3RJdGVtLFxuICAgIGVhY2g6IExpc3QkZWFjaCxcbiAgICBfc2V0SXRlbTogTGlzdCRfc2V0SXRlbSxcbiAgICBfcmVtb3ZlSXRlbTogTGlzdCRfcmVtb3ZlSXRlbSxcbiAgICBfYWRkSXRlbTogTGlzdCRfYWRkSXRlbSxcbiAgICBfYWRkSXRlbXM6IExpc3QkX2FkZEl0ZW1zLFxuICAgIF9jcmVhdGVDYWNoZVRlbXBsYXRlOiBMaXN0JF9jcmVhdGVDYWNoZVRlbXBsYXRlLFxuICAgIF91cGRhdGVEYXRhUGF0aHM6IExpc3QkX3VwZGF0ZURhdGFQYXRoc1xufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChMaXN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0O1xuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplZCBMaXN0IGZhY2V0IGluc3RhbmNlIGFuZCBzZXRzIHVwIGl0ZW0gcHJvcGVydGllcy5cbiAqL1xuZnVuY3Rpb24gTGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX2xpc3RJdGVtczogW10sXG4gICAgICAgIF9saXN0SXRlbXNIYXNoOiB7fVxuICAgIH0pO1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ2l0ZW1TYW1wbGUnLCBudWxsLCBfLldSSVQpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdGFydHMgdGhlIExpc3QgZmFjZXQgaW5zdGFuY2UsIGZpbmRzIGNoaWxkIHdpdGggSXRlbSBmYWNldC5cbiAqL1xuZnVuY3Rpb24gTGlzdCRzdGFydCgpIHtcbiAgICAvLyBGaXJlZCBieSBfX2JpbmRlcl9fIHdoZW4gYWxsIGNoaWxkcmVuIG9mIGNvbXBvbmVudCBhcmUgYm91bmRcbiAgICB0aGlzLm93bmVyLm9uKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgLy8gZ2V0IGl0ZW1zIGFscmVhZHkgaW4gdGhlIGxpc3RcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmRvbS5jaGlsZHJlbigpXG4gICAgICAgICwgaXRlbXMgPSB0aGlzLmxpc3QuX2xpc3RJdGVtc1xuICAgICAgICAsIGl0ZW1zSGFzaCA9IHRoaXMubGlzdC5fbGlzdEl0ZW1zSGFzaDtcblxuICAgIGNoaWxkcmVuICYmIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGRFbCkge1xuICAgICAgICB2YXIgY29tcCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoY2hpbGRFbCk7XG4gICAgICAgIGlmIChjb21wICYmIGNvbXAuaXRlbSkge1xuICAgICAgICAgICAgaXRlbXMucHVzaChjb21wKTtcbiAgICAgICAgICAgIGl0ZW1zSGFzaFtjb21wLm5hbWVdID0gY29tcDtcbiAgICAgICAgICAgIGNvbXAuaXRlbS5saXN0ID0gdGhpcy5saXN0O1xuICAgICAgICB9XG4gICAgfSwgdGhpcyk7XG5cbiAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBmb3VuZEl0ZW0gPSBpdGVtc1swXTtcbiAgICAgICAgaXRlbXMuc3BsaWNlKDAsIDEpO1xuICAgICAgICBkZWxldGUgaXRlbXNIYXNoW2ZvdW5kSXRlbS5uYW1lXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgaXRlbS5pdGVtLnNldEluZGV4KGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENvbXBvbmVudCBtdXN0IGhhdmUgb25lIGNoaWxkIHdpdGggYW4gSXRlbSBmYWNldCBcbiAgICBpZiAoISBmb3VuZEl0ZW0pIHRocm93IG5ldyBFcnJvcignTm8gY2hpbGQgY29tcG9uZW50IGhhcyBJdGVtIGZhY2V0Jyk7XG5cbiAgICB0aGlzLmxpc3QuaXRlbVNhbXBsZSA9IGZvdW5kSXRlbTtcblxuICAgIC8vIEFmdGVyIGtlZXBpbmcgYSByZWZlcmVuY2UgdG8gdGhlIGl0ZW0gc2FtcGxlLCBpdCBtdXN0IGJlIGhpZGRlbiBhbmQgcmVtb3ZlZCBmcm9tIHNjb3BlXG4gICAgZm91bmRJdGVtLmRvbS5oaWRlKCk7XG4gICAgZm91bmRJdGVtLnJlbW92ZSh0cnVlKTtcbiAgICBmb3VuZEl0ZW0uZG9tLnJlbW92ZUNzc0NsYXNzZXMoTElTVF9TQU1QTEVfQ1NTX0NMQVNTKTtcblxuICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGNvbXBvbmVudHMgZnJvbSBzYW1wbGUgaXRlbVxuICAgIGZvdW5kSXRlbS53YWxrU2NvcGVUcmVlKGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgZGVsZXRlIGNvbXAuZWxbbWlsb0NvbmZpZy5jb21wb25lbnRSZWZdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5saXN0Ll9jcmVhdGVDYWNoZVRlbXBsYXRlKCk7XG59XG5cblxuZnVuY3Rpb24gTGlzdCRfY3JlYXRlQ2FjaGVUZW1wbGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXRlbVNhbXBsZSkgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIHZhciBpdGVtU2FtcGxlID0gdGhpcy5pdGVtU2FtcGxlO1xuXG4gICAgLy8gY3JlYXRlIGl0ZW0gdGVtcGxhdGUgdG8gaW5zZXJ0IG1hbnkgaXRlbXMgYXQgb25jZVxuICAgIHZhciBpdGVtRWxDb3B5ID0gaXRlbVNhbXBsZS5lbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgdmFyIGF0dHIgPSBpdGVtU2FtcGxlLmNvbXBvbmVudEluZm8uYXR0cjtcbiAgICB2YXIgYXR0ckNvcHkgPSBfLmNsb25lKGF0dHIpO1xuICAgIGF0dHIuY29tcE5hbWUgPSAne3s9IGl0LmNvbXBvbmVudE5hbWUoKSB9fSc7XG4gICAgYXR0ci5lbCA9IGl0ZW1FbENvcHk7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgdmFyIGl0ZW1zVGVtcGxhdGVTdHIgPSBcbiAgICAgICAgICAne3sgdmFyIGkgPSBpdC5jb3VudDsgd2hpbGUoaS0tKSB7IH19J1xuICAgICAgICArIGl0ZW1FbENvcHkub3V0ZXJIVE1MXG4gICAgICAgICsgJ3t7IH0gfX0nO1xuXG4gICAgdGhpcy5pdGVtc1RlbXBsYXRlID0gZG9ULmNvbXBpbGUoaXRlbXNUZW1wbGF0ZVN0cik7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHJpZXZlIGEgcGFydGljdWxhciBjaGlsZCBpdGVtIGJ5IGluZGV4XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgaXRlbSB0byBnZXQuXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBjb21wb25lbnQgZm91bmRcbiAqL1xuZnVuY3Rpb24gTGlzdCRpdGVtKGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RJdGVtc1tpbmRleF07XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBjaGlsZCBpdGVtc1xuICogQHJldHVybiB7SW50ZWdlcn0gVGhlIHRvdGFsXG4gKi9cbmZ1bmN0aW9uIExpc3QkY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RJdGVtcy5sZW5ndGg7XG59XG5cblxuZnVuY3Rpb24gTGlzdCRfc2V0SXRlbShpbmRleCwgY29tcG9uZW50KSB7XG4gICAgdGhpcy5fbGlzdEl0ZW1zLnNwbGljZShpbmRleCwgMCwgY29tcG9uZW50KTtcbiAgICB0aGlzLl9saXN0SXRlbXNIYXNoW2NvbXBvbmVudC5uYW1lXSA9IGNvbXBvbmVudDtcbiAgICBjb21wb25lbnQuaXRlbS5saXN0ID0gdGhpcztcbiAgICBjb21wb25lbnQuaXRlbS5zZXRJbmRleCgraW5kZXgpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBwYXJ0aWN1bGFyIGNoaWxkIGl0ZW0gZXhpc3RzIGluIHRoZSBsaXN0XG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gbG9vayBmb3IuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBMaXN0JGNvbnRhaW5zKGNvbXBvbmVudCkge1xuICAgIHJldHVybiB0aGlzLl9saXN0SXRlbXNIYXNoW2NvbXBvbmVudC5uYW1lXSA9PSBjb21wb25lbnQ7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgYSBuZXcgY2hpbGQgY29tcG9uZW50IGF0IGEgcGFydGljdWxhciBpbmRleCBhbmQgcmV0dXJucyB0aGUgbmV3IGNvbXBvbmVudC5cbiAqIFRoaXMgbWV0aG9kIHVzZXMgZGF0YSBmYWNldCwgc28gbm90aWZpY2F0aW9uIHdpbGwgYmUgZW1pdHRlZCBvbiBkYXRhIGZhY2V0LlxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggdG8gYWRkIGF0XG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBuZXdseSBjcmVhdGVkIGNvbXBvbmVudFxuICovXG5mdW5jdGlvbiBMaXN0JGFkZEl0ZW0oaW5kZXgsIGl0ZW1EYXRhKSB7XG4gICAgaW5kZXggPSBpbmRleCB8fCB0aGlzLmNvdW50KCk7XG4gICAgdGhpcy5vd25lci5kYXRhLnNwbGljZShpbmRleCwgMCwgaXRlbURhdGEgfHwge30pO1xuICAgIHJldHVybiB0aGlzLml0ZW0oaW5kZXgpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBBZGRzIGEgbmV3IGNoaWxkIGNvbXBvbmVudCBhdCBhIHBhcnRpY3VsYXIgaW5kZXggYW5kIHJldHVybnMgdGhlIG5ldyBjb21wb25lbnRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IHRvIGFkZCBhdFxuICogQHJldHVybiB7Q29tcG9uZW50fSBUaGUgbmV3bHkgY3JlYXRlZCBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gTGlzdCRfYWRkSXRlbShpbmRleCkge1xuICAgIGluZGV4ID0gaW5kZXggfHwgdGhpcy5jb3VudCgpO1xuICAgIGlmICh0aGlzLml0ZW0oaW5kZXgpKVxuICAgICAgICB0aHJvdyBFcnJvcignYXR0ZW1wdCB0byBjcmVhdGUgaXRlbSB3aXRoIElEIG9mIGV4aXN0aW5nIGl0ZW0nKTtcblxuICAgIC8vIENvcHkgY29tcG9uZW50XG4gICAgdmFyIGNvbXBvbmVudCA9IENvbXBvbmVudC5jb3B5KHRoaXMuaXRlbVNhbXBsZSwgdHJ1ZSk7XG4gICAgdmFyIHByZXZDb21wb25lbnQgPSB0aGlzLl9pdGVtUHJldmlvdXNDb21wb25lbnQoaW5kZXgpO1xuXG4gICAgaWYgKCFwcmV2Q29tcG9uZW50LmVsLnBhcmVudE5vZGUpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignbGlzdCBpdGVtIHNhbXBsZSB3YXMgcmVtb3ZlZCBmcm9tIERPTSwgcHJvYmFibHkgY2F1c2VkIGJ5IHdyb25nIGRhdGEuIFJlc2V0IGxpc3QgZGF0YSB3aXRoIGFycmF5Jyk7XG5cbiAgICAvLyBBZGQgaXQgdG8gdGhlIERPTVxuICAgIHByZXZDb21wb25lbnQuZG9tLmluc2VydEFmdGVyKGNvbXBvbmVudC5lbCk7XG5cbiAgICAvLyBBZGQgdG8gbGlzdCBpdGVtc1xuICAgIHRoaXMuX3NldEl0ZW0oaW5kZXgsIGNvbXBvbmVudCk7XG5cbiAgICAvLyBTaG93IHRoZSBsaXN0IGl0ZW0gY29tcG9uZW50XG4gICAgY29tcG9uZW50LmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcblxuICAgIF91cGRhdGVJdGVtc0luZGV4ZXMuY2FsbCh0aGlzLCBpbmRleCArIDEpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuXG5mdW5jdGlvbiBfdXBkYXRlSXRlbXNJbmRleGVzKGZyb21JbmRleCwgdG9JbmRleCkge1xuICAgIGZyb21JbmRleCA9IGZyb21JbmRleCB8fCAwO1xuICAgIHRvSW5kZXggPSB0b0luZGV4IHx8IHRoaXMuY291bnQoKTtcbiAgICBmb3IgKHZhciBpID0gZnJvbUluZGV4OyBpIDwgdG9JbmRleDsgaSsrKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLl9saXN0SXRlbXNbaV07XG4gICAgICAgIGlmIChjb21wb25lbnQpXG4gICAgICAgICAgICBjb21wb25lbnQuaXRlbS5zZXRJbmRleChpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0xpc3Q6IG5vIGl0ZW0gYXQgcG9zaXRpb24nLCBpKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gTGlzdCRhZGRJdGVtcyhjb3VudCwgaW5kZXgpIHsgLy8gLC4uLiBpdGVtcyBkYXRhXG4gICAgdmFyIGl0ZW1zRGF0YSA9IF8uc2xpY2UoYXJndW1lbnRzLCAyKTtcbiAgICBpZiAoaXRlbXNEYXRhLmxlbmd0aCA8IGNvdW50KSBcbiAgICAgICAgaXRlbXNEYXRhLmNvbmNhdChfLnJlcGVhdChjb3VudCAtIGl0ZW1zRGF0YS5sZW5ndGgsIHt9KSk7XG4gICAgdmFyIHNwbGljZUFyZ3MgPSBbaW5kZXgsIDBdLmNvbmNhdChpdGVtc0RhdGEpO1xuICAgIHZhciBkYXRhRmFjZXQgPSB0aGlzLm93bmVyLmRhdGE7XG4gICAgZGF0YUZhY2V0LnNwbGljZS5hcHBseShkYXRhRmFjZXQsIHNwbGljZUFyZ3MpO1xufVxuXG5cbi8qKlxuICogTGlzdCBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgYSBnaXZlbiBudW1iZXIgb2YgaXRlbXMgdXNpbmcgdGVtcGxhdGUgcmVuZGVyaW5nIHJhdGhlciB0aGFuIGFkZGluZyBlbGVtZW50cyBvbmUgYnkgb25lXG4gKlxuICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudCBudW1iZXIgb2YgaXRlbXMgdG8gYWRkXG4gKiBAcGFyYW0ge1tJbnRlZ2VyXX0gaW5kZXggb3B0aW9uYWwgaW5kZXggb2YgaXRlbSBhZnRlciB3aGljaCB0byBhZGRcbiAqL1xuZnVuY3Rpb24gTGlzdCRfYWRkSXRlbXMoY291bnQsIGluZGV4KSB7XG4gICAgY2hlY2soY291bnQsIE1hdGNoLkludGVnZXIpO1xuICAgIGlmIChjb3VudCA8IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuXFwndCBhZGQgbmVnYXRpdmUgbnVtYmVyIG9mIGl0ZW1zJyk7XG5cbiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW1zSFRNTCA9IHRoaXMuaXRlbXNUZW1wbGF0ZSh7XG4gICAgICAgIGNvbXBvbmVudE5hbWU6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgIGNvdW50OiBjb3VudFxuICAgIH0pO1xuXG4gICAgdmFyIHdyYXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdyYXBFbC5pbm5lckhUTUwgPSBpdGVtc0hUTUw7XG5cbiAgICBtaWxvQmluZGVyKHdyYXBFbCwgdGhpcy5vd25lci5jb250YWluZXIuc2NvcGUpO1xuICAgIHZhciBjaGlsZHJlbiA9IGRvbVV0aWxzLmNoaWxkcmVuKHdyYXBFbCk7XG5cbiAgICBpZiAoY291bnQgIT0gY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICBsb2dnZXIuZXJyb3IoJ251bWJlciBvZiBpdGVtcyBhZGRlZCBpcyBkaWZmZXJlbnQgZnJvbSByZXF1ZXN0ZWQnKTtcblxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGxpc3RMZW5ndGggPSB0aGlzLmNvdW50KCk7XG4gICAgICAgIHZhciBzcGxpY2VJbmRleCA9IGluZGV4IDwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZW9mIGluZGV4ID09ICd1bmRlZmluZWQnIHx8IGluZGV4ID4gbGlzdExlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGxpc3RMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbmRleDtcblxuICAgICAgICB2YXIgcHJldkNvbXBvbmVudCA9IHNwbGljZUluZGV4ID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLml0ZW1TYW1wbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9saXN0SXRlbXNbc3BsaWNlSW5kZXggLSAxXTtcblxuICAgICAgICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgICAgLCBuZXdDb21wb25lbnRzID0gW107XG5cbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlbCwgaSkge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoZWwpO1xuICAgICAgICAgICAgaWYgKCEgY29tcG9uZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXIuZXJyb3IoJ0xpc3Q6IGVsZW1lbnQgaW4gbmV3IGl0ZW1zIGlzIG5vdCBhIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgbmV3Q29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLl9zZXRJdGVtKHNwbGljZUluZGV4KyssIGNvbXBvbmVudCk7XG4gICAgICAgICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgX3VwZGF0ZUl0ZW1zSW5kZXhlcy5jYWxsKHRoaXMsIHNwbGljZUluZGV4KTtcblxuICAgICAgICBpZiAoIXByZXZDb21wb25lbnQuZWwucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIHJldHVybiBsb2dnZXIud2FybignbGlzdCBpdGVtIHNhbXBsZSB3YXMgcmVtb3ZlZCBmcm9tIERPTSwgcHJvYmFibHkgY2F1c2VkIGJ5IHdyb25nIGRhdGEuIFJlc2V0IGxpc3QgZGF0YSB3aXRoIGFycmF5Jyk7XG5cbiAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSBET01cbiAgICAgICAgcHJldkNvbXBvbmVudC5kb20uaW5zZXJ0QWZ0ZXIoZnJhZyk7XG5cbiAgICAgICAgXy5kZWZlck1ldGhvZChuZXdDb21wb25lbnRzLCAnZm9yRWFjaCcsIGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgICAgIGNvbXAuYnJvYWRjYXN0KCdzdGF0ZXJlYWR5Jyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIExpc3QgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZW1vdmVcbiAqIEByZXR1cm4ge0FycmF5W09iamVjdF19IFRoZSBzcGxpY2VkIGRhdGFcbiAqL1xuZnVuY3Rpb24gTGlzdCRyZW1vdmVJdGVtKGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXIuZGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xufVxuXG5cbi8qKlxuICogTGlzdCBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGV4dHJhY3RcbiAqIEByZXR1cm4ge0NvbXBvbmVudH0gVGhlIGV4dHJhY3RlZCBpdGVtXG4gKi9cbmZ1bmN0aW9uIExpc3QkZXh0cmFjdEl0ZW0oaW5kZXgpIHtcbiAgICB2YXIgaXRlbUNvbXAgPSB0aGlzLl9yZW1vdmVJdGVtKGluZGV4LCBmYWxzZSk7XG4gICAgdGhpcy5fdXBkYXRlRGF0YVBhdGhzKGluZGV4LCB0aGlzLmNvdW50KCkpO1xuICAgIHJldHVybiBpdGVtQ29tcDtcbn1cblxuXG4vKipcbiAqIExpc3QgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGl0ZW0sIHJldHVybnMgdGhlIHJlbW92ZWQgaXRlbSB0aGF0IGlzIGRlc3Ryb3llZCBieSBkZWZhdWx0LlxuICogXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGluZGV4IGl0ZW0gaW5kZXhcbiAqIEBwYXJhbSAge0Jvb2xlYW59IGRvRGVzdHJveUl0ZW0gb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBpdGVtIGRlc3RydWN0aW9uLCB0cnVlIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gTGlzdCRfcmVtb3ZlSXRlbShpbmRleCwgZG9EZXN0cm95SXRlbSkge1xuICAgIHZhciBjb21wID0gdGhpcy5pdGVtKGluZGV4KTtcblxuICAgIGlmICghIGNvbXApXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignYXR0ZW1wdCB0byByZW1vdmUgbGlzdCBpdGVtIHdpdGggaWQgdGhhdCBkb2VzIG5vdCBleGlzdCcpO1xuXG4gICAgdGhpcy5fbGlzdEl0ZW1zW2luZGV4XSA9IHVuZGVmaW5lZDtcbiAgICBkZWxldGUgdGhpcy5fbGlzdEl0ZW1zSGFzaFtjb21wLm5hbWVdO1xuICAgIGlmIChkb0Rlc3Ryb3lJdGVtICE9PSBmYWxzZSkgY29tcC5kZXN0cm95KCk7XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbXAucmVtb3ZlKCk7XG4gICAgICAgIGNvbXAuZG9tLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIF91cGRhdGVJdGVtc0luZGV4ZXMuY2FsbCh0aGlzLCBpbmRleCk7XG5cbiAgICByZXR1cm4gY29tcDtcbn1cblxuXG5mdW5jdGlvbiBMaXN0JHJlcGxhY2VJdGVtKGluZGV4LCBuZXdJdGVtKXtcbiAgICB2YXIgb2xkSXRlbSA9IHRoaXMuaXRlbShpbmRleCk7XG4gICAgb2xkSXRlbS5kb20uaW5zZXJ0QWZ0ZXIobmV3SXRlbS5lbCk7XG4gICAgdGhpcy5fcmVtb3ZlSXRlbShpbmRleCk7XG4gICAgdGhpcy5fc2V0SXRlbShpbmRleCwgbmV3SXRlbSk7XG59XG5cblxuLy8gUmV0dXJucyB0aGUgcHJldmlvdXMgaXRlbSBjb21wb25lbnQgZ2l2ZW4gYW4gaW5kZXhcbmZ1bmN0aW9uIF9pdGVtUHJldmlvdXNDb21wb25lbnQoaW5kZXgpIHtcbiAgICB3aGlsZSAoaW5kZXggPj0gMCAmJiAhIHRoaXMuX2xpc3RJdGVtc1tpbmRleF0pXG4gICAgICAgIGluZGV4LS07XG5cbiAgICByZXR1cm4gaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgID8gdGhpcy5fbGlzdEl0ZW1zW2luZGV4XVxuICAgICAgICAgICAgICAgIDogdGhpcy5pdGVtU2FtcGxlO1xufVxuXG5cbi8vIHRvSW5kZXggaXMgbm90IGluY2x1ZGVkXG4vLyBubyByYW5nZSBjaGVja2luZyBpcyBtYWRlXG5mdW5jdGlvbiBMaXN0JF91cGRhdGVEYXRhUGF0aHMoZnJvbUluZGV4LCB0b0luZGV4KSB7XG4gICAgZm9yICh2YXIgaSA9IGZyb21JbmRleDsgaSA8IHRvSW5kZXg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbShpKTtcbiAgICAgICAgaWYgKGl0ZW0pXG4gICAgICAgICAgICBpdGVtLmRhdGEuX3BhdGggPSAnWycgKyBpICsgJ10nO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignRGF0YTogbm8gaXRlbSBmb3IgaW5kZXgnLCBqKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNpbWlsYXIgdG8gZm9yRWFjaCBtZXRob2Qgb2YgQXJyYXksIGl0ZXJhdGVzIGVhY2ggb2YgdGhlIGNoaWxkIGl0ZW1zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQW4gaXRlcmF0b3IgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGVhY2ggY2hpbGQgaXRlbS5cbiAqIEBwYXJhbSB7W3R5cGVdfSAgIHRoaXNBcmcgIENvbnRleHQgdG8gc2V0IGB0aGlzYC5cbiAqL1xuZnVuY3Rpb24gTGlzdCRlYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgdGhpcy5fbGlzdEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKGl0ZW0pIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIHBhc3NlcyBpdGVtLCBpbmRleCB0byBjYWxsYmFja1xuICAgICAgICBlbHNlIGxvZ2dlci53YXJuKCdMaXN0JGVhY2g6IGl0ZW0nLCBpbmRleCwgJ2lzIHVuZGVmaW5lZCcpO1xuICAgIH0sIHRoaXNBcmcgfHwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIERlc3Ryb3lzIHRoZSBsaXN0XG4gKi9cbmZ1bmN0aW9uIExpc3QkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5pdGVtU2FtcGxlKSB0aGlzLml0ZW1TYW1wbGUuZGVzdHJveSh0cnVlKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBNaXhpbiA9IG1pbG9Db3JlLmNsYXNzZXMuTWl4aW5cbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG4vLyBnZW5lcmljIGRyYWcgaGFuZGxlciwgc2hvdWxkIGJlIG92ZXJyaWRkZW5cbnZhciBNb2RlbEZhY2V0ID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ01vZGVsJyk7XG5cbl8uZXh0ZW5kUHJvdG8oTW9kZWxGYWNldCwge1xuICAgIGluaXQ6IE1vZGVsRmFjZXQkaW5pdCxcbiAgICBnZXRTdGF0ZTogTW9kZWxGYWNldCRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogTW9kZWxGYWNldCRzZXRTdGF0ZSxcbiAgICBfY3JlYXRlTWVzc2VuZ2VyOiBNb2RlbEZhY2V0JF9jcmVhdGVNZXNzZW5nZXIsXG4gICAgZGVzdHJveTogTW9kZWxGYWNldCRkZXN0cm95XG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKE1vZGVsRmFjZXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsRmFjZXQ7XG5cblxuLyoqXG4gKiBFeHBvc2UgTW9kZWwgY2xhc3MgbWV0aG9kcyBvbiBNb2RlbEZhY2V0XG4gKi9cbk1vZGVsLnVzZVdpdGgoTW9kZWxGYWNldCwgJ20nKTtcblxuXG5mdW5jdGlvbiBNb2RlbEZhY2V0JGluaXQoKSB7XG4gICAgdGhpcy5tID0gbmV3IE1vZGVsKHRoaXMuY29uZmlnLmRhdGEsIHRoaXMpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgLy8gdGhpcy5tLnByb3h5TWV0aG9kcyh0aGlzKTsgLy8gQ3JlYXRlcyBtb2RlbCdzIG1ldGhvZHMgZGlyZWN0bHkgb24gZmFjZXRcbn1cblxuXG4vKipcbiAqIE1vZGVsRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuZ2V0U3RhdGVgIHRvIGdldCBmYWNldCdzIHN0YXRlXG4gKiBTaW1wbHkgcmV0dXJucyBtb2RlbCBkYXRhXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBNb2RlbEZhY2V0JGdldFN0YXRlKCkge1xuICAgIHZhciBtb2RlbFZhbHVlID0gdGhpcy5tLmdldCgpO1xuICAgIGlmICh0eXBlb2YgbW9kZWxWYWx1ZSA9PSAnb2JqZWN0JylcbiAgICAgICAgbW9kZWxWYWx1ZSA9IF8uZGVlcENsb25lKG1vZGVsVmFsdWUpO1xuICAgIHJldHVybiB7IHN0YXRlOiBtb2RlbFZhbHVlIH07XG59XG5cblxuLyoqXG4gKiBNb2RlbEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IGBDb21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlYCB0byBzZXQgZmFjZXQncyBzdGF0ZVxuICogU2ltcGx5IHNldHMgbW9kZWwgZGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBkYXRhIHRvIHNldCBvbiBmYWNldCdzIG1vZGVsXG4gKi9cbmZ1bmN0aW9uIE1vZGVsRmFjZXQkc2V0U3RhdGUoc3RhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5tLnNldChzdGF0ZS5zdGF0ZSk7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxGYWNldCRfY3JlYXRlTWVzc2VuZ2VyKCkgeyAvLyBDYWxsZWQgYnkgaW5oZXJpdGVkIGluaXRcbiAgICB0aGlzLl9tZXNzZW5nZXIgPSB0aGlzLm0uX21lc3Nlbmdlcjtcbn1cblxuXG5mdW5jdGlvbiBNb2RlbEZhY2V0JGRlc3Ryb3koKSB7XG4gICAgdGhpcy5tLmRlc3Ryb3koKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxuLy8gZ2VuZXJpYyBkcmFnIGhhbmRsZXIsIHNob3VsZCBiZSBvdmVycmlkZGVuXG52YXIgT3B0aW9ucyA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdPcHRpb25zJyk7XG5cbl8uZXh0ZW5kUHJvdG8oT3B0aW9ucywge1xuICAgIGluaXQ6IE9wdGlvbnMkaW5pdCxcbiAgICBkZXN0cm95OiBPcHRpb25zJGRlc3Ryb3ksXG4gICAgX2NyZWF0ZU1lc3NlbmdlcjogT3B0aW9ucyRfY3JlYXRlTWVzc2VuZ2VyXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKE9wdGlvbnMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9wdGlvbnM7XG5cblxuZnVuY3Rpb24gT3B0aW9ucyRpbml0KCkge1xuICAgIHRoaXMubSA9IG5ldyBNb2RlbCh0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMubS5wcm94eU1ldGhvZHModGhpcyk7IC8vIENyZWF0ZXMgbW9kZWwncyBtZXRob2RzIGRpcmVjdGx5IG9uIGZhY2V0XG59XG5cblxuZnVuY3Rpb24gT3B0aW9ucyRfY3JlYXRlTWVzc2VuZ2VyKCkgeyAvLyBDYWxsZWQgYnkgaW5oZXJpdGVkIGluaXRcbiAgICB0aGlzLl9tZXNzZW5nZXIgPSB0aGlzLm0uX21lc3Nlbmdlcjtcbn1cblxuXG5mdW5jdGlvbiBPcHRpb25zJGRlc3Ryb3koKSB7XG4gICAgdGhpcy5tLmRlc3Ryb3koKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwiY29tcG9uZW50cy1mYWNldHMtdGVtcGxhdGVcIj48L2E+XG4vLyAjIyN0ZW1wbGF0ZSBmYWNldFxuXG4vLyBzaW1wbGlmaWVzIHJlbmRlcmluZyBvZiBjb21wb25lbnQgZWxlbWVudCBmcm9tIHRlbXBsYXRlLlxuLy8gICBBbnkgdGVtcGxhdGluZyBlbmdpbmcgY2FuIGJlIHVzZWQgdGhhdCBzdXBwb3J0cyB0ZW1wbGF0ZSBjb21waWxhdGlvblxuLy8gICAob3IgeW91IGNhbiBtb2NrIHRoaXMgY29tcGlsYXRpb24gZWFzaWx5IGJ5IGNyZWF0aW5nIGNsb3N1cmUgc3RvcmluZ1xuLy8gICB0ZW1wbGF0ZSBzdHJpbmcgaW4gY2FzZSB5b3VyIGVuZ2luZSBkb2Vzbid0IHN1cHBvcnQgY29tcGlsYXRpb24pLlxuLy8gICBCeSBkZWZhdWx0IG1pbG8gdXNlcyBbZG9UXSgpLCB0aGUgbW9zdCB2ZXJzYXRpbGUsIGNvbnNjaXNlIGFuZCBhdCB0aGVcbi8vICAgc2FtZSB0aW1lIHRoZSBmYXN0ZXN0IHRlbXBsYXRpbmcgZW5naW5lLlxuLy8gICBJZiB5b3UgdXNlIG1pbG8gaW4gYnJvd3NlciwgaXQgaXMgdGhlIHBhcnQgb2YgbWlsbyBidW5kbGUgYW5kIGF2YWlsYWJsZVxuLy8gICBhcyBnbG9iYWwgdmFyaWFibGUgYGRvVGAuXG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJyk7XG5cblxuLy8gZGF0YSBtb2RlbCBjb25uZWN0aW9uIGZhY2V0XG52YXIgVGVtcGxhdGUgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnVGVtcGxhdGUnKTtcblxuXy5leHRlbmRQcm90byhUZW1wbGF0ZSwge1xuICAgIGluaXQ6IFRlbXBsYXRlJGluaXQsXG4gICAgc3RhcnQ6IFRlbXBsYXRlJHN0YXJ0LFxuICAgIHNldDogVGVtcGxhdGUkc2V0LFxuICAgIGdldENvbXBpbGVkOiBUZW1wbGF0ZSRnZXRDb21waWxlZCxcbiAgICByZW5kZXI6IFRlbXBsYXRlJHJlbmRlcixcbiAgICBiaW5kZXI6IFRlbXBsYXRlJGJpbmRlclxuXG4gICAgLy8gX3JlYXR0YWNoOiBfcmVhdHRhY2hFdmVudHNPbkVsZW1lbnRDaGFuZ2Vcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoVGVtcGxhdGUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRlbXBsYXRlO1xuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIHRlbXBsYXRlcyBhcmUgaW50ZXJwb2xhdGVkIHdpdGggZGVmYXVsdCAoZG9UKSBvciBjb25maWd1cmVkIGVuZ2luZSAodGhpcy5jb25maWcuY29tcGlsZSlcbiAgICAvLyB1bmxlc3MgdGhpcy5jb25maWcuaW50ZXJwb2xhdGUgaXMgZmFsc2VcbiAgICB2YXIgY29tcGlsZSA9IHRoaXMuY29uZmlnLmludGVycG9sYXRlID09PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY29uZmlnLmNvbXBpbGUgfHwgbWlsby5jb25maWcudGVtcGxhdGUuY29tcGlsZTtcblxuICAgIHRoaXMuc2V0KHRoaXMuY29uZmlnLnRlbXBsYXRlIHx8ICcnLCBjb21waWxlLCB0aGlzLmNvbmZpZy5jb21waWxlT3B0aW9ucyk7XG59XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkc3RhcnQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmF1dG9SZW5kZXIpIHtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmF1dG9CaW5kZXIpXG4gICAgICAgICAgICB0aGlzLmJpbmRlcigpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRnZXRDb21waWxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7XG59XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkc2V0KHRlbXBsYXRlU3RyLCBjb21waWxlLCBjb21waWxlT3B0aW9ucykge1xuICAgIGNoZWNrKHRlbXBsYXRlU3RyLCBNYXRjaC5PbmVPZihTdHJpbmcsIEZ1bmN0aW9uKSk7XG4gICAgY2hlY2soY29tcGlsZSwgTWF0Y2guT3B0aW9uYWwoRnVuY3Rpb24pKTtcblxuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVTdHIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSB0ZW1wbGF0ZVN0cjtcbiAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5fdGVtcGxhdGVTdHIgPSB0ZW1wbGF0ZVN0cjtcbiAgICAgICAgaWYgKGNvbXBpbGUpXG4gICAgICAgICAgICB0aGlzLl9jb21waWxlID0gY29tcGlsZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29tcGlsZSA9IHRoaXMuX2NvbXBpbGU7XG5cbiAgICAgICAgaWYgKGNvbXBpbGUpXG4gICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IGNvbXBpbGUodGVtcGxhdGVTdHIsIGNvbXBpbGVPcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRyZW5kZXIoZGF0YSkgeyAvLyB3ZSBuZWVkIGRhdGEgb25seSBpZiB1c2UgdGVtcGxhdGluZyBlbmdpbmVcbiAgICB0aGlzLm93bmVyLmVsLmlubmVySFRNTCA9IHRoaXMuX3RlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5fdGVtcGxhdGUoZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl90ZW1wbGF0ZVN0cjtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJGJpbmRlcigpIHtcbiAgICBpZiAodGhpcy5vd25lci5jb250YWluZXIpXG4gICAgICAgIHJldHVybiB0aGlzLm93bmVyLmNvbnRhaW5lci5iaW5kZXIoKTtcbiAgICBlbHNlXG4gICAgICAgIGxvZ2dlci5lcnJvcignVGVtcGxhdGVGYWNldDogQmluZGVyIGNhbGxlZCB3aXRob3V0IGNvbnRhaW5lciBmYWNldC4nKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8qKlxuICogVHJhbnNmZXIgZmFjZXQgaXMgZGVzaWduZWQgZm9yIGNvbXBvbmVudHMgdG8gYmUgYWJsZSB0byByZXByZXNlbnQgb3RoZXIgY29tcG9uZW50c1xuICogSWYgYSBbQ29tcG9uZW50XSguLi9jX2NsYXNzLmpzLmh0bWwpIGhhcyBUcmFuc2ZlciBmYWNldCwgd2hlbiBgQ29tcG9uZW50LmdldFN0YXRlYCBpcyBjYWxsZWQgZm9yIHRoaXMgY29tcG9uZXQgaXQgcmV0dXJucyBwcmV2aW91c2x5IHNhdmVkIGRhdGEsIHBvc3NpYmx5IGZyb20gYW5vdGhlciBjb21wb25lbnQuXG4gKiBGb3IgZXhhbXBsZSwgYSBsaXN0IG9mIGRvY3VtZW50cyBjYW4gdXNlIHRoaXMgZmFjZXQgc28gdGhhdCBlYWNoIGl0ZW0gaW4gdGhlIGxpc3QgY2FuIHN0b3JlIGFjdHVhbCBkb2N1bWVudCBjb21wb25lbnQgb24gaXQuXG4gKi9cbnZhciBUcmFuc2ZlciA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdUcmFuc2ZlcicpO1xuXG5fLmV4dGVuZFByb3RvKFRyYW5zZmVyLCB7XG4gICAgaW5pdDogVHJhbnNmZXIkaW5pdCxcbiAgICBnZXRTdGF0ZTogVHJhbnNmZXIkZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IFRyYW5zZmVyJHNldFN0YXRlLFxuICAgIHNldEFjdGl2ZVN0YXRlOiBUcmFuc2ZlciRzZXRBY3RpdmVTdGF0ZSxcbiAgICBzZXRTdGF0ZVdpdGhLZXk6IFRyYW5zZmVyJHNldFN0YXRlV2l0aEtleSxcbiAgICBnZXRTdGF0ZVdpdGhLZXk6IFRyYW5zZmVyJGdldFN0YXRlV2l0aEtleSxcbiAgICBnZXRDb21wb25lbnRNZXRhOiBUcmFuc2ZlciRnZXRDb21wb25lbnRNZXRhXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKFRyYW5zZmVyKTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2ZlcjtcblxuXG5mdW5jdGlvbiBUcmFuc2ZlciRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5fYWN0aXZlU3RhdGUgPSAnJztcbiAgICB0aGlzLl9kZWZhdWx0S2V5ID0gJyc7XG4gICAgdGhpcy5fc3RhdGUgPSB7fTtcbn1cblxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0cmFuc2ZlciBzdGF0ZSBmb3IgY29tcG9uZW50LiBDYW4gYmUgb2J0YWluZWQgZnJvbSBhbm90aGVyIGNvbXBvbmVudCBieSB1c2luZyBgQ29tcG9uZW50LmdldFN0YXRlYFxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gVHJhbnNmZXIkZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlW3RoaXMuX2FjdGl2ZVN0YXRlXSB8fCB0aGlzLl9zdGF0ZVt0aGlzLl9kZWZhdWx0S2V5XTtcbn1cblxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0cmFuc2ZlciBzdGF0ZSBmb3IgY29tcG9uZW50LiBDYW4gYmUgb2J0YWluZWQgZnJvbSBhbm90aGVyIGNvbXBvbmVudCBieSB1c2luZyBgQ29tcG9uZW50LmdldFN0YXRlYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICovXG5mdW5jdGlvbiBUcmFuc2ZlciRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHRoaXMuX3N0YXRlWycnXSA9IHN0YXRlO1xuICAgIHRoaXMuc2V0QWN0aXZlU3RhdGUoJycpO1xufVxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgYWN0aXZlIHN0YXRlICh1c2VkIGJ5IGdldFN0YXRlKVxuICogQHBhcmFtIHtbdHlwZV19IGtleSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIFRyYW5zZmVyJHNldEFjdGl2ZVN0YXRlKGtleSkge1xuICAgIHRoaXMuX2FjdGl2ZVN0YXRlID0ga2V5O1xufVxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0cmFuc2ZlciBzdGF0ZSBmb3IgY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBrZXkuIENhbiBiZSBvYnRhaW5lZCBmcm9tIGFub3RoZXIgY29tcG9uZW50IGJ5IHVzaW5nIGBDb21wb25lbnQuZ2V0U3RhdGVgXG4gKiBXaGVuIHRoZSBhY3RpdmUgc3RhdGUgaXMgc2V0IHRvIHRoZSBleHBlY3RlZCBrZXlcbiAqIEBwYXJhbSB7W3R5cGVdfSBrZXkgICBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0ge1t0eXBlXX0gc3RhdGUgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtIHtCb29sZWFufSBpc0RlZmF1bHRLZXkgKE9wdGlvbmFsKVxuICovXG5mdW5jdGlvbiBUcmFuc2ZlciRzZXRTdGF0ZVdpdGhLZXkoa2V5LCBzdGF0ZSwgaXNEZWZhdWx0S2V5KSB7XG4gICAgaWYgKCFrZXkpIHRocm93IG5ldyBFcnJvcignVHJhbnNmZXIkc2V0U3RhdGVXaXRoS2V5OiBubyBrZXknKTtcblxuICAgIGlmIChpc0RlZmF1bHRLZXkpXG4gICAgICAgIHRoaXMuX2RlZmF1bHRLZXkgPSBrZXk7XG4gICAgZWxzZVxuICAgICAgICB0aGlzLl9kZWZhdWx0S2V5ID0gdGhpcy5fZGVmYXVsdEtleSB8fCBrZXk7XG5cbiAgICB0aGlzLl9zdGF0ZVtrZXldID0gc3RhdGU7XG4gICAgdGhpcy5zZXRBY3RpdmVTdGF0ZShrZXkpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zZmVyJGdldFN0YXRlV2l0aEtleShrZXkpIHtcbiAgICByZXR1cm4gdHlwZW9mIGtleSA9PSAnc3RyaW5nJyAmJiB0aGlzLl9zdGF0ZVtrZXldO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zZmVyJGdldENvbXBvbmVudE1ldGEoKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBOYW1lOiBzdGF0ZSAmJiBzdGF0ZS5jb21wTmFtZSxcbiAgICAgICAgY29tcENsYXNzOiBzdGF0ZSAmJiBzdGF0ZS5jb21wQ2xhc3NcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2xhc3NSZWdpc3RyeSA9IHJlcXVpcmUoJy4uLy4uL2Fic3RyYWN0L3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzYFxuICogQ29tcG9uZW50IGZhY2V0cyByZWdpc3RyeS4gQW4gaW5zdGFuY2Ugb2YgW0NsYXNzUmVnaXN0cnldKC4uLy4uL2Fic3RyYWN0L3JlZ2lzdHJ5LmpzLmh0bWwpIGNsYXNzIHRoYXQgaXMgdXNlZCBieSBtaWxvIHRvIHJlZ2lzdGVyIGFuZCBmaW5kIGZhY2V0cy5cbiAqL1xuIHZhciBmYWNldHNSZWdpc3RyeSA9IG5ldyBDbGFzc1JlZ2lzdHJ5KENvbXBvbmVudEZhY2V0KTtcblxuXG4vLyBBZGRzIGNvbW1vbiBhbmNlc3RvciB0byBhbGwgZmFjZXRzIG9mIGNvbXBvbmVudHMgdG8gdGhlIHJlZ2lzdHJ5LlxuZmFjZXRzUmVnaXN0cnkuYWRkKENvbXBvbmVudEZhY2V0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWNldHNSZWdpc3RyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY19yZWdpc3RyeScpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY19mYWNldHMvY2ZfcmVnaXN0cnknKVxuICAgICwgY29tcG9uZW50TmFtZSA9IHJlcXVpcmUoJy4uL3V0aWwvY29tcG9uZW50X25hbWUnKVxuICAgICwgU2NvcGUgPSByZXF1aXJlKCcuL3Njb3BlJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb21wb25lbnRJbmZvO1xuXG5cbi8qKlxuICogU2ltcGxlIGNsYXNzIHRvIGhvbGQgaW5mb3JtYXRpb24gYWxsb3dpbmcgdG8gY3JlYXRlL2NvcHkgY29tcG9uZW50IHVzaW5nIFtgQ29tcG9uZW50LmNyZWF0ZWBdKC4vY19jbGFzcy5qcy5odG1sI2NyZWF0ZSkgYW5kIFtgQ29tcG9uZW50LmNvcHlgXSguL2NfY2xhc3MuanMuaHRtbCNjb3B5KS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIHNjb3BlIG9iamVjdCB0aGUgY29tcG9uZW50IGJlbG9ncyB0bywgdXN1YWxseSBlaXRoZXIgdG9wIGxldmVsIHNjb3BlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBbbWlsby5iaW5kZXJdKC4uL2JpbmRlci5qcy5odG1sKSBvciBgc2NvcGVgIHByb3BlcnR5IG9mIFtDb250YWluZXJdKC4vY19mYWNldHMvQ29udGFpbmVyLmpzLmh0bWwpIGZhY2V0IG9mIGNvbnRhaW5pbmcgY29tcG9uZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIERPTSBlbGVtZW50IHRoZSBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG9cbiAqIEBwYXJhbSB7QmluZEF0dHJpYnV0ZX0gYXR0ciBCaW5kQXR0cmlidXRlIGluc3RhbmNlIHRoYXQgdGhlIGNvbXBvbmVudCB3YXMgY3JlYXRlZCB3aXRoXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqIEByZXR1cm4ge0NvbXBvbmVudEluZm99XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgYXR0ci5wYXJzZSgpLnZhbGlkYXRlKCk7XG5cbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuYXR0ciA9IGF0dHI7XG4gICAgdGhpcy5uYW1lID0gYXR0ci5jb21wTmFtZTtcbiAgICB0aGlzLkNvbXBvbmVudENsYXNzID0gZ2V0Q29tcG9uZW50Q2xhc3MoYXR0ciwgdGhyb3dPbkVycm9ycyk7XG4gICAgdGhpcy5leHRyYUZhY2V0c0NsYXNzZXMgPSBnZXRDb21wb25lbnRFeHRyYUZhY2V0cyh0aGlzLkNvbXBvbmVudENsYXNzLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcblxuICAgIGlmICh0aGlzLkNvbXBvbmVudENsYXNzXG4gICAgICAgICAgICAmJiBoYXNDb250YWluZXJGYWNldCh0aGlzLkNvbXBvbmVudENsYXNzLCB0aGlzLmV4dHJhRmFjZXRzQ2xhc3NlcykpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB7fTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiAjIyMjQ29tcG9uZW50SW5mbyBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICogXG4gKiAtIFtkZXN0cm95XSgjQ29tcG9uZW50SW5mbyRkZXN0cm95KVxuICogLSBbcmVuYW1lXSgjQ29tcG9uZW50SW5mbyRyZW5hbWUpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oQ29tcG9uZW50SW5mbywge1xuICAgIGRlc3Ryb3k6IENvbXBvbmVudEluZm8kZGVzdHJveSxcbiAgICByZW5hbWU6IENvbXBvbmVudEluZm8kcmVuYW1lXG59KTtcblxuXG4vKipcbiAqIENvbXBvbmVudEluZm8gaW5zdGFuY2UgbWV0aG9kXG4gKiBEZXN0cm95cyBDb21wb25lbnRJbmZvIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2VzIHRvIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudEluZm8kZGVzdHJveSgpIHtcbiAgICBkZWxldGUgdGhpcy5lbDtcbiAgICB0aGlzLmF0dHIuZGVzdHJveSgpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50SW5mbyBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbmFtZXMgQ29tcG9uZW50SW5mbyBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1tTdHJpbmddfSBuYW1lIG9wdGlvbmFsIG5ldyBjb21wb25lbnQgbmFtZSwgZ2VuZXJhdGVkIGZyb20gdGltZXN0YW1wIGJ5IGRlZmF1bHRcbiAqIEBwYXJhbSB7W0Jvb2xlYW5dfSByZW5hbWVJblNjb3BlIG9wdGlvbmFsIGZhbHNlIHRvIG5vdCByZW5hbWUgQ29tcG9uZW50SW5mbyBvYmplY3QgaW4gaXRzIHNjb3BlLCB0cnVlIGJ5IGRlZmF1bHRcbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50SW5mbyRyZW5hbWUobmFtZSwgcmVuYW1lSW5TY29wZSkge1xuICAgIG5hbWUgPSBuYW1lIHx8IGNvbXBvbmVudE5hbWUoKTtcbiAgICBTY29wZS5yZW5hbWUodGhpcywgbmFtZSwgcmVuYW1lSW5TY29wZSk7XG4gICAgdGhpcy5hdHRyLmNvbXBOYW1lID0gbmFtZTtcbiAgICB0aGlzLmF0dHIuZGVjb3JhdGUoKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRDbGFzcyhhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gY29tcG9uZW50c1JlZ2lzdHJ5LmdldChhdHRyLmNvbXBDbGFzcyk7XG4gICAgaWYgKCEgQ29tcG9uZW50Q2xhc3MpXG4gICAgICAgIHJlcG9ydEJpbmRlckVycm9yKHRocm93T25FcnJvcnMsICdjbGFzcyAnICsgYXR0ci5jb21wQ2xhc3MgKyAnIGlzIG5vdCByZWdpc3RlcmVkJyk7XG4gICAgcmV0dXJuIENvbXBvbmVudENsYXNzO1xufVxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudEV4dHJhRmFjZXRzKENvbXBvbmVudENsYXNzLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIGZhY2V0cyA9IGF0dHIuY29tcEZhY2V0c1xuICAgICAgICAsIGV4dHJhRmFjZXRzQ2xhc3NlcyA9IHt9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFjZXRzKSlcbiAgICAgICAgZmFjZXRzLmZvckVhY2goZnVuY3Rpb24oZmN0TmFtZSkge1xuICAgICAgICAgICAgZmN0TmFtZSA9IF8uZmlyc3RVcHBlckNhc2UoZmN0TmFtZSk7XG4gICAgICAgICAgICBpZiAoQ29tcG9uZW50Q2xhc3MuaGFzRmFjZXQoZmN0TmFtZSkpXG4gICAgICAgICAgICAgICAgcmVwb3J0QmluZGVyRXJyb3IodGhyb3dPbkVycm9ycywgJ2NsYXNzICcgKyBDb21wb25lbnRDbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBhbHJlYWR5IGhhcyBmYWNldCAnICsgZmN0TmFtZSk7XG4gICAgICAgICAgICBpZiAoZXh0cmFGYWNldHNDbGFzc2VzW2ZjdE5hbWVdKVxuICAgICAgICAgICAgICAgIHJlcG9ydEJpbmRlckVycm9yKHRocm93T25FcnJvcnMsICdjb21wb25lbnQgJyArIGF0dHIuY29tcE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIGFscmVhZHkgaGFzIGZhY2V0ICcgKyBmY3ROYW1lKTtcbiAgICAgICAgICAgIHZhciBGYWNldENsYXNzID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZjdE5hbWUpO1xuICAgICAgICAgICAgZXh0cmFGYWNldHNDbGFzc2VzW2ZjdE5hbWVdID0gRmFjZXRDbGFzcztcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gZXh0cmFGYWNldHNDbGFzc2VzO1xufVxuXG5cbmZ1bmN0aW9uIHJlcG9ydEJpbmRlckVycm9yKHRocm93T25FcnJvcnMsIG1lc3NhZ2UpIHtcbiAgICBpZiAodGhyb3dPbkVycm9ycyA9PT0gZmFsc2UpXG4gICAgICAgIGxvZ2dlci5lcnJvcignQ29tcG9uZW50SW5mbyBiaW5kZXIgZXJyb3I6JywgbWVzc2FnZSk7XG4gICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59O1xuXG5cbmZ1bmN0aW9uIGhhc0NvbnRhaW5lckZhY2V0KENvbXBvbmVudENsYXNzLCBleHRyYUZhY2V0c0NsYXNzZXMpIHtcbiAgICByZXR1cm4gKENvbXBvbmVudENsYXNzLmhhc0ZhY2V0KCdjb250YWluZXInKVxuICAgICAgICB8fCAnQ29udGFpbmVyJyBpbiBleHRyYUZhY2V0c0NsYXNzZXNcbiAgICAgICAgfHwgXy5zb21lS2V5KGV4dHJhRmFjZXRzQ2xhc3NlcywgZmFjZXRSZXF1aXJlc0NvbnRhaW5lcilcbiAgICAgICAgfHwgY2xhc3NIYXNGYWNldFRoYXRSZXF1aXJlc0NvbnRhaW5lcigpKTtcblxuICAgIGZ1bmN0aW9uIGNsYXNzSGFzRmFjZXRUaGF0UmVxdWlyZXNDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiAoQ29tcG9uZW50Q2xhc3MucHJvdG90eXBlLmZhY2V0c0NsYXNzZXNcbiAgICAgICAgICAgICYmIF8uc29tZUtleShDb21wb25lbnRDbGFzcy5wcm90b3R5cGUuZmFjZXRzQ2xhc3NlcywgZmFjZXRSZXF1aXJlc0NvbnRhaW5lcikpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmFjZXRSZXF1aXJlc0NvbnRhaW5lcihGYWNldENsYXNzKSB7XG4gICAgICAgIHJldHVybiBGYWNldENsYXNzLnJlcXVpcmVzRmFjZXQoJ2NvbnRhaW5lcicpO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENsYXNzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9hYnN0cmFjdC9yZWdpc3RyeScpXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuL2NfY2xhc3MnKTtcblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5jb21wb25lbnRzYFxuICogQW4gaW5zdGFuY2Ugb2YgW0NsYXNzUmVnaXN0cnldKC4uL2Fic3RyYWN0L3JlZ2lzdHJ5LmpzLmh0bWwpIGNsYXNzIHRoYXQgaXMgdXNlZCBieSBtaWxvIHRvIHJlZ2lzdGVyIGFuZCBmaW5kIGNvbXBvbmVudHMuXG4gKi9cbnZhciBjb21wb25lbnRzUmVnaXN0cnkgPSBuZXcgQ2xhc3NSZWdpc3RyeShDb21wb25lbnQpO1xuXG4vLyBhZGQgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBjb21wb25lbnRzIHRvIHRoZSByZWdpc3RyeS5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoQ29tcG9uZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb25lbnRzUmVnaXN0cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIGNvbXBvbmVudFV0aWxzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgaXNDb21wb25lbnQ6IGlzQ29tcG9uZW50LFxuICAgIGdldENvbXBvbmVudDogZ2V0Q29tcG9uZW50LFxuICAgIGdldENvbnRhaW5pbmdDb21wb25lbnQ6IGdldENvbnRhaW5pbmdDb21wb25lbnQsXG4gICAgX21ha2VDb21wb25lbnRDb25kaXRpb25GdW5jOiBfbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmNcbn07XG5cblxuLyoqXG4gKiBpc0NvbXBvbmVudFxuICpcbiAqIENoZWNrcyBpZiBlbGVtZW50IGhhcyBhIGNvbXBvbmVudCBhdHRhY2hlZCB0byBpdCBieVxuICogY2hlY2tpbmcgdGhlIHByZXNlbmNlIG9mIHByb3BlcnR5IGRpZmluZWQgaW4gbWlsby5jb25maWdcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIERPTSBlbGVtZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlLCBpZiBpdCBoYXMgbWlsbyBjb21wb25lbnQgYXR0YWNoZWQgdG8gaXRcbiAqL1xuZnVuY3Rpb24gaXNDb21wb25lbnQoZWwpIHtcbiAgICByZXR1cm4gZWwuaGFzT3duUHJvcGVydHkoY29uZmlnLmNvbXBvbmVudFJlZik7XG59XG5cblxuLyoqXG4gKiBnZXRDb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIERPTSBlbGVtZW50XG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IGNvbXBvbmVudCBhdHRhY2hlZCB0byBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGdldENvbXBvbmVudChlbCkge1xuICAgIHJldHVybiBlbCAmJiBlbFtjb25maWcuY29tcG9uZW50UmVmXTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNsb3Nlc3QgY29tcG9uZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCxcbiAqIG9wdGlvbmFsbHksIG9ubHkgY29tcG9uZW50IHRoYXQgcGFzc2VzIGBjb25kaXRpb25gIHRlc3Qgb3IgY29udGFpbnMgc3BlY2lmaWVkIGZhY2V0XG4gKlxuICogVW5sZXNzIGByZXR1cm5DdXJyZW50YCBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogdGhlIGN1cnJlbnQgY29tcG9uZW50IG9mIHRoZSBlbGVtZW50ICh0cnVlIGJ5IGRlZmF1bHQpLlxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBET00gRWxlbWVudCBvciB0ZXh0IE5vZGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmV0dXJuQ3VycmVudCBvcHRpb25hbCBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29tcG9uZW50IG9mIHRoZSBlbGVtZW50IGNhbiBiZSByZXR1cm5lZC4gVHJ1ZSBieSBkZWZhdWx0LCBzaG91bGQgYmUgZmFsc2UgdG8gcmV0dXJuIG9ubHkgYW5jZXN0b3JzLlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGNvbmRpdGlvbk9yRmFjZXQgb3B0aW9uYWwgY29uZGl0aW9uIHRoYXQgY29tcG9uZW50IHNob3VsZCBwYXNzIChvciBmYWNldCBuYW1lIGl0IHNob3VsZCBjb250YWluKVxuICogQHJldHVybiB7Q29tcG9uZW50fSBcbiAqL1xuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0NvbXBvbmVudChub2RlLCByZXR1cm5DdXJyZW50LCBjb25kaXRpb25PckZhY2V0KSB7XG4gICAgLy8gY2hlY2sobm9kZSwgTm9kZSk7IC0gY2FuJ3QgY2hlY2sgdGl5cGUgaGVyZSBhcyBpdCBpcyBtb3N0IGxpa2VseSBjb21pbmcgZnJvbSBhbm90aGVyIGZyYW1lXG4gICAgY2hlY2socmV0dXJuQ3VycmVudCwgTWF0Y2guT3B0aW9uYWwoQm9vbGVhbikpO1xuICAgIGNoZWNrKGNvbmRpdGlvbk9yRmFjZXQsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKSk7XG5cbiAgICB2YXIgY29uZGl0aW9uRnVuYyA9IF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYyhjb25kaXRpb25PckZhY2V0KTtcblxuICAgIHJldHVybiBfZ2V0Q29udGFpbmluZ0NvbXBvbmVudChub2RlLCByZXR1cm5DdXJyZW50LCBjb25kaXRpb25GdW5jKTtcbn1cblxuXG5mdW5jdGlvbiBfbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmMoY29uZGl0aW9uT3JGYWNldCkge1xuICAgIGlmICh0eXBlb2YgY29uZGl0aW9uT3JGYWNldCA9PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gY29uZGl0aW9uT3JGYWNldDtcbiAgICBlbHNlIGlmICh0eXBlb2YgY29uZGl0aW9uT3JGYWNldCA9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgZmFjZXROYW1lID0gXy5maXJzdExvd2VyQ2FzZShjb25kaXRpb25PckZhY2V0KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb21wKSB7XG4gICAgICAgICAgIHJldHVybiBjb21wLmhhc0ZhY2V0KGZhY2V0TmFtZSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9nZXRDb250YWluaW5nQ29tcG9uZW50KGVsLCByZXR1cm5DdXJyZW50LCBjb25kaXRpb25GdW5jKSB7XG4gICAgLy8gV2hlcmUgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIGNvbXBvbmVudCBpdCBzaG91bGQgYmUgcmV0dXJuZWRcbiAgICAvLyBpZiByZXR1cm5DdXJyZW50IGlzIHRydWUgb3IgdW5kZWZpbmVkXG4gICAgaWYgKHJldHVybkN1cnJlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHZhciBjb21wID0gZ2V0Q29tcG9uZW50KGVsKTtcbiAgICAgICAgaWYgKGNvbXAgJiYgKCEgY29uZGl0aW9uRnVuYyB8fCBjb25kaXRpb25GdW5jKGNvbXApKSlcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuICAgIH1cblxuICAgIC8vIFdoZXJlIHRoZXJlIGlzIG5vIHBhcmVudCBlbGVtZW50LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHVuZGVmaW5lZFxuICAgIC8vIFRoZSBwYXJlbnQgZWxlbWVudCBpcyBjaGVja2VkIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKGVsLnBhcmVudE5vZGUpXG4gICAgICAgIHJldHVybiBfZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbC5wYXJlbnROb2RlLCB0cnVlLCBjb25kaXRpb25GdW5jKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBWaWV3ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdWaWV3JywgWydjb250YWluZXInXSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoVmlldyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmlldztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgZ2V0RWxlbWVudERhdGFBY2Nlc3MgPSByZXF1aXJlKCcuL2RlX2RhdGEnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyQVBJID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzZW5nZXJBUElcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbi8vIGNsYXNzIHRvIGhhbmRsZSBzdWJzY3JpYnRpb25zIHRvIGNoYW5nZXMgaW4gRE9NIGZvciBVSSAobWF5YmUgYWxzbyBjb250ZW50IGVkaXRhYmxlKSBlbGVtZW50c1xuXG4vKipcbiAqIEEgY2xhc3NcbiAqL1xudmFyIERhdGFNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ0RhdGFNc2dBUEknLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKERhdGFNc2dBUEksIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICBpbml0OiBEYXRhTXNnQVBJJGluaXQsXG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgZmlsdGVyU291cmNlTWVzc2FnZTogZmlsdGVyU291cmNlTWVzc2FnZSxcbiAgICBjcmVhdGVJbnRlcm5hbERhdGE6IGNyZWF0ZUludGVybmFsRGF0YSxcblxuICAgIC8vIGNsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICB2YWx1ZTogRGF0YU1zZ0FQSSR2YWx1ZVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YU1zZ0FQSTtcblxuXG5mdW5jdGlvbiBEYXRhTXNnQVBJJGluaXQoY29tcG9uZW50KSB7XG4gICAgTWVzc2VuZ2VyQVBJLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB0aGlzLmVsRGF0YSA9IGdldEVsZW1lbnREYXRhQWNjZXNzKGNvbXBvbmVudC5lbCk7XG59XG5cblxuLy8gZ2V0RG9tRWxlbWVudERhdGFWYWx1ZVxuZnVuY3Rpb24gRGF0YU1zZ0FQSSR2YWx1ZSgpIHsgLy8gdmFsdWUgbWV0aG9kXG4gICAgdmFyIGNvbXBvbmVudEdldHRlciA9IHRoaXMuY29tcG9uZW50LmRhdGEuY29uZmlnLmdldDtcbiAgICB2YXIgbmV3VmFsdWUgPSB0eXBlb2YgY29tcG9uZW50R2V0dGVyID09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgPyBjb21wb25lbnRHZXR0ZXIuY2FsbCh0aGlzLmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmVsRGF0YS5nZXQodGhpcy5jb21wb25lbnQuZWwpO1xuXG4gICAgdGhpcy5jb21wb25lbnQuZGF0YS5fdmFsdWUgPSBuZXdWYWx1ZTtcblxuICAgIHJldHVybiBuZXdWYWx1ZTtcbn1cblxuXG4vLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gcmVsZXZhbnQgRE9NIGV2ZW50IGRlcGVuZGVudCBvbiBlbGVtZW50IHRhZ1xuLy8gQ2FuIGFsc28gaW1wbGVtZW50IGJlZm9yZWRhdGFjaGFuZ2VkIGV2ZW50IHRvIGFsbG93IHByZXZlbnRpbmcgdGhlIGNoYW5nZVxuLy8gdHJhbnNsYXRlVG9Eb21FdmVudFxuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB2YXIgY29tcG9uZW50RXZlbnQgPSB0aGlzLmNvbXBvbmVudC5kYXRhLmNvbmZpZy5ldmVudDtcbiAgICB2YXIgZXZlbnQgPSBjb21wb25lbnRFdmVudCB8fCB0aGlzLmVsRGF0YS5ldmVudCh0aGlzLmNvbXBvbmVudC5lbCk7XG5cbiAgICBpZiAobWVzc2FnZSA9PSAnJyAmJiBldmVudClcbiAgICAgICAgcmV0dXJuIGV2ZW50OyAgLy8gdGhpcy50YWdFdmVudDtcbn1cblxuXG4vLyBmaWx0ZXJEYXRhTWVzc2FnZVxuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEubmV3VmFsdWUgIT0gZGF0YS5vbGRWYWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBjcmVhdGVJbnRlcm5hbERhdGEoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgZGF0YSkge1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuY29tcG9uZW50LmRhdGEuX3ZhbHVlXG4gICAgICAgICwgbmV3VmFsdWUgPSB0aGlzLnZhbHVlKCk7XG5cbiAgICB2YXIgaW50ZXJuYWxEYXRhID0geyBcbiAgICAgICAgcGF0aDogJycsXG4gICAgICAgIHR5cGU6ICdjaGFuZ2VkJyxcbiAgICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgICBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICB9O1xuICAgIHJldHVybiBpbnRlcm5hbERhdGE7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG4vKipcbiAqIFJldHVybnMgZGF0YSBhY2Nlc3MgbWV0aG9kcyBhbmQgZXZlbnRzIGZvciBnaXZlbiBET00gZWxlbWVudC5cbiAqIFVzZWQgYnkgW0RhdGFdKC4uL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgZmFjZXQgYW5kIGJ5IFtEYXRhTXNnQVBJXSguL2RhdGEuanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnZhciBnZXRFbGVtZW50RGF0YUFjY2VzcyA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIHRhZ05hbWUgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgLCBlbERhdGEgPSBkb21FbGVtZW50c0RhdGFBY2Nlc3NbdGFnTmFtZV07XG4gICAgcmV0dXJuIGVsRGF0YSB8fCBkb21FbGVtZW50c0RhdGFBY2Nlc3MuYnlEZWZhdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEVsZW1lbnREYXRhQWNjZXNzO1xuXG5cbi8qKlxuICogRGF0YSBhY2Nlc3MgbWV0aG9kcyBhbmQgZXZlbnRzIGZvciBET00gZWxlbWVudHMuXG4gKi9cbnZhciBkb21FbGVtZW50c0RhdGFBY2Nlc3MgPSB7XG4gICAgYnlEZWZhdWx0OiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICB9LFxuICAgICdkaXYnOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJywgLy8gaGFjaywgc2hvdWxkIGJlIGlubmVySFRNTD8gdG8gbWFrZSB3b3JrIHdpdGggRWRpdGFibGUgZmFjZXRcbiAgICAgICAgLy8gZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICdzcGFuJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAncCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ2lucHV0Jzoge1xuICAgICAgICBwcm9wZXJ0eTogaW5wdXREYXRhUHJvcGVydHksXG4gICAgICAgIGV2ZW50OiBpbnB1dENoYW5nZUV2ZW50XG4gICAgfSxcbiAgICAndGV4dGFyZWEnOiB7XG4gICAgICAgIHByb3BlcnR5OiAndmFsdWUnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3NlbGVjdCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICd2YWx1ZScsXG4gICAgICAgIGV2ZW50OiAnY2hhbmdlJ1xuICAgIH0sXG4gICAgJ2ltZyc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdzcmMnXG4gICAgfSxcbiAgICAnY2FwdGlvbic6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3RoZWFkJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAndGJvZHknOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICd0Zm9vdCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH1cbn07XG5cblxuLy8gY29udmVydCBzdHJpbmdzIHRvIGZ1bmN0aW9ucyBhbmQgY3JlYXRlIGdldHNldCBtZXRob2RzXG5fLmVhY2hLZXkoZG9tRWxlbWVudHNEYXRhQWNjZXNzLCBmdW5jdGlvbih0YWdJbmZvKSB7XG4gICAgdmFyIHByb3BlcnR5ID0gdGFnSW5mby5wcm9wZXJ0eVxuICAgICAgICAsIGV2ZW50ID0gdGFnSW5mby5ldmVudDtcbiAgICBpZiAodHlwZW9mIHByb3BlcnR5ICE9ICdmdW5jdGlvbicpXG4gICAgICAgIHRhZ0luZm8ucHJvcGVydHkgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHByb3BlcnR5OyB9O1xuICAgIHZhciBwcm9wRnVuYyA9IHRhZ0luZm8ucHJvcGVydHk7XG4gICAgaWYgKHR5cGVvZiBldmVudCAhPSAnZnVuY3Rpb24nKVxuICAgICAgICB0YWdJbmZvLmV2ZW50ID0gZnVuY3Rpb24oKSB7IHJldHVybiBldmVudDsgfTtcbiAgICBpZiAoISB0YWdJbmZvLmdldClcbiAgICAgICAgdGFnSW5mby5nZXQgPSBmdW5jdGlvbihlbCkgeyByZXR1cm4gZWxbcHJvcEZ1bmMoZWwpXTsgfVxuICAgIGlmICghIHRhZ0luZm8uc2V0KVxuICAgICAgICB0YWdJbmZvLnNldCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIChlbFtwcm9wRnVuYyhlbCldID0gdHlwZW9mIHZhbHVlID09ICd1bmRlZmluZWQnID8gJycgOiB2YWx1ZSk7XG4gICAgICAgIH1cbn0pO1xuXG5cbi8qKlxuICogVHlwZXMgb2YgaW5wdXQgZWxlbWVudHNcbiAqL1xudmFyIGlucHV0RWxlbWVudFR5cGVzID0ge1xuICAgIGJ5RGVmYXVsdDoge1xuICAgICAgICBwcm9wZXJ0eTogJ3ZhbHVlJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICdjaGVja2JveCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdjaGVja2VkJyxcbiAgICAgICAgZXZlbnQ6ICdjaGFuZ2UnXG4gICAgfSxcbiAgICAncmFkaW8nOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY2hlY2tlZCcsXG4gICAgICAgIGV2ZW50OiAnY2hhbmdlJ1xuICAgIH0sXG4gICAgJ3RleHQnOiB7XG4gICAgICAgIHByb3BlcnR5OiAndmFsdWUnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybiBwcm9wZXJ0eSBvZiBpbnB1dCBlbGVtZW50IHRvIGdldC9zZXQgaXRzIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGlucHV0RGF0YVByb3BlcnR5KGVsKSB7XG4gICAgdmFyIGlucHV0VHlwZSA9IGlucHV0RWxlbWVudFR5cGVzW2VsLnR5cGVdO1xuICAgIHJldHVybiBpbnB1dFR5cGVcbiAgICAgICAgICAgID8gaW5wdXRUeXBlLnByb3BlcnR5XG4gICAgICAgICAgICA6IGlucHV0RWxlbWVudFR5cGVzLmJ5RGVmYXVsdC5wcm9wZXJ0eTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgRE9NIGV2ZW50IHR5cGUgdG8gbGlzdGVuIHRvIHRvIHJlYWN0IHRvIGlucHV0IGVsZW1lbnQgY2hhbmdlXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBpbnB1dENoYW5nZUV2ZW50KGVsKSB7XG4gICAgdmFyIGlucHV0VHlwZSA9IGlucHV0RWxlbWVudFR5cGVzW2VsLnR5cGVdO1xuICAgIHJldHVybiBpbnB1dFR5cGVcbiAgICAgICAgICAgID8gaW5wdXRUeXBlLmV2ZW50XG4gICAgICAgICAgICA6IGlucHV0RWxlbWVudFR5cGVzLmJ5RGVmYXVsdC5ldmVudDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgTWVzc2VuZ2VyQVBJID0gcmVxdWlyZSgnbWlsby1jb3JlJykuY2xhc3Nlcy5NZXNzZW5nZXJBUEk7XG5cblxudmFyIERyb3BNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ0Ryb3BNc2dBUEknLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKERyb3BNc2dBUEksIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBmaWx0ZXJTb3VyY2VNZXNzYWdlOiBmaWx0ZXJTb3VyY2VNZXNzYWdlLFxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBEcm9wTXNnQVBJO1xuXG5cbnZhciBkcm9wRXZlbnRzTWFwID0ge1xuICAgICdkcmFnaW4nOiAnZHJhZ2VudGVyJyxcbiAgICAnZHJhZ291dCc6ICdkcmFnbGVhdmUnXG59O1xuXG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgcmV0dXJuIGRyb3BFdmVudHNNYXAuaGFzT3duUHJvcGVydHkobWVzc2FnZSlcbiAgICAgICAgICAgID8gZHJvcEV2ZW50c01hcFttZXNzYWdlXVxuICAgICAgICAgICAgOiBtZXNzYWdlO1xufVxuXG5mdW5jdGlvbiByZXNldEZpbHRlclZhcnMoKSB7XG4gICAgZGVsZXRlIHRoaXMuX2N1cnJlbnRUYXJnZXQ7XG4gICAgZGVsZXRlIHRoaXMuX2luc2lkZTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBkYXRhKSB7IC8vIGRhdGEgaXMgRE9NIGV2ZW50IG9iamVjdFxuICAgIHZhciBvayA9IHRydWU7XG5cbiAgICBpZiAoc291cmNlTWVzc2FnZSA9PSAnZHJhZ2VudGVyJyAmJiBtZXNzYWdlID09ICdkcmFnaW4nKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYXJnZXQgPSBkYXRhLnRhcmdldDtcbiAgICAgICAgb2sgPSAhdGhpcy5faW5zaWRlO1xuICAgICAgICB0aGlzLl9pbnNpZGUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoc291cmNlTWVzc2FnZSA9PSAnZHJhZ2xlYXZlJyAmJiBtZXNzYWdlID09ICdkcmFnb3V0Jykge1xuICAgICAgICBvayA9IHRoaXMuX2N1cnJlbnRUYXJnZXQgPT0gZGF0YS50YXJnZXQ7XG4gICAgICAgIGlmIChvaykgcmVzZXRGaWx0ZXJWYXJzLmNhbGwodGhpcyk7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNZXNzYWdlID09ICdkcm9wJykgcmVzZXRGaWx0ZXJWYXJzLmNhbGwodGhpcyk7XG5cbiAgICByZXR1cm4gb2s7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIERPTUVtaXR0ZXJTb3VyY2UgPSByZXF1aXJlKCcuLi8uLi9zZXJ2aWNlcy9kb21fc291cmNlJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cbnZhciBET01FdmVudHNTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKERPTUVtaXR0ZXJTb3VyY2UsICdET01FdmVudHNTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKERPTUV2ZW50c1NvdXJjZSwge1xuICAgIGluaXQ6IGluaXQsXG4gICAgZGVzdHJveTogRE9NRXZlbnRzU291cmNlJGRlc3Ryb3ksXG4gICAgZW1pdHRlcjogZW1pdHRlclxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NRXZlbnRzU291cmNlO1xuXG5cbnZhciB1c2VDYXB0dXJlUGF0dGVybiA9IC9fX2NhcHR1cmUkL1xuICAgICwgdXNlQ2FwdHVyZVBvc3RmaXggPSAnX19jYXB0dXJlJztcblxuXG4vLyBpbml0IERPTSBldmVudCBzb3VyY2VcbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBjb21wb25lbnQpIHtcbiAgICBjaGVjayhjb21wb25lbnQsIENvbXBvbmVudCk7XG4gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIERPTUV2ZW50c1NvdXJjZSRkZXN0cm95KCkge1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBkZWxldGUgdGhpcy5jb21wb25lbnQ7XG59XG5cblxuLy8gZ2V0IERPTSBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuZWw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vICMjI2NvbXBvbmVudCBpZnJhbWUgc291cmNlXG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxudmFyIEZyYW1lTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2FnZVNvdXJjZSwgJ0ZyYW1lTWVzc2FnZVNvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRnJhbWVNZXNzYWdlU291cmNlLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgaW5pdDogaW5pdCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgdHJpZ2dlcjogdHJpZ2dlcixcblxuICAgIC8vY2xhc3Mgc3BlY2lmaWMgbWV0aG9kc1xuICAgIGZyYW1lV2luZG93OiBmcmFtZVdpbmRvdyxcbiAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQgIC8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZyYW1lTWVzc2FnZVNvdXJjZTtcblxuXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJT3JDbGFzcywgY29tcG9uZW50KSB7XG4gICAgY2hlY2soY29tcG9uZW50LCBDb21wb25lbnQpO1xuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuXG4gICAgaWYgKGNvbXBvbmVudC5lbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2lmcmFtZScpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcG9uZW50IGZvciBGcmFtZU1lc3NhZ2VTb3VyY2UgY2FuIG9ubHkgYmUgYXR0YWNoZWQgdG8gaWZyYW1lIGVsZW1lbnQnKTtcblxuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBmcmFtZVdpbmRvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuZWwuY29udGVudFdpbmRvdztcbn1cblxuXG4vLyBhZGRJRnJhbWVNZXNzYWdlTGlzdGVuZXJcbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHZhciB3aW4gPSB0aGlzLmZyYW1lV2luZG93KCk7XG4gICAgaWYgKHdpbikgd2luLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLCBmYWxzZSk7XG4gICAgZWxzZSBsb2dnZXIud2FybignRnJhbWVNZXNzYWdlU291cmNlOiBmcmFtZSB3aW5kb3cgaXMgdW5kZWZpbmVkJyk7XG59XG5cblxuLy8gcmVtb3ZlSUZyYW1lTWVzc2FnZUxpc3RlbmVyXG5mdW5jdGlvbiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB2YXIgd2luID0gdGhpcy5mcmFtZVdpbmRvdygpO1xuICAgIGlmICh3aW4pIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcywgZmFsc2UpO1xuICAgIGVsc2UgbG9nZ2VyLndhcm4oJ0ZyYW1lTWVzc2FnZVNvdXJjZTogZnJhbWUgd2luZG93IGlzIHVuZGVmaW5lZCcpO1xufVxuXG5cbmZ1bmN0aW9uIHRyaWdnZXIobXNnVHlwZSwgZGF0YSkge1xuICAgIGRhdGEgPSBkYXRhIHx8IHt9O1xuICAgIGRhdGEudHlwZSA9IG1zZ1R5cGU7XG5cbiAgICB0aGlzLmZyYW1lV2luZG93KCkucG9zdE1lc3NhZ2UoZGF0YSwgJyonKTtcbn1cblxuXG4vLyBUT0RPIG1heWJlIHJlZmFjdG9yIHRvIEZyYW1lTXNnQVBJP1xuZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICB0aGlzLmRpc3BhdGNoTWVzc2FnZShldmVudC5kYXRhLnR5cGUsIGV2ZW50KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY29tcG9uZW50TmFtZSA9IHJlcXVpcmUoJy4uL3V0aWwvY29tcG9uZW50X25hbWUnKVxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG4vKipcbiAqIFNjb3BlIGNsYXNzLlxuICogQHBhcmFtIHtFbGVtZW50fSByb290RWwgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIHNjb3BlXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCB0aGUgaG9zdCBcbiAqIEByZXR1cm4ge1Njb3BlfVxuICovXG5mdW5jdGlvbiBTY29wZShyb290RWwsIGhvc3RPYmplY3QpIHtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfcm9vdEVsOiByb290RWwsXG4gICAgICAgIF9ob3N0T2JqZWN0OiBob3N0T2JqZWN0XG4gICAgfSwgXy5XUklUKTsgLy8gd3JpdGFibGVcbn07XG5cbl8uZXh0ZW5kUHJvdG8oU2NvcGUsIHtcbiAgICBfYWRkOiBTY29wZSRfYWRkLFxuICAgIF9zYWZlQWRkOiBTY29wZSRfc2FmZUFkZCxcbiAgICBfY29weTogU2NvcGUkX2NvcHksXG4gICAgX2VhY2g6IFNjb3BlJF9lYWNoLFxuICAgIF9tb3ZlOiBTY29wZSRfbW92ZSxcbiAgICBfbWVyZ2U6IFNjb3BlJF9tZXJnZSxcbiAgICBfbGVuZ3RoOiBTY29wZSRfbGVuZ3RoLFxuICAgIF9hbnk6IFNjb3BlJF9hbnksXG4gICAgX3JlbW92ZTogU2NvcGUkX3JlbW92ZSxcbiAgICBfY2xlYW46IFNjb3BlJF9jbGVhbixcbiAgICBfZGV0YWNoRWxlbWVudDogU2NvcGUkX2RldGFjaEVsZW1lbnQsXG4gICAgX2hhczogU2NvcGUkX2hhcyxcbiAgICBfZmlsdGVyOiBTY29wZSRfZmlsdGVyXG59KTtcblxuXG5fLmV4dGVuZChTY29wZSwge1xuICAgIHJlbmFtZTogU2NvcGUkJHJlbmFtZVxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY29wZTtcblxuXG52YXIgYWxsb3dlZE5hbWVQYXR0ZXJuID0gL15bQS1aYS16XVtBLVphLXowLTlcXF9cXCRdKiQvO1xuXG5cbi8qKlxuICogU2NvcGUgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBvYmplY3QgdG8gdGhlIHNjb3BlLCB0aHJvd2luZyBpZiBuYW1lIGlzIG5vdCB1bmlxdWVcbiAqIEBwYXJhbSB7Q29tcG9uZW50fENvbXBvbmVudEluZm99IG9iamVjdCBjb21wb25lbnQgb3IgY29tcG9uZW50IGluZm8gdG8gYWRkIHRvIHRoZSBzY29wZVxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBhZGRcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2FkZChvYmplY3QsIG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpXG4gICAgICAgIG9iamVjdC5uYW1lID0gbmFtZTtcbiAgICBlbHNlXG4gICAgICAgIG5hbWUgPSBvYmplY3QubmFtZTtcbiAgICBcbiAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkdXBsaWNhdGUgb2JqZWN0IG5hbWU6ICcgKyBuYW1lKTtcblxuICAgIGNoZWNrTmFtZShuYW1lKTtcbiAgICBfX2FkZC5jYWxsKHRoaXMsIG9iamVjdCwgbmFtZSk7XG59XG5cblxuLyoqXG4gKiBTY29wZSBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgb2JqZWN0IHRvIHNjb3BlIHJlbmFtaW5nIGl0IGlmIG5hbWUgaXMgbm90IHVuaXF1ZVxuICogQHBhcmFtIHtDb21wb25lbnR8Q29tcG9uZW50SW5mb30gb2JqZWN0IGNvbXBvbmVudCBvciBjb21wb25lbnQgaW5mbyB0byBhZGQgdG8gdGhlIHNjb3BlXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGFkZFxuICovXG5mdW5jdGlvbiBTY29wZSRfc2FmZUFkZChvYmplY3QsIG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpXG4gICAgICAgIG9iamVjdC5uYW1lID0gbmFtZTtcbiAgICBlbHNlXG4gICAgICAgIG5hbWUgPSBvYmplY3QubmFtZTtcblxuICAgIHZhciBzaG91bGRSZW5hbWUgPSB0aGlzLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgIGlmIChzaG91bGRSZW5hbWUpXG4gICAgICAgIGxvZ2dlci5lcnJvcignU2NvcGU6IGR1cGxpY2F0ZSBvYmplY3QgbmFtZTogJyArIG5hbWUpO1xuICAgIGVsc2Uge1xuICAgICAgICBzaG91bGRSZW5hbWUgPSAhIGFsbG93ZWROYW1lUGF0dGVybi50ZXN0KG5hbWUpO1xuICAgICAgICBpZiAoc2hvdWxkUmVuYW1lKVxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdTY29wZTogbmFtZSBzaG91bGQgc3RhcnQgZnJvbSBsZXR0ZXIsIHRoaXMgbmFtZSBpcyBub3QgYWxsb3dlZDogJyArIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRSZW5hbWUpIHtcbiAgICAgICAgbmFtZSA9IGNvbXBvbmVudE5hbWUoKTtcbiAgICAgICAgb2JqZWN0Lm5hbWUgPSBuYW1lO1xuICAgIH1cblxuICAgIF9fYWRkLmNhbGwodGhpcywgb2JqZWN0LCBuYW1lKTtcbn1cblxuXG5mdW5jdGlvbiBfX2FkZChvYmplY3QsIG5hbWUpIHtcbiAgICB0aGlzW25hbWVdID0gb2JqZWN0O1xuICAgIG9iamVjdC5zY29wZSA9IHRoaXM7XG5cbiAgICBpZiAodHlwZW9mIG9iamVjdC5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgb2JqZWN0LnBvc3RNZXNzYWdlKCdhZGRlZHRvc2NvcGUnKTsgXG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBjb3BpZXMgYWxsIG9iamVjdHMgZnJvbSBvbmUgc2NvcGUgdG8gYW5vdGhlcixcbiAqIHRocm93aW5nIGlmIHNvbWUgb2JqZWN0IGlzIG5vdCB1bmlxdWVcbiAqIEBwYXJhbSB7U2NvcGV9IGFTY29wZSB0aGUgc2NvcGUgdG8gY29weVxuICovXG5mdW5jdGlvbiBTY29wZSRfY29weShhU2NvcGUpIHtcbiAgICBjaGVjayhhU2NvcGUsIFNjb3BlKTtcblxuICAgIGFTY29wZS5fZWFjaChTY29wZSRfYWRkLCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIE1vdmVzIGEgY29tcG9uZW50IGZyb20gdGhpcyBzY29wZSB0byBhbm90aGVyIHNjb3BlLlxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudCB0aGUgY29tcG9uZW50IHRvIGJlIG1vdmVkXG4gKiBAcGFyYW0ge1Njb3BlfSBvdGhlclNjb3BlIHRoZSBzY29wZSB0byBjb3B5IHRoZSBjb21wb25lbnQgdG9cbiAqL1xuZnVuY3Rpb24gU2NvcGUkX21vdmUoY29tcG9uZW50LCBvdGhlclNjb3BlKSB7XG4gICAgb3RoZXJTY29wZS5fYWRkKGNvbXBvbmVudCk7XG4gICAgdGhpcy5fcmVtb3ZlKGNvbXBvbmVudC5uYW1lKTtcbiAgICBjb21wb25lbnQuc2NvcGUgPSBvdGhlclNjb3BlO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogTWVyZ2VzIG9uZSBzY29wZSBpbnRvIHRoaXMgc2NvcGVcbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIHRoZSBzY29wZSB0byBhYnNvcmJcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX21lcmdlKHNjb3BlKSB7XG4gICAgc2NvcGUuX2VhY2goZnVuY3Rpb24gKGNvbXApIHtcbiAgICAgICAgdGhpcy5fYWRkKGNvbXAsIGNvbXAubmFtZSk7XG4gICAgICAgIHNjb3BlLl9yZW1vdmUoY29tcC5uYW1lKTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIEVudW1lcmF0ZXMgZWFjaCBjb21wb25lbnQgaW4gdGhlIHNjb3BlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmb3IgZWFjaCBjb21wb25lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIHRoZSBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9lYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgXy5lYWNoS2V5KHRoaXMsIGNhbGxiYWNrLCB0aGlzQXJnIHx8IHRoaXMsIHRydWUpOyAvLyBlbnVtZXJhdGVzIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBjb21wb25lbnRzIGJhc2VkIG9uIGEgY2FsbGJhY2tcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIGNvbXBvbmVudFxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgdGhlIGNvbnRleHRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBTY29wZSRfZmlsdGVyKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyS2V5cyh0aGlzLCBjYWxsYmFjaywgdGhpc0FyZyB8fCB0aGlzLCB0cnVlKTtcbn1cblxuXG4vKipcbiAqIENoZWNrcyB0aGUgdmFsaWRpdHkgb2YgYSBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIGNoZWNrTmFtZShuYW1lKSB7XG4gICAgaWYgKCEgYWxsb3dlZE5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbmFtZSBzaG91bGQgc3RhcnQgZnJvbSBsZXR0ZXIsIHRoaXMgbmFtZSBpcyBub3QgYWxsb3dlZDogJyArIG5hbWUpO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHNjb3BlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9sZW5ndGgoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmxlbmd0aDtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIFJldHVybnMgYSBjb21wb25lbnQgZnJvbSB0aGUgc2NvcGUuIEl0IG1heSBsb29rIGxpa2UgaXQgcmV0dXJucyB0aGUgZmlyc3QgY29tcG9uZW50XG4gKiBidXQgaW4gcmVhbGl0eSBnaXZlbiB0aGF0IHNjb3BlcyBhcmUgaGFzaGVzLCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nLlxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBTY29wZSRfYW55KCkge1xuICAgIHZhciBrZXkgPSBPYmplY3Qua2V5cyh0aGlzKVswXTtcbiAgICByZXR1cm4ga2V5ICYmIHRoaXNba2V5XTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIFJlbW92ZXMgYSBjb21wb25lbnQgZnJvbSB0aGUgc2NvcGUgYnkgaXQncyBuYW1lLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byByZW1vdmVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVpZXQgb3B0aW9uYWwgdHJ1ZSB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGluIHNjb3BlXG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9yZW1vdmUobmFtZSwgcXVpZXQpIHtcbiAgICBpZiAoISAobmFtZSBpbiB0aGlzKSkge1xuICAgICAgICBpZiAoIXF1aWV0KSBsb2dnZXIud2FybigncmVtb3Zpbmcgb2JqZWN0IHRoYXQgaXMgbm90IGluIHNjb3BlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb2JqZWN0ID0gdGhpc1tuYW1lXTtcblxuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmplY3QucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIG9iamVjdC5wb3N0TWVzc2FnZSgncmVtb3ZlZGZyb21zY29wZScpO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogUmVtb3ZlcyBhbGwgY29tcG9uZW50cyBmcm9tIHRoZSBzY29wZS5cbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2NsZWFuKCkge1xuICAgIHRoaXMuX2VhY2goZnVuY3Rpb24ob2JqZWN0LCBuYW1lKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdLnNjb3BlO1xuICAgICAgICBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICB9LCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gU2NvcGUkX2RldGFjaEVsZW1lbnQoKSB7XG4gICAgdGhpcy5fcm9vdEVsID0gbnVsbDtcbn1cblxuXG4vKipcbiAqIENoZWNrcyBpZiBzY29wZSBoYXMgb2JqZWN0IGJ5IG9iamVjdCBuYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBTY29wZSRfaGFzKG9iamVjdCkge1xuICAgIHJldHVybiB0aGlzLmhhc093blByb3BlcnR5KG9iamVjdC5uYW1lKTtcbn1cblxuXG4vKipcbiAqIENoYW5nZSBvYmplY3QgbmFtZSwgcmVuYW1pbmcgaXQgaW4gc2NvcGUgdW5sZXNzIHJlbmFtZUluU2NvcGUgaXMgZmFsc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG5ldyBuYW1lXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlbmFtZUluU2NvcGUgdHJ1ZSBieSBkZWZhdWx0XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJCRyZW5hbWUob2JqLCBuYW1lLCByZW5hbWVJblNjb3BlKSB7XG4gICAgaWYgKG9iai5zY29wZSAmJiByZW5hbWVJblNjb3BlICE9PSBmYWxzZSkge1xuICAgICAgICBvYmouc2NvcGUuX3JlbW92ZShvYmoubmFtZSk7XG4gICAgICAgIG9iai5zY29wZS5fYWRkKG9iaiwgbmFtZSk7XG4gICAgfSBlbHNlXG4gICAgICAgIG9iai5uYW1lID0gbmFtZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIE1MQnV0dG9uID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEJ1dHRvbicsIHtcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktYnV0dG9uJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQnV0dG9uKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEJ1dHRvbjtcblxuXy5leHRlbmRQcm90byhNTEJ1dHRvbiwge1xuICAgIGRpc2FibGU6IE1MQnV0dG9uJGRpc2FibGUsXG4gICAgaXNEaXNhYmxlZDogTUxCdXR0b24kaXNEaXNhYmxlZFxufSk7XG5cblxuZnVuY3Rpb24gTUxCdXR0b24kZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59XG5cbmZ1bmN0aW9uIE1MQnV0dG9uJGlzRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5lbC5kaXNhYmxlZDtcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgQ09NQk9fQ0hBTkdFX01FU1NBR0UgPSAnbWxjb21ib2NoYW5nZSc7XG5cbnZhciBEQVRBTElTVF9URU1QTEFURSA9ICd7e34gaXQuY29tYm9PcHRpb25zIDpvcHRpb24gfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwie3s9IG9wdGlvbi5sYWJlbCB9fVwiPjwvb3B0aW9uPiBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHt7fn19JztcblxudmFyIE1MQ29tYm8gPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MQ29tYm8nLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MQ29tYm9fZ2V0LFxuICAgICAgICBzZXQ6IE1MQ29tYm9fc2V0LFxuICAgICAgICBkZWw6IE1MQ29tYm9fZGVsLFxuICAgICAgICBzcGxpY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgZXZlbnQ6IENPTUJPX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqKic6IHsgc3Vic2NyaWJlcjogb25PcHRpb25zQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWRhdGFsaXN0J1xuICAgIH0sXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWRcbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQ29tYm8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MQ29tYm87XG5cblxuXy5leHRlbmRQcm90byhNTENvbWJvLCB7XG4gICAgaW5pdDogTUxDb21ibyRpbml0XG59KTtcblxuXG5mdW5jdGlvbiBNTENvbWJvJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5vbignY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG59XG5cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAnX2NvbWJvSW5wdXQnOiB0aGlzLmNvbnRhaW5lci5zY29wZS5pbnB1dCxcbiAgICAgICAgJ19jb21ib0xpc3QnOiB0aGlzLmNvbnRhaW5lci5zY29wZS5kYXRhbGlzdFxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29tYm9MaXN0LnRlbXBsYXRlLnNldChEQVRBTElTVF9URU1QTEFURSk7XG5cbiAgICB0aGlzLl9jb21ib0lucHV0LmRhdGEub24oJ2lucHV0JyxcbiAgICAgICAgeyBzdWJzY3JpYmVyOiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UsIGNvbnRleHQ6IHRoaXMgfSk7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9fZ2V0KCkge1xuICAgIGlmICghIHRoaXMuX2NvbWJvSW5wdXQpIHJldHVybjtcbiAgICByZXR1cm4gdGhpcy5fY29tYm9JbnB1dC5kYXRhLmdldCgpO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvX3NldCh2YWx1ZSkge1xuICAgIHJldHVybiBjaGFuZ2VDb21ib0RhdGEuY2FsbCh0aGlzLCAnc2V0JywgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvX2RlbCgpIHtcbiAgICByZXR1cm4gY2hhbmdlQ29tYm9EYXRhLmNhbGwodGhpcywgJ2RlbCcsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gY2hhbmdlQ29tYm9EYXRhKG1ldGhvZCwgdmFsdWUpIHtcbiAgICBpZiAoISB0aGlzLl9jb21ib0lucHV0KSByZXR1cm47XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NvbWJvSW5wdXQuZGF0YVttZXRob2RdKHZhbHVlKTtcbiAgICBkaXNwYXRjaENoYW5nZU1lc3NhZ2UuY2FsbCh0aGlzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8vIFBvc3QgdGhlIGRhdGEgY2hhbmdlXG5mdW5jdGlvbiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShDT01CT19DSEFOR0VfTUVTU0FHRSk7XG59XG5cbmZ1bmN0aW9uIG9uT3B0aW9uc0NoYW5nZShtc2csIGRhdGEpIHtcbiAgICB0aGlzLl9jb21ib0xpc3QudGVtcGxhdGUucmVuZGVyKHtcbiAgICAgICAgY29tYm9PcHRpb25zOiB0aGlzLm1vZGVsLmdldCgpXG4gICAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG52YXIgQ09NQk9fTElTVF9DSEFOR0VfTUVTU0FHRSA9ICdtbGNvbWJvbGlzdGNoYW5nZSc7XG5cblxudmFyIE1MQ29tYm9MaXN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTENvbWJvTGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktY29tYm8tbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgICAgZ2V0OiBNTENvbWJvTGlzdF9nZXQsXG4gICAgICAgIHNldDogTUxDb21ib0xpc3Rfc2V0LFxuICAgICAgICBkZWw6IE1MQ29tYm9MaXN0X2RlbCxcbiAgICAgICAgZXZlbnQ6IENPTUJPX0xJU1RfQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKioqJzogeyBzdWJzY3JpYmVyOiBvbkl0ZW1zQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInfVxuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJzxkaXYgbWwtYmluZD1cIk1MU3VwZXJDb21ibzpjb21ib1wiPjwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiTUxMaXN0Omxpc3RcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJNTExpc3RJdGVtOml0ZW1cIiBjbGFzcz1cImxpc3QtaXRlbVwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBtbC1iaW5kPVwiW2RhdGFdOmxhYmVsXCI+PC9zcGFuPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBtbC1iaW5kPVwiW2V2ZW50c106ZGVsZXRlQnRuXCIgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZVwiPjwvc3Bhbj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgIDwvZGl2PidcbiAgICB9XG59KTtcblxuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQ29tYm9MaXN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTENvbWJvTGlzdDtcblxuXG5fLmV4dGVuZFByb3RvKE1MQ29tYm9MaXN0LCB7XG4gICAgaW5pdDogTUxDb21ib0xpc3QkaW5pdCxcbiAgICBzZXRPcHRpb25zOiBNTENvbWJvTGlzdCRzZXRPcHRpb25zLFxuICAgIHNldERhdGFWYWxpZGF0aW9uOiBNTENvbWJvTGlzdCRzZXREYXRhVmFsaWRhdGlvbixcbiAgICB0b2dnbGVBZGRCdXR0b246IE1MQ29tYm9MaXN0JHRvZ2dsZUFkZEJ1dHRvbixcbiAgICBkZXN0cm95OiBNTENvbWJvTGlzdCRkZXN0cm95LFxuICAgIHNldEFkZEl0ZW1Qcm9tcHQ6IE1MQ29tYm9MaXN0JHNldEFkZEl0ZW1Qcm9tcHQsXG4gICAgY2xlYXJDb21ib0lucHV0IDogTUxDb21ib0xpc3QkY2xlYXJDb21ib0lucHV0XG59KTtcblxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2RhdGFWYWxpZGF0aW9uID0gZnVuY3Rpb24gKCkge307XG4gICAgdGhpcy5tb2RlbC5zZXQoW10pO1xuICAgIHRoaXMub25jZSgnY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG59XG5cblxuZnVuY3Rpb24gTUxDb21ib0xpc3Qkc2V0RGF0YVZhbGlkYXRpb24oZGF0YVZhbGlkYXRpb24pIHtcbiAgICBpZiAodHlwZW9mIGRhdGFWYWxpZGF0aW9uID09ICdmdW5jdGlvbicpXG4gICAgICAgIHRoaXMuX2RhdGFWYWxpZGF0aW9uID0gZGF0YVZhbGlkYXRpb247XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JHNldE9wdGlvbnMoYXJyKSB7XG4gICAgdGhpcy5fY29tYm8uc2V0T3B0aW9ucyhhcnIpO1xufVxuXG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JGNsZWFyQ29tYm9JbnB1dCAoKSB7XG4gICAgdGhpcy5fY29tYm8uY2xlYXJDb21ib0lucHV0KCk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSGlkZXMgYWRkIGJ1dHRvblxuICogQHBhcmFtIHtCb29sZWFufSBzaG93XG4gKi9cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JHRvZ2dsZUFkZEJ1dHRvbihzaG93KSB7XG4gICAgdGhpcy5fY29tYm8udG9nZ2xlQWRkQnV0dG9uKHNob3cpO1xufVxuXG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JHNldEFkZEl0ZW1Qcm9tcHQocHJvbXB0KSB7XG4gICB0aGlzLl9jb21iby5zZXRBZGRJdGVtUHJvbXB0KHByb21wdCk7XG59XG5cblxuZnVuY3Rpb24gTUxDb21ib0xpc3QkZGVzdHJveSgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLl9jb25uZWN0b3IgJiYgbWlsby5taW5kZXIuZGVzdHJveUNvbm5lY3Rvcih0aGlzLl9jb25uZWN0b3IpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG51bGw7XG59XG5cblxuZnVuY3Rpb24gb25DaGlsZHJlbkJvdW5kKCkge1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKCkuYmluZGVyKCk7XG4gICAgY29tcG9uZW50U2V0dXAuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gY29tcG9uZW50U2V0dXAoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgJ19jb21ibyc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmNvbWJvLFxuICAgICAgICAnX2xpc3QnOiB0aGlzLmNvbnRhaW5lci5zY29wZS5saXN0XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jb25uZWN0b3IgPSBtaWxvLm1pbmRlcih0aGlzLl9saXN0Lm1vZGVsLCAnPDw8LT4+PicsIHRoaXMubW9kZWwpO1xuICAgIHRoaXMuX2NvbWJvLmRhdGEub24oJycsIHsgc3Vic2NyaWJlcjogb25Db21ib0NoYW5nZSwgY29udGV4dDogdGhpcyB9KTtcbiAgICB0aGlzLl9jb21iby5vbignYWRkaXRlbScsIHsgc3Vic2NyaWJlcjogb25BZGRJdGVtLCBjb250ZXh0OiB0aGlzIH0pO1xufVxuXG5mdW5jdGlvbiBvbkNvbWJvQ2hhbmdlKG1zZywgZGF0YSkge1xuICAgIGlmIChkYXRhLm5ld1ZhbHVlICYmIHRoaXMuX2RhdGFWYWxpZGF0aW9uKG1zZywgZGF0YSwgdGhpcy5fbGlzdC5tb2RlbC5nZXQoKSkpXG4gICAgICAgIHRoaXMuX2xpc3QubW9kZWwucHVzaChkYXRhLm5ld1ZhbHVlKTtcbiAgICB0aGlzLl9jb21iby5kYXRhLmRlbCgpO1xuICAgIC8vIGJlY2F1c2Ugb2Ygc3VwZXJjb21ibyBsaXN0ZW5lcnMgb2ZmIHlvdSBoYXZlIHRvIHNldCBfdmFsdWUgZXhwbGljaXRseVxuICAgIHRoaXMuX2NvbWJvLmRhdGEuX3ZhbHVlID0gJyc7XG59XG5cbmZ1bmN0aW9uIG9uSXRlbXNDaGFuZ2UobXNnLCBkYXRhKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShDT01CT19MSVNUX0NIQU5HRV9NRVNTQUdFKTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib0xpc3RfZ2V0KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KCk7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyA/IF8uY2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0X3NldCh2YWx1ZSkge1xuICAgIHRoaXMubW9kZWwuc2V0KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib0xpc3RfZGVsKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLnNldChbXSk7XG59XG5cblxuZnVuY3Rpb24gb25BZGRJdGVtKG1zZywgZGF0YSkge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ2FkZGl0ZW0nLCBkYXRhKTtcbiAgICB0aGlzLmV2ZW50cy5wb3N0TWVzc2FnZSgnbWlsb19jb21ib2xpc3RhZGRpdGVtJywgZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG52YXIgTUxEYXRlID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERhdGUnLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MRGF0ZV9nZXQsXG4gICAgICAgIHNldDogTUxEYXRlX3NldCxcbiAgICAgICAgZGVsOiBNTERhdGVfZGVsLFxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWRhdGUnXG4gICAgfVxufSk7XG5cbl8uZXh0ZW5kUHJvdG8oTUxEYXRlLCB7XG4gICAgZ2V0TWluOiBNTERhdGUkZ2V0TWluLFxuICAgIHNldE1pbjogTUxEYXRlJHNldE1pbixcbiAgICBnZXRNYXg6IE1MRGF0ZSRnZXRNYXgsXG4gICAgc2V0TWF4OiBNTERhdGUkc2V0TWF4XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERhdGUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRGF0ZTtcblxuXG5mdW5jdGlvbiBNTERhdGUkZ2V0TWluKCkge1xuICAgIHJldHVybiBfLmRhdGUodGhpcy5lbC5taW4pO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGF0ZSRzZXRNaW4odmFsdWUpIHtcbiAgICB2YXIgZGF0ZSA9IF8udG9EYXRlKHZhbHVlKTtcblxuICAgIHRoaXMuZWwubWluID0gZGF0ZSA/IHRvSVNPODYwMUZvcm1hdChkYXRlKSA6ICcnO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGF0ZSRnZXRNYXgoKSB7XG4gICAgcmV0dXJuIF8uZGF0ZSh0aGlzLmVsLm1heCk7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlJHNldE1heCh2YWx1ZSkge1xuICAgIHZhciBkYXRlID0gXy50b0RhdGUodmFsdWUpO1xuXG4gICAgdGhpcy5lbC5tYXggPSBkYXRlID8gdG9JU084NjAxRm9ybWF0KGRhdGUpIDogJyc7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlX2dldCgpIHtcbiAgICByZXR1cm4gXy50b0RhdGUodGhpcy5lbC52YWx1ZSk7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlX3NldCh2YWx1ZSkge1xuICAgIHZhciBkYXRlID0gXy50b0RhdGUodmFsdWUpO1xuXG4gICAgdGhpcy5lbC52YWx1ZSA9IGRhdGUgPyB0b0lTTzg2MDFGb3JtYXQoZGF0ZSkgOiAnJztcblxuICAgIGRpc3BhdGNoSW5wdXRNZXNzYWdlLmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIE1MRGF0ZV9kZWwoKSB7XG4gICAgdGhpcy5lbC52YWx1ZSA9ICcnO1xuXG4gICAgZGlzcGF0Y2hJbnB1dE1lc3NhZ2UuY2FsbCh0aGlzKTtcbn1cblxuXG5mdW5jdGlvbiBkaXNwYXRjaElucHV0TWVzc2FnZSgpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKCdpbnB1dCcpOyAvLyBEaXNwYXRjaCB0aGUgJ2lucHV0JyAodXN1YWxseSBkaXNwYXRjaGVkIGJ5IHRoZSB1bmRlcmx5aW5nIDxpbnB1dD4gZWxlbWVudCkgZXZlbnQgc28gdGhhdCB0aGUgZGF0YSBjaGFuZ2UgY2FuIGJlIGxpc3RlbmVkIHRvXG59XG5cblxuZnVuY3Rpb24gdG9JU084NjAxRm9ybWF0KGRhdGUpIHtcbiAgICB2YXIgZGF0ZUFyciA9IFtcbiAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSksXG4gICAgICAgIHBhZChkYXRlLmdldERhdGUoKSlcbiAgICBdO1xuXG4gICAgdmFyIGRhdGVTdHIgPSBkYXRlQXJyLmpvaW4oJy0nKTtcblxuICAgIHJldHVybiBkYXRlU3RyO1xuXG4gICAgZnVuY3Rpb24gcGFkKG4pIHsgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4gOiBuOyB9XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKTtcblxuXG52YXIgTUxEcm9wVGFyZ2V0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERyb3BUYXJnZXQnLCBbJ2Ryb3AnXSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERyb3BUYXJnZXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRHJvcFRhcmdldDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRvVCA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnV0aWwuZG9UXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgdW5pcXVlSWQgPSByZXF1aXJlKCcuLi8uLi91dGlsL3VuaXF1ZV9pZCcpO1xuXG52YXIgVFJFRV9URU1QTEFURSA9ICc8dWwgY2xhc3M9XCJtbC11aS1mb2xkdHJlZS1saXN0XCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7fiBpdC5kYXRhLml0ZW1zIDppdGVtOmluZGV4IH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2YXIgaGFzU3ViVHJlZSA9IGl0ZW0uaXRlbXMgJiYgaXRlbS5pdGVtcy5sZW5ndGg7IH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkge3s/IGhhc1N1YlRyZWUgfX1jbGFzcz1cIm1sLXVpLWZvbGR0cmVlLS1oYXMtbXVsdGlwbGVcInt7P319PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC11aS1mb2xkdHJlZS1pdGVtXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PyBoYXNTdWJUcmVlIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtdWktZm9sZHRyZWUtYnV0dG9uXCI+PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7P319XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PSBpdC5pdGVtVGVtcGxhdGUoeyBpdGVtOiBpdGVtLCBpZDogaXQuaXRlbUlEc1tpbmRleF0gfSkgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez8gaGFzU3ViVHJlZSB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez0gaXQudHJlZVRlbXBsYXRlKGl0ZW0pIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7fn19XFxcbiAgICAgICAgICAgICAgICAgICAgPC91bD4nO1xuXG52YXIgREVGQVVMVF9DT01QSUxFRF9JVEVNX1RFTVBMQVRFID0gZG9ULmNvbXBpbGUoJ1xcXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLXVpLWZvbGR0cmVlLWxhYmVsXCIgZGF0YS1pdGVtLWlkPVwie3s9IGl0LmlkIH19XCI+XFxcbiAgICAgICAgICAgICAgICB7ez0gaXQuaXRlbS5sYWJlbCB9fVxcXG4gICAgICAgICAgICA8L3NwYW4+JylcbiAgICAsIENPTVBJTEVEX1RSRUVfVEVNUExBVEUgPSBkb1QuY29tcGlsZShUUkVFX1RFTVBMQVRFKTtcblxuXG52YXIgTUxGb2xkVHJlZSA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxGb2xkVHJlZScsIHtcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICdjbGljayBkYmxjbGljayc6IHsgc3Vic2NyaWJlcjogb25JdGVtRXZlbnQsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZm9sZHRyZWUtbWFpbidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEZvbGRUcmVlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEZvbGRUcmVlO1xuXG5fLmV4dGVuZFByb3RvKE1MRm9sZFRyZWUsIHtcbiAgICBzZXRJdGVtVGVtcGxhdGU6IE1MRm9sZFRyZWUkc2V0SXRlbVRlbXBsYXRlLFxuICAgIHJlbmRlclRyZWU6IE1MRm9sZFRyZWUkcmVuZGVyVHJlZVxufSk7XG5cbmZ1bmN0aW9uIGZvbGRVbmZvbGQoZWwpIHtcbiAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdtbC11aS1mb2xkdHJlZS0tdW5mb2xkJyk7XG59XG5cbmZ1bmN0aW9uIGl0ZW1NZXNzYWdlKG1zZywgZWwpIHtcbiAgICB2YXIgaWQgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaXRlbS1pZCcpXG4gICAgICAgICwgaXRlbSA9IHRoaXMuX2l0ZW1zTWFwW2lkXTtcblxuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ21sZm9sZHRyZWVfJyArIG1zZywge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBlbDogZWxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gb25JdGVtRXZlbnQobXNnLCBlKSB7XG4gICAgdmFyIGVsID0gZS50YXJnZXQ7XG4gICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnbWwtdWktZm9sZHRyZWUtYnV0dG9uJykpXG4gICAgICAgIGZvbGRVbmZvbGQoZWwucGFyZW50Tm9kZS5wYXJlbnROb2RlKTtcbiAgICBlbHNlIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ21sLXVpLWZvbGR0cmVlLWxhYmVsJykpXG4gICAgICAgIGl0ZW1NZXNzYWdlLmNhbGwodGhpcywgbXNnLCBlbCk7XG4gICAgZWxzZSByZXR1cm47XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbn1cblxuZnVuY3Rpb24gTUxGb2xkVHJlZSRzZXRJdGVtVGVtcGxhdGUgKHRlbXBsYXRlU3RyKSB7XG4gICAgdGhpcy5faXRlbVRlbXBsYXRlID0gZG9ULmNvbXBpbGUodGVtcGxhdGVTdHIpO1xufVxuXG5mdW5jdGlvbiBNTEZvbGRUcmVlJHJlbmRlclRyZWUgKGRhdGEpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgc2VsZi5faXRlbXNNYXAgPSB7fTtcbiAgICB0aGlzLmVsLmlubmVySFRNTCA9IF9yZW5kZXJUcmVlKGRhdGEpO1xuXG4gICAgZnVuY3Rpb24gX3JlbmRlclRyZWUgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuaXRlbXMpXG4gICAgICAgICAgICB2YXIgaXRlbXNJRHMgPSBfLm1hcChkYXRhLml0ZW1zLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgICAgICAgICBzZWxmLl9pdGVtc01hcFtpZF0gPSBpdGVtO1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDsgXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gQ09NUElMRURfVFJFRV9URU1QTEFURSh7XG4gICAgICAgICAgICBpdGVtSURzOiBpdGVtc0lEcyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBpdGVtVGVtcGxhdGU6IHNlbGYuX2l0ZW1UZW1wbGF0ZSB8fCBERUZBVUxUX0NPTVBJTEVEX0lURU1fVEVNUExBVEUsXG4gICAgICAgICAgICB0cmVlVGVtcGxhdGU6IF9yZW5kZXJUcmVlXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTEdyb3VwID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEdyb3VwJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZ3JvdXAnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxHcm91cCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxHcm91cDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTEh5cGVybGluayA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxIeXBlcmxpbmsnLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1oeXBlcmxpbmsnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxIeXBlcmxpbmspO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSHlwZXJsaW5rO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgSU1BR0VfQ0hBTkdFX01FU1NBR0UgPSAnbWxpbWFnZWNoYW5nZSc7XG5cbnZhciBNTEltYWdlID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEltYWdlJywge1xuICAgIGRhdGE6IHtcbiAgICAgICAgc2V0OiBNTEltYWdlX3NldCxcbiAgICAgICAgZ2V0OiBNTEltYWdlX2dldCxcbiAgICAgICAgZGVsOiBNTEltYWdlX2RlbCxcbiAgICAgICAgc3BsaWNlOiB1bmRlZmluZWQsXG4gICAgICAgIGV2ZW50OiBJTUFHRV9DSEFOR0VfTUVTU0FHRVxuICAgIH0sXG4gICAgbW9kZWw6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICcuc3JjJzogeyBzdWJzY3JpYmVyOiBvbk1vZGVsQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIHRhZ05hbWU6ICdpbWcnLFxuICAgICAgICBjbHM6ICdtbC11aS1pbWFnZSdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEltYWdlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEltYWdlO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxJbWFnZSwge1xuICAgIGluaXQ6IE1MSW1hZ2UkaW5pdFxufSk7XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplIHJhZGlvIGdyb3VwIGFuZCBzZXR1cFxuICovXG5mdW5jdGlvbiBNTEltYWdlJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBTZXRzIGltYWdlIHZhbHVlXG4gKiBSZXBsYWNlcyB0aGUgZGF0YSBzZXQgb3BlcmF0aW9uIHRvIGRlYWwgd2l0aCByYWRpbyBidXR0b25zXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHNldFxuICovXG5mdW5jdGlvbiBNTEltYWdlX3NldCh2YWx1ZSkge1xuICAgIHRoaXMubW9kZWwuc2V0KHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cblxuLyoqXG4gKiBHZXRzIGdyb3VwIHZhbHVlXG4gKiBSZXRyaWV2ZXMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBncm91cFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gTUxJbWFnZV9nZXQoKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5tb2RlbC5nZXQoKTtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnID8gXy5jbG9uZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cblxuXG4vKipcbiAqIERlbGV0ZWQgZ3JvdXAgdmFsdWVcbiAqIERlbGV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBncm91cCwgc2V0dGluZyBpdCB0byBlbXB0eVxuICovXG5mdW5jdGlvbiBNTEltYWdlX2RlbCgpIHtcbiAgICB0aGlzLm1vZGVsLmRlbCgpO1xufVxuXG5cbi8vIFBvc3QgdGhlIGRhdGEgY2hhbmdlXG5mdW5jdGlvbiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShJTUFHRV9DSEFOR0VfTUVTU0FHRSk7XG59XG5cblxuZnVuY3Rpb24gb25Nb2RlbENoYW5nZShwYXRoLCBkYXRhKSB7XG4gICAgdGhpcy5lbC5zcmMgPSBkYXRhLm5ld1ZhbHVlO1xuICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgTUxJbnB1dCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxJbnB1dCcsIHtcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWlucHV0J1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MSW5wdXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSW5wdXQ7XG5cbl8uZXh0ZW5kUHJvdG8oTUxJbnB1dCwge1xuICAgIGRpc2FibGU6IE1MSW5wdXQkZGlzYWJsZSxcbiAgICBpc0Rpc2FibGVkOiBNTElucHV0JGlzRGlzYWJsZWQsXG4gICAgc2V0TWF4TGVuZ3RoOiBNTElucHV0JHNldE1heExlbmd0aFxufSk7XG5cbmZ1bmN0aW9uIE1MSW5wdXQkZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXQkaXNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmVsLmRpc2FibGVkO1xufVxuXG5mdW5jdGlvbiBNTElucHV0JHNldE1heExlbmd0aChsZW5ndGgpIHtcbiAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgnbWF4bGVuZ3RoJywgbGVuZ3RoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBJTlBVVF9MSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21saW5wdXRsaXN0Y2hhbmdlJztcblxudmFyIGFzeW5jSGFuZGxlciA9IGZ1bmN0aW9uICh2YWx1ZSwgY2FsbGJhY2spIHtjYWxsYmFjayh2YWx1ZSk7fTtcblxudmFyIE1MSW5wdXRMaXN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTElucHV0TGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktaW5wdXQtbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgICAgZ2V0OiBNTElucHV0TGlzdF9nZXQsXG4gICAgICAgIHNldDogTUxJbnB1dExpc3Rfc2V0LFxuICAgICAgICBkZWw6IE1MSW5wdXRMaXN0X2RlbCxcbiAgICAgICAgc3BsaWNlOiBNTElucHV0TGlzdF9zcGxpY2UsXG4gICAgICAgIGV2ZW50OiBJTlBVVF9MSVNUX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqKic6IHsgc3Vic2NyaWJlcjogb25JdGVtc0NoYW5nZSwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnXFxcbiAgICAgICAgICAgIDxkaXYgbWwtYmluZD1cIk1MTGlzdDpsaXN0XCI+XFxcbiAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJNTExpc3RJdGVtOml0ZW1cIiBjbGFzcz1cImxpc3QtaXRlbVwiPlxcXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCJbZGF0YV06bGFiZWxcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gbWwtYmluZD1cIltldmVudHNdOmRlbGV0ZUJ0blwiIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmVcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1sLWJpbmQ9XCJNTElucHV0OmlucHV0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cXFxuICAgICAgICAgICAgPGJ1dHRvbiBtbC1iaW5kPVwiTUxCdXR0b246YnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIj5cXFxuICAgICAgICAgICAgICAgIEFkZFxcXG4gICAgICAgICAgICA8L2J1dHRvbj4nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxJbnB1dExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSW5wdXRMaXN0O1xuXG5fLmV4dGVuZFByb3RvKE1MSW5wdXRMaXN0LCB7XG4gICAgaW5pdDogTUxJbnB1dExpc3QkaW5pdCxcbiAgICBzZXRBc3luYzogTUxJbnB1dExpc3Qkc2V0QXN5bmMsXG4gICAgc2V0UGxhY2VIb2xkZXI6IE1MSW5wdXRMaXN0JHNldFBsYWNlSG9sZGVyLFxuICAgIGRlc3Ryb3k6IE1MSW5wdXRMaXN0JGRlc3Ryb3lcbn0pO1xuXG5mdW5jdGlvbiBNTElucHV0TGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub25jZSgnY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG4gICAgdGhpcy5tb2RlbC5zZXQoW10pO1xufVxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgcmVuZGVyLmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0JHNldFBsYWNlSG9sZGVyKHBsYWNlSG9sZGVyKSB7XG4gICAgdGhpcy5faW5wdXQuZWwuc2V0QXR0cmlidXRlKCdwbGFjZUhvbGRlcicsIHBsYWNlSG9sZGVyKTtcbn1cblxuZnVuY3Rpb24gTUxJbnB1dExpc3Qkc2V0QXN5bmMobmV3SGFuZGxlcikge1xuICAgIGFzeW5jSGFuZGxlciA9IG5ld0hhbmRsZXIgfHwgYXN5bmNIYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdCRkZXN0cm95KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKCkuYmluZGVyKCk7XG4gICAgY29tcG9uZW50U2V0dXAuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gY29tcG9uZW50U2V0dXAoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgJ19pbnB1dCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmlucHV0LFxuICAgICAgICAnX2J1dHRvbic6IHRoaXMuY29udGFpbmVyLnNjb3BlLmJ1dHRvbixcbiAgICAgICAgJ19saXN0JzogdGhpcy5jb250YWluZXIuc2NvcGUubGlzdFxuICAgIH0pO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG1pbG8ubWluZGVyKHRoaXMuX2xpc3QubW9kZWwsICc8PDwtPj4+JywgdGhpcy5tb2RlbCk7XG4gICAgdGhpcy5fYnV0dG9uLmV2ZW50cy5vbignY2xpY2snLCB7c3Vic2NyaWJlcjogb25DbGljaywgY29udGV4dDogdGhpcyB9KTsgICBcbn1cblxuZnVuY3Rpb24gb25DbGljayhtc2cpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLl9pbnB1dC5kYXRhLmdldCgwKTtcbiAgICBpZiAodGhpcy5faW5wdXQuZGF0YSlcbiAgICAgICAgYXN5bmNIYW5kbGVyKHZhbHVlLCBmdW5jdGlvbiAobGFiZWwsIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0Lm1vZGVsLnB1c2goeyBsYWJlbDogbGFiZWwsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9pbnB1dC5kYXRhLmRlbCgpO1xufVxuXG5mdW5jdGlvbiBvbkl0ZW1zQ2hhbmdlKG1zZywgZGF0YSkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoSU5QVVRfTElTVF9DSEFOR0VfTUVTU0FHRSk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0X2dldCgpIHtcbiAgICB2YXIgbW9kZWwgPSB0aGlzLm1vZGVsLmdldCgpO1xuICAgIHJldHVybiBtb2RlbCA/IF8uY2xvbmUobW9kZWwpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9zZXQodmFsdWUpIHtcbiAgICB0aGlzLm1vZGVsLnNldCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0X2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5zZXQoW10pO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9zcGxpY2UoKSB7IC8vIC4uLiBhcmd1bWVudHNcbiAgICB0aGlzLm1vZGVsLnNwbGljZS5hcHBseSh0aGlzLm1vZGVsLCBhcmd1bWVudHMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBMSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21sbGlzdGNoYW5nZSdcbiAgICAsIERFTEVURV9CVVRUT05fTkFNRSA9ICdkZWxldGVCdG4nO1xuXG5cbnZhciBNTExpc3QgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MTGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDogdW5kZWZpbmVkLFxuICAgIGxpc3Q6IHVuZGVmaW5lZFxufSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MTGlzdDtcblxuXG5fLmV4dGVuZFByb3RvKE1MTGlzdCwge1xuICAgIGluaXQ6IE1MTGlzdCRpbml0LFxuICAgIGRlc3Ryb3k6IE1MTGlzdCRkZXN0cm95LFxuICAgIHJlbW92ZUl0ZW06IE1MTGlzdCRyZW1vdmVJdGVtLFxuICAgIG1vdmVJdGVtOiBNTExpc3QkbW92ZUl0ZW1cbn0pO1xuXG5cbmZ1bmN0aW9uIE1MTGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub24oJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdCRkZXN0cm95KCkge1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3QkcmVtb3ZlSXRlbShpbmRleCl7XG4gICAgdGhpcy5tb2RlbC5zcGxpY2UoaW5kZXgsIDEpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdCRtb3ZlSXRlbShmcm9tLCB0bykge1xuICAgIHZhciBzcGxpY2VkRGF0YSA9IHRoaXMubW9kZWwuc3BsaWNlKGZyb20sIDEpO1xuICAgIHJldHVybiB0aGlzLm1vZGVsLnNwbGljZSh0bywgMCwgc3BsaWNlZERhdGFbMF0pO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICB0aGlzLm1vZGVsLnNldChbXSk7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbWlsby5taW5kZXIodGhpcy5tb2RlbCwgJzw8PC0nLCB0aGlzLmRhdGEpLmRlZmVyQ2hhbmdlTW9kZSgnPDw8LT4+PicpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBEcmFnRHJvcCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZHJhZ2Ryb3AnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIExJU1RJVEVNX0NIQU5HRV9NRVNTQUdFID0gJ21sbGlzdGl0ZW1jaGFuZ2UnXG5cbnZhciBNTExpc3RJdGVtID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTExpc3RJdGVtJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRvbTogdW5kZWZpbmVkLFxuICAgIGRyYWc6IHtcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgcGFyYW1zOiBnZXRNZXRhRGF0YVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkcm9wOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnZHJhZ2VudGVyJzogeyBzdWJzY3JpYmVyOiBvbkRyYWdIb3ZlciwgY29udGV4dDogJ293bmVyJyB9LFxuICAgICAgICAgICAgJ2RyYWdvdmVyJzogeyBzdWJzY3JpYmVyOiBvbkRyYWdIb3ZlciwgY29udGV4dDogJ293bmVyJyB9LFxuICAgICAgICAgICAgJ2RyYWdsZWF2ZSc6IHsgc3Vic2NyaWJlcjogb25EcmFnT3V0LCBjb250ZXh0OiAnb3duZXInIH0sXG4gICAgICAgICAgICAnZHJvcCc6IHsgc3Vic2NyaWJlcjogb25JdGVtRHJvcCwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH0sXG4gICAgICAgIGFsbG93OiB7XG4gICAgICAgICAgICBjb21wb25lbnRzOiBpc0NvbXBvbmVudEFsbG93ZWRcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MTGlzdEl0ZW1fZ2V0LFxuICAgICAgICBzZXQ6IE1MTGlzdEl0ZW1fc2V0LFxuICAgICAgICBkZWw6IE1MTGlzdEl0ZW1fZGVsLFxuICAgICAgICBldmVudDogTElTVElURU1fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB1bmRlZmluZWQsXG4gICAgaXRlbTogdW5kZWZpbmVkXG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTExpc3RJdGVtKTtcblxudmFyIE1MTGlzdEl0ZW0gPSBtb2R1bGUuZXhwb3J0cyA9IE1MTGlzdEl0ZW07XG5cblxuXy5leHRlbmRQcm90byhNTExpc3RJdGVtLCB7XG4gICAgaW5pdDogTUxMaXN0SXRlbSRpbml0LFxuICAgIG1vdmVJdGVtOiBNTExpc3RJdGVtJG1vdmVJdGVtLFxuICAgIHJlbW92ZUl0ZW06IE1MTGlzdEl0ZW0kcmVtb3ZlSXRlbSxcbiAgICBpc0Ryb3BBbGxvd2VkOiBNTExpc3RJdGVtJGlzRHJvcEFsbG93ZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW0kaW5pdCgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLm9uKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgdmFyIGRlbGV0ZUJ0biA9IHRoaXMuY29udGFpbmVyLnNjb3BlLmRlbGV0ZUJ0bjtcbiAgICBkZWxldGVCdG4gJiYgZGVsZXRlQnRuLmV2ZW50cy5vbignY2xpY2snLCB7IHN1YnNjcmliZXI6IHRoaXMucmVtb3ZlSXRlbSwgY29udGV4dDogdGhpcyB9KTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtJHJlbW92ZUl0ZW0oKSB7XG4gICAgdHJ5IHsgdmFyIGxpc3RPd25lciA9IHRoaXMuaXRlbS5saXN0Lm93bmVyOyB9IGNhdGNoKGUpIHt9XG4gICAgbGlzdE93bmVyICYmIGxpc3RPd25lci5yZW1vdmVJdGVtKHRoaXMuaXRlbS5pbmRleCk7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbSRtb3ZlSXRlbShpbmRleCkge1xuICAgIHZhciBsaXN0T3duZXIgPSB0aGlzLml0ZW0ubGlzdC5vd25lcjtcbiAgICBsaXN0T3duZXIgJiYgbGlzdE93bmVyLm1vdmVJdGVtKHRoaXMuaXRlbS5pbmRleCwgaW5kZXgpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW0kaXNEcm9wQWxsb3dlZChtZXRhLCBkcmFnRHJvcCl7XG4gICAgcmV0dXJuIG1ldGEucGFyYW1zICYmIG1ldGEucGFyYW1zLmluZGV4ICYmIG1ldGEuY29tcENsYXNzID09ICdNTExpc3RJdGVtJztcbn1cblxuXG5mdW5jdGlvbiBpc0NvbXBvbmVudEFsbG93ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNEcm9wQWxsb3dlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIG9uSXRlbURyb3AoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIG9uRHJhZ091dC5jYWxsKHRoaXMpO1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgdmFyIG1ldGEgPSBkdC5nZXRDb21wb25lbnRNZXRhKCk7XG4gICAgdmFyIHN0YXRlID0gZHQuZ2V0Q29tcG9uZW50U3RhdGUoKTtcbiAgICB2YXIgbGlzdE93bmVyID0gdGhpcy5pdGVtLmxpc3Qub3duZXI7XG4gICAgdmFyIGluZGV4ID0gbWV0YS5wYXJhbXMgJiYgbWV0YS5wYXJhbXMuaW5kZXg7XG5cbiAgICBsaXN0T3duZXIubW92ZUl0ZW0oK2luZGV4LCB0aGlzLml0ZW0uaW5kZXgsIHN0YXRlKTtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdIb3ZlcihldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5kb20uYWRkQ3NzQ2xhc3NlcygnbWwtZHJhZy1vdmVyJyk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnT3V0KGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLmRvbS5yZW1vdmVDc3NDbGFzc2VzKCdtbC1kcmFnLW92ZXInKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRNZXRhRGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleDogdGhpcy5pdGVtLmluZGV4XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW1fZ2V0KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KCk7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyA/IF8uY2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbV9zZXQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKVxuICAgICAgICB0aGlzLmRhdGEuX3NldCh2YWx1ZSk7XG4gICAgdGhpcy5tb2RlbC5zZXQodmFsdWUpO1xuICAgIF9zZW5kQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtX2RlbCgpIHtcbiAgICB0aGlzLmRhdGEuX2RlbCgpO1xuICAgIHRoaXMubW9kZWwuZGVsKCk7XG4gICAgX3NlbmRDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7ICAgIFxufVxuXG5cbmZ1bmN0aW9uIF9zZW5kQ2hhbmdlTWVzc2FnZSgpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKExJU1RJVEVNX0NIQU5HRV9NRVNTQUdFKTtcbn1cblxuXG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCB1bmlxdWVJZCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdW5pcXVlX2lkJylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgUkFESU9fQ0hBTkdFX01FU1NBR0UgPSAnbWxyYWRpb2dyb3VwY2hhbmdlJ1xuICAgICwgRUxFTUVOVF9OQU1FX1BST1BFUlRZID0gJ19tbFJhZGlvR3JvdXBFbGVtZW50SUQnXG4gICAgLCBFTEVNRU5UX05BTUVfUFJFRklYID0gJ21sLXJhZGlvLWdyb3VwLSc7XG5cbnZhciBNTFJhZGlvR3JvdXAgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MUmFkaW9Hcm91cCcsIHtcbiAgICBkYXRhOiB7XG4gICAgICAgIHNldDogTUxSYWRpb0dyb3VwX3NldCxcbiAgICAgICAgZ2V0OiBNTFJhZGlvR3JvdXBfZ2V0LFxuICAgICAgICBkZWw6IE1MUmFkaW9Hcm91cF9kZWwsXG4gICAgICAgIHNwbGljZTogdW5kZWZpbmVkLFxuICAgICAgICBldmVudDogUkFESU9fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKioqJzogeyBzdWJzY3JpYmVyOiBvbk9wdGlvbnNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICdjbGljayc6IHsgc3Vic2NyaWJlcjogb25Hcm91cENsaWNrLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXJhZGlvLWdyb3VwJ1xuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICd7e34gaXQucmFkaW9PcHRpb25zIDpvcHRpb24gfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IyNkZWYuZWxJRDp7ez0gaXQuZWxlbWVudE5hbWUgfX0te3s9IG9wdGlvbi52YWx1ZSB9fSN9fSBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ7ez0gaXQuX3JlbmRlck9wdGlvbnMub3B0aW9uQ3NzQ2xhc3MgfHwgXCInICsgRUxFTUVOVF9OQU1FX1BSRUZJWCArICdvcHRpb25cIiB9fVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInt7IyBkZWYuZWxJRCB9fVwiIHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwie3s9IG9wdGlvbi52YWx1ZSB9fVwiIG5hbWU9XCJ7ez0gaXQuZWxlbWVudE5hbWUgfX1cIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwie3sjIGRlZi5lbElEIH19XCI+e3s9IG9wdGlvbi5sYWJlbCB9fTwvbGFiZWw+IFxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IFxcXG4gICAgICAgICAgICAgICAgICAge3t+fX0nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxSYWRpb0dyb3VwKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTFJhZGlvR3JvdXA7XG5cblxuXy5leHRlbmRQcm90byhNTFJhZGlvR3JvdXAsIHtcbiAgICBpbml0OiBNTFJhZGlvR3JvdXAkaW5pdCxcbiAgICBkZXN0cm95OiBNTFJhZGlvR3JvdXAkZGVzdHJveSxcbiAgICBzZXRSZW5kZXJPcHRpb25zOiBNTFJhZGlvR3JvdXAkc2V0UmVuZGVyT3B0aW9uc1xufSk7XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplIHJhZGlvIGdyb3VwIGFuZCBzZXR1cFxuICovXG5mdW5jdGlvbiBNTFJhZGlvR3JvdXAkaW5pdCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfcmFkaW9MaXN0JywgW10sIF8uQ09ORik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBFTEVNRU5UX05BTUVfUFJPUEVSVFksIEVMRU1FTlRfTkFNRV9QUkVGSVggKyB1bmlxdWVJZCgpKTtcbiAgICB0aGlzLl9yZW5kZXJPcHRpb25zID0ge307XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gTUxSYWRpb0dyb3VwJHNldFJlbmRlck9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMuX3JlbmRlck9wdGlvbnMgPSBvcHRpb25zO1xufVxuXG5cbi8qKlxuICogU2V0cyBncm91cCB2YWx1ZVxuICogUmVwbGFjZXMgdGhlIGRhdGEgc2V0IG9wZXJhdGlvbiB0byBkZWFsIHdpdGggcmFkaW8gYnV0dG9uc1xuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBzZXRcbiAqL1xuZnVuY3Rpb24gTUxSYWRpb0dyb3VwX3NldCh2YWx1ZSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5fcmFkaW9MaXN0XG4gICAgICAgICwgc2V0UmVzdWx0O1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24ocmFkaW8pIHtcbiAgICAgICAgICAgIHJhZGlvLmNoZWNrZWQgPSByYWRpby52YWx1ZSA9PSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChyYWRpby5jaGVja2VkKVxuICAgICAgICAgICAgICAgIHNldFJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBkaXNwYXRjaENoYW5nZU1lc3NhZ2UuY2FsbCh0aGlzKTtcblxuICAgICAgICByZXR1cm4gc2V0UmVzdWx0O1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEdldHMgZ3JvdXAgdmFsdWVcbiAqIFJldHJpZXZlcyB0aGUgc2VsZWN0ZWQgdmFsdWUgb2YgdGhlIGdyb3VwXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBNTFJhZGlvR3JvdXBfZ2V0KCkge1xuICAgIHZhciBjaGVja2VkID0gXy5maW5kKHRoaXMuX3JhZGlvTGlzdCwgZnVuY3Rpb24ocmFkaW8pIHtcbiAgICAgICAgcmV0dXJuIHJhZGlvLmNoZWNrZWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2hlY2tlZCAmJiBjaGVja2VkLnZhbHVlIHx8IHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIERlbGV0ZWQgZ3JvdXAgdmFsdWVcbiAqIERlbGV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBncm91cCwgc2V0dGluZyBpdCB0byBlbXB0eVxuICovXG5mdW5jdGlvbiBNTFJhZGlvR3JvdXBfZGVsKCkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5fcmFkaW9MaXN0O1xuICAgIGlmIChvcHRpb25zLmxlbmd0aClcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgICAgICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIE1hbmFnZSByYWRpbyBjaGlsZHJlbiBjbGlja3NcbiAqL1xuZnVuY3Rpb24gb25Hcm91cENsaWNrKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT0gJ3JhZGlvJylcbiAgICAgICAgZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7XG59XG5cbi8vIFBvc3QgdGhlIGRhdGEgY2hhbmdlXG5mdW5jdGlvbiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShSQURJT19DSEFOR0VfTUVTU0FHRSk7XG59XG5cblxuLy8gU2V0IHJhZGlvIGJ1dHRvbiBjaGlsZHJlbiBvbiBtb2RlbCBjaGFuZ2VcbmZ1bmN0aW9uIG9uT3B0aW9uc0NoYW5nZShwYXRoLCBkYXRhKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICByYWRpb09wdGlvbnM6IHRoaXMubW9kZWwuZ2V0KCksXG4gICAgICAgIGVsZW1lbnROYW1lOiB0aGlzW0VMRU1FTlRfTkFNRV9QUk9QRVJUWV0sXG4gICAgICAgIF9yZW5kZXJPcHRpb25zOiB0aGlzLl9yZW5kZXJPcHRpb25zXG4gICAgfSk7XG5cbiAgICB2YXIgcmFkaW9FbHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXScpXG4gICAgICAgICwgb3B0aW9ucyA9IF8udG9BcnJheShyYWRpb0Vscyk7XG5cbiAgICB0aGlzLl9yYWRpb0xpc3QubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9yYWRpb0xpc3Quc3BsaWNlLmFwcGx5KHRoaXMuX3JhZGlvTGlzdCwgWzAsIDBdLmNvbmNhdChvcHRpb25zKSk7XG59XG5cblxuZnVuY3Rpb24gTUxSYWRpb0dyb3VwJGRlc3Ryb3koKSB7XG4gICAgZGVsZXRlIHRoaXMuX3JhZGlvTGlzdDtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIE1MU2VsZWN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFNlbGVjdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktc2VsZWN0J1xuICAgIH0sXG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKionOiB7IHN1YnNjcmliZXI6IG9uT3B0aW9uc0NoYW5nZSwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAne3t+IGl0LnNlbGVjdE9wdGlvbnMgOm9wdGlvbiB9fSBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInt7PSBvcHRpb24udmFsdWUgfX1cIiB7ez8gb3B0aW9uLnNlbGVjdGVkIH19c2VsZWN0ZWR7ez99fT57ez0gb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+IFxcXG4gICAgICAgICAgICAgICAgICAge3t+fX0nXG4gICAgfVxufSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFNlbGVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxTZWxlY3Q7XG5cblxuXy5leHRlbmRQcm90byhNTFNlbGVjdCwge1xuICAgIHNldE9wdGlvbnM6IE1MU2VsZWN0JHNldE9wdGlvbnMsXG4gICAgZGlzYWJsZTogTUxTZWxlY3QkZGlzYWJsZVxufSk7XG5cblxuZnVuY3Rpb24gTUxTZWxlY3Qkc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgLy8gU2V0IG9wdGlvbnMgdGVtcG9yYXJpbHkgZGlzYWJsZXMgbW9kZWwgc3Vic2NyaXB0aW9ucyAoQXMgYSB3b3JrYXJvdW5kIGZvciBwZXJmb3JtYW5jZSBpc3N1ZXMgcmVsYXRpbmcgdG8gbW9kZWwgdXBkYXRlcyAvIHRlbXBsYXRlIHJlLXJlbmRlcmluZylcbiAgICB2YXIgbW9kZWxDaGFuZ2VMaXN0ZW5lciA9IHsgY29udGV4dDogdGhpcywgc3Vic2NyaWJlcjogb25PcHRpb25zQ2hhbmdlIH07XG5cbiAgICB0aGlzLm1vZGVsLm9mZignKionLCBtb2RlbENoYW5nZUxpc3RlbmVyKTtcbiAgICB0aGlzLm1vZGVsLnNldChvcHRpb25zKTtcbiAgICB0aGlzLm1vZGVsLm9uKCcqKicsIG1vZGVsQ2hhbmdlTGlzdGVuZXIpO1xuXG4gICAgb25PcHRpb25zQ2hhbmdlLmNhbGwodGhpcyk7XG59XG5cblxuZnVuY3Rpb24gTUxTZWxlY3QkZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59XG5cblxuZnVuY3Rpb24gb25PcHRpb25zQ2hhbmdlKHBhdGgsIGRhdGEpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcih7IHNlbGVjdE9wdGlvbnM6IHRoaXMubW9kZWwuZ2V0KCkgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTUxTdXBlckNvbWJvXG4gKiBBIGNvbWJvIHNlbGVjdCBsaXN0IHdpdGggaW50ZWxsaWdlbnQgc2Nyb2xsaW5nIG9mIHN1cGVyIGxhcmdlIGxpc3RzLlxuICovXG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBkb1QgPSBtaWxvQ29yZS51dGlsLmRvVFxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cbnZhciBDT01CT19PUEVOID0gJ21sLXVpLXN1cGVyY29tYm8tb3Blbic7XG52YXIgQ09NQk9fQ0hBTkdFX01FU1NBR0UgPSAnbWxzdXBlcmNvbWJvY2hhbmdlJztcblxudmFyIE9QVElPTlNfVEVNUExBVEUgPSAne3t+IGl0LmNvbWJvT3B0aW9ucyA6b3B0aW9uOmluZGV4IH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHt7PyBvcHRpb24uc2VsZWN0ZWR9fWNsYXNzPVwic2VsZWN0ZWRcIiB7ez99fWRhdGEtdmFsdWU9XCJ7ez0gaW5kZXggfX1cIj57ez0gb3B0aW9uLmxhYmVsIH19PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7fn19JztcblxudmFyIE1BWF9SRU5ERVJFRCA9IDEwMDtcbnZhciBCVUZGRVIgPSAyNTtcbnZhciBERUZBVUxUX0VMRU1FTlRfSEVJR0hUID0gMjA7XG5cbnZhciBNTFN1cGVyQ29tYm8gPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MU3VwZXJDb21ibycsIHtcbiAgICBldmVudHM6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICdtb3VzZWxlYXZlJzoge3N1YnNjcmliZXI6IG9uTW91c2VMZWF2ZSwgY29udGV4dDogJ293bmVyJ30sXG4gICAgICAgICAgICAnbW91c2VvdmVyJzoge3N1YnNjcmliZXI6IG9uTW91c2VPdmVyLCBjb250ZXh0OiAnb3duZXInfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxTdXBlckNvbWJvX2dldCxcbiAgICAgICAgc2V0OiBNTFN1cGVyQ29tYm9fc2V0LFxuICAgICAgICBkZWw6IE1MU3VwZXJDb21ib19kZWwsXG4gICAgICAgIHNwbGljZTogdW5kZWZpbmVkLFxuICAgICAgICBldmVudDogQ09NQk9fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1zdXBlcmNvbWJvJ1xuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICc8aW5wdXQgbWwtYmluZD1cIltkYXRhLCBldmVudHNdOmlucHV0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWwtdWktaW5wdXRcIj5cXFxuICAgICAgICAgICAgICAgICAgIDxkaXYgbWwtYmluZD1cIltkb21dOmFkZEl0ZW1EaXZcIiBjbGFzcz1cIm1sLXVpLXN1cGVyY29tYm8tYWRkXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCI6YWRkUHJvbXB0XCI+PC9zcGFuPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1sLWJpbmQ9XCJbZXZlbnRzLCBkb21dOmFkZEJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IG1sLXVpLWJ1dHRvblwiPkFkZDwvYnV0dG9uPlxcXG4gICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tLCBldmVudHNdOmxpc3RcIiBjbGFzcz1cIm1sLXVpLXN1cGVyY29tYm8tZHJvcGRvd25cIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tXTpiZWZvcmVcIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbdGVtcGxhdGUsIGRvbSwgZXZlbnRzXTpvcHRpb25zXCIgY2xhc3M9XCJtbC11aS1zdXBlcmNvbWJvLW9wdGlvbnNcIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tXTphZnRlclwiPjwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgPC9kaXY+J1xuICAgIH0sXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWRcbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MU3VwZXJDb21ibyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxTdXBlckNvbWJvO1xuXG4vKipcbiAqIFB1YmxpYyBBcGlcbiAqL1xuXy5leHRlbmRQcm90byhNTFN1cGVyQ29tYm8sIHtcbiAgICBpbml0OiBNTFN1cGVyQ29tYm8kaW5pdCxcbiAgICBzaG93T3B0aW9uczogTUxTdXBlckNvbWJvJHNob3dPcHRpb25zLFxuICAgIGhpZGVPcHRpb25zOiBNTFN1cGVyQ29tYm8kaGlkZU9wdGlvbnMsXG4gICAgdG9nZ2xlT3B0aW9uczogTUxTdXBlckNvbWJvJHRvZ2dsZU9wdGlvbnMsXG4gICAgc2V0T3B0aW9uczogTUxTdXBlckNvbWJvJHNldE9wdGlvbnMsXG4gICAgaW5pdE9wdGlvbnNVUkw6IE1MU3VwZXJDb21ibyRpbml0T3B0aW9uc1VSTCxcbiAgICBzZXRGaWx0ZXJlZE9wdGlvbnM6IE1MU3VwZXJDb21ibyRzZXRGaWx0ZXJlZE9wdGlvbnMsXG4gICAgdXBkYXRlOiBNTFN1cGVyQ29tYm8kdXBkYXRlLFxuICAgIHRvZ2dsZUFkZEJ1dHRvbjogTUxTdXBlckNvbWJvJHRvZ2dsZUFkZEJ1dHRvbixcbiAgICBzZXRBZGRJdGVtUHJvbXB0OiBNTFN1cGVyQ29tYm8kc2V0QWRkSXRlbVByb21wdCxcbiAgICBjbGVhckNvbWJvSW5wdXQ6IE1MU3VwZXJDb21ib19kZWxcbn0pO1xuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbGlzZSB0aGUgY29tcG9uZW50LCB3YWl0IGZvciBjaGlsZHJlbmJvdW5kLCBzZXR1cCBlbXB0eSBvcHRpb25zIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLm9uY2UoJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX29wdGlvbnNEYXRhOiBbXSxcbiAgICAgICAgX2ZpbHRlcmVkT3B0aW9uc0RhdGE6IFtdXG4gICAgfSwgXy5XUklUKTtcbn1cblxuLyoqXG4gKiBIYW5kbGVyIGZvciBpbml0IGNoaWxkcmVuYm91bmQgbGlzdGVuZXIuIFJlbmRlcnMgdGVtcGxhdGUuXG4gKi9cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcigpLmJpbmRlcigpO1xuICAgIGNvbXBvbmVudFNldHVwLmNhbGwodGhpcyk7XG59XG5cblxuLyoqXG4gKiBEZWZpbmUgaW5zdGFuY2UgcHJvcGVydGllcywgZ2V0IHN1YmNvbXBvbmVudHMsIGNhbGwgc2V0dXAgc3ViLXRhc2tzXG4gKi9cbmZ1bmN0aW9uIGNvbXBvbmVudFNldHVwKCkge1xuICAgIHZhciBzY29wZSA9IHRoaXMuY29udGFpbmVyLnNjb3BlO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX2NvbWJvSW5wdXQ6IHNjb3BlLmlucHV0LFxuICAgICAgICBfY29tYm9MaXN0OiBzY29wZS5saXN0LFxuICAgICAgICBfY29tYm9PcHRpb25zOiBzY29wZS5vcHRpb25zLFxuICAgICAgICBfY29tYm9CZWZvcmU6IHNjb3BlLmJlZm9yZSxcbiAgICAgICAgX2NvbWJvQWZ0ZXI6IHNjb3BlLmFmdGVyLFxuICAgICAgICBfY29tYm9BZGRJdGVtRGl2OiBzY29wZS5hZGRJdGVtRGl2LFxuICAgICAgICBfY29tYm9BZGRQcm9tcHQ6IHNjb3BlLmFkZFByb21wdCxcbiAgICAgICAgX2NvbWJvQWRkQnRuOiBzY29wZS5hZGRCdG4sXG4gICAgICAgIF9vcHRpb25UZW1wbGF0ZTogZG9ULmNvbXBpbGUoT1BUSU9OU19URU1QTEFURSlcbiAgICB9KTtcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9zdGFydEluZGV4OiAwLFxuICAgICAgICBfZW5kSW5kZXg6IE1BWF9SRU5ERVJFRCxcbiAgICAgICAgX2hpZGRlbjogZmFsc2UsXG4gICAgICAgIF9lbGVtZW50SGVpZ2h0OiBERUZBVUxUX0VMRU1FTlRfSEVJR0hULFxuICAgICAgICBfdG90YWw6IDAsXG4gICAgICAgIF9vcHRpb25zSGVpZ2h0OiAyMDAsXG4gICAgICAgIF9sYXN0U2Nyb2xsUG9zOiAwLFxuICAgICAgICBfY3VycmVudFZhbHVlOiBudWxsLFxuICAgICAgICBfc2VsZWN0ZWQ6IG51bGwsXG4gICAgICAgIF9pc0FkZEJ1dHRvblNob3duOiBmYWxzZVxuICAgIH0sIF8uV1JJVCk7XG5cbiAgICAvLyBDb21wb25lbnQgU2V0dXBcbiAgICB0aGlzLmRvbS5zZXRTdHlsZXMoeyBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9KTtcbiAgICBzZXR1cENvbWJvTGlzdCh0aGlzLl9jb21ib0xpc3QsIHRoaXMuX2NvbWJvT3B0aW9ucywgdGhpcyk7XG4gICAgc2V0dXBDb21ib0lucHV0KHRoaXMuX2NvbWJvSW5wdXQsIHRoaXMpO1xuICAgIHNldHVwQ29tYm9CdG4odGhpcy5fY29tYm9BZGRCdG4sIHRoaXMpO1xuXG4gICAgdGhpcy5ldmVudHMub24oJ2tleWRvd24nLCB7IHN1YnNjcmliZXI6IGNoYW5nZVNlbGVjdGVkLCBjb250ZXh0OiB0aGlzIH0pO1xuICAgIC8vdGhpcy5ldmVudHMub24oJ21vdXNlbGVhdmUnLCB7IHN1YnNjcmliZXI6IE1MU3VwZXJDb21ibyRoaWRlT3B0aW9ucywgY29udGV4dDogdGhpcyB9KTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTaG93cyBvciBoaWRlcyBvcHRpb24gbGlzdC5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHNob3cgdHJ1ZSB0byBzaG93LCBmYWxzZSB0byBoaWRlXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyR0b2dnbGVPcHRpb25zKHNob3cpIHtcbiAgICB0aGlzLl9oaWRkZW4gPSAhc2hvdztcbiAgICB0aGlzLl9jb21ib0xpc3QuZG9tLnRvZ2dsZShzaG93KTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTaG93cyBvcHRpb25zIGxpc3RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHNob3dPcHRpb25zKCkge1xuICAgIHRoaXMuX2hpZGRlbiA9IGZhbHNlO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZChDT01CT19PUEVOKTtcbiAgICB0aGlzLl9jb21ib0xpc3QuZG9tLnRvZ2dsZSh0cnVlKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBIaWRlcyBvcHRpb25zIGxpc3RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJGhpZGVPcHRpb25zKCkge1xuICAgIHRoaXMuX2hpZGRlbiA9IHRydWU7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKENPTUJPX09QRU4pO1xuICAgIHRoaXMuX2NvbWJvTGlzdC5kb20udG9nZ2xlKGZhbHNlKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBIaWRlcyBhZGQgYnV0dG9uXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyR0b2dnbGVBZGRCdXR0b24oc2hvdywgb3B0aW9ucykge1xuICAgIHRoaXMuX2NvbWJvQWRkSXRlbURpdi5kb20udG9nZ2xlKHNob3cpO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucHJlc2VydmVTdGF0ZSkgdGhpcy5fX3Nob3dBZGRPbkNsaWNrID0gdGhpcy5faXNBZGRCdXR0b25TaG93bjtcbiAgICB0aGlzLl9pc0FkZEJ1dHRvblNob3duID0gc2hvdztcbn1cblxuXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kc2V0QWRkSXRlbVByb21wdChwcm9tcHQpIHtcbiAgICB0aGlzLl9hZGRJdGVtUHJvbXB0ID0gcHJvbXB0O1xuICAgIHRoaXMuX2NvbWJvQWRkUHJvbXB0LmVsLmlubmVySFRNTCA9IHByb21wdDtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBvcHRpb25zIG9mIHRoZSBkcm9wZG93blxuICpcbiAqIEBwYXJhbSB7QXJyYXlbT2JqZWN0XX0gYXJyIHRoZSBvcHRpb25zIHRvIHNldCB3aXRoIGxhYmVsIGFuZCB2YWx1ZSBwYWlycy4gVmFsdWUgY2FuIGJlIGFuIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHNldE9wdGlvbnMoYXJyKSB7XG4gICAgdGhpcy5fb3B0aW9uc0RhdGEgPSBhcnI7XG4gICAgdGhpcy5zZXRGaWx0ZXJlZE9wdGlvbnMoYXJyKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpc2UgdGhlIHJlbW90ZSBvcHRpb25zIG9mIHRoZSBkcm9wZG93blxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIGluaXRpYWxpc2UuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRpbml0T3B0aW9uc1VSTChvcHRpb25zKSB7XG4gICAgdGhpcy5fb3B0aW9uc1VSTCA9IG9wdGlvbnMudXJsO1xuICAgIHRoaXMuX2Zvcm1hdE9wdGlvbnNVUkwgPSBvcHRpb25zLmZvcm1hdE9wdGlvbnMgfHwgZnVuY3Rpb24oZSl7cmV0dXJuIGU7fTtcbn1cblxuXG4vKipcbiAqIFByaXZhdGUgbWV0aG9kXG4gKiBTZXRzIHRoZSBvcHRpb25zIG9mIHRoZSBkcm9wZG93biBiYXNlZCBvbiBhIHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gX2dldE9wdGlvbnNVUkwoY2IpIHtcbiAgICB2YXIgdXJsID0gdGhpcy5fb3B0aW9uc1VSTCxcbiAgICAgICAgcXVlcnlTdHJpbmcgPSB0aGlzLl9jb21ib0lucHV0LmRhdGEuZ2V0KCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGNiID0gY2IgfHwgXy5ub29wO1xuICAgIG1pbG8udXRpbC5yZXF1ZXN0LnBvc3QodXJsLCB7IG5hbWU6IHF1ZXJ5U3RyaW5nIH0sIGZ1bmN0aW9uIChlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQ2FuIG5vdCBzZWFyY2ggZm9yIFwiJyArIHF1ZXJ5U3RyaW5nICsgJ1wiJyk7XG4gICAgICAgICAgICByZXR1cm4gY2IobmV3IEVycm9yKCdSZXF1ZXN0IGVycm9yJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IF8uanNvblBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlRGF0YSkgY2IobnVsbCwgcmVzcG9uc2VEYXRhKTtcbiAgICAgICAgZWxzZSBjYihuZXcgRXJyb3IoJ0RhdGEgZXJyb3InKSk7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBmaWx0ZXJlZCBvcHRpb25zLCB3aGljaCBpcyBhIHN1YnNldCBvZiBub3JtYWwgb3B0aW9uc1xuICpcbiAqIEBwYXJhbSB7W3R5cGVdfSBhcnIgVGhlIG9wdGlvbnMgdG8gc2V0XG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRzZXRGaWx0ZXJlZE9wdGlvbnMoYXJyKSB7XG4gICAgaWYgKCEgYXJyKSByZXR1cm4gbG9nZ2VyLmVycm9yKCdzZXRGaWx0ZXJlZE9wdGlvbnM6IHBhcmFtZXRlciBpcyB1bmRlZmluZWQnKTtcbiAgICB0aGlzLl9maWx0ZXJlZE9wdGlvbnNEYXRhID0gYXJyO1xuICAgIHRoaXMuX3RvdGFsID0gYXJyLmxlbmd0aDtcbiAgICB0aGlzLnVwZGF0ZSgpO1xufVxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFVwZGF0ZXMgdGhlIGxpc3QuIFRoaXMgaXMgdXNlZCBvbiBzY3JvbGwsIGFuZCBtYWtlcyB1c2Ugb2YgdGhlIGZpbHRlcmVkT3B0aW9ucyB0b1xuICogaW50ZWxsaWdlbnRseSBzaG93IGEgc3Vic2V0IG9mIHRoZSBmaWx0ZXJlZCBsaXN0IGF0IGEgdGltZS5cbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHVwZGF0ZSgpIHtcbiAgICB2YXIgd2FzSGlkZGVuID0gdGhpcy5faGlkZGVuO1xuXG4gICAgdmFyIGFyclRvU2hvdyA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGEuc2xpY2UodGhpcy5fc3RhcnRJbmRleCwgdGhpcy5fZW5kSW5kZXgpO1xuXG4gICAgdGhpcy5fY29tYm9PcHRpb25zLnRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgIGNvbWJvT3B0aW9uczogYXJyVG9TaG93XG4gICAgfSk7XG5cbiAgICB0aGlzLl9lbGVtZW50SGVpZ2h0ID0gdGhpcy5fZWxlbWVudEhlaWdodCB8fCBERUZBVUxUX0VMRU1FTlRfSEVJR0hUO1xuXG4gICAgaWYgKHdhc0hpZGRlbilcbiAgICAgICAgdGhpcy5oaWRlT3B0aW9ucygpO1xuXG4gICAgdmFyIGJlZm9yZUhlaWdodCA9IHRoaXMuX3N0YXJ0SW5kZXggKiB0aGlzLl9lbGVtZW50SGVpZ2h0O1xuICAgIHZhciBhZnRlckhlaWdodCA9ICh0aGlzLl90b3RhbCAtIHRoaXMuX2VuZEluZGV4KSAqIHRoaXMuX2VsZW1lbnRIZWlnaHQ7XG4gICAgdGhpcy5fY29tYm9CZWZvcmUuZWwuc3R5bGUuaGVpZ2h0ID0gYmVmb3JlSGVpZ2h0ICsgJ3B4JztcbiAgICB0aGlzLl9jb21ib0FmdGVyLmVsLnN0eWxlLmhlaWdodCA9IGFmdGVySGVpZ2h0ID4gMCA/IGFmdGVySGVpZ2h0ICsgJ3B4JyA6ICcwcHgnO1xufVxuXG4vKipcbiAqIFNldHVwIHRoZSBjb21ibyBsaXN0XG4gKlxuICogQHBhcmFtICB7Q29tcG9uZW50fSBsaXN0XG4gKiBAcGFyYW0gIHtBcnJheX0gb3B0aW9uc1xuICogQHBhcmFtICB7Q29tcG9uZW50fSBzZWxmXG4gKi9cbmZ1bmN0aW9uIHNldHVwQ29tYm9MaXN0KGxpc3QsIG9wdGlvbnMsIHNlbGYpIHtcbiAgICBzZWxmLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSk7XG4gICAgb3B0aW9ucy50ZW1wbGF0ZS5zZXQoT1BUSU9OU19URU1QTEFURSk7XG5cbiAgICBsaXN0LmRvbS5zZXRTdHlsZXMoe1xuICAgICAgICBvdmVyZmxvdzogJ3Njcm9sbCcsXG4gICAgICAgIGhlaWdodDogc2VsZi5fb3B0aW9uc0hlaWdodCArICdweCcsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB6SW5kZXg6IDEwXG4gICAgICAgIC8vIHRvcDogeVBvcyArICdweCcsXG4gICAgICAgIC8vIGxlZnQ6IHhQb3MgKyAncHgnLFxuICAgIH0pO1xuXG4gICAgc2VsZi5oaWRlT3B0aW9ucygpO1xuICAgIGxpc3QuZXZlbnRzLm9uTWVzc2FnZXMoe1xuICAgICAgICAnY2xpY2snOiB7c3Vic2NyaWJlcjogb25MaXN0Q2xpY2ssIGNvbnRleHQ6IHNlbGZ9LFxuICAgICAgICAnc2Nyb2xsJzoge3N1YnNjcmliZXI6IG9uTGlzdFNjcm9sbCwgY29udGV4dDogc2VsZn1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBTZXR1cCB0aGUgaW5wdXQgY29tcG9uZW50XG4gKlxuICogQHBhcmFtICB7Q29tcG9uZW50fSBpbnB1dFxuICogQHBhcmFtICB7Q29tcG9uZW50fSBzZWxmXG4gKi9cbmZ1bmN0aW9uIHNldHVwQ29tYm9JbnB1dChpbnB1dCwgc2VsZikge1xuICAgIGlucHV0LmV2ZW50cy5vbmNlKCdmb2N1cycsIGZ1bmN0aW9uKCl7XG4gICAgICAgIGlucHV0LmRhdGEub24oJycsIHsgc3Vic2NyaWJlcjogb25EYXRhQ2hhbmdlLCBjb250ZXh0OiBzZWxmIH0pO1xuICAgICAgICBpbnB1dC5ldmVudHMub24oJ2NsaWNrJywge3N1YnNjcmliZXI6IG9uSW5wdXRDbGljaywgY29udGV4dDogc2VsZiB9KTtcbiAgICAgICAgaW5wdXQuZXZlbnRzLm9uKCdrZXlkb3duJywge3N1YnNjcmliZXI6IG9uRW50ZXJLZXksIGNvbnRleHQ6IHNlbGYgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogU2V0dXAgdGhlIGJ1dHRvblxuICogQHBhcmFtICB7Q29tcG9uZW50fSBidG5cbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gc2VsZlxuICovXG5mdW5jdGlvbiBzZXR1cENvbWJvQnRuKGJ0biwgc2VsZikge1xuICAgIGJ0bi5ldmVudHMub24oJ2NsaWNrJywgeyBzdWJzY3JpYmVyOiBvbkFkZEJ0biwgY29udGV4dDogc2VsZiB9KTtcbn1cblxuXG4vKipcbiAqIEN1c3RvbSBkYXRhIGZhY2V0IGdldCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvX2dldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFZhbHVlO1xufVxuXG4vKipcbiAqIEN1c3RvbSBkYXRhIGZhY2V0IHNldCBtZXRob2RcbiAqIEBwYXJhbSB7VmFyaWFibGV9IG9ialxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm9fc2V0KG9iaikge1xuICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IG9iajtcbiAgICB0aGlzLl9jb21ib0lucHV0LmRhdGEuc2V0KG9iaiAmJiBvYmoubGFiZWwpO1xuICAgIF8uZGVmZXJNZXRob2QodGhpcywgJ2hpZGVPcHRpb25zJyk7XG59XG5cbi8qKlxuICogQ3VzdG9tIGRhdGEgZmFjZXQgZGVsIG1ldGhvZFxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm9fZGVsKCkge1xuICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLnNldCgnJyk7XG59XG5cblxuLyoqXG4gKiBJbnB1dCBkYXRhIGNoYW5nZSBoYW5kbGVyXG4gKiBXaGVuIHRoZSBpbnB1dCBkYXRhIGNoYW5nZXMsIHRoaXMgbWV0aG9kIGZpbHRlcnMgdGhlIG9wdGlvbnNEYXRhLCBhbmQgc2V0cyB0aGUgZmlyc3QgZWxlbWVudFxuICogdG8gYmUgc2VsZWN0ZWQuXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG1zZ1xuICogQHBhcmFtICB7T2JqZXh0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIG9uRGF0YUNoYW5nZShtc2csIGRhdGEpIHtcbiAgICB2YXIgdGV4dCA9IGRhdGEubmV3VmFsdWUgJiYgZGF0YS5uZXdWYWx1ZS50cmltKCk7XG4gICAgaWYgKHRoaXMuX29wdGlvbnNVUkwpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBfZ2V0T3B0aW9uc1VSTC5jYWxsKHRoaXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2VEYXRhKXtcbiAgICAgICAgICAgIGlmIChlcnIgfHwgIXJlc3BvbnNlRGF0YSkgcmV0dXJuO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHJlc3BvbnNlRGF0YS5kYXRhLm1hcChzZWxmLl9mb3JtYXRPcHRpb25zVVJMKTtcbiAgICAgICAgICAgICAgICBzZWxmLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZU9wdGlvbnNBbmRBZGRCdXR0b24uY2FsbChzZWxmLCB0ZXh0LCBzZWxmLl9vcHRpb25zRGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0RhdGEgZXJyb3InLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGZpbHRlcmVkRGF0YSA9IF9maWx0ZXJEYXRhLmNhbGwodGhpcywgdGV4dCk7XG4gICAgICAgIF91cGRhdGVPcHRpb25zQW5kQWRkQnV0dG9uLmNhbGwodGhpcywgdGV4dCwgZmlsdGVyZWREYXRhKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX2ZpbHRlckRhdGEodGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zRGF0YS5maWx0ZXIoZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgICAgIGRlbGV0ZSBvcHRpb24uc2VsZWN0ZWQ7XG4gICAgICAgIGlmIChvcHRpb24ubGFiZWwpIHtcbiAgICAgICAgICAgIHZhciBsYWJlbCA9IG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRyaW0oKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGV4dC50b0xvd2VyQ2FzZSgpKSA9PSAwO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX3VwZGF0ZU9wdGlvbnNBbmRBZGRCdXR0b24odGV4dCwgZmlsdGVyZWRBcnIpIHtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UsIHsgcHJlc2VydmVTdGF0ZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmlsdGVyZWRBcnIubGVuZ3RoICYmIF8uZmluZChmaWx0ZXJlZEFyciwgaXNFeGFjdE1hdGNoKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UsIHsgcHJlc2VydmVTdGF0ZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9hZGRJdGVtUHJvbXB0KSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbih0aGlzLl9vcHRpb25zRGF0YS5sZW5ndGggPiAxIHx8IHRoaXMuX29wdGlvbnNVUkwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlcmVkQXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zaG93T3B0aW9ucygpO1xuICAgICAgICAgICAgZmlsdGVyZWRBcnJbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBmaWx0ZXJlZEFyclswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0RmlsdGVyZWRPcHRpb25zKGZpbHRlcmVkQXJyKTtcbiAgICB0aGlzLl9jb21ib0xpc3QuZWwuc2Nyb2xsVG9wID0gMDtcblxuICAgIGZ1bmN0aW9uIGlzRXhhY3RNYXRjaChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLmxhYmVsLnRvTG93ZXJDYXNlKCkgPT09IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBtYXAgb2Yga2V5Q29kZXMgdG8gZGlyZWN0aW9uc1xuICogQHR5cGUge09iamVjdH1cbiAqL1xudmFyIGRpcmVjdGlvbk1hcCA9IHsgJzQwJzogMSwgJzM4JzogLTEgfTtcblxuLyoqXG4gKiBMaXN0IGtleWRvd24gaGFuZGxlclxuICogQ2hhbmdlcyB0aGUgc2VsZWN0ZWQgbGlzdCBpdGVtIGJ5IGZpbmRpbmcgdGhlIGFkamFjZW50IGl0ZW0gYW5kIHNldHRpbmcgaXQgdG8gc2VsZWN0ZWQuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gY2hhbmdlU2VsZWN0ZWQodHlwZSwgZXZlbnQpIHtcbiAgICAvL1RPRE8gdGVzdCBtb2NoYVxuICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25NYXBbZXZlbnQua2V5Q29kZV07XG5cbiAgICBpZihkaXJlY3Rpb24pXG4gICAgICAgIF9jaGFuZ2VTZWxlY3RlZC5jYWxsKHRoaXMsIGRpcmVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIF9jaGFuZ2VTZWxlY3RlZChkaXJlY3Rpb24pIHtcbiAgICAvLyBUT0RPOiByZWZhY3RvciBhbmQgdGlkeSB1cCwgbG9va3MgbGlrZSBzb21lIGNvZGUgZHVwbGljYXRpb24uXG4gICAgdmFyIHNlbGVjdGVkID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKVswXVxuICAgICAgICAsIHNjcm9sbFBvcyA9IHRoaXMuX2NvbWJvTGlzdC5lbC5zY3JvbGxUb3BcbiAgICAgICAgLCBzZWxlY3RlZFBvcyA9IHNlbGVjdGVkID8gc2VsZWN0ZWQub2Zmc2V0VG9wIDogMFxuICAgICAgICAsIHJlbGF0aXZlUG9zID0gc2VsZWN0ZWRQb3MgLSBzY3JvbGxQb3M7XG5cbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gX2dldERhdGFWYWx1ZUZyb21FbGVtZW50LmNhbGwodGhpcywgc2VsZWN0ZWQpXG4gICAgICAgICAgICAsIHRoaXNJdGVtID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVtpbmRleF1cbiAgICAgICAgICAgICwgYWRqSXRlbSA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbaW5kZXggKyBkaXJlY3Rpb25dO1xuXG4gICAgICAgIGlmIChhZGpJdGVtKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpc0l0ZW0uc2VsZWN0ZWQ7XG4gICAgICAgICAgICBhZGpJdGVtLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gYWRqSXRlbTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVswXSkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVswXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlbGF0aXZlUG9zID4gdGhpcy5fb3B0aW9uc0hlaWdodCAtIHRoaXMuX2VsZW1lbnRIZWlnaHQqMiAmJiBkaXJlY3Rpb24gPT09IDEpXG4gICAgICAgIHRoaXMuX2NvbWJvTGlzdC5lbC5zY3JvbGxUb3AgKz0gdGhpcy5fZWxlbWVudEhlaWdodCpkaXJlY3Rpb24qNTtcblxuICAgIGlmIChyZWxhdGl2ZVBvcyA8IHRoaXMuX2VsZW1lbnRIZWlnaHQgJiYgZGlyZWN0aW9uID09PSAtMSlcbiAgICAgICAgdGhpcy5fY29tYm9MaXN0LmVsLnNjcm9sbFRvcCArPSB0aGlzLl9lbGVtZW50SGVpZ2h0KmRpcmVjdGlvbio1O1xufVxuXG5cbi8qKlxuICogTW91c2Ugb3ZlciBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25Nb3VzZU92ZXIodHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLl9tb3VzZUlzT3ZlciA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBNb3VzZSBsZWF2ZSBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25Nb3VzZUxlYXZlKHR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX21vdXNlSXNPdmVyID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuX21vdXNlT3V0VGltZXIpIGNsZWFySW50ZXJ2YWwodGhpcy5fbW91c2VPdXRUaW1lcik7XG4gICAgdGhpcy5fbW91c2VPdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKCFzZWxmLl9tb3VzZUlzT3ZlcilcbiAgICAgICAgICAgIF9vbk1vdXNlTGVhdmUuY2FsbChzZWxmKTtcbiAgICB9LCA3NTApO1xufVxuXG5mdW5jdGlvbiBfb25Nb3VzZUxlYXZlKCkge1xuICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSwgeyBwcmVzZXJ2ZVN0YXRlOiB0cnVlIH0pO1xufVxuXG5cbi8qKlxuICogSW5wdXQgY2xpY2sgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uSW5wdXRDbGljayh0eXBlLCBldmVudCkge1xuICAgIHRoaXMuc2hvd09wdGlvbnMoKTtcbiAgICBpZiAodGhpcy5fX3Nob3dBZGRPbkNsaWNrKSB0aGlzLnRvZ2dsZUFkZEJ1dHRvbih0cnVlKTtcbn1cblxuXG4vKipcbiAqIEVudGVyIGtleSBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25FbnRlcktleSh0eXBlLCBldmVudCkge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09IDEzKSB7XG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZClcbiAgICAgICAgICAgIF9zZXREYXRhLmNhbGwodGhpcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZCBidXR0b24gaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uQWRkQnRuICh0eXBlLCBldmVudCkge1xuICAgIHZhciBkYXRhID0geyBsYWJlbDogdGhpcy5fY29tYm9JbnB1dC5lbC52YWx1ZSB9O1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ2FkZGl0ZW0nLCBkYXRhKTtcbiAgICB0aGlzLmV2ZW50cy5wb3N0TWVzc2FnZSgnbWlsb19zdXBlcmNvbWJvYWRkaXRlbScsIGRhdGEpO1xuICAgIHRoaXMudG9nZ2xlQWRkQnV0dG9uKGZhbHNlLCB7IHByZXNlcnZlU3RhdGU6IHRydWUgfSk7XG5cbn1cblxuLyoqXG4gKiBMaXN0IGNsaWNrIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbkxpc3RDbGljayAodHlwZSwgZXZlbnQpIHtcbiAgICB2YXIgaW5kZXggPSBfZ2V0RGF0YVZhbHVlRnJvbUVsZW1lbnQuY2FsbCh0aGlzLCBldmVudC50YXJnZXQpO1xuICAgIHZhciBkYXRhID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVtpbmRleF07XG5cbiAgICB0aGlzLl9zZWxlY3RlZCA9IGRhdGE7XG4gICAgX3NldERhdGEuY2FsbCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xufVxuXG5cbi8qKlxuICogTGlzdCBzY3JvbGwgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uTGlzdFNjcm9sbCAodHlwZSwgZXZlbnQpIHtcbiAgICB2YXIgc2Nyb2xsUG9zID0gZXZlbnQudGFyZ2V0LnNjcm9sbFRvcFxuICAgICAgICAsIGRpcmVjdGlvbiA9IHNjcm9sbFBvcyA+IHRoaXMuX2xhc3RTY3JvbGxQb3MgPyAnZG93bicgOiAndXAnXG4gICAgICAgICwgZmlyc3RDaGlsZCA9IHRoaXMuX2NvbWJvT3B0aW9ucy5lbC5sYXN0RWxlbWVudENoaWxkXG4gICAgICAgICwgbGFzdENoaWxkID0gdGhpcy5fY29tYm9PcHRpb25zLmVsLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgICwgbGFzdEVsUG9zaXRpb24gPSBmaXJzdENoaWxkID8gZmlyc3RDaGlsZC5vZmZzZXRUb3AgOiAwXG4gICAgICAgICwgZmlyc3RFbFBvc2l0aW9uID0gbGFzdENoaWxkID8gbGFzdENoaWxkLm9mZnNldFRvcCA6IDBcbiAgICAgICAgLCBkaXN0RnJvbUxhc3RFbCA9IGxhc3RFbFBvc2l0aW9uIC0gc2Nyb2xsUG9zIC0gdGhpcy5fb3B0aW9uc0hlaWdodCArIHRoaXMuX2VsZW1lbnRIZWlnaHRcbiAgICAgICAgLCBkaXN0RnJvbUZpcnN0RWwgPSBzY3JvbGxQb3MgLSBmaXJzdEVsUG9zaXRpb25cbiAgICAgICAgLCBlbHNGcm9tU3RhcnQgPSBNYXRoLmZsb29yKGRpc3RGcm9tRmlyc3RFbCAvIHRoaXMuX2VsZW1lbnRIZWlnaHQpXG4gICAgICAgICwgZWxzVG9UaGVFbmQgPSBNYXRoLmZsb29yKGRpc3RGcm9tTGFzdEVsIC8gdGhpcy5fZWxlbWVudEhlaWdodClcbiAgICAgICAgLCB0b3RhbEVsZW1lbnRzQmVmb3JlID0gTWF0aC5mbG9vcihzY3JvbGxQb3MgLyB0aGlzLl9lbGVtZW50SGVpZ2h0KSAtIEJVRkZFUjtcblxuICAgIGlmICgoZGlyZWN0aW9uID09ICdkb3duJyAmJiBlbHNUb1RoZUVuZCA8IEJVRkZFUilcbiAgICAgICAgfHwgKGRpcmVjdGlvbiA9PSAndXAnICYmIGVsc0Zyb21TdGFydCA8IEJVRkZFUikpIHtcbiAgICAgICAgdGhpcy5fc3RhcnRJbmRleCA9IHRvdGFsRWxlbWVudHNCZWZvcmUgPiAwID8gdG90YWxFbGVtZW50c0JlZm9yZSA6IDA7XG4gICAgICAgIHRoaXMuX2VuZEluZGV4ID0gdG90YWxFbGVtZW50c0JlZm9yZSArIE1BWF9SRU5ERVJFRDtcbiAgICAgICAgdGhpcy5fZWxlbWVudEhlaWdodCA9IGZpcnN0Q2hpbGQuc3R5bGUuaGVpZ2h0O1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cbiAgICB0aGlzLl9sYXN0U2Nyb2xsUG9zID0gc2Nyb2xsUG9zO1xufVxuXG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RcbiAqIFJldHJpZXZlcyB0aGUgZGF0YS12YWx1ZSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSB0aGUgZWxlbWVudCBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbmRleCBvZlxuICogdGhlIGZpbHRlcmVkT3B0aW9uc1xuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIF9nZXREYXRhVmFsdWVGcm9tRWxlbWVudChlbCkge1xuICAgIHJldHVybiBOdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpICsgdGhpcy5fc3RhcnRJbmRleDtcbn1cblxuLyoqXG4gKiBQcml2YXRlIG1ldGhvZFxuICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgU3VwZXJDb21ibywgdGFraW5nIGNhcmUgdG8gcmVzZXQgc29tZSB0aGluZ3MgYW5kIHRlbXBvcmFyaWx5XG4gKiB1bnN1YnNjcmliZSBkYXRhIGxpc3RlbmVycy5cbiAqL1xuZnVuY3Rpb24gX3NldERhdGEoKSB7XG4gICAgZGVsZXRlIHRoaXMuX3NlbGVjdGVkLnNlbGVjdGVkO1xuICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSk7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLm9mZignJywgeyBzdWJzY3JpYmVyOiBvbkRhdGFDaGFuZ2UsIGNvbnRleHQ6IHRoaXMgfSk7XG4gICAgLy9zdXBlcmNvbWJvIGxpc3RlbmVycyBvZmZcbiAgICB0aGlzLmRhdGEuc2V0KHRoaXMuX3NlbGVjdGVkKTtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKENPTUJPX0NIQU5HRV9NRVNTQUdFKTtcbiAgICB0aGlzLl9jb21ib0lucHV0LmRhdGEub24oJycsIHsgc3Vic2NyaWJlcjogb25EYXRhQ2hhbmdlLCBjb250ZXh0OiB0aGlzIH0pO1xuICAgIC8vc3VwZXJjb21ibyBsaXN0ZW5lcnMgb25cbiAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XG4gICAgdGhpcy5zZXRGaWx0ZXJlZE9wdGlvbnModGhpcy5fb3B0aW9uc0RhdGEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5Jyk7XG5cblxudmFyIE1MVGV4dCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxUZXh0Jywge1xuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktdGV4dCdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFRleHQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MVGV4dDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbnZhciBNTFRleHRhcmVhID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFRleHRhcmVhJywge1xuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktdGV4dGFyZWEnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxUZXh0YXJlYSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxUZXh0YXJlYTtcblxuXG52YXIgU0FNUExFX0FVVE9SRVNJWkVfVEVYVCA9ICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdCwnO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxUZXh0YXJlYSwge1xuICAgIHN0YXJ0QXV0b3Jlc2l6ZTogTUxUZXh0YXJlYSRzdGFydEF1dG9yZXNpemUsXG4gICAgc3RvcEF1dG9yZXNpemU6IE1MVGV4dGFyZWEkc3RvcEF1dG9yZXNpemUsXG4gICAgaXNBdXRvcmVzaXplZDogTUxUZXh0YXJlYSRpc0F1dG9yZXNpemVkLFxuICAgIGRpc2FibGU6IE1MVGV4dGFyZWEkZGlzYWJsZVxufSk7XG5cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRzdGFydEF1dG9yZXNpemUob3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9hdXRvcmVzaXplKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ01MVGV4dGFyZWEgc3RhcnRBdXRvcmVzaXplOiBhdXRvcmVzaXplIGlzIGFscmVhZHkgb24nKTtcbiAgICB0aGlzLl9hdXRvcmVzaXplID0gdHJ1ZTtcbiAgICB0aGlzLl9hdXRvcmVzaXplT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBfYWRqdXN0QXJlYUhlaWdodC5jYWxsKHRoaXMpO1xuICAgIF9tYW5hZ2VTdWJzY3JpcHRpb25zLmNhbGwodGhpcywgJ29uJyk7XG59XG5cblxuZnVuY3Rpb24gX21hbmFnZVN1YnNjcmlwdGlvbnMob25PZmYpIHtcbiAgICB0aGlzLmV2ZW50c1tvbk9mZl0oJ2NsaWNrJywgeyBzdWJzY3JpYmVyOiBfYWRqdXN0QXJlYUhlaWdodCwgY29udGV4dDogdGhpcyB9KTtcbiAgICB0aGlzLmRhdGFbb25PZmZdKCcnLCB7IHN1YnNjcmliZXI6IF9hZGp1c3RBcmVhSGVpZ2h0LCBjb250ZXh0OiB0aGlzIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9hZGp1c3RBcmVhSGVpZ2h0KCkge1xuICAgIHRoaXMuZWwuc3R5bGUuaGVpZ2h0ID0gMDtcblxuICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmVsLnNjcm9sbEhlaWdodFxuICAgICAgICAsIG1pbkhlaWdodCA9IHRoaXMuX2F1dG9yZXNpemVPcHRpb25zLm1pbkhlaWdodFxuICAgICAgICAsIG1heEhlaWdodCA9IHRoaXMuX2F1dG9yZXNpemVPcHRpb25zLm1heEhlaWdodDtcblxuICAgIG5ld0hlaWdodCA9IG5ld0hlaWdodCA+PSBtYXhIZWlnaHRcbiAgICAgICAgICAgICAgICA/IG1heEhlaWdodFxuICAgICAgICAgICAgICAgIDogbmV3SGVpZ2h0IDw9IG1pbkhlaWdodFxuICAgICAgICAgICAgICAgID8gbWluSGVpZ2h0XG4gICAgICAgICAgICAgICAgOiBuZXdIZWlnaHQ7XG5cbiAgICB0aGlzLmVsLnN0eWxlLmhlaWdodCA9IG5ld0hlaWdodCArICdweCc7XG59XG5cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRzdG9wQXV0b3Jlc2l6ZSgpIHtcbiAgICBpZiAoISB0aGlzLl9hdXRvcmVzaXplKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ01MVGV4dGFyZWEgc3RvcEF1dG9yZXNpemU6IGF1dG9yZXNpemUgaXMgbm90IG9uJyk7XG4gICAgdGhpcy5fYXV0b3Jlc2l6ZSA9IGZhbHNlO1xuICAgIF9tYW5hZ2VTdWJzY3JpcHRpb25zLmNhbGwodGhpcywgJ29mZicpO1xufVxuXG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkaXNBdXRvcmVzaXplZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b3Jlc2l6ZTtcbn1cblxuXG5mdW5jdGlvbiBNTFRleHRhcmVhJGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuX2F1dG9yZXNpemUpXG4gICAgICAgIHRoaXMuc3RvcEF1dG9yZXNpemUoKTtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRkaXNhYmxlKGRpc2FibGUpIHtcbiAgICB0aGlzLmVsLmRpc2FibGVkID0gZGlzYWJsZTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbnZhciBNTFRpbWUgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MVGltZScsIHtcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxUaW1lX2dldCxcbiAgICAgICAgc2V0OiBNTFRpbWVfc2V0LFxuICAgICAgICBkZWw6IE1MVGltZV9kZWwsXG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktdGltZSdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFRpbWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MVGltZTtcblxuXG52YXIgVElNRV9SRUdFWCA9IC9eKFswLTldezEsMn0pKD86XFw6fFxcLikoWzAtOV17MSwyfSkkL1xuICAgICwgVElNRV9URU1QTEFURSA9ICdoaDptbSc7XG5cbmZ1bmN0aW9uIE1MVGltZV9nZXQoKSB7XG4gICAgdmFyIHRpbWVTdHIgPSB0aGlzLmVsLnZhbHVlO1xuICAgIHZhciBtYXRjaCA9IHRpbWVTdHIubWF0Y2goVElNRV9SRUdFWCk7XG4gICAgaWYgKCEgbWF0Y2gpIHJldHVybjtcbiAgICB2YXIgaG91cnMgPSBtYXRjaFsxXVxuICAgICAgICAsIG1pbnMgPSBtYXRjaFsyXTtcbiAgICBpZiAoaG91cnMgPiAyMyB8fCBtaW5zID4gNTkpIHJldHVybjtcbiAgICB2YXIgdGltZSA9IG5ldyBEYXRlKDE5NzAsIDAsIDEsIGhvdXJzLCBtaW5zKTtcblxuICAgIHJldHVybiBfLnRvRGF0ZSh0aW1lKTtcbn1cblxuXG5mdW5jdGlvbiBNTFRpbWVfc2V0KHZhbHVlKSB7XG4gICAgdmFyIHRpbWUgPSBfLnRvRGF0ZSh2YWx1ZSk7XG4gICAgaWYgKCEgdGltZSkge1xuICAgICAgICB0aGlzLmVsLnZhbHVlID0gJyc7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGltZVN0ciA9IFRJTUVfVEVNUExBVEVcbiAgICAgICAgICAgIC5yZXBsYWNlKCdoaCcsIHBhZCh0aW1lLmdldEhvdXJzKCkpKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ21tJywgcGFkKHRpbWUuZ2V0TWludXRlcygpKSk7XG5cbiAgICB0aGlzLmVsLnZhbHVlID0gdGltZVN0cjtcbiAgICByZXR1cm4gdGltZVN0cjtcblxuICAgIGZ1bmN0aW9uIHBhZChuKSB7cmV0dXJuIG4gPCAxMCA/ICcwJyArIG4gOiBuOyB9XG59XG5cblxuZnVuY3Rpb24gTUxUaW1lX2RlbCgpIHtcbiAgICB0aGlzLmVsLnZhbHVlID0gJyc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKTtcblxuXG52YXIgTUxXcmFwcGVyID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFdyYXBwZXInLCB7XG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS13cmFwcGVyJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MV3JhcHBlcik7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxXcmFwcGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi8uLi9jX3JlZ2lzdHJ5JylcbiAgICAsIGNvbXBvbmVudE5hbWUgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlsL2NvbXBvbmVudF9uYW1lJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgQUxFUlRfQ1NTX0NMQVNTRVMgPSB7XG4gICAgc3VjY2VzczogJ2FsZXJ0LXN1Y2Nlc3MnLFxuICAgIHdhcm5pbmc6ICdhbGVydC13YXJuaW5nJyxcbiAgICBpbmZvOiAnYWxlcnQtaW5mbycsXG4gICAgZGFuZ2VyOiAnYWxlcnQtZGFuZ2VyJyxcbiAgICBmaXhlZDogJ2FsZXJ0LWZpeGVkJ1xufTtcblxuXG52YXIgTUxBbGVydCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxBbGVydCcsIHtcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiBbJ21sLWJzLWFsZXJ0JywgJ2FsZXJ0JywgJ2ZhZGUnXSxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgJ3JvbGUnOiAnYWxlcnQnLFxuICAgICAgICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnXFxcbiAgICAgICAgICAgIHt7PyBpdC5jbG9zZSB9fVxcXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtbC1iaW5kPVwiW2V2ZW50c106Y2xvc2VCdG5cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cImFsZXJ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvYnV0dG9uPlxcXG4gICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICB7ez0gaXQubWVzc2FnZX19J1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQWxlcnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MQWxlcnQ7XG5cblxuXy5leHRlbmQoTUxBbGVydCwge1xuICAgIGNyZWF0ZUFsZXJ0OiBNTEFsZXJ0JCRjcmVhdGVBbGVydCxcbiAgICBvcGVuQWxlcnQ6IE1MQWxlcnQkJG9wZW5BbGVydCxcbn0pO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxBbGVydCwge1xuICAgIG9wZW5BbGVydDogTUxBbGVydCRvcGVuQWxlcnQsXG4gICAgY2xvc2VBbGVydDogTUxBbGVydCRjbG9zZUFsZXJ0XG59KTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgYWxlcnQgaW5zdGFuY2UuIFRvIGNyZWF0ZSBhbmQgb3BlbiBhdCB0aGUgc2FtZSB0aW1lIHVzZSBbb3BlbkFsZXJ0XSgjTUxBbGVydCQkb3BlbkFsZXJ0KVxuICogYG9wdGlvbnNgIGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgICAgIG1lc3NhZ2U6IHN0cmluZyBhbGVydCBtZXNzYWdlXG4gKiAgICAgIHR5cGU6ICAgIG9wdGlvbmFsIHN0cmluZyB0aGUgdHlwZSBvZiBhbGVydCBtZXNzYWdlLCBvbmUgb2Ygc3VjY2Vzcywgd2FybmluZywgaW5mbywgZGFuZ2VyLCBmaXhlZFxuICogICAgICAgICAgICAgICBkZWZhdWx0ICdpbmZvJ1xuICogICAgICBjbG9zZTogICBvcHRpb25hbCBmYWxzZSB0byBwcmV2ZW50IHVzZXIgZnJvbSBjbG9zaW5nXG4gKiAgICAgICAgICAgICAgIG9yIHRydWUgKGRlZmF1bHQpIHRvIGVuYWJsZSBjbG9zaW5nIGFuZCByZW5kZXIgYSBjbG9zZSBidXR0b25cbiAqICAgICAgdGltZW91dDogb3B0aW9uYWwgdGltZXIsIGluIG1pbGxpc2Vjb25kcyB0byBhdXRvbWF0aWNhbGx5IGNsb3NlIHRoZSBhbGVydFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGFsZXJ0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZnVuY3Rpb24gTUxBbGVydCQkY3JlYXRlQWxlcnQob3B0aW9ucykge1xuICAgIGNoZWNrKG9wdGlvbnMsIHtcbiAgICAgICAgbWVzc2FnZTogU3RyaW5nLFxuICAgICAgICB0eXBlOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBjbG9zZTogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbiksXG4gICAgICAgIHRpbWVvdXQ6IE1hdGNoLk9wdGlvbmFsKE51bWJlcilcbiAgICB9KTtcblxuICAgIHZhciBhbGVydCA9IE1MQWxlcnQuY3JlYXRlT25FbGVtZW50KCk7XG5cbiAgICBvcHRpb25zID0gX3ByZXBhcmVPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgdmFyIGFsZXJ0Q2xzID0gQUxFUlRfQ1NTX0NMQVNTRVNbb3B0aW9ucy50eXBlXTtcbiAgICBhbGVydC5kb20uYWRkQ3NzQ2xhc3NlcyhhbGVydENscyk7XG5cbiAgICBhbGVydC5fYWxlcnQgPSB7XG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgfTtcblxuICAgIGFsZXJ0LnRlbXBsYXRlLnJlbmRlcihvcHRpb25zKS5iaW5kZXIoKTtcblxuICAgIHZhciBhbGVydFNjb3BlID0gYWxlcnQuY29udGFpbmVyLnNjb3BlO1xuXG4gICAgaWYgKG9wdGlvbnMuY2xvc2UpXG4gICAgICAgIGFsZXJ0U2NvcGUuY2xvc2VCdG4uZXZlbnRzLm9uKCdjbGljaycsXG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9vbkNsb3NlQnRuQ2xpY2ssIGNvbnRleHQ6IGFsZXJ0IH0pO1xuXG4gICAgaWYgKG9wdGlvbnMudGltZW91dClcbiAgICAgICAgdmFyIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYoYWxlcnQuX2FsZXJ0LnZpc2libGUpXG4gICAgICAgICAgICAgICAgYWxlcnQuY2xvc2VBbGVydCgpO1xuICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQpO1xuXG4gICAgcmV0dXJuIGFsZXJ0O1xufVxuXG5cbi8qKlxuICogQ3JlYXRlIGFuZCBzaG93IGFsZXJ0IHBvcHVwXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgb2JqZWN0IHdpdGggbWVzc2FnZSwgdHlwZSwgY2xvc2UgYW5kIHRpbWVvdXRcbiAqIEByZXR1cm4ge01MQWxlcnR9IHRoZSBhbGVydCBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBNTEFsZXJ0JCRvcGVuQWxlcnQob3B0aW9ucykge1xuICAgIHZhciBhbGVydCA9IE1MQWxlcnQuY3JlYXRlQWxlcnQob3B0aW9ucyk7XG4gICAgYWxlcnQub3BlbkFsZXJ0KCk7XG4gICAgcmV0dXJuIGFsZXJ0O1xufVxuXG5cbmZ1bmN0aW9uIF9vbkNsb3NlQnRuQ2xpY2sodHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLmNsb3NlQWxlcnQoKTtcbn1cblxuXG5mdW5jdGlvbiBfcHJlcGFyZU9wdGlvbnMob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBfLmNsb25lKG9wdGlvbnMpO1xuICAgIG9wdGlvbnMuY2xvc2UgPSB0eXBlb2Ygb3B0aW9ucy5jbG9zZSA9PSAndW5kZWZpbmVkJyB8fCBvcHRpb25zLmNsb3NlID09PSB0cnVlO1xuICAgIG9wdGlvbnMudGltZW91dCA9IE1hdGguZmxvb3Iob3B0aW9ucy50aW1lb3V0KTtcbiAgICBvcHRpb25zLnR5cGUgPSBvcHRpb25zLnR5cGUgfHwgJ2luZm8nO1xuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5cblxuLyoqXG4gKiBPcGVuIHRoZSBhbGVydFxuICovXG5mdW5jdGlvbiBNTEFsZXJ0JG9wZW5BbGVydCgpIHtcbiAgICBfdG9nZ2xlQWxlcnQuY2FsbCh0aGlzLCB0cnVlKTtcbn1cblxuXG4vKipcbiAqIENsb3NlIHRoZSBhbGVydFxuICovXG5mdW5jdGlvbiBNTEFsZXJ0JGNsb3NlQWxlcnQoKSB7XG4gICAgX3RvZ2dsZUFsZXJ0LmNhbGwodGhpcywgZmFsc2UpO1xuICAgIHRoaXMuZGVzdHJveSgpO1xufVxuXG5cbmZ1bmN0aW9uIF90b2dnbGVBbGVydChkb1Nob3cpIHtcbiAgICBkb1Nob3cgPSB0eXBlb2YgZG9TaG93ID09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyAhIHRoaXMuX2FsZXJ0LnZpc2libGVcbiAgICAgICAgICAgICAgICA6ICEhIGRvU2hvdztcblxuICAgIHZhciBhZGRSZW1vdmUgPSBkb1Nob3cgPyAnYWRkJyA6ICdyZW1vdmUnXG4gICAgICAgICwgYXBwZW5kUmVtb3ZlID0gZG9TaG93ID8gJ2FwcGVuZENoaWxkJyA6ICdyZW1vdmVDaGlsZCc7XG5cbiAgICB0aGlzLl9hbGVydC52aXNpYmxlID0gZG9TaG93O1xuXG4gICAgZG9jdW1lbnQuYm9keVthcHBlbmRSZW1vdmVdKHRoaXMuZWwpO1xuICAgIHRoaXMuZG9tLnRvZ2dsZShkb1Nob3cpO1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICFkb1Nob3cpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0W2FkZFJlbW92ZV0oJ2luJyk7XG4gICAgdGhpcy5lbFtkb1Nob3cgPyAnZm9jdXMnIDogJ2JsdXInXSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi8uLi9jX3JlZ2lzdHJ5JylcbiAgICAsIGNvbXBvbmVudE5hbWUgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlsL2NvbXBvbmVudF9uYW1lJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgREVGQVVMVF9CVVRUT05TID0gWyB7IHR5cGU6ICdkZWZhdWx0JywgbGFiZWw6ICdPSycsIHJlc3VsdDogJ09LJyB9IF07XG5cbnZhciBDTE9TRV9PUFRJT05TID0gWydiYWNrZHJvcCcsICdrZXlib2FyZCcsICdidXR0b24nXTtcblxudmFyIEJVVFRPTl9DU1NfQ0xBU1NFUyA9IHsgLy8gVE9ETyAtIHVzZSBpbiB0ZW1wbGF0ZVxuICAgIGRlZmF1bHQ6ICdidG4tZGVmYXVsdCcsXG4gICAgcHJpbWFyeTogJ2J0bi1wcmltYXJ5JyxcbiAgICBzdWNjZXNzOiAnYnRuLXN1Y2Nlc3MnLFxuICAgIGluZm86ICdidG4taW5mbycsXG4gICAgd2FybmluZzogJ2J0bi13YXJuaW5nJyxcbiAgICBkYW5nZXI6ICdidG4tZGFuZ2VyJyxcbiAgICBsaW5rOiAnYnRuLWxpbmsnXG59O1xuXG5cbi8qKlxuICogRGlhbG9nIGNsYXNzIHRvIHNob3cgY3VzdG9tIGRpYWxvZyBib3hlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uIC0gc2VlIFtjcmVhdGVEaWFsb2ddKCNNTERpYWxvZyQkY3JlYXRlRGlhbG9nKSBtZXRob2QuXG4gKiBPbmx5IG9uZSBkaWFsb2cgY2FuIGJlIG9wZW5lZCBhdCBhIHRpbWUgLSB0cnlpbmcgdG8gb3BlbiBhbm90aGVyIHdpbGwgbG9nIGVycm9yIHRvIGNvbnNvbGUuIEN1cnJlbnRseSBvcGVuZWQgZGlhbG9nIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgW2dldEN1cnJlbnREaWFsb2ddKCNNTERpYWxvZyQkZ2V0Q3VycmVudERpYWxvZykgY2xhc3MgbWV0aG9kLlxuICovXG52YXIgTUxEaWFsb2cgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MRGlhbG9nJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6IFsnbWwtYnMtZGlhbG9nJywgJ21vZGFsJywgJ2ZhZGUnXSxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgJ3JvbGUnOiAnZGlhbG9nJyxcbiAgICAgICAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJ1xcXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIHt7PSBpdC5jc3NDbGFzcyB9fVwiPlxcXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez8gaXQudGl0bGUgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGl0LmNsb3NlLmJ1dHRvbiB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWwtYmluZD1cIltldmVudHNdOmNsb3NlQnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIj4mdGltZXM7PC9idXR0b24+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj57ez0gaXQudGl0bGUgfX08L2g0PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgIHt7PyBpdC5odG1sIHx8IGl0LnRleHQgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBtbC1iaW5kPVwiW2NvbnRhaW5lcl06ZGlhbG9nQm9keVwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGl0Lmh0bWwgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez0gaXQuaHRtbCB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/P319XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3s9IGl0LnRleHQgfX08L3A+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgIHt7PyBpdC5idXR0b25zICYmIGl0LmJ1dHRvbnMubGVuZ3RoIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7fiBpdC5idXR0b25zIDpidG4gfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4te3s9IGJ0bi50eXBlIH19e3s/IGJ0bi5jbHMgfX0ge3s9IGJ0bi5jbHMgfX17ez99fVwiXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sLWJpbmQ9XCJbZXZlbnRzXTp7ez0gYnRuLm5hbWUgfX1cIj57ez0gYnRuLmxhYmVsIH19PC9idXR0b24+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e359fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgIDwvZGl2PidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERpYWxvZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxEaWFsb2c7XG5cblxuXy5leHRlbmQoTUxEaWFsb2csIHtcbiAgICBjcmVhdGVEaWFsb2c6IE1MRGlhbG9nJCRjcmVhdGVEaWFsb2csXG4gICAgb3BlbkRpYWxvZzogTUxEaWFsb2ckJG9wZW5EaWFsb2csXG4gICAgZ2V0T3BlbmVkRGlhbG9nOiBNTERpYWxvZyQkZ2V0T3BlbmVkRGlhbG9nXG59KTtcblxuXG5fLmV4dGVuZFByb3RvKE1MRGlhbG9nLCB7XG4gICAgb3BlbkRpYWxvZzogTUxEaWFsb2ckb3BlbkRpYWxvZyxcbiAgICBjbG9zZURpYWxvZzogTUxEaWFsb2ckY2xvc2VEaWFsb2csXG4gICAgZGVzdHJveTogTUxEaWFsb2ckZGVzdHJveVxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGRpYWxvZyBpbnN0YW5jZS4gVG8gY3JlYXRlIGFuZCBvcGVuIGF0IHRoZSBzYW1lIHRpbWUgW29wZW5EaWFsb2ddKCNNTERpYWxvZyQkb3BlbkRpYWxvZylcbiAqIGBvcHRpb25zYCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAgIHRpdGxlOiBvcHRpb25hbCBkaWFsb2cgdGl0bGVcbiAqICAgICBodG1sOiBvcHRpb25hbCBkaWFsb2cgdGV4dCBhcyBodG1sICh3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRleHQgaWYgYm90aCB0ZXh0IG5kIGh0bWwgYXJlIHBhc3NlZClcbiAqICAgICAgIG9yXG4gKiAgICAgdGV4dDogb3B0aW9uYWwgZGlhbG9nIHRleHRcbiAqICAgICBjbG9zZTogb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBiYWNrZHJvcCBhbmQgZXNjIGtleSBmcm9tIGNsb3NpbmcgdGhlIGRpYWxvZyBhbmQgcmVtb3ZpbmcgY2xvc2UgYnV0dG9uIGluIHRvcCByaWdodCBjb3JuZXJcbiAqICAgICAgICAgICAgb3IgdHJ1ZSAoZGVmYXVsdCkgdG8gZW5hYmxlIGFsbCBjbG9zZSBvcHRpb25zXG4gKiAgICAgICAgICAgIG9yIG9iamVjdCB3aXRoIHByb3BlcnRpZXNcbiAqICAgICAgICAgYmFja2Ryb3A6IGZhbHNlIG9yIHRydWUgKGRlZmF1bHQpLCBjbG9zZSBkaWFsb2cgd2hlbiBiYWNrZHJvcCBjbGlja2VkXG4gKiAgICAgICAgIGtleWJvYXJkOiBmYWxzZSBvciB0cnVlIChkZWZhdWx0KSwgY2xvc2UgZGlhbG9nIHdoZW4gZXNjIGtleSBpcyBwcmVzc2VkXG4gKiAgICAgICAgIGJ1dHRvbjogZmFsc2Ugb3IgdHJ1ZSAoZGVmYXVsdCksIHNob3cgY2xvc2UgYnV0dG9uIGluIHRoZSBoZWFkZXIgKHdvbid0IGJlIHNob3duIGlmIHRoZXJlIGlzIG5vIGhlYWRlciB3aGVuIHRpdGxlIGlzIG5vdCBwYXNzZWQpXG4gKiAgICAgYnV0dG9uczogb3B0aW9uYWwgYXJyYXkgb2YgYnV0dG9ucyBjb25maWd1cmF0aW9ucywgd2hlcmUgZWFjaCBidXR0b24gY29uZmlnIGlzIGFuIG9iamVjdFxuICogICAgICAgICBuYW1lOiAgIG9wdGlvbmFsIG5hbWUgb2YgY29tcG9uZW50LCBzaG91bGQgYmUgdW5pcXVlIGFuZCBzaG91bGQgbm90IGJlIGBjbG9zZUJ0bmAsIGlmIG5vdCBwYXNzZWQgYSB0aW1lc3RhbXAgYmFzZWQgbmFtZSB3aWxsIGJlIHVzZWRcbiAqICAgICAgICAgdHlwZTogICBidXR0b24gdHlwZSwgd2lsbCBkZXRlcm1pbmUgYnV0dG9uIENTUyBzdHlsZS4gUG9zc2libGUgdHlwZXMgYXJlOiBkZWZ1bHQsIHByaW1hcnksIHN1Y2Nlc3MsIGluZm8sIHdhcm5pbmcsIGRhbmdlciwgbGluayAobWFwIHRvIHJlbGF0ZWQgYm9vdHN0cmFwIGJ1dHRvbiBzdHlsZXMpXG4gKiAgICAgICAgIGxhYmVsOiAgYnV0dG9uIGxhYmVsXG4gKiAgICAgICAgIGNsb3NlOiAgb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCB0aGlzIGJ1dHRvbiBmcm9tIGNsb3NpbmcgZGlhbG9nXG4gKiAgICAgICAgIHJlc3VsdDogc3RyaW5nIHdpdGggZGlhbG9nIGNsb3NlIHJlc3VsdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGRpYWxvZyBzdWJzY3JpYmVyIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXJcbiAqICAgICAgICAgZGF0YTogICBhbnkgdmFsdWUvb2JqZWN0IG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gZGlhbG9nIHN1YnNjcmliZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuXG4gKiAgICAgICAgICAgICAgICAgSWYgZnVuY3Rpb24gaXMgcGFzc2VkIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggZGlhbG9nIGFzIGNvbnRleHQgYW5kIGJ1dHRvbiBvcHRpb25zIGFzIHBhcmFtZXRlci5cbiAqXG4gKiAgICAgSWYgYHRpdGxlYCBpcyBub3QgcGFzc2VkLCBkaWFsb2cgd2lsbCBub3QgaGF2ZSB0aXRsZSBzZWN0aW9uXG4gKiAgICAgSWYgbmVpdGhlciBgdGV4dGAgbm9yIGBodG1sYCBpcyBwYXNzZWQsIGRpYWxvZyB3aWxsIG5vdCBoYXZlIGJvZHkgc2VjdGlvbi5cbiAqICAgICBJZiBgYnV0dG9uc2AgYXJlIG5vdCBwYXNzZWQsIHRoZXJlIHdpbGwgb25seSBiZSBPSyBidXR0b24uXG4gKlxuICogV2hlbiBkaWFsb2cgaXMgY2xvc2VkLCB0aGUgc3Vic2NyaWJlciBpcyBjYWxsZWQgd2l0aCByZWF1bHQgYW5kIG9wdGlvbmFsIGRhdGEgYXMgZGVmaW5lZCBpbiBidXR0b25zIGNvbmZpZ3VyYXRpb25zLlxuICogSWYgYmFja2Ryb3AgaXMgY2xpY2tlZCBvciBFU0Mga2V5IGlzIHByZXNzZWQgdGhlIHJlc3VsdCB3aWxsIGJlICdkaXNtaXNzZWQnXG4gKiBJZiBjbG9zZSBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgaXMgY2xpY2tlZCwgdGhlIHJlc3VsdCB3aWxsIGJlICdjbG9zZWQnIChkZWZhdWx0IHJlc3VsdClcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBkaWFsb2cgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gaW5pdGlhbGl6ZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBkaWFsb2dcbiAqL1xuZnVuY3Rpb24gTUxEaWFsb2ckJGNyZWF0ZURpYWxvZyhvcHRpb25zLCBpbml0aWFsaXplKSB7XG4gICAgY2hlY2sob3B0aW9ucywge1xuICAgICAgICB0aXRsZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgaHRtbDogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgdGV4dDogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY2xvc2U6IE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEJvb2xlYW4sIHtcbiAgICAgICAgICAgIGJhY2tkcm9wOiBNYXRjaC5PcHRpb25hbChCb29sZWFuKSxcbiAgICAgICAgICAgIGtleWJvYXJkOiBNYXRjaC5PcHRpb25hbChCb29sZWFuKSxcbiAgICAgICAgICAgIGJ1dHRvbjogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbilcbiAgICAgICAgfSkpLFxuICAgICAgICBidXR0b25zOiBNYXRjaC5PcHRpb25hbChbIHtcbiAgICAgICAgICAgIG5hbWU6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICBsYWJlbDogU3RyaW5nLFxuICAgICAgICAgICAgY2xvc2U6IE1hdGNoLk9wdGlvbmFsKEJvb2xlYW4pLFxuICAgICAgICAgICAgcmVzdWx0OiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICAgICAgZGF0YTogTWF0Y2guT3B0aW9uYWwoTWF0Y2guQW55KSxcbiAgICAgICAgICAgIGNsczogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKVxuICAgICAgICB9IF0pLFxuICAgICAgICBjc3NDbGFzczogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKVxuICAgIH0pO1xuXG4gICAgdmFyIGRpYWxvZyA9IE1MRGlhbG9nLmNyZWF0ZU9uRWxlbWVudCgpO1xuXG4gICAgb3B0aW9ucyA9IF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBkaWFsb2cuX2RpYWxvZyA9IHtcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICB9O1xuXG4gICAgZGlhbG9nLnRlbXBsYXRlXG4gICAgICAgIC5yZW5kZXIob3B0aW9ucylcbiAgICAgICAgLmJpbmRlcigpO1xuXG4gICAgdmFyIGRpYWxvZ1Njb3BlID0gZGlhbG9nLmNvbnRhaW5lci5zY29wZTtcblxuICAgIGlmIChvcHRpb25zLmNsb3NlLmJhY2tkcm9wKVxuICAgICAgICBkaWFsb2cuZXZlbnRzLm9uKCdjbGljaycsXG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9vbkJhY2tkcm9wQ2xpY2ssIGNvbnRleHQ6IGRpYWxvZyB9KTtcblxuICAgIGlmIChvcHRpb25zLnRpdGxlICYmIG9wdGlvbnMuY2xvc2UuYnV0dG9uKVxuICAgICAgICBkaWFsb2dTY29wZS5jbG9zZUJ0bi5ldmVudHMub24oJ2NsaWNrJyxcbiAgICAgICAgICAgIHsgc3Vic2NyaWJlcjogX29uQ2xvc2VCdG5DbGljaywgY29udGV4dDogZGlhbG9nIH0pO1xuXG4gICAgb3B0aW9ucy5idXR0b25zLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIHZhciBidXR0b25TdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcjogXy5wYXJ0aWFsKF9kaWFsb2dCdXR0b25DbGljaywgYnRuKSxcbiAgICAgICAgICAgIGNvbnRleHQ6IGRpYWxvZ1xuICAgICAgICB9O1xuICAgICAgICBkaWFsb2dTY29wZVtidG4ubmFtZV0uZXZlbnRzLm9uKCdjbGljaycsIGJ1dHRvblN1YnNjcmliZXIpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluaXRpYWxpemUpIGluaXRpYWxpemUoZGlhbG9nKTtcbiAgICByZXR1cm4gZGlhbG9nO1xufVxuXG5cbmZ1bmN0aW9uIF9kaWFsb2dCdXR0b25DbGljayhidXR0b24pIHtcbiAgICBpZiAoYnV0dG9uLmNsb3NlICE9PSBmYWxzZSlcbiAgICAgICAgX3RvZ2dsZURpYWxvZy5jYWxsKHRoaXMsIGZhbHNlKTtcblxuICAgIHZhciBkYXRhID0gXy5yZXN1bHQoYnV0dG9uLmRhdGEsIHRoaXMsIGJ1dHRvbik7XG4gICAgX2Rpc3BhdGNoUmVzdWx0LmNhbGwodGhpcywgYnV0dG9uLnJlc3VsdCwgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gX2Rpc3BhdGNoUmVzdWx0KHJlc3VsdCwgZGF0YSkge1xuICAgIHZhciBzdWJzY3JpYmVyID0gdGhpcy5fZGlhbG9nLnN1YnNjcmliZXI7XG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyID09ICdmdW5jdGlvbicpXG4gICAgICAgIHN1YnNjcmliZXIuY2FsbCh0aGlzLCByZXN1bHQsIGRhdGEpO1xuICAgIGVsc2VcbiAgICAgICAgc3Vic2NyaWJlci5zdWJzY3JpYmVyLmNhbGwoc3Vic2NyaWJlci5jb250ZXh0LCByZXN1bHQsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9vbkJhY2tkcm9wQ2xpY2soZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgPT0gdGhpcy5lbClcbiAgICAgICAgdGhpcy5jbG9zZURpYWxvZygnZGlzbWlzc2VkJyk7XG59XG5cblxuZnVuY3Rpb24gX29uQ2xvc2VCdG5DbGljaygpIHtcbiAgICB0aGlzLmNsb3NlRGlhbG9nKCdjbG9zZWQnKTtcbn1cblxuXG5mdW5jdGlvbiBfb25LZXlEb3duKGV2ZW50KSB7XG4gICAgaWYgKG9wZW5lZERpYWxvZ1xuICAgICAgICAgICAgJiYgb3BlbmVkRGlhbG9nLl9kaWFsb2cub3B0aW9ucy5jbG9zZS5rZXlib2FyZFxuICAgICAgICAgICAgJiYgZXZlbnQua2V5Q29kZSA9PSAyNykgLy8gZXNjIGtleVxuICAgICAgICBvcGVuZWREaWFsb2cuY2xvc2VEaWFsb2coJ2Rpc21pc3NlZCcpO1xufVxuXG5cbmZ1bmN0aW9uIF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IF8uY2xvbmUob3B0aW9ucyk7XG4gICAgb3B0aW9ucy5idXR0b25zID0gXy5jbG9uZShvcHRpb25zLmJ1dHRvbnMgfHwgREVGQVVMVF9CVVRUT05TKTtcbiAgICBvcHRpb25zLmJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLm5hbWUgPSBidG4ubmFtZSB8fCBjb21wb25lbnROYW1lKCk7XG4gICAgfSk7XG5cbiAgICBvcHRpb25zLmNsb3NlID0gdHlwZW9mIG9wdGlvbnMuY2xvc2UgPT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfLm9iamVjdChDTE9TRV9PUFRJT05TLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlb2Ygb3B0aW9ucy5jbG9zZSA9PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXy5tYXBUb09iamVjdChDTE9TRV9PUFRJT05TLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihvcHQpIHsgcmV0dXJuIG9wdGlvbnMuY2xvc2Vbb3B0XSAhPT0gZmFsc2U7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfLm9iamVjdChDTE9TRV9PUFRJT05TLCBmYWxzZSk7XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn1cblxuXG4vKipcbiAqIENyZWF0ZSBhbmQgc2hvdyBkaWFsb2cgcG9wdXBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBvYmplY3Qgd2l0aCB0aXRsZSwgdGV4dCBhbmQgYnV0dG9ucy4gU2VlIFtjcmVhdGVEaWFsb2ddKCNNTERpYWxvZyQkY3JlYXRlRGlhbG9nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBzdWJzY3JpYmVyIG9wdGlvbmFsIHN1YnNjcmliZXIgZnVuY3Rpb24gb3Igb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHJlc3VsdCBhbmQgb3B0aW9uYWwgZGF0YS4gVW5sZXNzIGNvbnRleHQgaXMgZGVmaW5lZCwgZGlhbG9nIHdpbGwgYmUgdGhlIGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIE1MRGlhbG9nJCRvcGVuRGlhbG9nKG9wdGlvbnMsIHN1YnNjcmliZXIsIGluaXRpYWxpemUpIHtcbiAgICB2YXIgZGlhbG9nID0gTUxEaWFsb2cuY3JlYXRlRGlhbG9nKG9wdGlvbnMsIGluaXRpYWxpemUpO1xuICAgIGRpYWxvZy5vcGVuRGlhbG9nKHN1YnNjcmliZXIpO1xuICAgIHJldHVybiBkaWFsb2c7XG59XG5cblxuXG5mdW5jdGlvbiBfdG9nZ2xlRGlhbG9nKGRvU2hvdykge1xuICAgIGRvU2hvdyA9IHR5cGVvZiBkb1Nob3cgPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/ICEgdGhpcy5fZGlhbG9nLnZpc2libGVcbiAgICAgICAgICAgICAgICA6ICEhIGRvU2hvdztcblxuICAgIHZhciBhZGRSZW1vdmUgPSBkb1Nob3cgPyAnYWRkJyA6ICdyZW1vdmUnXG4gICAgICAgICwgYXBwZW5kUmVtb3ZlID0gZG9TaG93ID8gJ2FwcGVuZENoaWxkJyA6ICdyZW1vdmVDaGlsZCc7XG5cbiAgICB0aGlzLl9kaWFsb2cudmlzaWJsZSA9IGRvU2hvdztcblxuICAgIGlmIChkb1Nob3cgJiYgISBkaWFsb2dzSW5pdGlhbGl6ZWQpXG4gICAgICAgIF9pbml0aWFsaXplRGlhbG9ncygpO1xuXG4gICAgZG9jdW1lbnQuYm9keVthcHBlbmRSZW1vdmVdKHRoaXMuZWwpO1xuICAgIGlmIChiYWNrZHJvcEVsKVxuICAgICAgICBkb2N1bWVudC5ib2R5W2FwcGVuZFJlbW92ZV0oYmFja2Ryb3BFbCk7XG4gICAgdGhpcy5kb20udG9nZ2xlKGRvU2hvdyk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgIWRvU2hvdyk7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3RbYWRkUmVtb3ZlXSgnbW9kYWwtb3BlbicpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0W2FkZFJlbW92ZV0oJ2luJyk7XG5cbiAgICBvcGVuZWREaWFsb2cgPSBkb1Nob3cgPyB0aGlzIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuZWxbZG9TaG93ID8gJ2ZvY3VzJyA6ICdibHVyJ10oKTtcbn1cblxuXG52YXIgZGlhbG9nc0luaXRpYWxpemVkLCBiYWNrZHJvcEVsO1xuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZURpYWxvZ3MoKSB7XG4gICAgYmFja2Ryb3BFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGJhY2tkcm9wRWwuY2xhc3NOYW1lID0gJ21vZGFsLWJhY2tkcm9wIGZhZGUgaW4nO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfb25LZXlEb3duKTtcbiAgICBkaWFsb2dzSW5pdGlhbGl6ZWQgPSB0cnVlO1xufVxuXG5cbnZhciBvcGVuZWREaWFsb2c7XG5cbi8qKlxuICogT3BlbnMgZGlhbG9nIGluc3RhbmNlLlxuICogU3Vic2NyaWJlciBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBzdWJzY3JpYmVyIGZvciB0aGUgTWVzc2VuZ2VyIChhbHRob3VnaCBNZXNzZW5nZXIgaXMgbm90IHVzZWQpIC0gZWl0aGVyIGZ1bmN0aW9uIG9yIG9iamVjdCB3aXRoIHN1YnNjcmliZXIgYW5kIGNvbnRleHQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gc3Vic2NyaWJlciBzdWJzY3JpYmVyIG9iamVjdFxuICovXG5mdW5jdGlvbiBNTERpYWxvZyRvcGVuRGlhbG9nKHN1YnNjcmliZXIpIHtcbiAgICBjaGVjayhzdWJzY3JpYmVyLCBNYXRjaC5PbmVPZihGdW5jdGlvbiwgeyBzdWJzY3JpYmVyOiBGdW5jdGlvbiwgY29udGV4dDogTWF0Y2guQW55IH0pKTtcblxuICAgIGlmIChvcGVuZWREaWFsb2cpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignTUxEaWFsb2cgb3BlbkRpYWxvZzogY2FuXFwndCBvcGVuIGRpYWxvZywgYW5vdGhlciBkaWFsb2cgaXMgYWxyZWFkeSBvcGVuJyk7XG5cbiAgICB0aGlzLl9kaWFsb2cuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gICAgX3RvZ2dsZURpYWxvZy5jYWxsKHRoaXMsIHRydWUpO1xufVxuXG5cbi8qKlxuICogQ2xvc2VzIGRpYWxvZyBpbnN0YW5jZSwgb3B0aW9uYWxseSBwYXNzaW5nIHJlc3VsdCBhbmQgZGF0YSB0byBkaWFsb2cgc3Vic2NyaWJlci5cbiAqIElmIG5vIHJlc3VsdCBpcyBwYXNzZWQsICdjbG9zZWQnIHdpbGwgYmUgcGFzc2VkIHRvIHN1YnNjcmliZXIuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHJlc3VsdCBkaWFsb2cgcmVzdWx0LCBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byBzdWJjc3JpYmVyXG4gKiBAcGFyYW0ge0FueX0gZGF0YSBvcHRpb25hbCBkaWFsb2cgZGF0YSwgcGFzc2VkIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHN1YnNjcmliZXJcbiAqL1xuZnVuY3Rpb24gTUxEaWFsb2ckY2xvc2VEaWFsb2cocmVzdWx0LCBkYXRhKSB7XG4gICAgaWYgKCEgb3BlbmVkRGlhbG9nKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ01MRGlhbG9nIGNsb3NlRGlhbG9nOiBjYW5cXCd0IGNsb3NlIGRpYWxvZywgbm8gZGlhbG9nIG9wZW4nKTtcblxuICAgIHJlc3VsdCA9IHJlc3VsdCB8fCAnY2xvc2VkJztcblxuICAgIF90b2dnbGVEaWFsb2cuY2FsbCh0aGlzLCBmYWxzZSk7XG4gICAgX2Rpc3BhdGNoUmVzdWx0LmNhbGwodGhpcywgcmVzdWx0LCBkYXRhKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgY3VycmVudGx5IG9wZW5lZCBkaWFsb2dcbiAqXG4gKiBAcmV0dXJuIHtNTERpYWxvZ31cbiAqL1xuZnVuY3Rpb24gTUxEaWFsb2ckJGdldE9wZW5lZERpYWxvZygpIHtcbiAgICByZXR1cm4gb3BlbmVkRGlhbG9nO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGlhbG9nJGRlc3Ryb3koKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9vbktleURvd24pO1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi8uLi9jX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIERPTUxpc3RlbmVycyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWwvZG9tX2xpc3RlbmVycycpO1xuXG5cbnZhciBUT0dHTEVfQ1NTX0NMQVNTID0gJ2Ryb3Bkb3duLXRvZ2dsZSdcbiAgICAsIE1FTlVfQ1NTX0NMQVNTID0gJ2Ryb3Bkb3duLW1lbnUnO1xuXG5cbnZhciBNTERyb3Bkb3duID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERyb3Bkb3duJywge1xuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6IFsnbWwtYnMtZHJvcGRvd24nLCAnZHJvcGRvd24nXVxuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MRHJvcGRvd24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRHJvcGRvd247XG5cblxuXy5leHRlbmRQcm90byhNTERyb3Bkb3duLCB7XG4gICAgc3RhcnQ6IE1MRHJvcGRvd24kc3RhcnQsXG4gICAgZGVzdHJveTogTUxEcm9wZG93biRkZXN0cm95LFxuICAgIHRvZ2dsZU1lbnU6IE1MRHJvcGRvd24kdG9nZ2xlTWVudSxcbiAgICBzaG93TWVudTogTUxEcm9wZG93biRzaG93TWVudSxcbiAgICBoaWRlTWVudTogTUxEcm9wZG93biRoaWRlTWVudVxufSk7XG5cblxuZnVuY3Rpb24gTUxEcm9wZG93biRzdGFydCgpIHtcbiAgICB2YXIgdG9nZ2xlRWwgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy4nICsgVE9HR0xFX0NTU19DTEFTUylcbiAgICAgICAgLCBtZW51RWwgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy4nICsgTUVOVV9DU1NfQ0xBU1MpO1xuXG4gICAgaWYgKCEgKHRvZ2dsZUVsICYmIG1lbnVFbCkpXG4gICAgICAgIHJldHVybiBsb2dnZXIuZXJyb3IoJ01MRHJvcGRvd246JywgVE9HR0xFX0NTU19DTEFTUywgJ29yJywgTUVOVV9DU1NfQ0xBU1MsICdpc25cXCd0IGZvdW5kJyk7XG5cbiAgICB2YXIgZG9jID0gd2luZG93LmRvY3VtZW50XG4gICAgICAgICwgY2xpY2tIYW5kbGVyID0gdGhpcy50b2dnbGVNZW51LmJpbmQodGhpcywgdW5kZWZpbmVkKTtcblxuICAgIHZhciBsaXN0ZW5lcnMgPSBuZXcgRE9NTGlzdGVuZXJzO1xuICAgIHRoaXMuX2Ryb3Bkb3duID0ge1xuICAgICAgICBtZW51OiBtZW51RWwsXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH07XG4gICAgdGhpcy5oaWRlTWVudSgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGxpc3RlbmVycy5hZGQodG9nZ2xlRWwsICdjbGljaycsIGNsaWNrSGFuZGxlcik7XG4gICAgLy9tYXliZSBvbmx5IGFkZCB0aGlzIGV2ZW50cyBpZiBpcyBvcGVuP1xuICAgIGxpc3RlbmVycy5hZGQoZG9jLCAnbW91c2VvdXQnLCBvbkRvY091dCk7XG4gICAgbGlzdGVuZXJzLmFkZChkb2MsICdjbGljaycsIG9uQ2xpY2spO1xuXG5cbiAgICBmdW5jdGlvbiBvbkRvY091dChldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0XG4gICAgICAgICAgICAsIHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgICAgICAsIGxpc3RlbmVycyA9IHNlbGYuX2Ryb3Bkb3duLmxpc3RlbmVycztcblxuICAgICAgICBpZiAoaXNJZnJhbWUodGFyZ2V0KSlcbiAgICAgICAgICAgIGxpc3RlbmVycy5yZW1vdmUodGFyZ2V0LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsICdjbGljaycsIG9uQ2xpY2spO1xuXG4gICAgICAgIGlmIChpc0lmcmFtZShyZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgIGxpc3RlbmVycy5hZGQocmVsYXRlZFRhcmdldC5jb250ZW50V2luZG93LmRvY3VtZW50LCAnY2xpY2snLCBvbkNsaWNrKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghc2VsZi5lbC5jb250YWlucyhldmVudC50YXJnZXQpKVxuICAgICAgICAgICAgc2VsZi5oaWRlTWVudSgpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBpc0lmcmFtZShlbCkge1xuICAgIHJldHVybiBlbCAmJiBlbC50YWdOYW1lID09ICdJRlJBTUUnO1xufVxuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kZGVzdHJveSgpIHtcbiAgICB0aGlzLl9kcm9wZG93bi5saXN0ZW5lcnMucmVtb3ZlQWxsKCk7XG4gICAgZGVsZXRlIHRoaXMuX2Ryb3Bkb3duO1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kc2hvd01lbnUoKSB7XG4gICAgdGhpcy50b2dnbGVNZW51KHRydWUpO1xufVxuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kaGlkZU1lbnUoKSB7XG4gICAgdGhpcy50b2dnbGVNZW51KGZhbHNlKTtcbn1cblxuXG5mdW5jdGlvbiBNTERyb3Bkb3duJHRvZ2dsZU1lbnUoZG9TaG93KSB7XG4gICAgZG9TaG93ID0gdHlwZW9mIGRvU2hvdyA9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gISB0aGlzLl9kcm9wZG93bi52aXNpYmxlXG4gICAgICAgICAgICAgICAgOiAhISBkb1Nob3c7XG5cbiAgICB0aGlzLl9kcm9wZG93bi52aXNpYmxlID0gZG9TaG93O1xuXG4gICAgdmFyIG1lbnUgPSB0aGlzLl9kcm9wZG93bi5tZW51O1xuICAgIG1lbnUuc3R5bGUuZGlzcGxheSA9IGRvU2hvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2Jsb2NrJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ25vbmUnO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbi8vIDxhIG5hbWU9XCJjb25maWdcIj48L2E+XG4vLyBtaWxvLmNvbmZpZ1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gSXQgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRvIGNoYW5nZSBtaWxvIGNvbmZpZ3VyYXRpb25zIGFuZCBhbHNvXG4vLyBhY2Nlc3MgdGhlbSBvbiBjb25maWcncyBwcm9wZXJ0aWVzLlxuXG4vLyBgYGBqYXZhc2NyaXB0XG4vLyBtaWxvLmNvbmZpZyh7XG4vLyAgICAgYXR0cnM6IHtcbi8vICAgICAgICAgYmluZDogJ21sLWJpbmQnLFxuLy8gICAgICAgICBsb2FkOiAnbWwtbG9hZCdcbi8vICAgICB9XG4vLyB9KTtcbi8vIGBgYFxuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGRvVCA9IG1pbG9Db3JlLnV0aWwuZG9UO1xuXG5cbnZhciBjb25maWcgPSBtb2R1bGUuZXhwb3J0cyA9IG1pbG9Db3JlLmNvbmZpZztcblxuXG5jb25maWcoe1xuICAgIGF0dHJzOiB7XG4gICAgICAgIGJpbmQ6ICdtbC1iaW5kJyxcbiAgICAgICAgbG9hZDogJ21sLWxvYWQnXG4gICAgfSxcbiAgICBjb21wb25lbnRSZWY6ICdfX19taWxvX2NvbXBvbmVudCcsXG4gICAgY29tcG9uZW50UHJlZml4OiAnbWlsb18nLFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIGNvbXBpbGU6IGRvVC5jb21waWxlXG4gICAgfSxcbiAgICBkb21TdG9yYWdlOiB7XG4gICAgICAgIHR5cGVTdWZmaXg6ICc6X19fbWlsb19kYXRhX3R5cGUnLFxuICAgICAgICBwcmVmaXhTZXBhcmF0b3I6ICcvJyxcbiAgICAgICAgcm9vdDogJycsXG4gICAgICAgIG1lc3NhZ2VLZXk6ICdfX19taWxvX21lc3NhZ2UvJyxcbiAgICAgICAgbWVzc2FnZVRpbWVzdGFtcDogJ19fX21pbG9fdGltZXN0YW1wJyxcbiAgICAgICAgcXVvdGFFeGNlZWRlZDoge1xuICAgICAgICAgICAgdGhyb3dFcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGZhbHNlXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdEcm9wOiB7XG4gICAgICAgIGRhdGFUeXBlczoge1xuICAgICAgICAgICAgY29tcG9uZW50OiAneC1hcHBsaWNhdGlvbi9taWxvL2NvbXBvbmVudCcsXG4gICAgICAgICAgICBjb21wb25lbnRNZXRhVGVtcGxhdGU6ICd4LWFwcGxpY2F0aW9uL21pbG8vY29tcG9uZW50LW1ldGEvJWNsYXNzLyVuYW1lLyVwYXJhbXMnLFxuICAgICAgICAgICAgY29tcG9uZW50TWV0YVJlZ2V4OiAvXnhcXC1hcHBsaWNhdGlvblxcL21pbG9cXC9jb21wb25lbnRcXC1tZXRhXFwvKFthLXowLTldKylcXC8oW2EtejAtOV0rKVxcLyhbYS16MC05XSopJC8sXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVlc3Q6IHtcbiAgICAgICAganNvbnBUaW1lb3V0OiA2MDAwMCxcbiAgICAgICAganNvbnBDYWxsYmFja1ByZWZpeDogJ19fX21pbG9fY2FsbGJhY2tfJyxcbiAgICAgICAgb3B0aW9uc0tleTogJ19fX21pbG9fb3B0aW9ucycsXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICB0aW1lb3V0OiA2MDAwMFxuICAgICAgICB9XG4gICAgfSxcbiAgICB3ZWJzb2NrZXQ6IHtcbiAgICAgICAgcnBjOiB7XG4gICAgICAgICAgICB0aW1lb3V0OiAxNTAwMCxcbiAgICAgICAgICAgIHJlc3BvbnNlUHJlZml4OiAncmVzcG9uc2VfJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICBkZXByZWNhdGlvbldhcm5pbmc6ICdvbmNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9NYWlsID0gcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIHJlcXVlc3QgPSByZXF1aXJlKCcuL3V0aWwvcmVxdWVzdCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCB1dGlsRG9tID0gcmVxdWlyZSgnLi91dGlsL2RvbScpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuL2NvbmZpZycpXG4gICAgLCBMb2FkQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hdHRyaWJ1dGVzL2FfbG9hZCcpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbG9hZGVyO1xuXG4vKipcbiAqIGBtaWxvLmxvYWRlcmBcbiAqIFxuICogUmVjdXJzaXZlbHkgc2NhbnMgdGhlIGRvY3VtZW50IHRyZWUgaW5zaWRlIGByb290RWxgIChkb2N1bWVudC5ib2R5IGJ5IGRlZmF1bHQpIGxvb2tpbmcgZm9yIF9fbWwtbG9hZF9fIEBhdHRyaWJ1dGUuXG4gKiBPbmUgbGV2ZWwgbG9hZCBpcyBleGVjdXRlZC4gTm8gYWRkaXRpb25hbCBsb2FkZXIgZ2V0IGNhbGxlZCBvbiBpbnNpZGUgX19tbC1sb2FkX18gYXR0cmlidXRlcy4gXG4gKlxuICogUG9zc2libGUgdXNhZ2VzOlxuICogLSBtaWxvLmxvYWRlcihbbXlSb290RWwsXVtteVJlbW92ZUF0dHJpYnV0ZSxdbXlDYWxsYmFjaylcbiAqIFxuICogQHBhcmFtICB7RWxlbWVudH0gIHJvb3RFbCAgICAgICAgICBSb290IGVsZW1lbnQgaW5zaWRlIHdoaWNoIERPTSB3aWxsIGJlIHNjYW5uZWQgKGRvY3VtZW50LmJvZHkgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0gIHtCb29sZWFufSAgcmVtb3ZlQXR0cmlidXRlIElmIHNldCB0byB0cnVlLCB0aGVuIHRoZSBfX21sLWxvYWRfXyBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkIG9uY2UgbG9hZGVyIGhhcyBiZWVuIGV4ZWN1dGVkIChGYWxzZSBieSBkZWZhdWx0KS5cbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFjayAgICAgICAgQ2FsbGJhY2sgdG8gY2FsbCBhZnRlciBhbGwgZWxlbWVudHMgZ2V0IGxvYWRlZCAoUmVxdWlyZWQpLlxuICovXG5mdW5jdGlvbiBsb2FkZXIocm9vdEVsLCByZW1vdmVBdHRyaWJ1dGUsIGNhbGxiYWNrKSB7XG4gICAgbWlsbyhmdW5jdGlvbigpIHtcbiAgICAgICAgX2xvYWRlcihyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9sb2FkZXIocm9vdEVsLCByZW1vdmVBdHRyaWJ1dGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiByb290RWwgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjayA9IHJvb3RFbDtcbiAgICAgICAgcm9vdEVsID0gdW5kZWZpbmVkO1xuICAgICAgICByZW1vdmVBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlbW92ZUF0dHJpYnV0ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gcmVtb3ZlQXR0cmlidXRlO1xuICAgICAgICByZW1vdmVBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByb290RWwgPSByb290RWwgfHwgZG9jdW1lbnQuYm9keTtcblxuICAgIG1pbG9NYWlsLnBvc3RNZXNzYWdlKCdsb2FkZXInLCB7IHN0YXRlOiAnc3RhcnRlZCcgfSk7XG4gICAgX2xvYWRWaWV3c0luRWxlbWVudChyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgZnVuY3Rpb24odmlld3MpIHtcbiAgICAgICAgbWlsb01haWwucG9zdE1lc3NhZ2UoJ2xvYWRlcicsIHsgXG4gICAgICAgICAgICBzdGF0ZTogJ2ZpbmlzaGVkJyxcbiAgICAgICAgICAgIHZpZXdzOiB2aWV3c1xuICAgICAgICB9KTtcbiAgICAgICAgY2FsbGJhY2sodmlld3MpO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9sb2FkVmlld3NJbkVsZW1lbnQocm9vdEVsLCByZW1vdmVBdHRyaWJ1dGUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGxvYWRFbGVtZW50cyA9IHJvb3RFbC5nZXRBdHRyaWJ1dGUoY29uZmlnLmF0dHJzLmxvYWQpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtyb290RWxdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJvb3RFbC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIGNvbmZpZy5hdHRycy5sb2FkICsgJ10nKTtcblxuICAgIHZhciB2aWV3cyA9IHt9XG4gICAgICAgICwgdG90YWxDb3VudCA9IGxvYWRFbGVtZW50cy5sZW5ndGhcbiAgICAgICAgLCBsb2FkZWRDb3VudCA9IDA7XG5cbiAgICBfLmZvckVhY2gobG9hZEVsZW1lbnRzLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgbG9hZFZpZXcoZWwsIHJlbW92ZUF0dHJpYnV0ZSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICB2aWV3c1tlbC5pZF0gPSBlcnIgfHwgZWw7XG4gICAgICAgICAgICBsb2FkZWRDb3VudCsrO1xuICAgICAgICAgICAgaWYgKGxvYWRlZENvdW50ID09IHRvdGFsQ291bnQpXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sodmlld3MpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cblxuZnVuY3Rpb24gbG9hZFZpZXcoZWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodXRpbERvbS5jaGlsZHJlbihlbCkubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgbG9hZCBodG1sIGludG8gZWxlbWVudCB0aGF0IGlzIG5vdCBlbXB0eScpO1xuXG4gICAgdmFyIGF0dHIgPSBuZXcgTG9hZEF0dHJpYnV0ZShlbCk7XG5cbiAgICBhdHRyLnBhcnNlKCkudmFsaWRhdGUoKTtcblxuICAgIHJlcXVlc3QuZ2V0KGF0dHIubG9hZFVybCwgZnVuY3Rpb24oZXJyLCBodG1sKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UgfHwgJ2NhblxcJ3QgbG9hZCBmaWxlICcgKyBhdHRyLmxvYWRVcmw7XG4gICAgICAgICAgICAvLyBsb2dnZXIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIGlmIChyZW1vdmVBdHRyaWJ1dGUpIExvYWRBdHRyaWJ1dGUucmVtb3ZlKGVsKTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxuLy8gcmVnaXN0ZXIgaW5jbHVkZWQgZmFjZXRzXG5yZXF1aXJlKCcuL3VzZV9mYWNldHMnKTtcblxuLy8gcmVnaXN0ZXIgaW5jbHVkZWQgY29tcG9uZW50c1xucmVxdWlyZSgnLi91c2VfY29tcG9uZW50cycpO1xuXG5cbi8qKlxuICogYG1pbG9gXG4gKlxuICogQSBtaW5pbWFsaXN0IGJyb3dzZXIgZnJhbWV3b3JrIHRoYXQgYmluZHMgRE9NIGVsZW1lbnRzIHRvIEpTIGNvbXBvbmVudHMgYW5kIGNvbXBvbmVudHMgdG8gbW9kZWxzLlxuICpcbiAqIGBtaWxvYCBpcyBhdmFpbGFibGUgYXMgZ2xvYmFsIG9iamVjdCBpbiB0aGUgYnJvd3Nlci5cbiAqIEF0IHRoZSBtb21lbnQgaXQgaXMgbm90IHBvc3NpaWJsZSB0byByZXF1aXJlIGl0IHdpdGggYnJvd3NlcmlmeSB0byBoYXZlIGl0IGJ1bmRsZWQgd2l0aCB0aGUgYXBwIGJlY2F1c2Ugb2YgdGhlIHdheSBbYnJmc10oaHR0cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL2JyZnMpIGJyb3dzZXJpZnkgcGx1Z2luIGlzIGltcGxlbWVudGVkLlxuICogSXQgaXMgcG9zc2libGUgdGhvdWdoIHRvIHJlcXVpcmUgYG1pbG9gIHdpdGggbm9kZSB0byB1c2UgdW5pdmVyc2FsIHBhcnRzIG9mIHRoZSBmcmFtZXdvcmsgKGFic3RyYWN0IGNsYXNzZXMsIE1lc3NlbmdlciwgTW9kZWwsIGV0Yy4pOlxuICogYGBgXG4gKiB2YXIgbWlsbyA9IHJlcXVpcmUoJ21pbG9qcycpO1xuICogYGBgXG4gKiBcbiAqIGBtaWxvYCBpdHNlbGYgaXMgYSBmdW5jdGlvbiB0aGF0IGluIHRoZSBicm93c2VyIGNhbiBiZSB1c2VkIHRvIGRlbGF5IGV4ZWN1dGlvbiB1bnRpbCBET00gaXMgcmVhZHkuXG4gKi9cbmZ1bmN0aW9uIG1pbG8oZnVuYykge1xuICAgIG1pbG8udXRpbC5kb21SZWFkeShmdW5jKTtcbn1cblxuXG4vKipcbiAqICMjIyNNaWxvIHBhY2thZ2VzIyMjI1xuICpcbiAqIC0gW2xvYWRlcl0oLi9sb2FkZXIuanMuaHRtbCkgLSBsb2FkaW5nIHN1YnZpZXdzIGludG8gcGFnZVxuICogLSBbYmluZGVyXSguL2JpbmRlci5qcy5odG1sKSAtIGNvbXBvbmVudHMgaW5zdGFudGlhdGlvbiBhbmQgYmluZGluZyBvZiBET00gZWxlbWVudHMgdG8gdGhlbVxuICogLSBbbWluZGVyXSguL21pbmRlci5qcy5odG1sKSAtIGRhdGEgcmVhY3Rpdml0eSwgb25lIG9yIHR3byB3YXksIHNoYWxsb3cgb3IgZGVlcCwgYXMgeW91IGxpa2UgaXRcbiAqIC0gW21haWxdKC4vbWFpbC9pbmRleC5qcy5odG1sKSAtIGFwcGxpY2FpdG9uIGxldmVsIG1lc3NlbmdlciwgYWxzbyBjb25uZWN0cyB0byBtZXNzYWdlcyBmcm9tIG90aGVyIHdpbmRvd3MgZGlzcGF0Y2hlZCB3aXRoIGB3aW5kb3cucG9zdE1lc3NhZ2VgLlxuICogLSBbY29uZmlnXSguL2NvbmZpZy5qcy5odG1sKSAtIG1pbG8gY29uZmlndXJhdGlvblxuICogLSBbdXRpbF0oLi91dGlsL2luZGV4LmpzLmh0bWwpIC0gbG9nZ2VyLCByZXF1ZXN0LCBkb20sIGNoZWNrLCBlcnJvciwgZXRjLlxuICogLSBbY2xhc3Nlc10oLi9jbGFzc2VzLmpzLmh0bWwpIC0gYWJzdHJhY3QgYW5kIGJhc2UgY2xhc3Nlc1xuICogLSBbYXR0cmlidXRlc10oLi9hdHRyaWJ1dGVzL2luZGV4LmpzLmh0bWwpIC0gY2xhc3NlcyB0aGF0IHdyYXAgRE9NIGVsZW1lbnRzIGF0dHJpYnV0ZXMgcmVjb2duaXplZCBieSBtaWxvXG4gKiAtIFtDb21wb25lbnRGYWNldF0oLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgLSBiYXNlIGNsYXNzIG9mIENvbXBvbmVudCBmYWNldFxuICogLSBbQ29tcG9uZW50XSguL2NvbXBvbmVudHMvY19jbGFzcy5qcy5odG1sKSAtIGJhc2UgQ29tcG9uZW50IGNsYXNzXG4gKiAtIFtNZXNzZW5nZXJdKC4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIC0gZ2VuZXJpYyBNZXNzZW5nZXIgdXNlZCBpbiBtb3N0IG90aGVyIG1pbG8gY2xhc3NlcywgY2FuIGJlIG1peGVkIGludG8gYXBwIGNsYXNzZXMgdG9vLlxuICogLSBbTW9kZWxdKC4vbW9kZWwvaW5kZXguanMuaHRtbCkgLSBNb2RlbCBjbGFzcyB0aGF0IGVtaXRzIG1lc3NhZ2VzIG9uIGNoYW5nZXMgdG8gYW55IGRlcHRoIHdpdGhvdXQgdGltZXIgYmFzZWQgd2F0Y2hpbmdcbiAqIC0gW3JlZ2lzdHJ5XSguL3JlZ2lzdHJ5LmpzLmh0bWwpIC0gcmVnaXN0cmllcyBvZiBmYXNldHMgYW5kIGNvbXBvbmVudHMgY2xhc3Nlc1xuICovXG5fLmV4dGVuZChtaWxvLCB7XG4gICAgTWVzc2VuZ2VyOiBtaWxvQ29yZS5NZXNzZW5nZXIsXG4gICAgTW9kZWw6IG1pbG9Db3JlLk1vZGVsLFxuICAgIG1pbmRlcjogbWlsb0NvcmUubWluZGVyLFxuICAgIGxvYWRlcjogcmVxdWlyZSgnLi9sb2FkZXInKSxcbiAgICBiaW5kZXI6IHJlcXVpcmUoJy4vYmluZGVyJyksXG4gICAgbWFpbDogcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJyksXG4gICAgd2luZG93OiByZXF1aXJlKCcuL3NlcnZpY2VzL3dpbmRvdycpLFxuICAgIGNvbmZpZzogcmVxdWlyZSgnLi9jb25maWcnKSxcbiAgICB1dGlsOiByZXF1aXJlKCcuL3V0aWwnKSxcbiAgICBjbGFzc2VzOiByZXF1aXJlKCcuL2NsYXNzZXMnKSxcbiAgICBhdHRyaWJ1dGVzOiByZXF1aXJlKCcuL2F0dHJpYnV0ZXMnKSxcbiAgICBDb21wb25lbnRGYWNldDogcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXQnKSxcbiAgICBDb21wb25lbnQ6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2NsYXNzJyksXG4gICAgQ29tbWFuZDogcmVxdWlyZSgnLi9jb21tYW5kJyksXG4gICAgcmVnaXN0cnk6IHJlcXVpcmUoJy4vcmVnaXN0cnknKSxcbiAgICBtaWxvX3ZlcnNpb246ICcwLjIuNScsXG4gICAgY3JlYXRlQ29tcG9uZW50Q2xhc3M6IHJlcXVpcmUoJy4vdXRpbC9jcmVhdGVfY29tcG9uZW50X2NsYXNzJyksXG4gICAgZGVzdHJveTogZGVzdHJveVxufSk7XG5cblxuLy8gZXhwb3J0IGZvciBub2RlL2Jyb3dzZXJpZnlcbmlmICh0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSAgICBcbiAgICBtb2R1bGUuZXhwb3J0cyA9IG1pbG87XG5cbi8vIGdsb2JhbCBtaWxvIGZvciBicm93c2VyXG5pZiAodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0Jykge1xuICAgIHdpbmRvdy5taWxvID0gbWlsbztcbiAgICBtaWxvLm1haWwudHJpZ2dlcignbWlsb3JlYWR5Jyk7XG59XG5cblxuZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBtaWxvQ29yZS5kZXN0cm95KCk7XG4gICAgbWlsby5tYWlsLmRlc3Ryb3koKTtcbiAgICBtaWxvLndpbmRvdy5kZXN0cm95KCk7XG4gICAgbWlsby51dGlsLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZWdpc3RyaWVzIG9mIGZhY2V0cyBhbmQgb2YgY29tcG9uZW50c1xuICpcbiAqIC0gW2ZhY2V0c10oLi9jb21wb25lbnRzL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5LmpzLmh0bWwpXG4gKiAtIFtjb21wb25lbnRzXSguL2NvbXBvbmVudHMvY19yZWdpc3RyeS5qcy5odG1sKVxuICovXG52YXIgcmVnaXN0cnkgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBmYWNldHM6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9jZl9yZWdpc3RyeScpLFxuICAgIGNvbXBvbmVudHM6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX3JlZ2lzdHJ5JyksXG4gICAgY29tbWFuZHM6IHJlcXVpcmUoJy4vY29tbWFuZC9jbWRfcmVnaXN0cnknKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZG9tLWNvbnN0cnVjdG9yc1wiPjwvYT5cbi8vICMjI2RvbSBldmVudHMgY29uc3RydWN0b3JzXG5cblxudmFyIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9SZWZlcmVuY2UvRXZlbnRzXG5cbnZhciBldmVudFR5cGVzID0ge1xuICAgIENsaXBib2FyZEV2ZW50OiBbJ2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ2JlZm9yZWNvcHknLCAnYmVmb3JlY3V0JywgJ2JlZm9yZXBhc3RlJ10sXG4gICAgRXZlbnQ6IFsnaW5wdXQnLCAncmVhZHlzdGF0ZWNoYW5nZSddLFxuICAgIEZvY3VzRXZlbnQ6IFsnZm9jdXMnLCAnYmx1cicsICdmb2N1c2luJywgJ2ZvY3Vzb3V0J10sXG4gICAgS2V5Ym9hcmRFdmVudDogWydrZXlkb3duJywgJ2tleXByZXNzJywgICdrZXl1cCddLFxuICAgIE1vdXNlRXZlbnQ6IFsnY2xpY2snLCAnY29udGV4dG1lbnUnLCAnZGJsY2xpY2snLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLFxuICAgICAgICAgICAgICAgICAnbW91c2VlbnRlcicsICdtb3VzZWxlYXZlJywgJ21vdXNlbW92ZScsICdtb3VzZW91dCcsICdtb3VzZW92ZXInLFxuICAgICAgICAgICAgICAgICAnc2hvdycgLyogY29udGV4dCBtZW51ICovXSxcbiAgICBUb3VjaEV2ZW50OiBbJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnLCAndG91Y2htb3ZlJywgJ3RvdWNoZW50ZXInLCAndG91Y2hsZWF2ZScsICd0b3VjaGNhbmNlbCddLFxufTtcblxuXG4vLyBtb2NrIHdpbmRvdyBhbmQgZXZlbnQgY29uc3RydWN0b3JzIGZvciB0ZXN0aW5nXG5pZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJylcbiAgICB2YXIgZ2xvYmFsID0gd2luZG93O1xuZWxzZSB7XG4gICAgZ2xvYmFsID0ge307XG4gICAgXy5lYWNoS2V5KGV2ZW50VHlwZXMsIGZ1bmN0aW9uKGVUeXBlcywgZXZlbnRDb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICAgICAgdmFyIGV2ZW50Q29uc3RydWN0b3IgPSBfLm1ha2VGdW5jdGlvbihldmVudENvbnN0cnVjdG9yTmFtZSwgJ3R5cGUnLCAncHJvcGVydGllcycsXG4gICAgICAgICAgICAndGhpcy50eXBlID0gdHlwZTsgXy5leHRlbmQodGhpcywgcHJvcGVydGllcyk7Jyk7XG4gICAgICAgIGdsb2JhbFtldmVudENvbnN0cnVjdG9yTmFtZV0gPSBldmVudENvbnN0cnVjdG9yO1xuICAgIH0pO1xufVxuXG5cbnZhciBkb21FdmVudHNDb25zdHJ1Y3RvcnMgPSB7fTtcblxuXy5lYWNoS2V5KGV2ZW50VHlwZXMsIGZ1bmN0aW9uKGVUeXBlcywgZXZlbnRDb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBlVHlwZXMuZm9yRWFjaChmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkoZG9tRXZlbnRzQ29uc3RydWN0b3JzLCB0eXBlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZHVwbGljYXRlIGV2ZW50IHR5cGUgJyArIHR5cGUpO1xuXG4gICAgICAgIGRvbUV2ZW50c0NvbnN0cnVjdG9yc1t0eXBlXSA9IGdsb2JhbFtldmVudENvbnN0cnVjdG9yTmFtZV07XG4gICAgfSk7XG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGRvbUV2ZW50c0NvbnN0cnVjdG9ycztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cy9jX2NsYXNzJylcbiAgICAsIGRvbUV2ZW50c0NvbnN0cnVjdG9ycyA9IHJlcXVpcmUoJy4vZGVfY29uc3RycycpIC8vIFRPRE8gbWVyZ2Ugd2l0aCBET01FdmVudFNvdXJjZSA/P1xuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cbnZhciBET01FbWl0dGVyU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnRE9NRW1pdHRlclNvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRE9NRW1pdHRlclNvdXJjZSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGluaXQ6IGluaXQsXG4gICAgZGVzdHJveTogRE9NRW1pdHRlclNvdXJjZSRkZXN0cm95LFxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IF8ucGFydGlhbChzb3VyY2VTdWJzY3JpYmVyTWV0aG9kLCAnYWRkRXZlbnRMaXN0ZW5lcicpLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IF8ucGFydGlhbChzb3VyY2VTdWJzY3JpYmVyTWV0aG9kLCAncmVtb3ZlRXZlbnRMaXN0ZW5lcicpLFxuICAgIHBvc3RNZXNzYWdlOiBET01FbWl0dGVyU291cmNlJHBvc3RNZXNzYWdlLFxuICAgIHRyaWdnZXI6IHRyaWdnZXIsXG5cbiAgICAvLyBjbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgZW1pdHRlcjogZW1pdHRlcixcbiAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQsICAvLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01FbWl0dGVyU291cmNlO1xuXG5cbnZhciB1c2VDYXB0dXJlUGF0dGVybiA9IC9fX2NhcHR1cmUkL1xuICAgICwgdXNlQ2FwdHVyZVBvc3RmaXggPSAnX19jYXB0dXJlJztcblxuXG4vLyBpbml0IERPTSBldmVudCBzb3VyY2VcbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBldmVudEVtaXR0ZXIpIHtcbiAgICB0aGlzLmV2ZW50RW1pdHRlciA9IGV2ZW50RW1pdHRlcjtcbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gRE9NRW1pdHRlclNvdXJjZSRkZXN0cm95KCkge1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBkZWxldGUgdGhpcy5ldmVudEVtaXR0ZXI7XG59XG5cblxuLy8gZ2V0IERPTSBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudEVtaXR0ZXI7XG59XG5cblxuZnVuY3Rpb24gc291cmNlU3Vic2NyaWJlck1ldGhvZChtZXRob2QsIGV2ZW50VHlwZSkge1xuICAgIGlmICghIChldmVudFR5cGUgJiYgdHlwZW9mIGV2ZW50VHlwZSA9PSAnc3RyaW5nJykpIHJldHVybjtcbiAgICB2YXIgY2FwdHVyZSA9IHVzZUNhcHR1cmVQYXR0ZXJuLnRlc3QoZXZlbnRUeXBlKTtcbiAgICBldmVudFR5cGUgPSBldmVudFR5cGUucmVwbGFjZSh1c2VDYXB0dXJlUGF0dGVybiwgJycpO1xuICAgIHRoaXMuZW1pdHRlcigpW21ldGhvZF0oZXZlbnRUeXBlLCB0aGlzLCBjYXB0dXJlKTtcbn1cblxuXG4vLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG5mdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgIHZhciBpc0NhcHR1cmVQaGFzZTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgaXNDYXB0dXJlUGhhc2UgPSBldmVudC5ldmVudFBoYXNlID09IHdpbmRvdy5FdmVudC5DQVBUVVJJTkdfUEhBU0U7XG5cbiAgICBpZiAoaXNDYXB0dXJlUGhhc2UpXG4gICAgICAgIGV2ZW50ICs9IHVzZUNhcHR1cmVQb3N0Zml4O1xuXG4gICAgdGhpcy5kaXNwYXRjaE1lc3NhZ2UoZXZlbnQudHlwZSwgZXZlbnQpO1xufVxuXG5cbmZ1bmN0aW9uIERPTUVtaXR0ZXJTb3VyY2UkcG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2VuZ2VyLnBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiB0cmlnZ2VyKGV2ZW50VHlwZSwgcHJvcGVydGllcykge1xuICAgIGNoZWNrKGV2ZW50VHlwZSwgU3RyaW5nKTtcbiAgICBjaGVjayhwcm9wZXJ0aWVzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcblxuICAgIGV2ZW50VHlwZSA9IGV2ZW50VHlwZS5yZXBsYWNlKHVzZUNhcHR1cmVQYXR0ZXJuLCAnJyk7XG4gICAgdmFyIEV2ZW50Q29uc3RydWN0b3IgPSBkb21FdmVudHNDb25zdHJ1Y3RvcnNbZXZlbnRUeXBlXTtcblxuICAgIGlmICh0eXBlb2YgRXZlbnRDb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGV2ZW50IHR5cGUnKTtcblxuICAgIC8vIGNoZWNrIGlmIGl0IGlzIGNvcnJlY3RcbiAgICBpZiAodHlwZW9mIHByb3BlcnRpZXMgIT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHByb3BlcnRpZXMudHlwZSA9IGV2ZW50VHlwZTtcblxuICAgIHZhciBkb21FdmVudCA9IG5ldyBFdmVudENvbnN0cnVjdG9yKGV2ZW50VHlwZSwgcHJvcGVydGllcyk7XG4gICAgdmFyIG5vdENhbmNlbGxlZCA9IHRoaXMuZW1pdHRlcigpLmRpc3BhdGNoRXZlbnQoZG9tRXZlbnQpO1xuICAgIHJldHVybiBub3RDYW5jZWxsZWQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYG1pbG8ubWFpbGBcbiAqIEl0IGlzIGFuIGFwcGxpY2F0aW9uIGxldmVsIG1lc3NlbmdlciB0aGF0IGlzIGFuIGluc3RhbmNlIG9mIE1lc3NlbmdlciBjbGFzcy5cbiAqXG4gKiBBdCB0aGUgbW9tZW50LCBpbiBhZGRpdGlvbiB0byBhcHBsaWNhdGlvbiBtZXNzYWdlcyB0aGF0IHlvdSBkZWZpbmUsIHlvdSBjYW4gc3Vic2NyaWJlIHRvIF9fZG9tcmVhZHlfXyBtZXNzYWdlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBmaXJlIG9uY2UsXG4gKiBldmVuIGlmIERPTSB3YXMgcmVhZHkgYXQgdGhlIHRpbWUgb2YgdGhlIHN1YnNjcmlwdGlvbi5cbiAqXG4gKiBNZXNzYWdpbmcgYmV0d2VlbiBmcmFtZXMgaXMgYXZhaWxhYmxlIHZpYSBtaWxvLm1haWwuIFNlZSBbRnJhbWUgZmFjZXRdKC4uL2NvbXBvbmVudHMvY19mYWNldHMvRnJhbWUuanMuaHRtbCkuXG4gKlxuICogU2VlIFtNZXNzZW5nZXJdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKS5cbiAqIFxuKiovXG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgTWFpbE1zZ0FQSSA9IHJlcXVpcmUoJy4vbWFpbF9hcGknKVxuICAgICwgTWFpbE1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21haWxfc291cmNlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgbWlsb01haWwgPSBuZXcgTWVzc2VuZ2VyO1xuXG52YXIgbWFpbE1zZ1NvdXJjZSA9IG5ldyBNYWlsTWVzc2FnZVNvdXJjZShtaWxvTWFpbCwgeyB0cmlnZ2VyOiAndHJpZ2dlcicgfSwgbmV3IE1haWxNc2dBUEkpO1xuXG5taWxvTWFpbC5fc2V0TWVzc2FnZVNvdXJjZShtYWlsTXNnU291cmNlKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbG9NYWlsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyQVBJID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzZW5nZXJBUElcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbnZhciBNYWlsTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJBUEksICdNYWlsTXNnQVBJJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhNYWlsTXNnQVBJLCB7XG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgZmlsdGVyU291cmNlTWVzc2FnZTogZmlsdGVyU291cmNlTWVzc2FnZVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFpbE1zZ0FQSTtcblxuXG4vLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gcmVsZXZhbnQgRE9NIGV2ZW50IGRlcGVuZGVudCBvbiBlbGVtZW50IHRhZ1xuLy8gQ2FuIGFsc28gaW1wbGVtZW50IGJlZm9yZWRhdGFjaGFuZ2VkIGV2ZW50IHRvIGFsbG93IHByZXZlbnRpbmcgdGhlIGNoYW5nZVxuLy8gdHJhbnNsYXRlVG9Eb21FdmVudFxudmFyIHdpbmRvd01lc3NhZ2VSZWdFeHAgPSAvXm1lc3NhZ2VcXDovXG4gICAgLCB3aW5kb3dNZXNzYWdlUHJlZml4ID0gJ21lc3NhZ2U6JztcblxuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBpZiAobWVzc2FnZSA9PSAnZG9tcmVhZHknKVxuICAgICAgICByZXR1cm4gJ3JlYWR5c3RhdGVjaGFuZ2UnO1xuICAgIGVsc2UgaWYgKHdpbmRvd01lc3NhZ2VSZWdFeHAudGVzdChtZXNzYWdlKSlcbiAgICAgICAgcmV0dXJuICdtZXNzYWdlJztcbn1cblxuXG4vLyBmaWx0ZXJEYXRhTWVzc2FnZVxuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtc2dUeXBlLCBtc2dEYXRhKSB7XG4gICAgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ3JlYWR5c3RhdGVjaGFuZ2UnKSB7XG4gICAgICAgIC8vcmV0dXJuIGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJztcbiAgICAgICAgLy8gIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2RvbVJlYWR5RmlyZWQnLCB0cnVlLCBfLldSSVQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ21lc3NhZ2UnKVxuICAgICAgICByZXR1cm4gd2luZG93TWVzc2FnZVByZWZpeCArIG1zZ0RhdGEuZGF0YS50eXBlID09IG1zZ1R5cGU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgZG9tRXZlbnRzQ29uc3RydWN0b3JzID0gcmVxdWlyZSgnLi4vZGVfY29uc3RycycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgTWFpbE1lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdNYWlsTWVzc2FnZVNvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTWFpbE1lc3NhZ2VTb3VyY2UsIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgdHJpZ2dlcjogdHJpZ2dlcixcblxuICAgIC8vIGNsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICBfd2luZG93U3Vic2NyaWJlck1ldGhvZDogX3dpbmRvd1N1YnNjcmliZXJNZXRob2QsXG4gICAgaGFuZGxlRXZlbnQ6IGhhbmRsZUV2ZW50LCAgLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNYWlsTWVzc2FnZVNvdXJjZTtcblxuXG5mdW5jdGlvbiBhZGRTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICBpZiAoaXNSZWFkeVN0YXRlQ2hhbmdlKHNvdXJjZU1lc3NhZ2UpKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09ICdsb2FkaW5nJylcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCB0aGlzLCBmYWxzZSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIEV2ZW50Q29uc3RydWN0b3IgPSBkb21FdmVudHNDb25zdHJ1Y3RvcnMucmVhZHlzdGF0ZWNoYW5nZTtcbiAgICAgICAgICAgIHZhciBkb21FdmVudCA9IG5ldyBFdmVudENvbnN0cnVjdG9yKCdyZWFkeXN0YXRlY2hhbmdlJywgeyB0YXJnZXQ6IGRvY3VtZW50IH0pO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaE1lc3NhZ2UoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBkb21FdmVudCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2VcbiAgICAgICAgdGhpcy5fd2luZG93U3Vic2NyaWJlck1ldGhvZCgnYWRkRXZlbnRMaXN0ZW5lcicsIHNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIGlmIChpc1JlYWR5U3RhdGVDaGFuZ2Uoc291cmNlTWVzc2FnZSkpXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCB0aGlzLCBmYWxzZSk7XG4gICAgZWxzZSBcbiAgICAgICAgdGhpcy5fd2luZG93U3Vic2NyaWJlck1ldGhvZCgncmVtb3ZlRXZlbnRMaXN0ZW5lcicsIHNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIGlzUmVhZHlTdGF0ZUNoYW5nZShzb3VyY2VNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2UgPT0gJ3JlYWR5c3RhdGVjaGFuZ2UnICYmIHR5cGVvZiBkb2N1bWVudCA9PSAnb2JqZWN0Jztcbn1cblxuZnVuY3Rpb24gaXNXaW5kb3dNZXNzYWdlKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICByZXR1cm4gc291cmNlTWVzc2FnZSA9PSAnbWVzc2FnZScgJiYgdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0Jztcbn1cblxuZnVuY3Rpb24gX3dpbmRvd1N1YnNjcmliZXJNZXRob2QobWV0aG9kLCBzb3VyY2VNZXNzYWdlKSB7XG4gICAgaWYgKGlzV2luZG93TWVzc2FnZShzb3VyY2VNZXNzYWdlKSlcbiAgICAgICAgd2luZG93W21ldGhvZF0oJ21lc3NhZ2UnLCB0aGlzLCBmYWxzZSk7XG59XG5cblxuLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxuZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICB0aGlzLmRpc3BhdGNoTWVzc2FnZShldmVudC50eXBlLCBldmVudCk7XG59XG5cblxuZnVuY3Rpb24gdHJpZ2dlcihtc2dUeXBlLCBkYXRhKSB7XG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YS50eXBlID0gJ21lc3NhZ2U6JyArIG1zZ1R5cGU7XG4gICAgXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcpXG4gICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZShkYXRhLCAnKicpXG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgRE9NRW1pdHRlclNvdXJjZSA9IHJlcXVpcmUoJy4vZG9tX3NvdXJjZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIHdpbmRvd1NlcnZpY2UgPSBuZXcgTWVzc2VuZ2VyO1xudmFyIGRvbUVtaXR0ZXJTb3VyY2UgPSBuZXcgRE9NRW1pdHRlclNvdXJjZSh3aW5kb3dTZXJ2aWNlLCB7IHRyaWdnZXI6ICd0cmlnZ2VyJyB9LCB1bmRlZmluZWQsIHdpbmRvdyk7XG53aW5kb3dTZXJ2aWNlLl9zZXRNZXNzYWdlU291cmNlKGRvbUVtaXR0ZXJTb3VyY2UpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gd2luZG93U2VydmljZTtcblxuXG5fLmV4dGVuZCh3aW5kb3dTZXJ2aWNlLCB7XG4gICAgaXNUb3A6IHdpbmRvd1NlcnZpY2VfaXNUb3Bcbn0pO1xuXG5cbmZ1bmN0aW9uIHdpbmRvd1NlcnZpY2VfaXNUb3AoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy50b3AgPT0gd2luZG93LnNlbGYgfHwgd2luZG93Ll9fa2FybWFfXztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxucmVxdWlyZSgnLi9jb21wb25lbnRzL2NsYXNzZXMvVmlldycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0dyb3VwJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvV3JhcHBlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1RleHQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9TZWxlY3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9JbnB1dCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0lucHV0TGlzdCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1RleHRhcmVhJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvUmFkaW9Hcm91cCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0J1dHRvbicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0h5cGVybGluaycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0xpc3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9MaXN0SXRlbScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1RpbWUnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9EYXRlJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvQ29tYm8nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9TdXBlckNvbWJvJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvQ29tYm9MaXN0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvSW1hZ2UnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9Ecm9wVGFyZ2V0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvRm9sZFRyZWUnKTtcblxucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9Ecm9wZG93bicpO1xuLy8gcmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0RvbScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9GcmFtZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0V2ZW50cycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL09wdGlvbnMnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9UZW1wbGF0ZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0NvbnRhaW5lcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL01vZGVsRmFjZXQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9EcmFnJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvRHJvcCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0xpc3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9JdGVtJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvVHJhbnNmZXInKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHVuaXF1ZUlkID0gcmVxdWlyZSgnLi91bmlxdWVfaWQnKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIHByZWZpeCA9IGNvbmZpZy5jb21wb25lbnRQcmVmaXg7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb25lbnROYW1lO1xuXG5cbmZ1bmN0aW9uIGNvbXBvbmVudE5hbWUoKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIHVuaXF1ZUlkKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgY29tcG9uZW50UmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL2NfcmVnaXN0cnknKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNvbXBvbmVudENsYXNzO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhbmQgcmVnaXN0ZXJzIG5ldyBtaWxvIGNvbXBvbmVudC4gIFRoZSBjb21wb25lbnQgY3JlYXRlZCB3aWxsIGhhdmVcbiAqIGEgcmVmZXJlbmNlIHRvIHRoZSBzdXBlciBjbGFzcyB1c2VkIGluIGl0cyBjcmVhdGlvbiAoQWNjZXNzYWJsZSB1c2luZyA8Q29tcG9uZW50Q2xhc3M+LnN1cGVyKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnLmNsYXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBuZXcgY29tcG9uZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gWydDb21wb25lbnQnXSBjb25maWcuc3VwZXJDbGFzc05hbWUgLSBUaGUgbmFtZSBvZiBhbiBleGlzdGluZyBjb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgbmV3IGNvbXBvbmVudCdzIHN1cGVyIGNsYXNzXG4gKiBAcGFyYW0ge29iamVjdD19IGNvbmZpZy5mYWNldHMgLSBGYWNldCBjb25maWd1cmF0aW9uIChIYXNoIG9mIGZhY2V0IG5hbWUge3N0cmluZ30gdG8gY29uZmlnIHtvYmplY3R9KVxuICogQHBhcmFtIHtvYmplY3Q9fSBjb25maWcubWV0aG9kcyAtIE1ldGhvZHMgb2YgdGhlIG5ldyBjb21wb25lbnQgKEhhc2ggb2YgZnVuY3Rpb24gbmFtZSB7c3RyaW5nfSB0byBmdW5jdGlvbiB7ZnVuY3Rpb259KVxuICogQHBhcmFtIHtvYmplY3Q9fSBjb25maWcuc3RhdGljTWV0aG9kcyAtIFN0YXRpYyBtZXRob2RzIG9mIHRoZSBuZXcgY29tcG9uZW50IChIYXNoIG9mIGZ1bmN0aW9uIG5hbWUge3N0cmluZ30gdG8gZnVuY3Rpb24ge2Z1bmN0aW9ufSlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50Q2xhc3MoY29uZmlnKSB7XG4gICAgY2hlY2soY29uZmlnLCB7XG4gICAgICAgIHN1cGVyQ2xhc3NOYW1lOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBjbGFzc05hbWU6IFN0cmluZyxcbiAgICAgICAgZmFjZXRzOiBNYXRjaC5PcHRpb25hbChPYmplY3QpLFxuICAgICAgICBtZXRob2RzOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PYmplY3RIYXNoKEZ1bmN0aW9uKSksXG4gICAgICAgIHN0YXRpY01ldGhvZHM6IE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9iamVjdEhhc2goRnVuY3Rpb24pKSxcbiAgICB9KTtcbiAgICB2YXIgU3VwZXJDbGFzcyA9IGNvbXBvbmVudFJlZ2lzdHJ5LmdldChjb25maWcuc3VwZXJDbGFzc05hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgIHZhciBDb21wb25lbnRDbGFzcyA9IFN1cGVyQ2xhc3MuY3JlYXRlQ29tcG9uZW50Q2xhc3MoY29uZmlnLmNsYXNzTmFtZSwgY29uZmlnLmZhY2V0cyk7XG5cbiAgICBpZiAoY29uZmlnLm1ldGhvZHMpIF8uZXh0ZW5kUHJvdG8oQ29tcG9uZW50Q2xhc3MsIGNvbmZpZy5tZXRob2RzKTtcblxuICAgIGlmIChjb25maWcuc3RhdGljTWV0aG9kcykge1xuICAgICAgICBpZiAoY29uZmlnLnN0YXRpY01ldGhvZHMuc3VwZXIgIT09IHVuZGVmaW5lZCkgdGhyb3cgJ1xcJ3N1cGVyXFwnIGlzIGEgcmVzZXJ2ZWQga2V5d29yZCc7XG4gICAgICAgIF8uZXh0ZW5kKENvbXBvbmVudENsYXNzLCBjb25maWcuc3RhdGljTWV0aG9kcyk7XG4gICAgfVxuXG4gICAgQ29tcG9uZW50Q2xhc3Muc3VwZXIgPSBTdXBlckNsYXNzLnByb3RvdHlwZTtcbiAgICBjb21wb25lbnRSZWdpc3RyeS5hZGQoQ29tcG9uZW50Q2xhc3MpO1xuICAgIHJldHVybiBDb21wb25lbnRDbGFzcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZXByZWNhdGUoZm4sIG1lc3NhZ2UpIHtcbiAgICB2YXIgd2FybmVkO1xuICAgIHN3aXRjaCAodHlwZW9mIGZuKSB7XG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICByZXR1cm4gXy5tYXBLZXlzKGZuLCBmdW5jdGlvbihmKSB7IHJldHVybiBkZXByZWNhdGUoZiwgbWVzc2FnZSk7IH0pO1xuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIGZuKVxuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWRbcHJvcF0gPSBkZXByZWNhdGUoZm5bcHJvcF0sIG1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZm47XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgICAgICBpZiAoY29uZmlnLmRlcHJlY2F0aW9uV2FybmluZ1xuICAgICAgICAgICAgJiYgKCF3YXJuZWQgfHwgY29uZmlnLmRlcHJlY2F0aW9uV2FybmluZyA9PSAnYWx3YXlzJykpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlIHx8ICdGdW5jdGlvbiAnICsgZm4ubmFtZSArICcgaXMgREVQUkVDQVRFRCcpO1xuICAgICAgICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxudmFyIGRvbVV0aWxzID0ge1xuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBmaWx0ZXJOb2RlTGlzdEJ5VHlwZTogZmlsdGVyTm9kZUxpc3RCeVR5cGUsXG4gICAgY29udGFpbmluZ0VsZW1lbnQ6IGNvbnRhaW5pbmdFbGVtZW50LFxuICAgIHNlbGVjdEVsZW1lbnRDb250ZW50czogc2VsZWN0RWxlbWVudENvbnRlbnRzLFxuICAgIHNlbGVjdEVsZW1lbnRUZXh0OiBzZWxlY3RFbGVtZW50VGV4dCxcbiAgICBnZXRFbGVtZW50T2Zmc2V0OiBnZXRFbGVtZW50T2Zmc2V0LFxuICAgIHNldENhcmV0UG9zaXRpb246IHNldENhcmV0UG9zaXRpb24sXG4gICAgZ2V0U2VsZWN0aW9uRGlyZWN0aW9uOiBnZXRTZWxlY3Rpb25EaXJlY3Rpb24sXG4gICAgc2V0U2VsZWN0aW9uOiBzZXRTZWxlY3Rpb24sXG4gICAgY2xlYXJTZWxlY3Rpb246IGNsZWFyU2VsZWN0aW9uLFxuICAgIHJlbW92ZUVsZW1lbnQ6IHJlbW92ZUVsZW1lbnQsXG4gICAgdW53cmFwRWxlbWVudDogdW53cmFwRWxlbWVudCxcbiAgICB3cmFwSW5FbGVtZW50OiB3cmFwSW5FbGVtZW50LFxuICAgIGRldGFjaENvbXBvbmVudDogZGV0YWNoQ29tcG9uZW50LFxuICAgIGZpcnN0VGV4dE5vZGU6IGZpcnN0VGV4dE5vZGUsXG4gICAgbGFzdFRleHROb2RlOiBsYXN0VGV4dE5vZGUsXG4gICAgdHJpbU5vZGVSaWdodDogdHJpbU5vZGVSaWdodCxcbiAgICB0cmltTm9kZUxlZnQ6IHRyaW1Ob2RlTGVmdCxcbiAgICBzdHJpcEh0bWw6IHN0cmlwSHRtbCxcbiAgICBodG1sRW50aXRpZXM6IGh0bWxFbnRpdGllcyxcbiAgICB3YWxrVHJlZTogd2Fsa1RyZWUsXG4gICAgY3JlYXRlVHJlZVdhbGtlcjogY3JlYXRlVHJlZVdhbGtlcixcblxuICAgIHRyZWVQYXRoT2Y6IHRyZWVQYXRoT2YsXG4gICAgZ2V0Tm9kZUF0VHJlZVBhdGg6IGdldE5vZGVBdFRyZWVQYXRoLFxuICAgIGluc2VydEF0VHJlZVBhdGg6IGluc2VydEF0VHJlZVBhdGgsXG4gICAgaXNUcmVlUGF0aEJlZm9yZTogaXNUcmVlUGF0aEJlZm9yZSxcblxuICAgIGdldE5vZGVXaW5kb3c6IGdldE5vZGVXaW5kb3csXG5cbiAgICBnZXRDb21wb25lbnRzRnJvbVJhbmdlOiBnZXRDb21wb25lbnRzRnJvbVJhbmdlLFxuICAgIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHM6IGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMsXG4gICAgZm9yRWFjaE5vZGVzSW5SYW5nZTogZm9yRWFjaE5vZGVzSW5SYW5nZSxcbiAgICBhcmVSYW5nZXNFcXVhbDogYXJlUmFuZ2VzRXF1YWwsXG5cbiAgICBhZGREZWJ1Z1BvaW50OiBhZGREZWJ1Z1BvaW50XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRvbVV0aWxzO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBlbGVtZW50IGNoaWxkcmVuIG9mIERPTSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBlbGVtZW50IHRvIHJldHVybiB0aGUgY2hpbGRyZW4gb2YgKG9ubHkgRE9NIGVsZW1lbnRzKVxuICogQHJldHVybiB7QXJyYXlbRWxlbWVudF19XG4gKi9cbiBmdW5jdGlvbiBjaGlsZHJlbihlbCkge1xuICAgIHJldHVybiBmaWx0ZXJOb2RlTGlzdEJ5VHlwZShlbC5jaGlsZE5vZGVzLCBOb2RlLkVMRU1FTlRfTk9ERSk7XG4gfVxuXG5cbi8qKlxuICogRmlsdGVycyB0aGUgbGlzdCBvZiBub2RlcyBieSB0eXBlXG4gKlxuICogQHBhcmFtIHtOb2RlTGlzdH0gbm9kZUxpc3QgdGhlIGxpc3Qgb2Ygbm9kZXMsIGZvciBleGFtcGxlIGNoaWxkTm9kZXMgcHJvcGVydHkgb2YgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gbm9kZVR5cGUgYW4gaW50ZWdlciBjb25zdGFudCBbZGVmaW5lZCBieSBET00gQVBJXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS5ub2RlVHlwZSksIGUuZy4gYE5vZGUuRUxFTUVOVF9OT0RFYCBvciBgTm9kZS5URVhUX05PREVgXG4gKiBAcmV0dXJuIHtBcnJheVtOb2RlXX1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyTm9kZUxpc3RCeVR5cGUobm9kZUxpc3QsIG5vZGVUeXBlKSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKG5vZGVMaXN0LCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSBub2RlVHlwZTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEZpbmQgbmVhcmVzdCBwYXJlbnQgZWxlbWVudCBmb3Igbm9kZS5cbiAqIElmIG5vZGUgaXMgYW4gZWxlbWVudCwgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xuZnVuY3Rpb24gY29udGFpbmluZ0VsZW1lbnQobm9kZSkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5cbi8qKlxuICogU2VsZWN0cyBpbm5lciBjb250ZW50cyBvZiBET00gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gc2VsZWN0RWxlbWVudENvbnRlbnRzKGVsKSB7XG4gICAgdmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG4gICAgaWYgKCEgZG9jKSByZXR1cm4gbG9nZ2VyLmVycm9yKCdzZWxlY3RFbGVtZW50Q29udGVudHM6IGVsZW1lbnQgaGFzIG5vIGRvY3VtZW50Jyk7XG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsKTtcbiAgICB2YXIgd2luID0gZ2V0Tm9kZVdpbmRvdyhlbClcbiAgICAgICAgLCBzZWwgPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG59XG5cblxuLyoqXG4gKiBTZWxlY3RzIHRleHQgaW5zaWRlIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqL1xuZnVuY3Rpb24gc2VsZWN0RWxlbWVudFRleHQoZWwpIHtcbiAgICB2YXIgZnJvbU5vZGUgPSBmaXJzdFRleHROb2RlKGVsKVxuICAgICAgICAsIHRvTm9kZSA9IGxhc3RUZXh0Tm9kZShlbCk7XG5cbiAgICBpZiAoZnJvbU5vZGUgJiYgdG9Ob2RlKVxuICAgICAgICBzZXRTZWxlY3Rpb24oZnJvbU5vZGUsIDAsIHRvTm9kZSwgdG9Ob2RlLnRleHRDb250ZW50Lmxlbmd0aCk7XG59XG5cblxuLyoqXG4gKiBTZXRzIHRoZSBjYXJldCBwb3NpdGlvbiB0byB0aGUgcG9zaXRpb24gaW4gdGhlIG5vZGVcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgRE9NIG5vZGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgY2FyZXQgcG9zaXRpb25cbiAqL1xuZnVuY3Rpb24gc2V0Q2FyZXRQb3NpdGlvbihub2RlLCBwb3MpIHtcbiAgICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIGlmICghIGRvYykgcmV0dXJuIGxvZ2dlci5lcnJvcignc2V0Q2FyZXRQb3NpdGlvbjogZWxlbWVudCBoYXMgbm8gZG9jdW1lbnQnKTtcbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZXRTdGFydChub2RlLCBwb3MpO1xuICAgIHZhciB3aW4gPSBnZXROb2RlV2luZG93KG5vZGUpXG4gICAgICAgICwgc2VsID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xufVxuXG4vKipcbiAqIGdldCB0aGUgZGlyZWN0aW9uIG9mIGEgc2VsZWN0aW9uXG4gKlxuICogMSBmb3J3YXJkLCAtMSBiYWNrd2FyZCwgMCBubyBkaXJlY3Rpb24sIHVuZGVmaW5lZCBvbmUgb2YgdGhlIG5vZGUgaXMgZGV0YWNoZWQgb3IgaW4gYSBkaWZmZXJlbnQgZnJhbWVcbiAqXG4gKiBAcGFyYW0ge3NlbH0gYSBzZWxlY3Rpb24gb2JqZWN0XG4gKiBAcmV0dXJuIHstMXwwfDF8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25EaXJlY3Rpb24oc2VsKXtcbiAgICByZXR1cm4gX2dldERpcmVjdGlvbihzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gX2dldERpcmVjdGlvbihmcm9tTm9kZSwgc3RhcnRPZmZzZXQsIHRvTm9kZSwgZW5kT2Zmc2V0KXtcbiAgICB2YXIgZG9jUG9zaXRpb24gPSBmcm9tTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0b05vZGUpO1xuICAgIGlmIChkb2NQb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKXtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRvY1Bvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpe1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyb21Ob2RlID09IHRvTm9kZSl7XG4gICAgICAgIGlmIChzdGFydE9mZnNldCA8IGVuZE9mZnNldCl7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGFydE9mZnNldCA+IGVuZE9mZnNldCl7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBTZWxlY3RzIGEgcmFuZ2UgaW4gYSBkb2N1bWVudFxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gZnJvbU5vZGUgRE9NIG5vZGUgdG8gc3RhcnQgc2VsZWN0aW9uIGluXG4gKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmZzZXRcbiAqIEBwYXJhbSB7Tm9kZX0gdG9Ob2RlIERPTSBub2RlIHRvIGVuZCBzZWxlY3Rpb24gaW5cbiAqIEBwYXJhbSB7TnVtYmVyfSBlbmRPZmZzZXRcbiAqL1xuZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGZyb21Ob2RlLCBzdGFydE9mZnNldCwgdG9Ob2RlLCBlbmRPZmZzZXQpIHtcbiAgICB2YXIgZG9jID0gZnJvbU5vZGUub3duZXJEb2N1bWVudDtcbiAgICBpZiAoISBkb2MpIHJldHVybiBsb2dnZXIoJ3NldENhcmV0UG9zaXRpb246IGVsZW1lbnQgaGFzIG5vIGRvY3VtZW50Jyk7XG4gICAgdmFyIGJhY2t3YXJkID0gX2dldERpcmVjdGlvbihmcm9tTm9kZSwgc3RhcnRPZmZzZXQsIHRvTm9kZSwgZW5kT2Zmc2V0KSA9PSAtMTtcbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICB2YXIgY29udGFpbmVyLCBvcmlnaW5hbENvbnRlbnRFZGl0YWJsZTtcbiAgICAvLyBkb2VzIG5vdCB3b3JrIGluIG5vbiBjb250ZW50RWRpdGFibGUgaXRlbXNcblxuICAgIHZhciB3aW4gPSBnZXROb2RlV2luZG93KGZyb21Ob2RlKVxuICAgICAgICAsIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcblxuXG4gICAgaWYgKGJhY2t3YXJkKXtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodG9Ob2RlLCBlbmRPZmZzZXQpO1xuICAgICAgICByYW5nZS5zZXRFbmQoZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0KTtcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKHRvTm9kZSwgZW5kT2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lciA9PSBOb2RlLkVMRU1FTlRfTk9ERSA/XG4gICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIDpcbiAgICAgICAgcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIucGFyZW50RWxlbWVudDtcblxuICAgIGlmICghY29udGFpbmVyLmlzQ29udGVudEVkaXRhYmxlKXtcbiAgICAgICAgb3JpZ2luYWxDb250ZW50RWRpdGFibGUgPSBjb250YWluZXIuY29udGVudEVkaXRhYmxlOyAvLyBmYWxzZSBvciBpbmhlcml0XG4gICAgICAgIGNvbnRhaW5lci5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICB9XG5cbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIGlmIChiYWNrd2FyZCl7XG4gICAgICAgIHNlbC5leHRlbmQodG9Ob2RlLCBlbmRPZmZzZXQpO1xuICAgIH1cblxuICAgIGlmIChvcmlnaW5hbENvbnRlbnRFZGl0YWJsZSl7XG4gICAgICAgIC8vIHJlc3RvcmluZyBjb250ZW50RWRpdGFibGVcbiAgICAgICAgY29udGFpbmVyLmNvbnRlbnRFZGl0YWJsZSA9IG9yaWdpbmFsQ29udGVudEVkaXRhYmxlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDbGVhcnMgc2VsZWN0aW9uIGluIGEgZ2l2ZW4gd2luZG93XG4gKiBAcGFyYW0ge1dpbmRvd30gd2luXG4gKi9cbmZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKHdpbikge1xuICAgIHdpbiA9IHdpbiB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG59XG5cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGFuIGVsZW1lbnQncyB0b3RhbCB0b3AgYW5kIGxlZnQgb2Zmc2V0IGZyb20gdGhlIGRvY3VtZW50IGVkZ2UuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCB0aGUgZWxlbWVudCBmb3Igd2hpY2ggcG9zaXRpb24gbmVlZHMgdG8gYmUgcmV0dXJuZWRcbiAqIEBwYXJhbSB7aW5jbHVkZUJvcmRlcn0gaWYgaXMgdG8gaW5jbHVkZSB0aGUgYm9yZGVyIHdpZHRoXG4gKiBAcmV0dXJuIHtPYmplY3R9IHZlY3RvciBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvcE9mZnNldCBhbmQgbGVmdE9mZnNldFxuICovXG5mdW5jdGlvbiBnZXRFbGVtZW50T2Zmc2V0KGVsLCBpbmNsdWRlQm9yZGVyKSB7XG4gICAgdmFyIHlQb3MsIHhQb3M7XG5cbiAgICB5UG9zID0gZWwub2Zmc2V0VG9wO1xuICAgIHhQb3MgPSBlbC5vZmZzZXRMZWZ0O1xuICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xuXG4gICAgd2hpbGUgKGVsKSB7XG4gICAgICAgIHlQb3MgKz0gZWwub2Zmc2V0VG9wICsgZ2V0Qm9yZGVyKGVsLCAnSGVpZ2h0JywgaW5jbHVkZUJvcmRlcik7XG4gICAgICAgIHhQb3MgKz0gZWwub2Zmc2V0TGVmdCArIGdldEJvcmRlcihlbCwgJ1dpZHRoJywgaW5jbHVkZUJvcmRlcik7XG4gICAgICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiB7IHRvcE9mZnNldDogeVBvcywgbGVmdE9mZnNldDogeFBvcyB9O1xufVxuXG5cbmZ1bmN0aW9uIGdldEJvcmRlcihlbCwgdHlwZSwgaW5jbHVkZUJvcmRlcikge1xuICAgIGlmIChpbmNsdWRlQm9yZGVyKSB7XG4gICAgICAgIHZhciBzaWRlID0gKHR5cGUgPT0gJ0hlaWdodCcpID8gJ3RvcCcgOiAnbGVmdCcsXG4gICAgICAgICAgICBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCksXG4gICAgICAgICAgICBzaWRlVmFsdWUgPSBwYXJzZUludChzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLScgKyBzaWRlICsgJy13aWR0aCcpLCAxMCk7XG5cbiAgICAgICAgaWYgKHNpZGVWYWx1ZSkgcmV0dXJuIHNpZGVWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGVsZW1lbnQgZnJvbSB0aGUgZG9jdW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIHRoZSBlbGVtZW50IHRvIGJlIHJlbW92ZWRcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnQpe1xuICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgICBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgdGV4dCBub2RlIG9mIGFuIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8Tm9kZX0gbm9kZSB0aGUgbm9kZSB0byBiZSBzZWFyY2hlZCwgaWYgdGhlIG5vZGUgaXMgdGV4dCBub2RlIHdlIHJldHVybiB0aGUgbm9kZS5cbiAqIEByZXR1cm4ge1RleHROb2RlfVxuICovXG5mdW5jdGlvbiBmaXJzdFRleHROb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuIG5vZGU7XG4gICAgdmFyIHRyZWVXYWxrZXIgPSBjcmVhdGVUcmVlV2Fsa2VyKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICByZXR1cm4gdHJlZVdhbGtlci5maXJzdENoaWxkKCk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXN0IGNoaWxkIHRleHQgbm9kZSBvZiBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fE5vZGV9IG5vZGUgdGhlIG5vZGUgdG8gYmUgc2VhcmNoZWQsIGlmIHRoZSBub2RlIGlzIHRleHQgbm9kZSB3ZSByZXR1cm4gdGhlIG5vZGUuXG4gKiBAcmV0dXJuIHtUZXh0Tm9kZX1cbiAqL1xuZnVuY3Rpb24gbGFzdFRleHROb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuIG5vZGU7XG4gICAgdmFyIHRyZWVXYWxrZXIgPSBjcmVhdGVUcmVlV2Fsa2VyKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICByZXR1cm4gdHJlZVdhbGtlci5sYXN0Q2hpbGQoKTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgZWxlbWVudCBmcm9tIHRoZSBkb2N1bWVudCBwdXR0aW5nIGl0cyBjaGlsZHJlbiBpbiBpdHMgcGxhY2VcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIHRoZSBlbGVtZW50IHRvIGJlIFwidW53cmFwcGVkXCJcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudChlbCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgLy8gbXVzdCBiZSBjb3BpZWQgdG8gYXZvaWQgaXRlcmF0aW5nIGEgbXV0YXRpbmcgbGlzdCBvZiBjaGlsZE5vZGVzXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IF8uc2xpY2UoZWwuY2hpbGROb2Rlcyk7XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goZnJhZy5hcHBlbmRDaGlsZCwgZnJhZyk7XG4gICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoZnJhZywgZWwpO1xuICAgICAgICBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogV3JhcHMgYW4gZWxlbWVudCBpbiBhbm90aGVyIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSB3cmFwSW50b0VsXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICovXG5mdW5jdGlvbiB3cmFwSW5FbGVtZW50KHdyYXBJbnRvRWwsIGVsKSB7XG4gICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudE5vZGU7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUod3JhcEludG9FbCwgZWwpO1xuICAgICAgICB3cmFwSW50b0VsLmFwcGVuZENoaWxkKGVsKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBUcmltcyBhIHRleHQgbm9kZSBvZiB0cmFpbGluZyBzcGFjZXMsIGFuZCByZXR1cm5zIHRydWUgaWYgYSB0cmltIHdhcyBwZXJmb3JtZWQuXG4gKlxuICogQHBhcmFtICB7VGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRyaW1Ob2RlUmlnaHQobm9kZSkge1xuICAgIHJldHVybiBfdHJpbU5vZGUobm9kZSwgJ3RyaW1SaWdodCcpO1xufVxuXG5cbi8qKlxuICogVHJpbXMgYSB0ZXh0IG5vZGUgb2YgbGVhZGluZyBzcGFjZXMsIGFuZCByZXR1cm5zIHRydWUgaWYgYSB0cmltIHdhcyBwZXJmb3JtZWQuXG4gKlxuICogQHBhcmFtICB7VGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRyaW1Ob2RlTGVmdChub2RlKSB7XG4gICAgcmV0dXJuIF90cmltTm9kZShub2RlLCAndHJpbUxlZnQnKTtcbn1cblxuXG5mdW5jdGlvbiBfdHJpbU5vZGUobm9kZSwgbWV0aG9kTmFtZSkge1xuICAgIHZhciBsZW4gPSBub2RlLmxlbmd0aDtcbiAgICBub2RlLnRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudFttZXRob2ROYW1lXSgpO1xuICAgIHJldHVybiBsZW4gIT09IG5vZGUubGVuZ3RoO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgcmVmZXJlbmNlIHRvIGNvbXBvbmVudCBmcm9tIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICovXG5mdW5jdGlvbiBkZXRhY2hDb21wb25lbnQoZWwpIHtcbiAgICBkZWxldGUgZWxbY29uZmlnLmNvbXBvbmVudFJlZl07XG59XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGNvbnRlbnQgb2YgYSBodG1sIHN0cmluZ1xuICogQHBhcmFtICB7U3RyaW5nfSBzdHIgQW55IHN0cmluZ1xuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBzdHJpbmcgY2xlYW5lZCBvZiBhbnkgaHRtbCBjb250ZW50LlxuICovXG5mdW5jdGlvbiBzdHJpcEh0bWwoc3RyKSB7XG4gICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIGRpdi50ZXh0Q29udGVudCB8fCAnJztcbn1cblxuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgZm9yIG5hdGl2ZSBUcmVlV2Fsa2VyIHRoYXQgYXV0b21hdGljYWxseSB3YWxrcyB0aGUgdHJlZSBhbmQgY2FsbHMgYW4gaXRlcmF0b3IgZnVuY3Rpb24uXG4gKiBUaGlzIHdpbGwgbm90IGl0ZXJhdGUgdGhlIHJvb3QgZWxlbWVudC5cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSByb290IFRoZSBjb250YWluaW5nIHJvb3QgZWxlbWVudCB0byBiZSB3YWxrZWQuIFdpbGwgbm90IGJlIGl0ZXJhdGVkLlxuICogQHBhcmFtICB7Tm9kZUZpbGVyfSBmaWx0ZXIgQSBOb2RlRmlsdGVyIGNvbnN0YW50LCBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL1RyZWVXYWxrZXJcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBpdGVyYXRvciBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBlYWNoIG5vZGUuIFJldHVybmluZyAnZmFsc2UnIHdpbGwgYnJlYWsuXG4gKiBAcGFyYW0gIHtPYmplY3R9IGNvbnRleHQgQW4gb3B0aW9uYWwgY29udGV4dCB0byBwYXNzZWQsIGRlZmF1bHRzIHRvIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIHdhbGtUcmVlKHJvb3QsIGZpbHRlciwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICB2YXIgdHcgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHJvb3QsIGZpbHRlcik7XG4gICAgd2hpbGUodHcubmV4dE5vZGUoKSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IuY2FsbChjb250ZXh0IHx8IHJvb3QsIHR3LmN1cnJlbnROb2RlKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIGJyZWFrO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgY2hpbGQgaW5kZXhlcyBvZiBlbGVtZW50IHBhdGggaW5zaWRlIHJvb3QgZWxlbWVudCBpbiBET00gdHJlZSB1c2luZyBicmVhZHRoIGZpcnN0IHRyZWUgdHJhdmVyc2FsLlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGVsZW1lbnQgaXMgbm90IGluc2lkZSByb290IGVsZW1lbnQsIDAgaWYgdGhlIHJvb3QgZWxlbWVudCBpdHNlbGYgaXMgcGFzc2VkLlxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IHJvb3RFbCBlbGVtZW50IHRvIHNlYXJjaFxuICogQHBhcmFtICB7RWxlbWVudH0gZWwgZWxlbWVudCB0byBmaW5kIHRoZSBpbmRleCBvZlxuICogQHJldHVybiB7QXJyYXlbTnVtYmVyXX1cbiAqL1xuZnVuY3Rpb24gdHJlZVBhdGhPZihyb290RWwsIGVsKSB7XG4gICAgaWYgKCEgKHJvb3RFbCAmJiByb290RWwuY29udGFpbnMoZWwpKSkgcmV0dXJuO1xuXG4gICAgdmFyIHRyZWVQYXRoID0gW11cbiAgICAgICAgLCBub2RlID0gcm9vdEVsO1xuXG4gICAgd2hpbGUgKG5vZGUgIT0gZWwpIHtcbiAgICAgICAgdmFyIG5vZGVJbmRleCA9IF8uZmluZEluZGV4KG5vZGUuY2hpbGROb2RlcywgY29udGFpbnNFbCk7XG4gICAgICAgIHRyZWVQYXRoLnB1c2gobm9kZUluZGV4KTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tub2RlSW5kZXhdO1xuICAgIH1cblxuICAgIHJldHVybiB0cmVlUGF0aDtcblxuICAgIGZ1bmN0aW9uIGNvbnRhaW5zRWwoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkLmNvbnRhaW5zKGVsKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGVsZW1lbnQgYXQgZ2l2ZW4gdHJlZSBwYXRoXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSByb290RWxcbiAqIEBwYXJhbSB7QXJyYXlbTnVtYmVyXX0gdHJlZVBhdGhcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbmVhcmVzdCByZXR1cm4gbmVhcmVzdCBwb3NzaWJsZSBub2RlIGlmIGV4YWN0IG5vZGUgZG9lcyBub3QgZXhpc3RcbiAqIEByZXR1cm4ge05vZGV9XG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVBdFRyZWVQYXRoKHJvb3RFbCwgdHJlZVBhdGgsIG5lYXJlc3QpIHtcbiAgICBpZiAoIXRyZWVQYXRoKSByZXR1cm47XG5cbiAgICB2YXIgbGVuID0gdHJlZVBhdGgubGVuZ3RoO1xuICAgIGlmIChsZW4gPT09IDApIHJldHVybiByb290RWw7XG5cbiAgICB2YXIgbm9kZSA9IHJvb3RFbDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICBpZiAoISBjaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKCEgbmVhcmVzdCkgbm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZEluZGV4ID0gdHJlZVBhdGhbaV1cbiAgICAgICAgICAgICwgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4XTtcbiAgICAgICAgaWYgKCEgY2hpbGQpIHtcbiAgICAgICAgICAgIG5vZGUgPSBuZWFyZXN0XG4gICAgICAgICAgICAgICAgICAgID8gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG59XG5cblxuLyoqXG4gKiBJbnNlcnRzIGFuIGVsZW1lbnQgaW5zaWRlIHJvb3QgYXQgYSBnaXZlbiBwYXRoIGluIHRyZWUgKHRoYXQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIGluZGV4IHJldHVybmVkIGJ5IGB0cmVlUGF0aE9mYCBmdW5jdGlvbikuIElmIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0aGUgcm9vdCdzIHRyZWUsIGl0IHdpbGwgYmUgcmVtb3ZlZCBmaXJzdCBhbmQgdGhlbiBtb3ZlZCB0byB0aGUgcGFzc2VkIHRyZWVJbmRleFxuICogSW5zZXJ0aW9uIGF0IGluZGV4IDAgaXMgbm90IHBvc3NpYmxlIGFuZCB3aWxsIHJldHVybiB1bmRlZmluZWQgYXMgaXQgd291bGQgbWVhbiByZXBsYWNpbmcgdGhlIHJvb3QgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbCBlbGVtZW50IGludG8gd2hpY2ggdG8gaW5zZXJ0XG4gKiBAcGFyYW0ge051bWJlcn0gdHJlZUluZGV4IGluZGV4IGluIERPTSB0cmVlIGluc2lkZSByb290IGVsZW1lbnQgKHNlZSB0cmVlUGF0aE9mKVxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBlbGVtZW50IHRvIGJlIGluc2VydGVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHdhcyBzdWNjZXNzZnVsbHkgaW5zZXJ0ZWRcbiAqL1xuZnVuY3Rpb24gaW5zZXJ0QXRUcmVlUGF0aChyb290RWwsIHRyZWVQYXRoLCBlbCwgbmVhcmVzdCkge1xuICAgIHZhciB0b05vcm1hbGl6ZSA9IGVsLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFO1xuICAgIGlmIChyb290RWwuY29udGFpbnMoZWwpKVxuICAgICAgICByZW1vdmVFbGVtZW50KGVsKTsgLy8gY2FuJ3QgdXNlIHJlbW92ZUNoaWxkIGFzIHJvb3RFbCBoZXJlIGlzIG5vdCBhbiBpbW1lZGlhdGUgcGFyZW50XG5cbiAgICBpZiAodHJlZVBhdGgubGVuZ3RoID09IDApIHJldHVybjtcblxuICAgIHZhciBwYXJlbnQgPSBnZXROb2RlQXRUcmVlUGF0aChyb290RWwsIHRyZWVQYXRoLnNsaWNlKDAsIC0xKSwgbmVhcmVzdClcbiAgICAgICAgLCBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZE5vZGVzO1xuXG4gICAgaWYgKCEgY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKG5lYXJlc3QpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcztcbiAgICAgICAgfSBlbHNlIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRJbmRleCA9IHRyZWVQYXRoW3RyZWVQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICwgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4XTtcblxuICAgIGlmIChjaGlsZCkge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGVsLCBjaGlsZCk7XG4gICAgICAgIGlmICh0b05vcm1hbGl6ZSkgcGFyZW50Lm5vcm1hbGl6ZSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAoY2hpbGRJbmRleCA9PT0gMCB8fCBuZWFyZXN0KSkge1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICBpZiAodG9Ob3JtYWxpemUpIHBhcmVudC5ub3JtYWxpemUoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4IC0gMV07XG4gICAgICAgIGlmIChjaGlsZCB8fCBuZWFyZXN0KSB7XG4gICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICAgICAgaWYgKHRvTm9ybWFsaXplKSBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBmaXJzdCB0cmVlIHBhdGggcG9pbnRzIHRvIGEgbm9kZSB3aGljaCBpcyBiZWZvcmUgdGhlIG90aGVyIGluIHRoZSBkb2N1bWVudCBvcmRlci5cbiAqIEBwYXJhbSAge0FycmF5fSAgcGF0aDEgICBBIHRyZWVwYXRoIGFycmF5XG4gKiBAcGFyYW0gIHtBcnJheX0gIHBhdGgyICAgQSB0cmVlcGF0aCBhcnJheVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNUcmVlUGF0aEJlZm9yZShwYXRoMSwgcGF0aDIpIHtcbiAgICB2YXIgaSA9IDBcbiAgICAgICAgLCBpc0JlZm9yZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aDEpICYmIEFycmF5LmlzQXJyYXkocGF0aDIpKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdpc1RyZWVQYXRoQmVmb3JlOiBPbmUgb3IgYm90aCBwYXRocyBhcmUgbm90IHZhbGlkIHRyZWVwYXRoIGFycmF5cy4nKTtcblxuICAgIGZvciAoaTsgaSA8IHBhdGgxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXRoMVtpXSA8IHBhdGgyW2ldKSB7XG4gICAgICAgICAgICBpc0JlZm9yZSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChwYXRoMVtpXSA+IHBhdGgyW2ldKSB7XG4gICAgICAgICAgICBpc0JlZm9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlzQmVmb3JlID09ICd1bmRlZmluZWQnKVxuICAgICAgICBpZiAocGF0aDEubGVuZ3RoIDwgcGF0aDIubGVuZ3RoKVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2lzVHJlZVBhdGhCZWZvcmU6IE9uZSBub2RlIGlzIGluc2lkZSBhbm90aGVyJyk7XG5cbiAgICByZXR1cm4gaXNCZWZvcmUgfHwgZmFsc2U7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0cyBub24gbGF0aW4gY2hhcmFjdGVycyB0byBIVE1MIGVudGl0eSBjb2Rlcy5cbiAqIEBwYXJhbSAge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gY29udmVydFxuICogQHJldHVybiB7U3RyaW5nfSAgICAgdGhlIHN0cmluZyB3aXRoIGh0bWwgZW50aXRpZXNcbiAqL1xuZnVuY3Rpb24gaHRtbEVudGl0aWVzKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1xcdTAwQTAtXFx1OTk5OTk8PlxcJl0vZ2ltLCBmdW5jdGlvbihpKSB7XG4gICAgICAgIHJldHVybiAnJiMnK2kuY2hhckNvZGVBdCgwKSsnOyc7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlVHJlZVdhbGtlcihlbCwgd2hhdFRvU2hvdykge1xuICAgIHdoYXRUb1Nob3cgPSB3aGF0VG9TaG93IHx8IChOb2RlRmlsdGVyLlNIT1dfVEVYVCB8IE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlbCwgd2hhdFRvU2hvdyk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gdGhlIHdpbmRvdyB0aGUgbm9kZSBpcyBpblxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICogQHJldHVybiB7V2luZG93fVxuICovXG5mdW5jdGlvbiBnZXROb2RlV2luZG93KG5vZGUpIHtcbiAgICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBkb2MgJiYgKGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93KTtcbn1cblxuXG5cbi8qKlxuICogZG8gc29tZXRoaW5nIGZvciBlYWNoIG5vZGVzIGNvbnRhaW5lZCBpbiBhIHJhbmdlXG4gKlxuICogQHBhcmFtIHtyYW5nZX0gYSByYW5nZVxuICogQHBhcmFtIHtjYn0gYSBmdW5jdGlvbiB0YWtpbmcgYSBub2RlIGFzIGFyZ3VtZW50XG5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaE5vZGVzSW5SYW5nZShyYW5nZSwgY2Ipe1xuICAgIHZhciByYW5nZUNvbnRhaW5lciA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXG4gICAgICAgICwgZG9jID0gcmFuZ2VDb250YWluZXIub3duZXJEb2N1bWVudDtcblxuICAgIGZ1bmN0aW9uIGlzTm9kZUluc2lkZVJhbmdlKG5vZGUpe1xuICAgICAgICB2YXIgbm9kZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgdmFyIGlzSW5zaWRlID0gZmFsc2U7XG4gICAgICAgIG5vZGVSYW5nZS5zZWxlY3ROb2RlKG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5TVEFSVF9UT19TVEFSVCwgcmFuZ2UpICE9IC0xXG4gICAgICAgICAgICAmJiBub2RlUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5FTkRfVE9fRU5ELCByYW5nZSkgIT0gMSl7XG4gICAgICAgICAgICBpc0luc2lkZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZVJhbmdlLmRldGFjaCgpO1xuICAgICAgICByZXR1cm4gaXNJbnNpZGU7XG4gICAgfVxuXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2MuY3JlYXRlVHJlZVdhbGtlcihyYW5nZUNvbnRhaW5lcixcbiAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UIHwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXG4gICAgdmFyIGN1cnJlbnROb2RlO1xuICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKSl7IC8vIHNob3VsZCBiZSBhc3NpZ25tZW50XG4gICAgICAgIGlmIChpc05vZGVJbnNpZGVSYW5nZShjdXJyZW50Tm9kZSkpe1xuICAgICAgICAgICAgY2IoY3VycmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIGdldCBhbGwgY29tcG9uZW50cyBjb250YWluZWQgaW4gYSByYW5nZVxuICpcbiAqIEBwYXJhbSB7cmFuZ2V9IGEgRE9NIHJhbmdlLlxuICovXG5mdW5jdGlvbiBnZXRDb21wb25lbnRzRnJvbVJhbmdlKHJhbmdlKSB7XG4gICAgdmFyIHdpbiA9IGdldE5vZGVXaW5kb3cocmFuZ2Uuc3RhcnRDb250YWluZXIpXG4gICAgICAgICwgQ29tcG9uZW50ID0gd2luLm1pbG8uQ29tcG9uZW50O1xuXG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICBmb3JFYWNoTm9kZXNJblJhbmdlKHJhbmdlLCBmdW5jdGlvbiAobm9kZSl7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICB2YXIgY29tcCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQobm9kZSk7XG4gICAgICAgICAgICBpZiAoY29tcClcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnRzO1xufVxuXG4vKipcbiAqIGRlbGV0ZSBhIHJhbmdlXG4gKlxuICogQHBhcmFtIHtyYW5nZX0gZGVsZXRlIGEgRE9NIHJhbmdlIGFuZCBhbGwgdGhlIGNvbXBvbmVudHMgaW5zaWRlXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMocmFuZ2UpIHtcbiAgICB2YXIgY29tcG9uZW50cyA9IGdldENvbXBvbmVudHNGcm9tUmFuZ2UocmFuZ2UpO1xuXG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgY29tcC5kZXN0cm95KHRydWUpO1xuICAgIH0pO1xuXG4gICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbn1cblxuLyoqXG4gKiBjaGVjayBpZiB0d28gcmFuZ2VzIGFyZSBlcXVpdmFsZW50XG4gKlxuICogQHBhcmFtIHtyYW5nZX0gcmFuZ2UxXG4gKiBAcGFyYW0ge3JhbmdlfSByYW5nZTJcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGFyZSB0aGUgdHdvIHJhbmdlcyBlcXVpdmFsZW50XG4gKi9cbmZ1bmN0aW9uIGFyZVJhbmdlc0VxdWFsKHJhbmdlMSwgcmFuZ2UyKXtcbiAgICByZXR1cm4gcmFuZ2UxLmNvbXBhcmVCb3VuZGFyeVBvaW50cyh3aW5kb3cuUmFuZ2UuU1RBUlRfVE9fU1RBUlQsIHJhbmdlMikgPT0gMCAmJiByYW5nZTEuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5FTkRfVE9fRU5ELCByYW5nZTIpID09IDA7XG59XG5cblxuLyoqXG4gKiBBZGRzIGEgc2luZ2xlIHBpeGVsIGRpdiB0byB0aGUgYm9keSBhdCBhIGdpdmVuIHggYW5kIHkgcG9zaXRpb24uIFVzZWZ1bCBmb3IgZGVidWdnaW5nIHBvc2l0aW9uIHNwZWNpZmljIGNvZGUuXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqL1xuZnVuY3Rpb24gYWRkRGVidWdQb2ludCh4LCB5KSB7XG4gICAgdmFyIGRiRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkYkVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6IDFweDsgaGVpZ2h0OiAxcHg7IHBvc2l0aW9uOmZpeGVkOyBsZWZ0OicreCsncHg7IHRvcDonK3krJ3B4OyBiYWNrZ3JvdW5kLWNvbG9yOnJlZDsgei1pbmRleDogMTAwJyk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRiRWwpO30sIDIwMCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IERPTUxpc3RlbmVycztcblxuXG5mdW5jdGlvbiBET01MaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKERPTUxpc3RlbmVycywge1xuICAgIGFkZDogRE9NTGlzdGVuZXJzJGFkZCxcbiAgICByZW1vdmU6IERPTUxpc3RlbmVycyRyZW1vdmUsXG4gICAgcmVtb3ZlQWxsOiBET01MaXN0ZW5lcnMkcmVtb3ZlQWxsXG59KTtcblxuXG5mdW5jdGlvbiBET01MaXN0ZW5lcnMkYWRkKHRhcmdldCwgZXZlbnRUeXBlLCBoYW5kbGVyKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaCh7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgaGFuZGxlcjogaGFuZGxlclxuICAgIH0pO1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlcik7XG59XG5cblxuZnVuY3Rpb24gRE9NTGlzdGVuZXJzJHJlbW92ZSh0YXJnZXQsIGV2ZW50VHlwZSwgaGFuZGxlcikge1xuICAgIHZhciBsaXN0ZW5lciA9IHtcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgICBoYW5kbGVyOiBoYW5kbGVyXG4gICAgfTtcbiAgICB2YXIgaWR4ID0gXy5maW5kSW5kZXgodGhpcy5saXN0ZW5lcnMsIF8ucGFydGlhbChfLmlzRXF1YWwsIGxpc3RlbmVyKSk7XG5cbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIERPTUxpc3RlbmVycyRyZW1vdmVBbGwoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaChfcmVtb3ZlTGlzdGVuZXIpO1xuICAgIHRoaXMubGlzdGVuZXJzID0gW107XG59XG5cblxuZnVuY3Rpb24gX3JlbW92ZUxpc3RlbmVyKGwpIHtcbiAgICBsLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGwuZXZlbnRUeXBlLCBsLmhhbmRsZXIpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBkb21SZWFkeTtcblxuXG52YXIgZG9tUmVhZHlGdW5jcyA9IFtdXG4gICAgLCBkb21SZWFkeVN1YnNjcmliZWQgPSBmYWxzZTtcblxuXG5mdW5jdGlvbiBkb21SZWFkeShmdW5jKSB7IC8vICwgYXJndW1lbnRzXG4gICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgICwgYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICBpZiAoaXNSZWFkeS5jYWxsKHRoaXMpKVxuICAgICAgICBjYWxsRnVuYygpO1xuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWRvbVJlYWR5U3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIG9uRG9tUmVhZHkpO1xuICAgICAgICAgICAgZG9tUmVhZHlTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBkb21SZWFkeUZ1bmNzLnB1c2goY2FsbEZ1bmMpOyAvLyBjbG9zdXJlIGlzIGFkZGVkLCBzbyBldmVyeSB0aW1lIGRpZmZlcmVudCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGxGdW5jKCkge1xuICAgICAgICBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBvbkRvbVJlYWR5KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBvbkRvbVJlYWR5KTtcbiAgICBkb21SZWFkeUZ1bmNzLmZvckVhY2goZnVuY3Rpb24oZnVuYykgeyBmdW5jKCk7IH0pO1xufVxuXG5cbl8uZXh0ZW5kKGRvbVJlYWR5LCB7XG4gICAgaXNSZWFkeTogaXNSZWFkeVxufSk7XG5cblxuZnVuY3Rpb24gaXNSZWFkeSgpIHtcbiAgICB2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG4gICAgcmV0dXJuIHJlYWR5U3RhdGUgPT0gJ2xvYWRpbmcnID8gZmFsc2UgOiByZWFkeVN0YXRlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cy9jX2NsYXNzJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgZHJhZ0Ryb3BDb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKS5kcmFnRHJvcFxuICAgICwgY29tcG9uZW50TWV0YVJlZ2V4ID0gZHJhZ0Ryb3BDb25maWcuZGF0YVR5cGVzLmNvbXBvbmVudE1ldGFSZWdleFxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBiYXNlMzIgPSByZXF1aXJlKCdiYXNlMzInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IERyYWdEcm9wO1xuXG5cbi8qKlxuICogV3JhcHBlciBmb3IgZXZlbnQuZGF0YVRyYW5zZmVyIG9mIGRyYWctZHJvcCBIVE1MIEFQSVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtldmVudH0gRE9NIGV2ZW50XG4gKiBAcmV0dXJuIHtEcmFnRHJvcH1cbiAqL1xuZnVuY3Rpb24gRHJhZ0Ryb3AoZXZlbnQpIHtcbiAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIgPSBldmVudC5kYXRhVHJhbnNmZXI7XG4gICAgdGhpcy50eXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcztcbn1cblxuLyoqXG4gKiBVc2FnZTpcbiAqIHZhciB0ZXN0RFQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICogdGVzdERULnNldENvbXBvbmVudE1ldGEobmV3Q29tcG9uZW50LCB7dGVzdDogJ3Rlc3QnLCB0ZXN0MjogJ3Rlc3QyJ30pO1xuICogdGVzdERULmdldENvbXBvbmVudE1ldGEoKTtcbiAqL1xuXG5fLmV4dGVuZChEcmFnRHJvcCwge1xuICAgIGNvbXBvbmVudERhdGFUeXBlOiBEcmFnRHJvcCQkY29tcG9uZW50RGF0YVR5cGVcbn0pO1xuXG5fLmV4dGVuZFByb3RvKERyYWdEcm9wLCB7XG4gICAgaXNDb21wb25lbnQ6IERyYWdEcm9wJGlzQ29tcG9uZW50LFxuICAgIGdldENvbXBvbmVudFN0YXRlOiBEcmFnRHJvcCRnZXRDb21wb25lbnRTdGF0ZSxcbiAgICBzZXRDb21wb25lbnRTdGF0ZTogRHJhZ0Ryb3Akc2V0Q29tcG9uZW50U3RhdGUsXG4gICAgZ2V0Q29tcG9uZW50TWV0YTogRHJhZ0Ryb3AkZ2V0Q29tcG9uZW50TWV0YSxcbiAgICBzZXRDb21wb25lbnRNZXRhOiBEcmFnRHJvcCRzZXRDb21wb25lbnRNZXRhLFxuICAgIGdldEFsbG93ZWRFZmZlY3RzOiBEcmFnRHJvcCRnZXRBbGxvd2VkRWZmZWN0cyxcbiAgICBzZXRBbGxvd2VkRWZmZWN0czogRHJhZ0Ryb3Akc2V0QWxsb3dlZEVmZmVjdHMsXG4gICAgZ2V0RHJvcEVmZmVjdDogRHJhZ0Ryb3AkZ2V0RHJvcEVmZmVjdCxcbiAgICBzZXREcm9wRWZmZWN0OiBEcmFnRHJvcCRzZXREcm9wRWZmZWN0LFxuICAgIGlzRWZmZWN0QWxsb3dlZDogRHJhZ0Ryb3AkaXNFZmZlY3RBbGxvd2VkLFxuICAgIGdldERhdGE6IERyYWdEcm9wJGdldERhdGEsXG4gICAgc2V0RGF0YTogRHJhZ0Ryb3Akc2V0RGF0YSxcbiAgICBjbGVhckRhdGE6IERyYWdEcm9wJGNsZWFyRGF0YVxufSk7XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3AkJGNvbXBvbmVudERhdGFUeXBlKCkge1xuICAgIHJldHVybiBkcmFnRHJvcENvbmZpZy5kYXRhVHlwZXMuY29tcG9uZW50O1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGlzQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBfLmluZGV4T2YodGhpcy50eXBlcywgRHJhZ0Ryb3AuY29tcG9uZW50RGF0YVR5cGUoKSkgPj0gMDtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXRDb21wb25lbnRTdGF0ZSgpIHtcbiAgICB2YXIgZGF0YVR5cGUgPSBEcmFnRHJvcC5jb21wb25lbnREYXRhVHlwZSgpXG4gICAgICAgICwgc3RhdGVTdHIgPSB0aGlzLmRhdGFUcmFuc2Zlci5nZXREYXRhKGRhdGFUeXBlKVxuICAgICAgICAsIHN0YXRlID0gXy5qc29uUGFyc2Uoc3RhdGVTdHIpO1xuXG4gICAgcmV0dXJuIHN0YXRlO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldENvbXBvbmVudFN0YXRlKGNvbXBvbmVudCwgc3RhdGVTdHIpe1xuICAgIGlmICghIHN0YXRlU3RyKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGNvbXBvbmVudC5nZXRUcmFuc2ZlclN0YXRlKHsgcmVxdWVzdGVkQnk6ICdkcmFnJyB9KTtcbiAgICAgICAgc3RhdGVTdHIgPSBKU09OLnN0cmluZ2lmeShzdGF0ZSk7XG4gICAgfVxuICAgIHZhciBkYXRhVHlwZSA9IERyYWdEcm9wLmNvbXBvbmVudERhdGFUeXBlKCk7XG5cbiAgICBzdGF0ZVN0ciAmJiB0aGlzLmRhdGFUcmFuc2Zlci5zZXREYXRhKGRhdGFUeXBlLCBzdGF0ZVN0cik7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9odG1sJywgY29tcG9uZW50LmVsLm91dGVySFRNTCk7XG4gICAgcmV0dXJuIHN0YXRlU3RyO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldENvbXBvbmVudE1ldGEoY29tcG9uZW50LCBwYXJhbXMsIGRhdGEpIHtcbiAgICB2YXIgbWV0YSA9IF9jb21wb25lbnRNZXRhKGNvbXBvbmVudCk7XG5cbiAgICB2YXIgcGFyYW1zU3RyID0gXy50b1F1ZXJ5U3RyaW5nKHBhcmFtcyk7XG4gICAgdmFyIGRhdGFUeXBlID0gZHJhZ0Ryb3BDb25maWcuZGF0YVR5cGVzLmNvbXBvbmVudE1ldGFUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnJWNsYXNzJywgX2VuY29kZShtZXRhLmNvbXBDbGFzcyB8fCAnJykpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclbmFtZScsIF9lbmNvZGUobWV0YS5jb21wTmFtZSB8fCAnJykpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclcGFyYW1zJywgX2VuY29kZShwYXJhbXNTdHIgfHwgJycpKTtcblxuICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09ICdvYmplY3QnKSBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5zZXREYXRhKGRhdGFUeXBlLCBkYXRhIHx8ICcnKTtcblxuICAgIHJldHVybiBkYXRhVHlwZTtcbn1cblxuXG5mdW5jdGlvbiBfZW5jb2RlKHN0cikge1xuICAgIHJldHVybiBiYXNlMzIuZW5jb2RlKHN0cikudG9Mb3dlckNhc2UoKTtcbn1cblxuXG5mdW5jdGlvbiBfY29tcG9uZW50TWV0YShjb21wb25lbnQpIHtcbiAgICByZXR1cm4gY29tcG9uZW50LnRyYW5zZmVyXG4gICAgICAgICAgICA/IGNvbXBvbmVudC50cmFuc2Zlci5nZXRDb21wb25lbnRNZXRhKClcbiAgICAgICAgICAgIDogeyBcbiAgICAgICAgICAgICAgICBjb21wQ2xhc3M6IGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgICAgICAgIGNvbXBOYW1lOiBjb21wb25lbnQubmFtZVxuICAgICAgICAgICAgfTtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXRDb21wb25lbnRNZXRhKCkge1xuICAgIHZhciBtYXRjaDtcbiAgICB2YXIgbWV0YURhdGFUeXBlID0gXy5maW5kKHRoaXMudHlwZXMsIGZ1bmN0aW9uIChkVHlwZSkge1xuICAgICAgICBtYXRjaCA9IGRUeXBlLm1hdGNoKGNvbXBvbmVudE1ldGFSZWdleCk7XG4gICAgICAgIHJldHVybiAhIW1hdGNoO1xuICAgIH0pO1xuICAgIGlmICghbWV0YURhdGFUeXBlKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpPTE7IGk8NDsgaSsrKVxuICAgICAgICBtYXRjaFtpXSA9IGJhc2UzMi5kZWNvZGUobWF0Y2hbaV0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tcENsYXNzOiBtYXRjaFsxXSxcbiAgICAgICAgY29tcE5hbWU6IG1hdGNoWzJdLFxuICAgICAgICBwYXJhbXM6IF8uZnJvbVF1ZXJ5U3RyaW5nKG1hdGNoWzNdKSxcbiAgICAgICAgbWV0YURhdGFUeXBlOiBtZXRhRGF0YVR5cGUsXG4gICAgICAgIG1ldGFEYXRhOiBfLmpzb25QYXJzZSh0aGlzLmRhdGFUcmFuc2Zlci5nZXREYXRhKG1ldGFEYXRhVHlwZSkpIFxuICAgICAgICAgICAgICAgICAgICA/IF8uanNvblBhcnNlKHRoaXMuZGF0YVRyYW5zZmVyLmdldERhdGEobWV0YURhdGFUeXBlKSkgXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShtZXRhRGF0YVR5cGUpXG4gICAgfTtcbn1cblxuXG4vLyBhcyBkZWZpbmVkIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvRHJhZ0Ryb3AvRHJhZ19PcGVyYXRpb25zI2RyYWdzdGFydFxuZnVuY3Rpb24gRHJhZ0Ryb3AkZ2V0QWxsb3dlZEVmZmVjdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0QWxsb3dlZEVmZmVjdHMoZWZmZWN0cykge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBlZmZlY3RzO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGdldERyb3BFZmZlY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0RHJvcEVmZmVjdChlZmZlY3QpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gZWZmZWN0O1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGlzRWZmZWN0QWxsb3dlZChlZmZlY3QpIHtcbiAgICB2YXIgYWxsb3dlZEVmZmVjdHMgPSB0aGlzLmdldEFsbG93ZWRFZmZlY3RzKClcbiAgICAgICAgLCBpc0NvcHkgPSBlZmZlY3QgPT0gJ2NvcHknXG4gICAgICAgICwgaXNNb3ZlID0gZWZmZWN0ID09ICdtb3ZlJ1xuICAgICAgICAsIGlzTGluayA9IGVmZmVjdCA9PSAnbGluaydcbiAgICAgICAgLCBpc0FsbG93ZWQgPSBpc0NvcHkgfHwgaXNMaW5rIHx8IGlzTW92ZTtcblxuICAgIHN3aXRjaCAoYWxsb3dlZEVmZmVjdHMpIHtcbiAgICAgICAgY2FzZSAnY29weSc6XG4gICAgICAgIGNhc2UgJ21vdmUnOlxuICAgICAgICBjYXNlICdsaW5rJzpcbiAgICAgICAgICAgIHJldHVybiBhbGxvd2VkRWZmZWN0cyA9PSBlZmZlY3Q7XG4gICAgICAgIGNhc2UgJ2NvcHlMaW5rJzpcbiAgICAgICAgICAgIHJldHVybiBpc0NvcHkgfHwgaXNMaW5rO1xuICAgICAgICBjYXNlICdjb3B5TW92ZSc6XG4gICAgICAgICAgICByZXR1cm4gaXNDb3B5IHx8IGlzTW92ZTtcbiAgICAgICAgY2FzZSAnbGlua01vdmUnOlxuICAgICAgICAgICAgcmV0dXJuIGlzTGluayB8fCBpc01vdmU7XG4gICAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGNhc2UgJ3VuaW5pdGlhbGl6ZWQnOlxuICAgICAgICAgICAgcmV0dXJuIGlzQWxsb3dlZDtcbiAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGdldERhdGEoZGF0YVR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSk7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0RGF0YShkYXRhVHlwZSwgZGF0YVN0cikge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLnNldERhdGEoZGF0YVR5cGUsIGRhdGFTdHIpO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGNsZWFyRGF0YShkYXRhVHlwZSkge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLmNsZWFyRGF0YShkYXRhVHlwZSk7XG59XG5cblxuLyoqXG4gKiBEcmFnIGRyb3Agc2VydmljZSBjb21wZW5zYXRpbmcgZm9yIHRoZSBsYWNrIG9mIGNvbW11bmljYXRpb24gZnJvbSBkcm9wIHRhcmdldCB0byBkcmFnIHNvdXJjZSBpbiBET00gQVBJXG4gKi9cbnZhciBkcmFnRHJvcFNlcnZpY2UgPSBuZXcgTWVzc2VuZ2VyO1xuXG52YXIgX2N1cnJlbnREcmFnRHJvcCwgX2N1cnJlbnREcmFnRmFjZXQ7XG5cbl8uZXh0ZW5kKERyYWdEcm9wLCB7XG4gICAgc2VydmljZTogZHJhZ0Ryb3BTZXJ2aWNlLFxuICAgIGRlc3Ryb3k6IERyYWdEcm9wX2Rlc3Ryb3lcbn0pO1xuXG5cbmRyYWdEcm9wU2VydmljZS5vbk1lc3NhZ2VzKHtcbiAgICAvLyBkYXRhIGlzIERyYWdEcm9wRGF0YVRyYW5zZmVyIGluc3RhbmNlXG4gICAgLy8gZmlyZWQgYnkgRHJhZyBmYWNldCBvbiBcImRyYWdzdGFydFwiIGV2ZW50XG4gICAgJ2RyYWdkcm9wc3RhcnRlZCc6IG9uRHJhZ0Ryb3BTdGFydGVkLCBcbiAgICAvLyBkYXRhIGlzIG9iamVjdCB3aXRoIGF0IGxlYXN0IGRyb3BFZmZlY3QgcHJvcGVydHlcbiAgICAvLyBmaXJlZCBieSBEcm9wIGZhY2V0IG9uIFwiZHJvcFwiIGV2ZW50XG4gICAgJ2RyYWdkcm9wY29tcGxldGVkJzogb25EcmFnRHJvcENvbXBsZXRlZCwgXG4gICAgLy8gZmlyZWQgYnkgRHJhZyBmYWNldCBvbiBcImRyYWdlbmRcIiBldmVudCB0byBjb21wbGV0ZSBkcmFnXG4gICAgLy8gaWYgZHJvcCBoYXBwZW5kZWQgaW4gYW5vdGhlciB3aW5kb3cgb3IgaWYgaXQgd2FzIGNhbmNlbGxlZFxuICAgICdjb21wbGV0ZWRyYWdkcm9wJzogb25Db21wbGV0ZURyYWdEcm9wXG59KTtcblxuXG5fLmV4dGVuZChkcmFnRHJvcFNlcnZpY2UsIHtcbiAgICBnZXRDdXJyZW50RHJhZ0Ryb3A6IGdldEN1cnJlbnREcmFnRHJvcFxufSk7XG5cblxuZnVuY3Rpb24gb25EcmFnRHJvcFN0YXJ0ZWQobXNnLCBkYXRhKSB7XG4gICAgX2N1cnJlbnREcmFnRHJvcCA9IGRhdGEuZHJhZ0Ryb3A7XG4gICAgX2N1cnJlbnREcmFnRmFjZXQgPSBkYXRhLmRyYWdGYWNldDtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdEcm9wQ29tcGxldGVkKG1zZywgZGF0YSkge1xuICAgIF9jdXJyZW50RHJhZ0ZhY2V0ICYmIF9jdXJyZW50RHJhZ0ZhY2V0LnBvc3RNZXNzYWdlU3luYygnZHJhZ2Ryb3Bjb21wbGV0ZWQnLCBkYXRhKTtcbiAgICBfY3VycmVudERyYWdEcm9wID0gdW5kZWZpbmVkO1xuICAgIF9jdXJyZW50RHJhZ0ZhY2V0ID0gdW5kZWZpbmVkO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ29tcGxldGVEcmFnRHJvcChtc2csIGRhdGEpIHtcbiAgICBpZiAoX2N1cnJlbnREcmFnRHJvcClcbiAgICAgICAgZHJhZ0Ryb3BTZXJ2aWNlLnBvc3RNZXNzYWdlU3luYygnZHJhZ2Ryb3Bjb21wbGV0ZWQnLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RHJhZ0Ryb3AoKSB7XG4gICAgcmV0dXJuIF9jdXJyZW50RHJhZ0Ryb3A7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3BfZGVzdHJveSgpIHtcbiAgICBkcmFnRHJvcFNlcnZpY2Uub2ZmQWxsKCk7XG59XG4iLCIvLyA8YSBuYW1lPVwidXRpbHMtZXJyb3JcIj48L2E+XG4vLyBtaWxvLnV0aWxzLmVycm9yXG4vLyAtLS0tLS0tLS0tLVxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxuLy8gbW9kdWxlIGV4cG9ydHMgZXJyb3IgY2xhc3NlcyBmb3IgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhpcyBhcnJheVxudmFyIGVycm9yQ2xhc3NOYW1lcyA9IFsnQWJzdHJhY3RDbGFzcycsICdNaXhpbicsICdNZXNzZW5nZXInLCAnQ29tcG9uZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ0F0dHJpYnV0ZScsICdCaW5kZXInLCAnTG9hZGVyJywgJ01haWxNZXNzYWdlU291cmNlJywgJ0ZhY2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ1Njb3BlJywgJ01vZGVsJywgJ0RvbUZhY2V0JywgJ0VkaXRhYmxlRmFjZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAnTGlzdCcsICdDb25uZWN0b3InLCAnUmVnaXN0cnknLCAnRnJhbWVNZXNzYWdlU291cmNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ0Ryb3AnLCAnQW5ndWxhcicsICdTdG9yYWdlTWVzc2FnZVNvdXJjZSddO1xuXG52YXIgZXJyb3IgPSB7XG4gICAgdG9CZUltcGxlbWVudGVkOiBlcnJvciR0b0JlSW1wbGVtZW50ZWQsXG4gICAgY3JlYXRlQ2xhc3M6IGVycm9yJGNyZWF0ZUNsYXNzXG59O1xuXG5lcnJvckNsYXNzTmFtZXMuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgZXJyb3JbbmFtZV0gPSBlcnJvciRjcmVhdGVDbGFzcyhuYW1lICsgJ0Vycm9yJyk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBlcnJvcjtcblxuXG5mdW5jdGlvbiBlcnJvciRjcmVhdGVDbGFzcyhlcnJvckNsYXNzTmFtZSkge1xuICAgIHZhciBFcnJvckNsYXNzID0gXy5tYWtlRnVuY3Rpb24oZXJyb3JDbGFzc05hbWUsICdtZXNzYWdlJyxcbiAgICAgICAgICAgICd0aGlzLm5hbWUgPSBcIicgKyBlcnJvckNsYXNzTmFtZSArICdcIjsgXFxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgXCJUaGVyZSB3YXMgYW4gIGVycm9yXCI7Jyk7XG4gICAgXy5tYWtlU3ViY2xhc3MoRXJyb3JDbGFzcywgRXJyb3IpO1xuXG4gICAgcmV0dXJuIEVycm9yQ2xhc3M7XG59XG5cblxuZnVuY3Rpb24gZXJyb3IkdG9CZUltcGxlbWVudGVkKCkge1xuICAgIHRocm93IG5ldyBlcnJvci5BYnN0cmFjdENsYXNzKCdjYWxsaW5nIHRoZSBtZXRob2Qgb2YgYW4gYWJzY3RyYWN0IGNsYXNzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvY19jbGFzcycpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi4vYXR0cmlidXRlcy9hX2JpbmQnKVxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vYmluZGVyJylcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi9kb20nKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbnZhciBjcmVhdGVSYW5nZVBhdGhzID0gX2NyZWF0ZU5vZGVzQW5kUGF0aHNGdW5jKGRvbVV0aWxzLnRyZWVQYXRoT2YpO1xudmFyIGNyZWF0ZVJhbmdlTm9kZXMgPSBfY3JlYXRlTm9kZXNBbmRQYXRoc0Z1bmMoZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgpO1xuXG5cbnZhciBmcmFnbWVudFV0aWxzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZ2V0U3RhdGU6IGZyYWdtZW50X2dldFN0YXRlLFxuICAgIGdldFN0YXRlQXN5bmM6IGZyYWdtZW50X2dldFN0YXRlQXN5bmMsXG5cbiAgICBleHBhbmRSYW5nZVRvU2libGluZ3M6IGV4cGFuZFJhbmdlVG9TaWJsaW5ncyxcbiAgICBnZXRSYW5nZVNpYmxpbmdzOiBnZXRSYW5nZVNpYmxpbmdzLFxuICAgIGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzOiBjcmVhdGVSYW5nZUZyb21TaWJsaW5ncyxcbiAgICBjcmVhdGVSYW5nZUZyb21Ob2RlczogY3JlYXRlUmFuZ2VGcm9tU2libGluZ3MsIC8vIGFsaWFzXG4gICAgY3JlYXRlUmFuZ2VQYXRoczogY3JlYXRlUmFuZ2VQYXRocyxcbiAgICBjcmVhdGVSYW5nZU5vZGVzOiBjcmVhdGVSYW5nZU5vZGVzXG59O1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc3RhdGUgb2Ygd3JhcHBlZCByYW5nZSB3aXRoIGNvbXBvbmVudHMsIGluY2x1ZGluZyBwYXJ0aWFsbHkgc2VsZWN0ZWQuIFRoZSByYW5nZSB3aWxsIGJlIGNsb25lZCBhbmQgd3JhcHBlZCBpbiBjb21wb25lbnQgd2l0aCBjb250YWluZXIgZmFjZXQgYmVmb3JlIGdldHRpbmcgaXRzIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGxvZyBlcnJvciBhbmQgcmV0dXJuIHVuZGVmaW5lZCBpZiByYW5nZSBoYXMgbm8gY29tbW9uIGFuY2VzdG9yIHRoYXQgaGFzIGNvbXBvbmVudCB3aXRoIGNvbnRhaW5lciBmYWNldFxuICogXG4gKiBAcGFyYW0ge1JhbmdlfSByYW5nZSBET00gUmFuZ2UgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVuYW1lQ2hpbGRyZW4gb3B0aW9uYWwgcGFyYW1ldGVyLCBgdHJ1ZWAgdG8gcmVuYW1lIGZyYWdtZW50IGNoaWxkIGNvbXBvbmVudHNcbiAqIEBwYXJhbSB7U3RyaW5nfSB3cmFwcGVyQ2xhc3NOYW1lIG9wdGlvbmFsIHBhcmFtZXRlciB0byB3cmFwIGluIGEgY3VzdG9tIGNvbXBvbmVudCBjbGFzc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBmcmFnbWVudF9nZXRTdGF0ZShyYW5nZSwgcmVuYW1lQ2hpbGRyZW4sIHdyYXBwZXJDbGFzc05hbWUpIHtcbiAgICB2YXIgcmFuZ2VDb250YWluZXIgPSBfZ2V0UmFuZ2VDb250YWluZXIocmFuZ2UpO1xuICAgIGlmICghIHJhbmdlQ29udGFpbmVyKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignZnJhZ21lbnQuZ2V0U3RhdGU6IHJhbmdlIGhhcyBubyBjb21tb24gY29udGFpbmVyJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZnJhZyA9IHJhbmdlLmNsb25lQ29udGVudHMoKVxuICAgICAgICAsIHdyYXBwZXIgPSBfd3JhcEZyYWdtZW50SW5Db250YWluZXIoZnJhZywgd3JhcHBlckNsYXNzTmFtZSk7XG5cbiAgICBfdHJhbnNmZXJTdGF0ZXMocmFuZ2VDb250YWluZXIsIHdyYXBwZXIpO1xuICAgIGlmIChyZW5hbWVDaGlsZHJlbikgX3JlbmFtZUNoaWxkcmVuKHdyYXBwZXIpO1xuICAgIHZhciB3cmFwcGVyU3RhdGUgPSB3cmFwcGVyLmdldFN0YXRlKCk7XG4gICAgXy5kZWZlck1ldGhvZCh3cmFwcGVyLCAnZGVzdHJveScpO1xuICAgIHJldHVybiB3cmFwcGVyU3RhdGU7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzdGF0ZSBvZiB3cmFwcGVkIHJhbmdlIHdpdGggY29tcG9uZW50cywgaW5jbHVkaW5nIHBhcnRpYWxseSBzZWxlY3RlZC4gVGhlIHJhbmdlIHdpbGwgYmUgY2xvbmVkIGFuZCB3cmFwcGVkIGluIGNvbXBvbmVudCB3aXRoIGNvbnRhaW5lciBmYWNldCBiZWZvcmUgZ2V0dGluZyBpdHMgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHJlc3VsdCBhbmQgYW55IGVycm9yIHZpYSBjYWxsYmFjay5cbiAqIFxuICogQHBhcmFtIHtSYW5nZX0gcmFuZ2UgRE9NIFJhbmdlIGluc3RhbmNlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlbmFtZUNoaWxkcmVuIG9wdGlvbmFsIHBhcmFtZXRlciwgYHRydWVgIHRvIHJlbmFtZSBmcmFnbWVudCBjaGlsZCBjb21wb25lbnRzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhbHdheXMgdGhlIGxhc3QgcGFyYW1ldGVyLCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbiBiZSBkcm9wcGVkOyByZXN1bHQgaXMgcGFzc2VkIHZpYSBjYWxsYmFjayB3aXRoIGFueSBlcnJvciBhcyBmaXJzdCBwYXJhbWV0ZXJcbiAqL1xuZnVuY3Rpb24gZnJhZ21lbnRfZ2V0U3RhdGVBc3luYyhyYW5nZSwgcmVuYW1lQ2hpbGRyZW4sIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJhbmdlQ29udGFpbmVyID0gX2dldFJhbmdlQ29udGFpbmVyKHJhbmdlKTtcbiAgICAgICAgaWYgKCEgcmFuZ2VDb250YWluZXIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignZnJhZ21lbnQuZ2V0U3RhdGU6IHJhbmdlIGhhcyBubyBjb21tb24gY29udGFpbmVyJykpO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBkbyBOT1QgY29ubmVjdCByZXR1cm4gdG8gcHJldmlvdXMgY2FsbGJhY2ssIGdldFN0YXRlIHNob3VsZCByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHJlbmFtZUNoaWxkcmVuID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gcmVuYW1lQ2hpbGRyZW47XG4gICAgICAgICAgICByZW5hbWVDaGlsZHJlbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZyYWcgPSByYW5nZS5jbG9uZUNvbnRlbnRzKClcbiAgICAgICAgICAgICwgd3JhcHBlciA9IF93cmFwRnJhZ21lbnRJbkNvbnRhaW5lcihmcmFnKTtcblxuICAgICAgICBfdHJhbnNmZXJTdGF0ZXMocmFuZ2VDb250YWluZXIsIHdyYXBwZXIpO1xuICAgICAgICBfLmRlZmVyKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd3JhcHBlci5icm9hZGNhc3QoJ3N0YXRlcmVhZHknKTtcbiAgICAgICAgICAgIF8uZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbmFtZUNoaWxkcmVuKSBfcmVuYW1lQ2hpbGRyZW4od3JhcHBlcik7XG4gICAgICAgICAgICAgICAgdmFyIHdyYXBwZXJTdGF0ZSA9IHdyYXBwZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB3cmFwcGVyU3RhdGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfd3JhcEZyYWdtZW50SW5Db250YWluZXIoZnJhZywgd3JhcHBlckNsYXNzTmFtZSkge1xuICAgIHZhciB3cmFwRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICAsIGF0dHIgPSBuZXcgQmluZEF0dHJpYnV0ZSh3cmFwRWwpO1xuXG4gICAgXy5leHRlbmQoYXR0ciwge1xuICAgICAgICBjb21wQ2xhc3M6IHdyYXBwZXJDbGFzc05hbWUgfHwgJ0NvbXBvbmVudCcsXG4gICAgICAgIGNvbXBGYWNldHM6IHdyYXBwZXJDbGFzc05hbWUgPyBbXSA6IFsnY29udGFpbmVyJ10sXG4gICAgICAgIGNvbXBOYW1lOiAnd3JhcHBlcidcbiAgICB9KTtcblxuICAgIGF0dHIuZGVjb3JhdGUoKTtcblxuICAgIHdyYXBFbC5hcHBlbmRDaGlsZChmcmFnKTtcbiAgICB2YXIgc2NvcGUgPSBiaW5kZXIod3JhcEVsKTtcbiAgICByZXR1cm4gc2NvcGUud3JhcHBlcjtcbn1cblxuXG5mdW5jdGlvbiBfZ2V0UmFuZ2VDb250YWluZXIocmFuZ2UpIHtcbiAgICB2YXIgZWwgPSBkb21VdGlscy5jb250YWluaW5nRWxlbWVudChyYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcik7XG4gICAgcmV0dXJuIENvbXBvbmVudC5nZXRDb250YWluaW5nQ29tcG9uZW50KGVsLCB0cnVlLCAnY29udGFpbmVyJyk7XG59XG5cblxuZnVuY3Rpb24gX3RyYW5zZmVyU3RhdGVzKGZyb21Db21wLCB0b0NvbXApIHtcbiAgICB2YXIgZnJvbVNjb3BlID0gZnJvbUNvbXAuY29udGFpbmVyLnNjb3BlO1xuICAgIHRvQ29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24odG9DaGlsZENvbXAsIG5hbWUpIHtcbiAgICAgICAgdmFyIGZyb21DaGlsZENvbXAgPSBmcm9tU2NvcGVbbmFtZV07XG4gICAgICAgIGlmICghIGZyb21DaGlsZENvbXApIHJldHVybiBsb2dnZXIuZXJyb3IoJ2ZyYWdtZW50LmdldFN0YXRlOiBjb25wb25lbnQnLCBuYW1lLCAnbm90IGZvdW5kIGluIHJhbmdlJyk7XG4gICAgICAgIHZhciBzdGF0ZSA9IGZyb21DaGlsZENvbXAuX2dldFN0YXRlKHRydWUpO1xuICAgICAgICB0b0NoaWxkQ29tcC5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX3JlbmFtZUNoaWxkcmVuKGNvbXApIHtcbiAgICBjb21wLmNvbnRhaW5lci5zY29wZS5fZWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICBjaGlsZC5yZW5hbWUoKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBleHBhbmRSYW5nZVRvU2libGluZ3MocmFuZ2UpIHtcbiAgICB2YXIgc2libGluZ3MgPSBnZXRSYW5nZVNpYmxpbmdzKHJhbmdlKTtcbiAgICByYW5nZSA9IGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzKHNpYmxpbmdzKTtcbiAgICByZXR1cm4gcmFuZ2U7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlUmFuZ2VGcm9tU2libGluZ3Mobm9kZXMpIHtcbiAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIGlmIChub2Rlcy5zaWJsaW5ncykge1xuICAgICAgICByYW5nZS5zZXRTdGFydEJlZm9yZShub2Rlcy5zdGFydCk7XG4gICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKG5vZGVzLmVuZCk7XG4gICAgfSBlbHNlXG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUobm9kZXMuc3RhcnQpO1xuICAgIHJldHVybiByYW5nZTtcbn1cblxuXG5mdW5jdGlvbiBnZXRSYW5nZVNpYmxpbmdzKHJhbmdlKSB7XG4gICAgdmFyIGNvbnRhaW5lck5vZGUgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lclxuICAgICAgICAsIHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gICAgICAgICwgZW5kTm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lcjtcblxuICAgIGlmIChzdGFydE5vZGUgPT0gZW5kTm9kZSkge1xuICAgICAgICBpZiAoc3RhcnROb2RlICE9IGNvbnRhaW5lck5vZGUpIGxvZ2dlci5lcnJvcignZGVsZXRlU2VsZWN0aW9uQ29tbWFuZCBsb2dpY2FsIGVycm9yOiBzdGFydD09ZW5kLCBidXQgY29udGFpbmVyIGlzIGRpZmZlcmVudCcpO1xuICAgICAgICByZXR1cm4geyBzaWJsaW5nczogZmFsc2UsIHN0YXJ0OiBzdGFydE5vZGUgfTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnROb2RlID09IGNvbnRhaW5lck5vZGUgfHwgZW5kTm9kZSA9PSBjb250YWluZXJOb2RlKVxuICAgICAgICByZXR1cm4geyBzaWJsaW5nczogZmFsc2UsIHN0YXJ0OiBjb250YWluZXJOb2RlIH07XG5cbiAgICB2YXIgc3RhcnRTaWJsaW5nID0gX2ZpbmRDb250YWluaW5nQ2hpbGQoY29udGFpbmVyTm9kZSwgc3RhcnROb2RlKTtcbiAgICB2YXIgZW5kU2libGluZyA9IF9maW5kQ29udGFpbmluZ0NoaWxkKGNvbnRhaW5lck5vZGUsIGVuZE5vZGUpO1xuXG4gICAgaWYgKHN0YXJ0U2libGluZyAmJiBlbmRTaWJsaW5nKSB7XG4gICAgICAgIGlmIChzdGFydFNpYmxpbmcgPT0gZW5kU2libGluZykge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdkZWxldGVTZWxlY3Rpb25Db21tYW5kIGxvZ2ljYWwgZXJyb3I6IHNhbWUgc2libGluZ3MnKTtcbiAgICAgICAgICAgIHJldHVybiB7IHNpYmxpbmdzOiBmYWxzZSwgc3RhcnQ6IHN0YXJ0U2libGluZyB9O1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiB7IHNpYmxpbmdzOiB0cnVlLCBzdGFydDogc3RhcnRTaWJsaW5nLCBlbmQ6IGVuZFNpYmxpbmcgfTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX2ZpbmRDb250YWluaW5nQ2hpbGQoY29udGFpbmVyTm9kZSwgc2VsTm9kZSkge1xuICAgIHJldHVybiBfLmZpbmQoY29udGFpbmVyTm9kZS5jaGlsZE5vZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmNvbnRhaW5zKHNlbE5vZGUpO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVOb2Rlc0FuZFBhdGhzRnVuYyhmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHJvb3RFbCwgZnJvbU9iaikge1xuICAgICAgICB2YXIgdG9PYmogPSB7XG4gICAgICAgICAgICBzaWJsaW5nczogZnJvbU9iai5zaWJsaW5ncyxcbiAgICAgICAgICAgIHN0YXJ0OiBmdW5jKHJvb3RFbCwgZnJvbU9iai5zdGFydClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRvT2JqLnNpYmxpbmdzKVxuICAgICAgICAgICAgdG9PYmouZW5kID0gZnVuYyhyb290RWwsIGZyb21PYmouZW5kKTtcbiAgICAgICAgcmV0dXJuIHRvT2JqO1xuICAgIH07XG59XG5cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgZGVwcmVjYXRlID0gcmVxdWlyZSgnLi9kZXByZWNhdGUnKTtcblxuLyoqXG4gKiBgbWlsby51dGlsYFxuICovXG52YXIgdXRpbCA9IHtcbiAgICBsb2dnZXI6IG1pbG9Db3JlLnV0aWwubG9nZ2VyLFxuICAgIHJlcXVlc3Q6IHJlcXVpcmUoJy4vcmVxdWVzdCcpLFxuICAgIHdlYnNvY2tldDogcmVxdWlyZSgnLi93ZWJzb2NrZXQnKSxcbiAgICBjaGVjazogbWlsb0NvcmUudXRpbC5jaGVjayxcbiAgICBlcnJvcjogZGVwcmVjYXRlKHJlcXVpcmUoJy4vZXJyb3InKSwgJ21pbG8udXRpbC5lcnJvciBpcyBERVBSRUNBVEVEIGFuZCB3aWxsIGJlIFJFTU9WRUQgc29vbiEnKSxcbiAgICBjb3VudDogZGVwcmVjYXRlKHJlcXVpcmUoJy4vdW5pcXVlX2lkJyksICdtaWxvLnV0aWwuY291bnQgaXMgREVQUkVDQVRFRCEgVXNlIG1pbG8udXRpbC51bmlxdWVJZCBpbnN0ZWFkJyksXG4gICAgdW5pcXVlSWQ6IHJlcXVpcmUoJy4vdW5pcXVlX2lkJyksXG4gICAgY29tcG9uZW50TmFtZTogcmVxdWlyZSgnLi9jb21wb25lbnRfbmFtZScpLFxuICAgIGRvbTogcmVxdWlyZSgnLi9kb20nKSxcbiAgICBkb21MaXN0ZW5lcnM6IHJlcXVpcmUoJy4vZG9tX2xpc3RlbmVycycpLFxuICAgIHNlbGVjdGlvbjogcmVxdWlyZSgnLi9zZWxlY3Rpb24nKSxcbiAgICBmcmFnbWVudDogcmVxdWlyZSgnLi9mcmFnbWVudCcpLFxuICAgIGpzb25QYXJzZTogZGVwcmVjYXRlKHJlcXVpcmUoJy4vanNvbl9wYXJzZScpLCAnbWlsby51dGlsLmpzb25QYXJzZSBpcyBERVBSRUNBVEVEISBVc2UgXy5qc29uUGFyc2UgaW5zdGVhZCcpLFxuICAgIHN0b3JhZ2U6IHJlcXVpcmUoJy4vc3RvcmFnZScpLFxuICAgIGRvbVJlYWR5OiByZXF1aXJlKCcuL2RvbXJlYWR5JyksXG4gICAgZHJhZ0Ryb3A6IHJlcXVpcmUoJy4vZHJhZ2Ryb3AnKSxcbiAgICBkaWFsb2c6IGRlcHJlY2F0ZShyZXF1aXJlKCcuLi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cnKSxcbiAgICAgICAgJ21pbG8udXRpbC5kaWFsb2cgaXMgREVQUkVDQVRFRCEgVXNlIG1pbG8ucmVnaXN0cnkuY29tcG9uZW50cy5nZXQoXFwnTUxEaWFsb2dcXCcpIGluc3RlYWQnKSxcbiAgICBhbGVydDogZGVwcmVjYXRlKHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0FsZXJ0JyksXG4gICAgICAgICdtaWxvLnV0aWwuYWxlcnQgaXMgREVQUkVDQVRFRCEgVXNlIG1pbG8ucmVnaXN0cnkuY29tcG9uZW50cy5nZXQoXFwnTUxBbGVydFxcJykgaW5zdGVhZCcpLFxuICAgIGRlcHJlY2F0ZTogZGVwcmVjYXRlLFxuICAgIGRvVDogbWlsb0NvcmUudXRpbC5kb1QsXG4gICAgZGVzdHJveTogdXRpbF9kZXN0cm95XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHV0aWw7XG5cblxuZnVuY3Rpb24gdXRpbF9kZXN0cm95KCkge1xuICAgIHV0aWwucmVxdWVzdC5kZXN0cm95KCk7XG4gICAgdXRpbC5kcmFnRHJvcC5kZXN0cm95KCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBqc29uUGFyc2U7XG5cblxuLyoqXG4gKiBgbWlsby51dGlsLmpzb25QYXJzZWBcbiAqIFNhZmUgSlNPTi5wYXJzZSwgcmV0dXJucyB1bmRlZmluZWQgaWYgSlNPTi5wYXJzZSB0aHJvd3MgYW4gZXhjZXB0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciAtIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdFxuICogQHJldHVybiB7T2JqZWN0fHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24ganNvblBhcnNlKHN0cikge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0cik7XG4gICAgfSBjYXRjaCAoZSkge31cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gbWlsby51dGlscy5yZXF1ZXN0XG4vLyAtLS0tLS0tLS0tLVxuXG4vLyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgd3JhcHBpbmcgWE1MSFRUUFJlcXVlc3QgZnVuY3Rpb25hbGl0eS5cblxuLy8gYGBgXG4vLyB2YXIgcmVxdWVzdCA9IG1pbG8udXRpbHMucmVxdWVzdFxuLy8gICAgICwgb3B0czogeyBtZXRob2Q6ICdHRVQnIH07XG5cbi8vIHJlcXVlc3QodXJsLCBvcHRzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbi8vICAgICBsb2dnZXIuZGVidWcoZGF0YSk7XG4vLyB9KTtcblxuLy8gcmVxdWVzdC5nZXQodXJsLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbi8vICAgICBsb2dnZXIuZGVidWcoZGF0YSk7XG4vLyB9KTtcbi8vIGBgYFxuXG4vLyBPbmx5IGdlbmVyaWMgcmVxdWVzdCBhbmQgZ2V0LCBqc29uLCBwb3N0IGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZC5cblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCB1bmlxdWVJZCA9IHJlcXVpcmUoJy4vdW5pcXVlX2lkJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVlc3Q7XG5cblxudmFyIF9wZW5kaW5nUmVxdWVzdHMgPSBbXTtcblxudmFyIHByb21pc2VUaGVuID0gY3JlYXRlUHJvbWlzZU92ZXJyaWRlKCd0aGVuJyk7XG52YXIgcHJvbWlzZUNhdGNoID0gY3JlYXRlUHJvbWlzZU92ZXJyaWRlKCdjYXRjaCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIHRvIG92ZXJyaWRlIHN0YW5kYXJkIHByb21pc2UgYmVoYXZpb3VyIGFuZCBhbGxvdyBwcm9taXNlIGluc3RhbmNlc1xuICogY3JlYXRlZCB0byBtYWludGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgcmVxdWVzdCBvYmplY3Qgbm8gbWF0dGVyIGlmIC50aGVuKCkgb3IgLmNhdGNoKCkgaXMgY2FsbGVkLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9taXNlT3ZlcnJpZGUoZnVuY3Rpb25OYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucHJvdG90eXBlW2Z1bmN0aW9uTmFtZV0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAga2VlcFJlcXVlc3RPYmplY3QocHJvbWlzZSwgdGhpcy5fcmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiByZXF1ZXN0KHVybCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICBvcHRzLnVybCA9IHVybDtcbiAgICBvcHRzLmNvbnRlbnRUeXBlID0gb3B0cy5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JztcbiAgICBpZiAoX21lc3NlbmdlcikgcmVxdWVzdC5wb3N0TWVzc2FnZVN5bmMoJ3JlcXVlc3QnLCB7IG9wdGlvbnM6IG9wdHMgfSk7XG5cbiAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgcmVxLm9wZW4ob3B0cy5tZXRob2QsIG9wdHMudXJsLCB0cnVlKTtcbiAgICByZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgb3B0cy5jb250ZW50VHlwZSk7XG4gICAgc2V0UmVxdWVzdEhlYWRlcnMocmVxLCBvcHRzLmhlYWRlcnMpO1xuXG4gICAgcmVxLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgfHwgY29uZmlnLnJlcXVlc3QuZGVmYXVsdHMudGltZW91dDtcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcmVxLm9udGltZW91dCA9IHJlcS5vbmFib3J0ID0gb25SZWFkeTtcblxuICAgIHZhciB4UHJvbWlzZSA9IF9jcmVhdGVYUHJvbWlzZShyZXEpO1xuXG4gICAgcmVxLnNlbmQoSlNPTi5zdHJpbmdpZnkob3B0cy5kYXRhKSk7XG4gICAgcmVxW2NvbmZpZy5yZXF1ZXN0Lm9wdGlvbnNLZXldID0gb3B0cztcblxuICAgIF9wZW5kaW5nUmVxdWVzdHMucHVzaChyZXEpO1xuXG4gICAgcmV0dXJuIHhQcm9taXNlLnByb21pc2U7XG5cbiAgICBmdW5jdGlvbiBvblJlYWR5KGUpIHtcbiAgICAgICAgX29uUmVhZHkocmVxLCBjYWxsYmFjaywgeFByb21pc2UsIGUudHlwZSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVYUHJvbWlzZShyZXF1ZXN0KSB7XG4gICAgdmFyIHJlc29sdmVQcm9taXNlLCByZWplY3RQcm9taXNlO1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgcmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIGtlZXBSZXF1ZXN0T2JqZWN0KHByb21pc2UsIHJlcXVlc3QpO1xuICAgIHByb21pc2UuY2F0Y2goXy5ub29wKTsgLy8gU29tZXRpbWVzIGVycm9ycyBhcmUgaGFuZGxlZCB3aXRoaW4gY2FsbGJhY2tzLCBzbyB1bmNhdWdodCBwcm9taXNlIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIHN1cHByZXNzZWQuXG5cbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlOiBwcm9taXNlLFxuICAgICAgICByZXNvbHZlOiByZXNvbHZlUHJvbWlzZSxcbiAgICAgICAgcmVqZWN0OiByZWplY3RQcm9taXNlXG4gICAgfVxufVxuXG4vLyBFbnN1cmVzIHRoYXQgdGhlIHByb21pc2UgKGFuZCBhbnkgcHJvbWlzZXMgY3JlYXRlZCB3aGVuIGNhbGxpbmcgLnRoZW4vLmNhdGNoKSBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2JqZWN0XG5mdW5jdGlvbiBrZWVwUmVxdWVzdE9iamVjdChwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgcHJvbWlzZS5fcmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgcHJvbWlzZS50aGVuID0gcHJvbWlzZVRoZW47XG4gICAgcHJvbWlzZS5jYXRjaCA9IHByb21pc2VDYXRjaDtcblxuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG5cbmZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXJzKHJlcSwgaGVhZGVycykge1xuICAgIGlmIChoZWFkZXJzKVxuICAgICAgICBfLmVhY2hLZXkoaGVhZGVycywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfb25SZWFkeShyZXEsIGNhbGxiYWNrLCB4UHJvbWlzZSwgZXZlbnRUeXBlKSB7XG4gICAgaWYgKHJlcS5yZWFkeVN0YXRlICE9IDQpIHJldHVybjtcbiAgICBpZiAoIXJlcS5zdGF0dXMgJiYgZXZlbnRUeXBlID09ICdyZWFkeXN0YXRlY2hhbmdlJykgcmV0dXJuO1xuXG4gICAgXy5zcGxpY2VJdGVtKF9wZW5kaW5nUmVxdWVzdHMsIHJlcSk7XG5cbiAgICB2YXIgZXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCByZXEuc3RhdHVzID49IDIwMCAmJiByZXEuc3RhdHVzIDwgNDAwICkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSgnc3VjY2VzcycpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwsIHJlcS5yZXNwb25zZVRleHQsIHJlcSk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHsgZXJyb3IgPSBlOyB9XG4gICAgICAgICAgICB4UHJvbWlzZS5yZXNvbHZlKHJlcS5yZXNwb25zZVRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGVycm9yUmVhc29uID0gcmVxLnN0YXR1cyB8fCBldmVudFR5cGU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKCdlcnJvcicpO1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKCdlcnJvcicgKyBlcnJvclJlYXNvbik7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZXJyb3JSZWFzb24sIHJlcS5yZXNwb25zZVRleHQsIHJlcSk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHsgZXJyb3IgPSBlOyB9XG4gICAgICAgICAgICB4UHJvbWlzZS5yZWplY3QoeyByZWFzb246IGVycm9yUmVhc29uLCByZXNwb25zZTogcmVxLnJlc3BvbnNlVGV4dCB9KTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBlcnJvciA9IGVycm9yIHx8IGU7XG4gICAgfVxuXG4gICAgLy8gbm90IHJlbW92aW5nIHN1YnNjcmlwdGlvbiBjcmVhdGVzIG1lbW9yeSBsZWFrLCBkZWxldGluZyBwcm9wZXJ0eSB3b3VsZCBub3QgcmVtb3ZlIHN1YnNjcmlwdGlvblxuICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSByZXEub250aW1lb3V0ID0gcmVxLm9uYWJvcnQgPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIV9wZW5kaW5nUmVxdWVzdHMubGVuZ3RoKVxuICAgICAgICBwb3N0TWVzc2FnZSgncmVxdWVzdHNjb21wbGV0ZWQnKTtcblxuICAgIGlmIChlcnJvcikgdGhyb3cgbmV3IEVycm9yKCdFeGNlcHRpb246ICcgKyBlcnJvcik7XG5cbiAgICBmdW5jdGlvbiBwb3N0TWVzc2FnZShtc2cpIHtcbiAgICAgICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2UobXNnLFxuICAgICAgICAgICAgeyBzdGF0dXM6IHN0YXR1cywgcmVzcG9uc2U6IHJlcS5yZXNwb25zZVRleHQgfSk7XG4gICAgfVxufVxuXG5cbl8uZXh0ZW5kKHJlcXVlc3QsIHtcbiAgICBnZXQ6IHJlcXVlc3QkZ2V0LFxuICAgIHBvc3Q6IHJlcXVlc3QkcG9zdCxcbiAgICBqc29uOiByZXF1ZXN0JGpzb24sXG4gICAganNvbnA6IHJlcXVlc3QkanNvbnAsXG4gICAgZmlsZTogcmVxdWVzdCRmaWxlLFxuICAgIHVzZU1lc3NlbmdlcjogcmVxdWVzdCR1c2VNZXNzZW5nZXIsXG4gICAgZGVzdHJveTogcmVxdWVzdCRkZXN0cm95LFxuICAgIHdoZW5SZXF1ZXN0c0NvbXBsZXRlZDogd2hlblJlcXVlc3RzQ29tcGxldGVkXG59KTtcblxuXG52YXIgX21lc3NlbmdlcjtcblxuXG5mdW5jdGlvbiByZXF1ZXN0JHVzZU1lc3NlbmdlcigpIHtcbiAgICBfbWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihyZXF1ZXN0LCBbJ29uJywgJ29uY2UnLCAnb25TeW5jJywgJ29mZicsICdvbk1lc3NhZ2VzJywgJ29mZk1lc3NhZ2VzJywgJ3Bvc3RNZXNzYWdlJywgJ3Bvc3RNZXNzYWdlU3luYyddKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1ZXN0JGdldCh1cmwsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ0dFVCcgfSwgY2FsbGJhY2spO1xufVxuXG5cbmZ1bmN0aW9uIHJlcXVlc3QkcG9zdCh1cmwsIGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ1BPU1QnLCBkYXRhOiBkYXRhIH0sIGNhbGxiYWNrKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1ZXN0JGpzb24odXJsLCBjYWxsYmFjaykge1xuICAgIHZhciBwcm9taXNlID0gcmVxdWVzdCh1cmwsIHsgbWV0aG9kOiAnR0VUJyB9KTtcblxuICAgIHZhciBqc29uUHJvbWlzZSA9IHByb21pc2UudGhlbihKU09OLnBhcnNlKTtcblxuICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAganNvblByb21pc2VcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVyckRhdGEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyckRhdGEucmVhc29uLCBlcnJEYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4ganNvblByb21pc2U7XG59XG5cblxudmFyIGpzb25wT3B0aW9ucyA9IHsgbWV0aG9kOiAnR0VUJywganNvbnA6IHRydWUgfTtcbmZ1bmN0aW9uIHJlcXVlc3QkanNvbnAodXJsLCBjYWxsYmFjaykge1xuICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSxcbiAgICAgICAgeFByb21pc2UgPSBfY3JlYXRlWFByb21pc2Uoc2NyaXB0KSxcbiAgICAgICAgaGVhZCA9IHdpbmRvdy5kb2N1bWVudC5oZWFkLFxuICAgICAgICB1bmlxdWVDYWxsYmFjayA9IGNvbmZpZy5yZXF1ZXN0Lmpzb25wQ2FsbGJhY2tQcmVmaXggKyB1bmlxdWVJZCgpO1xuXG4gICAgdmFyIG9wdHMgPSBfLmV4dGVuZCh7IHVybDogdXJsIH0sIGpzb25wT3B0aW9ucyk7XG4gICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2VTeW5jKCdyZXF1ZXN0JywgeyBvcHRpb25zOiBvcHRzIH0pO1xuXG4gICAgaWYgKCEgXy5pc0VxdWFsKF8ub21pdEtleXMob3B0cywgJ3VybCcpLCBqc29ucE9wdGlvbnMpKVxuICAgICAgICBsb2dnZXIud2FybignSWdub3JlZCBub3QgYWxsb3dlZCByZXF1ZXN0IG9wdGlvbnMgY2hhbmdlIGluIEpTT05QIHJlcXVlc3QgLSBvbmx5IFVSTCBjYW4gYmUgY2hhbmdlZCcpO1xuXG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdObyBKU09OUCByZXNwb25zZSBvciBubyBjYWxsYmFjayBpbiByZXNwb25zZScpO1xuICAgICAgICBfb25SZXN1bHQoZXJyKTtcbiAgICB9LCBjb25maWcucmVxdWVzdC5qc29ucFRpbWVvdXQpO1xuXG4gICAgd2luZG93W3VuaXF1ZUNhbGxiYWNrXSA9IF8ucGFydGlhbChfb25SZXN1bHQsIG51bGwpO1xuXG4gICAgX3BlbmRpbmdSZXF1ZXN0cy5wdXNoKHdpbmRvd1t1bmlxdWVDYWxsYmFja10pO1xuXG4gICAgc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICBzY3JpcHQuc3JjID0gb3B0cy51cmwgKyAob3B0cy51cmwuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnKSArICdjYWxsYmFjaz0nICsgdW5pcXVlQ2FsbGJhY2s7XG5cbiAgICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICByZXR1cm4geFByb21pc2UucHJvbWlzZTtcblxuXG4gICAgZnVuY3Rpb24gX29uUmVzdWx0KGVyciwgcmVzdWx0KSB7XG4gICAgICAgIF8uc3BsaWNlSXRlbShfcGVuZGluZ1JlcXVlc3RzLCB3aW5kb3dbdW5pcXVlQ2FsbGJhY2tdKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKGVyciA/ICdlcnJvcicgOiAnc3VjY2VzcycsIGVyciwgcmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ05vIEpTT05QIHJlc3BvbnNlIG9yIHRpbWVvdXQnKTtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSgnZXJyb3Jqc29ucHRpbWVvdXQnLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHsgdmFyIGVycm9yID0gZTsgfVxuICAgICAgICBpZiAoZXJyKSB4UHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgZWxzZSB4UHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG5cbiAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICBpZiAoIV9wZW5kaW5nUmVxdWVzdHMubGVuZ3RoKVxuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoJ3JlcXVlc3RzY29tcGxldGVkJyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaGVhZC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICBkZWxldGUgd2luZG93W3VuaXF1ZUNhbGxiYWNrXTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1zZywgc3RhdHVzLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2UobXNnLFxuICAgICAgICAgICAgeyBzdGF0dXM6IHN0YXR1cywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRmaWxlKG9wdHMsIGZpbGVEYXRhLCBjYWxsYmFjaywgcHJvZ3Jlc3MpIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT0gJ3N0cmluZycpXG4gICAgICAgIG9wdHMgPSB7IG1ldGhvZDogJ1BPU1QnLCB1cmw6IG9wdHMgfTtcblxuICAgIG9wdHMubWV0aG9kID0gb3B0cy5tZXRob2QgfHwgJ1BPU1QnO1xuICAgIG9wdHMuZmlsZSA9IHRydWU7XG5cbiAgICBpZiAoX21lc3NlbmdlcikgcmVxdWVzdC5wb3N0TWVzc2FnZVN5bmMoJ3JlcXVlc3QnLCB7IG9wdGlvbnM6IG9wdHMgfSk7XG5cbiAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgaWYgKHByb2dyZXNzKSByZXEudXBsb2FkLm9ucHJvZ3Jlc3MgPSBwcm9ncmVzcztcblxuICAgIHJlcS5vcGVuKG9wdHMubWV0aG9kLCBvcHRzLnVybCwgdHJ1ZSk7XG4gICAgc2V0UmVxdWVzdEhlYWRlcnMocmVxLCBvcHRzLmhlYWRlcnMpO1xuXG4gICAgcmVxLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgfHwgY29uZmlnLnJlcXVlc3QuZGVmYXVsdHMudGltZW91dDtcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcmVxLm9udGltZW91dCA9IHJlcS5vbmFib3J0ID0gb25SZWFkeTtcblxuICAgIHZhciB4UHJvbWlzZSA9IF9jcmVhdGVYUHJvbWlzZShyZXEpO1xuXG4gICAgaWYgKG9wdHMuYmluYXJ5KVxuICAgICAgICByZXEuc2VuZChmaWxlRGF0YSk7XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlRGF0YSk7XG4gICAgICAgIHJlcS5zZW5kKGZvcm1EYXRhKTtcbiAgICB9XG5cbiAgICBfcGVuZGluZ1JlcXVlc3RzLnB1c2gocmVxKTtcblxuICAgIHJldHVybiB4UHJvbWlzZS5wcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gb25SZWFkeShlKSB7XG4gICAgICAgIGlmIChwcm9ncmVzcykgcmVxLnVwbG9hZC5vbnByb2dyZXNzID0gdW5kZWZpbmVkO1xuICAgICAgICBfb25SZWFkeShyZXEsIGNhbGxiYWNrLCB4UHJvbWlzZSwgZS50eXBlKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRkZXN0cm95KCkge1xuICAgIGlmIChfbWVzc2VuZ2VyKSBfbWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICByZXF1ZXN0Ll9kZXN0cm95ZWQgPSB0cnVlO1xufVxuXG5cbmZ1bmN0aW9uIHdoZW5SZXF1ZXN0c0NvbXBsZXRlZChjYWxsYmFjaywgdGltZW91dCkge1xuICAgIGNhbGxiYWNrID0gXy5vbmNlKGNhbGxiYWNrKTtcbiAgICBpZiAodGltZW91dClcbiAgICAgICAgXy5kZWxheShjYWxsYmFjaywgdGltZW91dCwgJ3RpbWVvdXQnKTtcblxuICAgIGlmIChfcGVuZGluZ1JlcXVlc3RzLmxlbmd0aClcbiAgICAgICAgX21lc3Nlbmdlci5vbmNlKCdyZXF1ZXN0c2NvbXBsZXRlZCcsIGNhbGxiYWNrKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZGVmZXIoY2FsbGJhY2spO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBkb21VdGlscyA9IHJlcXVpcmUoJy4uL2RvbScpXG4gICAgLCBjb250YWluaW5nRWxlbWVudCA9IGRvbVV0aWxzLmNvbnRhaW5pbmdFbGVtZW50XG4gICAgLCBzZXRDYXJldFBvc2l0aW9uID0gZG9tVXRpbHMuc2V0Q2FyZXRQb3NpdGlvblxuICAgICwgZ2V0Q29tcG9uZW50c0Zyb21SYW5nZSA9IGRvbVV0aWxzLmdldENvbXBvbmVudHNGcm9tUmFuZ2VcbiAgICAsIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMgPSBkb21VdGlscy5kZWxldGVSYW5nZVdpdGhDb21wb25lbnRzXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY29tcG9uZW50cy9jX2NsYXNzJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxubW9kdWxlLmV4cG9ydHMgPSBUZXh0U2VsZWN0aW9uO1xuXG5cbi8qKlxuICogVGV4dCBzZWxlY3Rpb24gY2xhc3MuXG4gKiBTZXJ2ZXMgYXMgYSBoZWxwZXIgdG8gbWFuYWdlIGN1cnJlbnQgc2VsZWN0aW9uXG4gKiBUaGUgb2JqZWN0IGNhbm5vdCBiZSByZXVzZWQsIGlmIHRoZSBzZWxlY3Rpb24gY2hhbmdlcyBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIG1heSBjb250YWluIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gcHJldmlvdXMgc2VsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtXaW5kb3d9IHdpbiB3aW5kb3cgaW4gd2hpY2ggdGV4dCBzZWxlY3Rpb24gaXMgcHJvY2Vzc2VkXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24od2luKSB7XG4gICAgaWYgKCEgdGhpcyBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pXG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbih3aW4pO1xuICAgIHRoaXMud2luZG93ID0gd2luIHx8IHdpbmRvdztcbiAgICB0aGlzLmluaXQoKTtcbn1cblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBzdGFydCBlbGVtZW50XG4gKlxuICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRzdGFydEVsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfc3RhcnRFbGVtZW50JywgJ3N0YXJ0Q29udGFpbmVyJyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJGVuZEVsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfZW5kRWxlbWVudCcsICdlbmRDb250YWluZXInKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBlbmQgZWxlbWVudFxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kY29udGFpbmluZ0VsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfY29udGFpbmluZ0VsZW1lbnQnLCAnY29tbW9uQW5jZXN0b3JDb250YWluZXInKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBzdGFydCBDb21wb25lbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJHN0YXJ0Q29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfc3RhcnRDb21wb25lbnQnLCAnc3RhcnRFbGVtZW50Jyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIENvbXBvbmVudFxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kZW5kQ29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfZW5kQ29tcG9uZW50JywgJ2VuZEVsZW1lbnQnKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBlbmQgQ29tcG9uZW50XG4gKlxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRjb250YWluaW5nQ29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfY29udGFpbmluZ0NvbXBvbmVudCcsICdjb250YWluaW5nRWxlbWVudCcpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oVGV4dFNlbGVjdGlvbiwge1xuICAgIGluaXQ6IFRleHRTZWxlY3Rpb24kaW5pdCxcbiAgICB0ZXh0OiBUZXh0U2VsZWN0aW9uJHRleHQsXG4gICAgdGV4dE5vZGVzOiBUZXh0U2VsZWN0aW9uJHRleHROb2RlcyxcbiAgICBjbGVhcjogVGV4dFNlbGVjdGlvbiRjbGVhcixcblxuICAgIHN0YXJ0RWxlbWVudDogVGV4dFNlbGVjdGlvbiRzdGFydEVsZW1lbnQsXG4gICAgZW5kRWxlbWVudDogVGV4dFNlbGVjdGlvbiRlbmRFbGVtZW50LFxuICAgIGNvbnRhaW5pbmdFbGVtZW50OiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5pbmdFbGVtZW50LFxuXG4gICAgc3RhcnRDb21wb25lbnQ6IFRleHRTZWxlY3Rpb24kc3RhcnRDb21wb25lbnQsXG4gICAgZW5kQ29tcG9uZW50OiBUZXh0U2VsZWN0aW9uJGVuZENvbXBvbmVudCxcbiAgICBjb250YWluaW5nQ29tcG9uZW50OiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5pbmdDb21wb25lbnQsXG5cbiAgICBjb250YWluZWRDb21wb25lbnRzOiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5lZENvbXBvbmVudHMsXG4gICAgZWFjaENvbnRhaW5lZENvbXBvbmVudDogVGV4dFNlbGVjdGlvbiRlYWNoQ29udGFpbmVkQ29tcG9uZW50LFxuICAgIGRlbDogVGV4dFNlbGVjdGlvbiRkZWwsXG4gICAgX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludDogX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludCxcbiAgICBfc2VsZWN0QWZ0ZXJEZWxldGU6IF9zZWxlY3RBZnRlckRlbGV0ZSxcblxuICAgIGdldFJhbmdlOiBUZXh0U2VsZWN0aW9uJGdldFJhbmdlLFxuICAgIGdldFN0YXRlOiBUZXh0U2VsZWN0aW9uJGdldFN0YXRlLFxuICAgIGdldE5vcm1hbGl6ZWRSYW5nZTogVGV4dFNlbGVjdGlvbiQkZ2V0Tm9ybWFsaXplZFJhbmdlLFxuICAgIGdldERpcmVjdGlvbjogVGV4dFNlbGVjdGlvbiQkZ2V0RGlyZWN0aW9uXG59KTtcblxuXG5fLmV4dGVuZChUZXh0U2VsZWN0aW9uLCB7XG4gICAgY3JlYXRlRnJvbVJhbmdlOiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tUmFuZ2UsXG4gICAgY3JlYXRlRnJvbVN0YXRlOiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tU3RhdGUsXG4gICAgY3JlYXRlU3RhdGVPYmplY3Q6IFRleHRTZWxlY3Rpb24kJGNyZWF0ZVN0YXRlT2JqZWN0XG59KTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBUZXh0U2VsZWN0aW9uIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kaW5pdCgpIHtcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMud2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5yYW5nZUNvdW50KVxuICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gdGhpcy5zZWxlY3Rpb24uaXNDb2xsYXBzZWQ7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHNlbGVjdGlvbiB0ZXh0XG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJHRleHQoKSB7XG4gICAgaWYgKCEgdGhpcy5yYW5nZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICghIHRoaXMuX3RleHQpXG4gICAgICAgIHRoaXMuX3RleHQgPSB0aGlzLnJhbmdlLnRvU3RyaW5nKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fdGV4dDtcbn1cblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYW5kIHJldHVybnMgc2VsZWN0aW9uIHRleHQgbm9kZXNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheVtOb2RlXX1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiR0ZXh0Tm9kZXMoKSB7XG4gICAgaWYgKCEgdGhpcy5yYW5nZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICghIHRoaXMuX3RleHROb2RlcylcbiAgICAgICAgdGhpcy5fdGV4dE5vZGVzID0gX2dldFRleHROb2Rlcy5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl90ZXh0Tm9kZXM7XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiRjbGVhcigpIHtcbiAgICB0aGlzLnNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbn1cblxuXG4vKipcbiAqIFJldHJpZXZlcyB0ZXh0IGFuZCB0ZXh0IG5vZGVzIGZyb20gc2VsZWN0aW9uIHNhdmluZyB0aGVtIG9uIHByb3BlcnRpZXMgb2Ygb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7VGV4dFNlbGVjdGlvbn0gdGhpc1xuICovXG5mdW5jdGlvbiBfZ2V0VGV4dE5vZGVzKCkge1xuICAgIC8vIGxpc3Qgb2Ygc2VsZWN0ZWQgdGV4dCBub2Rlc1xuICAgIHZhciB0ZXh0Tm9kZXMgPSBbXTtcblxuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKVxuICAgICAgICByZXR1cm4gdGV4dE5vZGVzO1xuXG4gICAgLy8gY3JlYXRlIFRyZWVXYWxrZXIgdG8gdHJhdmVyc2UgdGhlIHRyZWUgdG8gc2VsZWN0IGFsbCB0ZXh0IG5vZGVzXG4gICAgdmFyIHNlbFN0YXJ0ID0gdGhpcy5yYW5nZS5zdGFydENvbnRhaW5lclxuICAgICAgICAsIHNlbEVuZCA9IHRoaXMucmFuZ2UuZW5kQ29udGFpbmVyXG4gICAgICAgICwgcmFuZ2VDb250YWluZXIgPSB0aGlzLnJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgdmFyIHRyZWVXYWxrZXIgPSB0aGlzLndpbmRvdy5kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHJhbmdlQ29udGFpbmVyLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG4gICAgdmFyIG5vZGUgPSB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsU3RhcnQ7XG5cbiAgICAvLyB0cmF2ZXJzZSBET00gdHJlZSB0byBjb2xsZWN0IGFsbCBzZWxlY3RlZCB0ZXh0IG5vZGVzXG4gICAgd2hpbGUgKG5vZGUgJiYgKCEgaW5FbmQgfHwgc2VsRW5kLmNvbnRhaW5zKG5vZGUpKSkge1xuICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgdmFyIGluRW5kID0gaW5FbmQgfHwgc2VsRW5kLmNvbnRhaW5zKG5vZGUpO1xuICAgICAgICBub2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dE5vZGVzO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHN0YXJ0L2VuZCBlbGVtZW50IGZyb20gc2VsZWN0aW9uIHNhdmluZyB0aGVtIG9uIHByb3BlcnRpZXMgb2Ygb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7VGV4dFNlbGVjdGlvbn0gdGhpc1xuICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICovXG5mdW5jdGlvbiBfZ2V0RWxlbWVudCh0aGlzUHJvcE5hbWUsIHJhbmdlUHJvcE5hbWUpIHtcbiAgICBpZiAoISB0aGlzLnJhbmdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzW3RoaXNQcm9wTmFtZV0gPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRoaXNbdGhpc1Byb3BOYW1lXSA9IGNvbnRhaW5pbmdFbGVtZW50KHRoaXMucmFuZ2VbcmFuZ2VQcm9wTmFtZV0pO1xuICAgIHJldHVybiB0aGlzW3RoaXNQcm9wTmFtZV07XG59XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJldHVybnMgc3RhcnQvZW5kIGNvbXBvbmVudCBmcm9tIHNlbGVjdGlvbiBzYXZpbmcgdGhlbSBvbiBwcm9wZXJ0aWVzIG9mIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1RleHRTZWxlY3Rpb259IHRoaXNcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gX2dldENvbXBvbmVudCh0aGlzUHJvcE5hbWUsIGVsTWV0aG9kTmFtZSkge1xuICAgIGlmICghIHRoaXMucmFuZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIHRoaXNbdGhpc1Byb3BOYW1lXSA9PSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhpc1t0aGlzUHJvcE5hbWVdID0gQ29tcG9uZW50LmdldENvbnRhaW5pbmdDb21wb25lbnQodGhpc1tlbE1ldGhvZE5hbWVdKCkpO1xuICAgIHJldHVybiB0aGlzW3RoaXNQcm9wTmFtZV07XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiRjb250YWluZWRDb21wb25lbnRzKCkge1xuICAgIGlmICh0aGlzLl9jb250YWluZWRDb21wb25lbnRzKVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVkQ29tcG9uZW50cztcblxuICAgIHZhciBjb21wb25lbnRzID0gdGhpcy5fY29udGFpbmVkQ29tcG9uZW50cyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQgfHwgISB0aGlzLnJhbmdlKSByZXR1cm4gY29tcG9uZW50cztcblxuICAgIHJldHVybiBnZXRDb21wb25lbnRzRnJvbVJhbmdlKHRoaXMucmFuZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZWFjaENvbnRhaW5lZENvbXBvbmVudChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkIHx8ICEgdGhpcy5yYW5nZSkgcmV0dXJuO1xuXG4gICAgdmFyIGNvbXBvbmVudHMgPSB0aGlzLmNvbnRhaW5lZENvbXBvbmVudHMoKTtcblxuICAgIGNvbXBvbmVudHMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogRGVsZXRlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIGFsbCBjb21wb25lbnRzIGluIGl0XG4gKiBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2VsZWN0RW5kQ29udGFpbmVyIHNldCB0byB0cnVlIGlmIHRoZSBlbmQgY29udGFpbmVyIHNob3VsZCBiZSBzZWxlY3RlZCBhZnRlciBkZWxldGlvblxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGRlbChzZWxlY3RFbmRDb250YWluZXIpIHtcbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCB8fCAhIHRoaXMucmFuZ2UpIHJldHVybjtcblxuICAgIHZhciBzZWxQb2ludCA9IHRoaXMuX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludChzZWxlY3RFbmRDb250YWluZXIpO1xuXG4gICAgZGVsZXRlUmFuZ2VXaXRoQ29tcG9uZW50cyh0aGlzLnJhbmdlKTtcblxuICAgIHRoaXMuX3NlbGVjdEFmdGVyRGVsZXRlKHNlbFBvaW50KTtcbiAgICBzZWxQb2ludC5ub2RlLnBhcmVudE5vZGUubm9ybWFsaXplKCk7XG59XG5cblxuZnVuY3Rpb24gX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludChzZWxlY3RFbmRDb250YWluZXIpIHtcbiAgICB2YXIgc2VsTm9kZSA9IHRoaXMucmFuZ2Uuc3RhcnRDb250YWluZXI7XG4gICAgdmFyIHNlbE9mZnNldCA9IHRoaXMucmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgaWYgKHNlbGVjdEVuZENvbnRhaW5lciAmJiB0aGlzLnJhbmdlLnN0YXJ0Q29udGFpbmVyICE9IHRoaXMucmFuZ2UuZW5kQ29udGFpbmVyKSB7XG4gICAgICAgIHNlbE5vZGUgPSB0aGlzLnJhbmdlLmVuZENvbnRhaW5lcjtcbiAgICAgICAgc2VsT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZTogc2VsTm9kZSwgb2Zmc2V0OiBzZWxPZmZzZXQgfTtcbn1cblxuXG5mdW5jdGlvbiBfc2VsZWN0QWZ0ZXJEZWxldGUoc2VsUG9pbnQpIHtcbiAgICB2YXIgc2VsTm9kZSA9IHNlbFBvaW50Lm5vZGVcbiAgICAgICAgLCBzZWxPZmZzZXQgPSBzZWxQb2ludC5vZmZzZXQ7XG5cbiAgICBpZiAoIXNlbE5vZGUpIHJldHVybjtcbiAgICBpZiAoc2VsTm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSlcbiAgICAgICAgc2VsTm9kZS50ZXh0Q29udGVudCA9IHNlbE5vZGUudGV4dENvbnRlbnQudHJpbVJpZ2h0KCk7XG4gICAgaWYgKCFzZWxOb2RlLm5vZGVWYWx1ZSlcbiAgICAgICAgc2VsTm9kZS5ub2RlVmFsdWUgPSAnXFx1MDBBMCc7IC8vbm9uLWJyZWFraW5nIHNwYWNlLCBcXHUyMDBCIGZvciB6ZXJvIHdpZHRoIHNwYWNlO1xuXG4gICAgdmFyIHBvc2l0aW9uID0gc2VsT2Zmc2V0ID4gc2VsTm9kZS5sZW5ndGggPyBzZWxOb2RlLmxlbmd0aCA6IHNlbE9mZnNldDtcbiAgICBzZXRDYXJldFBvc2l0aW9uKHNlbE5vZGUsIHBvc2l0aW9uKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgc2VsZWN0aW9uIHJhbmdlXG4gKlxuICogQHJldHVybiB7UmFuZ2V9XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZ2V0UmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2U7XG59XG5cblxuLyoqXG4gKiBTdG9yZXMgc2VsZWN0aW9uIHdpbmRvdywgbm9kZXMgYW5kIG9mZnNldHMgaW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZ2V0U3RhdGUocm9vdEVsKSB7XG4gICAgdmFyIHIgPSB0aGlzLnJhbmdlO1xuICAgIHZhciBkb2MgPSByb290RWwub3duZXJEb2N1bWVudFxuICAgICAgICAsIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIGlmICghcikgcmV0dXJuIHsgd2luZG93OiB3aW4gfTtcbiAgICByZXR1cm4gVGV4dFNlbGVjdGlvbi5jcmVhdGVTdGF0ZU9iamVjdChyb290RWwsIHIuc3RhcnRDb250YWluZXIsIHIuc3RhcnRPZmZzZXQsIHIuZW5kQ29udGFpbmVyLCByLmVuZE9mZnNldCk7XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkY3JlYXRlU3RhdGVPYmplY3Qocm9vdEVsLCBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQsIGVuZENvbnRhaW5lciwgZW5kT2Zmc2V0KSB7XG4gICAgZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyIHx8IHN0YXJ0Q29udGFpbmVyO1xuICAgIGVuZE9mZnNldCA9IGVuZE9mZnNldCB8fCBzdGFydE9mZnNldDtcbiAgICB2YXIgZG9jID0gcm9vdEVsLm93bmVyRG9jdW1lbnRcbiAgICAgICAgLCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICByZXR1cm4ge1xuICAgICAgICB3aW5kb3c6IHdpbixcbiAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgIHN0YXJ0OiBfZ2V0U2VsZWN0aW9uUG9pbnRTdGF0ZShyb290RWwsIHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCksXG4gICAgICAgIGVuZDogX2dldFNlbGVjdGlvblBvaW50U3RhdGUocm9vdEVsLCBlbmRDb250YWluZXIsIGVuZE9mZnNldClcbiAgICB9O1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRTZWxlY3Rpb25Qb2ludFN0YXRlKHJvb3RFbCwgbm9kZSwgb2Zmc2V0KSB7XG4gICAgdmFyIHRyZWVQYXRoID0gZG9tVXRpbHMudHJlZVBhdGhPZihyb290RWwsIG5vZGUpO1xuICAgIGlmICghIHRyZWVQYXRoKSBsb2dnZXIuZXJyb3IoJ1NlbGVjdGlvbiBwb2ludCBpcyBvdXRzaWRlIG9mIHJvb3QgZWxlbWVudCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRyZWVQYXRoOiB0cmVlUGF0aCxcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXRcbiAgICB9O1xufVxuXG5cbi8qKlxuICogUmVzdG9yZXMgYWN0dWFsIHNlbGVjdGlvbiB0byB0aGUgc3RvcmVkIHJhbmdlXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGNyZWF0ZUZyb21TdGF0ZShzdGF0ZSkge1xuICAgIHZhciBkb21VdGlscyA9IHN0YXRlLndpbmRvdy5taWxvLnV0aWwuZG9tO1xuXG4gICAgaWYgKHN0YXRlLnJvb3RFbCAmJiBzdGF0ZS5zdGFydCAmJiBzdGF0ZS5lbmQpIHtcbiAgICAgICAgdmFyIHN0YXJ0Tm9kZSA9IF9zZWxlY3Rpb25Ob2RlRnJvbVN0YXRlKHN0YXRlLnJvb3RFbCwgc3RhdGUuc3RhcnQpXG4gICAgICAgICAgICAsIGVuZE5vZGUgPSBfc2VsZWN0aW9uTm9kZUZyb21TdGF0ZShzdGF0ZS5yb290RWwsIHN0YXRlLmVuZCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRvbVV0aWxzLnNldFNlbGVjdGlvbihzdGFydE5vZGUsIHN0YXRlLnN0YXJ0Lm9mZnNldCwgZW5kTm9kZSwgc3RhdGUuZW5kLm9mZnNldCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oc3RhdGUud2luZG93KTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1RleHQgc2VsZWN0aW9uOiBjYW5cXCd0IGNyZWF0ZSBzZWxlY3Rpb24nLCBlLCBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG9tVXRpbHMuY2xlYXJTZWxlY3Rpb24oc3RhdGUud2luZG93KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKHN0YXRlLndpbmRvdyk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9zZWxlY3Rpb25Ob2RlRnJvbVN0YXRlKHJvb3RFbCwgcG9pbnRTdGF0ZSkge1xuICAgIHZhciBub2RlID0gZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgocm9vdEVsLCBwb2ludFN0YXRlLnRyZWVQYXRoKTtcbiAgICBpZiAoISBub2RlKSBsb2dnZXIuZXJyb3IoJ1RleHRTZWxlY3Rpb24gY3JlYXRlRnJvbVN0YXRlOiBubyBub2RlIGF0IHRyZWVQYXRoJyk7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHNlbGVjdGlvbiBmcm9tIHBhc3NlZCByYW5nZVxuICogXG4gKiBAcGFyYW0ge1JhbmdlfSByYW5nZVxuICogQHBhcmFtIHtCb29sZWFufSBiYWNrd2FyZFxuICpcbiAqIEByZXR1cm4ge1RleHRTZWxlY3Rpb259XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGNyZWF0ZUZyb21SYW5nZShyYW5nZSwgYmFja3dhcmQpIHtcbiAgICB2YXIgd2luID0gcmFuZ2Uuc3RhcnRDb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld1xuICAgICAgICAsIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKVxuICAgICAgICAsIGVuZFJhbmdlO1xuXG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKGJhY2t3YXJkKXtcbiAgICAgICAgZW5kUmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7XG4gICAgICAgIGVuZFJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcblxuICAgICAgICBzZWwuYWRkUmFuZ2UoZW5kUmFuZ2UpO1xuICAgICAgICBzZWwuZXh0ZW5kKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCByYW5nZS5zdGFydE9mZnNldCkgICAgICAgIFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24od2luKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbm9ybWFsaXplZCBjb3B5IG9mIHRoZSByYW5nZVxuICogSWYgeW91IHRyaXBsZSBjbGljayBhbiBpdGVtLCB0aGUgZW5kIG9mIHRoZSByYW5nZSBpcyBwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE5FWFQgbm9kZS5cbiAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJhbmdlIHdpdGggdGhlIGVuZCBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgdGV4dG5vZGUgY29udGFpbmVkIFxuICogaW5zaWRlIGEgY29tcG9uZW50IHdpdGggdGhlIFwiZWRpdGFibGVcIiBmYWNldFxuICogXG4gKiBAcmV0dXJuIHtyYW5nZX1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkZ2V0Tm9ybWFsaXplZFJhbmdlKCl7XG4gICAgdmFyIGRvYyA9IHRoaXMucmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIub3duZXJEb2N1bWVudFxuICAgICAgICAsIHR3LCBwcmV2aW91c05vZGVcbiAgICAgICAgLCBuZXdSYW5nZSA9IHRoaXMucmFuZ2UuY2xvbmVSYW5nZSgpO1xuXG4gICAgaWYgKG5ld1JhbmdlLmVuZENvbnRhaW5lci5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgdHcgPSBkb2MuY3JlYXRlVHJlZVdhbGtlcihkb2MuYm9keSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuICAgICAgICB0dy5jdXJyZW50Tm9kZSA9IG5ld1JhbmdlLmVuZENvbnRhaW5lcjtcbiAgICAgICAgcHJldmlvdXNOb2RlID0gdHcucHJldmlvdXNOb2RlKCk7XG4gICAgICAgIG5ld1JhbmdlLnNldEVuZChwcmV2aW91c05vZGUsIHByZXZpb3VzTm9kZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdSYW5nZTtcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGRpcmVjdGlvbiBvZiBhIHNlbGVjdGlvblxuICpcbiAqIDEgZm9yd2FyZCwgLTEgYmFja3dhcmQsIDAgbm8gZGlyZWN0aW9uLCB1bmRlZmluZWQgb25lIG9mIHRoZSBub2RlIGlzIGRldGFjaGVkIG9yIGluIGEgZGlmZmVyZW50IGZyYW1lXG4gKlxuICogQHJldHVybiB7LTF8MHwxfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkZ2V0RGlyZWN0aW9uKCl7XG4gICAgcmV0dXJuIGRvbVV0aWxzLmdldFNlbGVjdGlvbkRpcmVjdGlvbih0aGlzLnNlbGVjdGlvbik7ICAgIFxufVxuXG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgU3RvcmFnZU1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21zZ19zcmMnKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5yZXF1aXJlKCcuL21vZGVsJylcblxubW9kdWxlLmV4cG9ydHMgPSBET01TdG9yYWdlO1xuXG5cbi8vIHNoYXJlZCBrZXlzIHN0b3JlZCBieSBhbGwgaW5zdGFuY2VzLCBpbmNsdWRlIGtleSBwcmVmaXhlc1xudmFyIF9zdG9yZWRLZXlzID0ge1xuICAgIHRydWU6IHt9LCAvLyBzZXNzaW9uIHN0b3JhZ2VcbiAgICBmYWxzZToge30gLy8gbG9jYWwgc3RvcmFnZVxufTtcblxuXG4vKipcbiAqIERPTVN0b3JhZ2UgY2xhc3MgdG8gc2ltcGxpZnkgc3RvcmFnZSBhbmQgcmV0cmlldmFsIG9mIG11bHRpcGxlIGl0ZW1zIHdpdGggdHlwZXMgcHJlc2VydmF0aW9uIHRvIERPTSBzdG9yYWdlIChsb2NhbFN0b3JhZ2UgYW5kIHNlc3Npb25TdG9yYWdlKS5cbiAqIFR5cGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBrZXkgY3JlYXRlZCBmcm9tIHZhbHVlIGtleXMgd2l0aCBhcHBlbmRlZCBgbWlsby5jb25maWcuZG9tU3RvcmFnZS50eXBlU3VmZml4YFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlQcmVmaXggcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZCB0byBhbGwga2V5cyBmb2xsb3dlZCBieSBgbWlsby5jb25maWcuZG9tU3RvcmFnZS5wcmVmaXhTZXBhcmF0b3JgIChcIi9cIiBieSBkZWZhdWx0KS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2Vzc2lvbk9ubHkgdHJ1ZSB0byB1c2Ugc2Vzc2lvblN0b3JhZ2UuIGxvY2FsU3RvcmFnZSB3aWxsIGJlIHVzZWQgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7V2luZG93fSB3aW4gd2luZG93IHRvIHdvcmsgaW5cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZShrZXlQcmVmaXgsIHNlc3Npb25Pbmx5LCB3aW4pIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIHdpbiA9IHdpbiB8fCB3aW5kb3c7XG5cbiAgICBrZXlQcmVmaXggPSBjb25maWcuZG9tU3RvcmFnZS5yb290ICtcbiAgICAgICAgICAgICAgICAoa2V5UHJlZml4XG4gICAgICAgICAgICAgICAgICAgID8ga2V5UHJlZml4ICsgY29uZmlnLmRvbVN0b3JhZ2UucHJlZml4U2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgIDogJycpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAga2V5UHJlZml4OiBrZXlQcmVmaXgsXG4gICAgICAgIHNlc3Npb25Pbmx5OiAhISBzZXNzaW9uT25seSxcbiAgICAgICAgd2luZG93OiB3aW4sXG4gICAgICAgIF9zdG9yYWdlOiBzZXNzaW9uT25seSA/IHdpbi5zZXNzaW9uU3RvcmFnZSA6IHdpbi5sb2NhbFN0b3JhZ2UsXG4gICAgICAgIF90eXBlU3VmZml4OiBjb25maWcuZG9tU3RvcmFnZS50eXBlU3VmZml4LFxuICAgICAgICBfa2V5czoge31cbiAgICB9LCBfLldSSVQpO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oRE9NU3RvcmFnZSwge1xuICAgIGdldDogRE9NU3RvcmFnZSRnZXQsXG4gICAgc2V0OiBET01TdG9yYWdlJHNldCxcbiAgICByZW1vdmU6IERPTVN0b3JhZ2UkcmVtb3ZlLFxuICAgIGhhc0l0ZW06IERPTVN0b3JhZ2UkaGFzSXRlbSxcbiAgICBnZXRJdGVtOiBET01TdG9yYWdlJGdldEl0ZW0sXG4gICAgc2V0SXRlbTogRE9NU3RvcmFnZSRzZXRJdGVtLFxuICAgIHJlbW92ZUl0ZW06IERPTVN0b3JhZ2UkcmVtb3ZlSXRlbSxcbiAgICBfc3RvcmFnZUtleTogRE9NU3RvcmFnZSRfc3RvcmFnZUtleSxcbiAgICBfZG9tU3RvcmFnZUtleTogRE9NU3RvcmFnZSRfZG9tU3RvcmFnZUtleSxcbiAgICBnZXRBbGxLZXlzOiBET01TdG9yYWdlJGdldEFsbEtleXMsXG4gICAgZ2V0QWxsSXRlbXM6IERPTVN0b3JhZ2UkZ2V0QWxsSXRlbXMsXG4gICAgY3JlYXRlTWVzc2VuZ2VyOiBET01TdG9yYWdlJGNyZWF0ZU1lc3NlbmdlcixcbiAgICBkZXN0cm95OiBET01TdG9yYWdlJGRlc3Ryb3lcbn0pO1xuXG5cbi8qKlxuICogRXhwb3NlIE1lc2VuZ2VyIGFuZCBNZXNzYWdlU291cmNlIG1ldGhvZHMgb24gRE9NU3RvcmFnZVxuICovXG5NZXNzZW5nZXIudXNlV2l0aChET01TdG9yYWdlLCAnX21lc3NlbmdlcicsIE1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcyk7XG5TdG9yYWdlTWVzc2FnZVNvdXJjZS51c2VXaXRoKERPTVN0b3JhZ2UsICdfbWVzc2FnZVNvdXJjZScsIFsndHJpZ2dlciddKTtcblxuXG52YXIgX3Nlc3Npb25TdG9yYWdlID0gbmV3IERPTVN0b3JhZ2UoJycsIHRydWUpXG4gICAgLCBfbG9jYWxTdG9yYWdlID0gbmV3IERPTVN0b3JhZ2UoJycsIGZhbHNlKTtcblxudmFyIF9kb21TdG9yYWdlID0ge1xuICAgICAgICB0cnVlOiBfc2Vzc2lvblN0b3JhZ2UsXG4gICAgICAgIGZhbHNlOiBfbG9jYWxTdG9yYWdlXG4gICAgfTtcblxuXy5leHRlbmQoRE9NU3RvcmFnZSwge1xuICAgIHJlZ2lzdGVyRGF0YVR5cGU6IERPTVN0b3JhZ2UkJHJlZ2lzdGVyRGF0YVR5cGUsXG4gICAgbG9jYWw6IF9sb2NhbFN0b3JhZ2UsXG4gICAgc2Vzc2lvbjogX3Nlc3Npb25TdG9yYWdlLFxuICAgIHN0b3JhZ2U6IF9kb21TdG9yYWdlLFxuICAgIF9zdG9yZWRLZXlzOiBfc3RvcmVkS2V5cyAvLyBleHBvc2VkIGZvciB0ZXN0aW5nXG59KTtcblxuXG4vKipcbiAqIFNldHMgZGF0YSB0byBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8ga2V5cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSBzaW5nbGUgb2JqZWN0IGNhbiBiZSBwYXNzZWQgaW4gd2hpY2ggY2FzZSBrZXlzIHdpbGwgYmUgdXNlZCBhcyBrZXlzIGluIGxvY2FsIHN0b3JhZ2UuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhbHRlcm5hdGl2ZWx5IGp1c3QgdGhlIGxpc3Qgb2YgYXJndW1lbnRzIGNhbiBiZSBwYXNzZWQgd2hlcmUgYXJndW1lbnRzIGNhbiBiZSBzZXF1ZW50aWFsbHkgdXNlZCBhcyBrZXlzIGFuZCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2Ukc2V0KGRhdGEpIHsgLy8gb3IgYXJndW1lbnRzXG4gICAgaWYgKHR5cGVvZiBkYXRhID09ICdvYmplY3QnKVxuICAgICAgICBfLmVhY2hLZXkoZGF0YSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgdGhpcy5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGFyZ3NMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnc0xlbiAlIDIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRG9tU3RvcmFnZUVycm9yKCdET01TdG9yYWdlOiBzZXQgc2hvdWxkIGhhdmUgZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzIG9yIG9iamVjdCcpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gYXJndW1lbnRzW2ldXG4gICAgICAgICAgICAgICAgLCB2YWx1ZSA9IGFyZ3VtZW50c1srK2ldO1xuXG4gICAgICAgICAgICB0aGlzLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBHZXRzIGRhdGEgZnJvbSBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleXMsIGJ1dCByZXR1cm5lZCBvYmplY3Qgd2lsbCBoYXZlIGtleXMgd2l0aG91dCByb290IGtleXMuXG4gKlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMga2V5cyBjYW4gYmUgcGFzc2VkIGFzIHN0cmluZ3Mgb3IgYXJyYXlzIG9mIHN0cmluZ3NcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkZ2V0KCkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZGF0YSA9IHt9O1xuICAgIF8uZGVlcEZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgZGF0YVtrZXldID0gdGhpcy5nZXRJdGVtKGtleSk7XG4gICAgfSwgdGhpcyk7XG4gICAgcmV0dXJuIGRhdGE7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGtleXMgZnJvbSBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleXMuXG4gKlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMga2V5cyBjYW4gYmUgcGFzc2VkIGFzIHN0cmluZ3Mgb3IgYXJyYXlzIG9mIHN0cmluZ3NcbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRyZW1vdmUoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgXy5kZWVwRm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIENoZWNrIGZvciBwcmVzZW5jZSBvZiBzaW5nbGUgaXRlbSBpbiBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGhhc0l0ZW0oa2V5KSB7XG4gICAgdmFyIHBLZXkgPSB0aGlzLl9zdG9yYWdlS2V5KGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbShwS2V5KSAhPSBudWxsO1xufVxuXG5cbi8qKlxuICogR2V0cyBzaW5nbGUgaXRlbSBmcm9tIERPTSBzdG9yYWdlIHByZXBlbmRpbmcgYHRoaXMua2V5UHJlZml4YCB0byBwYXNzZWQga2V5LlxuICogUmVhZHMgdHlwZSBvZiB0aGUgb3JpZ2luYWxseSBzdG9yZWQgdmFsdWUgZnJvbSBga2V5ICsgdGhpcy5fdHlwZVN1ZmZpeGAgYW5kIGNvbnZlcnRzIGRhdGEgdG8gdGhlIG9yaWdpbmFsIHR5cGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGdldEl0ZW0oa2V5KSB7XG4gICAgdmFyIHBLZXkgPSB0aGlzLl9zdG9yYWdlS2V5KGtleSk7XG4gICAgdmFyIGRhdGFUeXBlID0gX2dldEtleURhdGFUeXBlLmNhbGwodGhpcywgcEtleSk7XG4gICAgdmFyIHZhbHVlU3RyID0gdGhpcy5fc3RvcmFnZS5nZXRJdGVtKHBLZXkpO1xuICAgIHZhciB2YWx1ZSA9IF9wYXJzZURhdGEodmFsdWVTdHIsIGRhdGFUeXBlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cblxuLyoqXG4gKiBTZXRzIHNpbmdsZSBpdGVtIHRvIERPTSBzdG9yYWdlIHByZXBlbmRpbmcgYHRoaXMua2V5UHJlZml4YCB0byBwYXNzZWQga2V5LlxuICogU3RvcmVzIHR5cGUgb2YgdGhlIHN0b3JlZCB2YWx1ZSB0byBga2V5ICsgdGhpcy5fdHlwZVN1ZmZpeGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBwS2V5ID0gdGhpcy5fc3RvcmFnZUtleShrZXkpO1xuICAgIHZhciBkYXRhVHlwZSA9IF9zZXRLZXlEYXRhVHlwZS5jYWxsKHRoaXMsIHBLZXksIHZhbHVlKTtcbiAgICB2YXIgdmFsdWVTdHIgPSBfc2VyaWFsaXplRGF0YSh2YWx1ZSwgZGF0YVR5cGUpO1xuICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2Uuc2V0SXRlbShwS2V5LCB2YWx1ZVN0cik7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicpIHtcbiAgICAgICAgICAgIHZhciBjZmcgPSBjb25maWcuZG9tU3RvcmFnZS5xdW90YUV4Y2VlZGVkO1xuICAgICAgICAgICAgaWYgKGNmZy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIG1pbG8ubWFpbC5wb3N0TWVzc2FnZSgncXVvdGFleGNlZWRlZGVycm9yJywgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNmZy50aHJvd0Vycm9yKVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgdGhpcy5fa2V5c1trZXldID0gdHJ1ZTtcbiAgICBfZG9tU3RvcmFnZVt0aGlzLnNlc3Npb25Pbmx5XS5fa2V5c1twS2V5XSA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIHNpbmdsZSBpdGVtIGZyb20gRE9NIHN0b3JhZ2UgcHJlcGVuZGluZyBgdGhpcy5rZXlQcmVmaXhgIHRvIHBhc3NlZCBrZXkuXG4gKiBUeXBlIG9mIHRoZSBzdG9yZWQgdmFsdWUgKGluIGBrZXkgKyB0aGlzLl90eXBlU3VmZml4YCBrZXkpIGlzIGFsc28gcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkcmVtb3ZlSXRlbShrZXkpIHtcbiAgICB2YXIgcEtleSA9IHRoaXMuX3N0b3JhZ2VLZXkoa2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0ocEtleSk7XG4gICAgX3JlbW92ZUtleURhdGFUeXBlLmNhbGwodGhpcywgcEtleSlcbiAgICBkZWxldGUgdGhpcy5fa2V5c1trZXldO1xuICAgIGRlbGV0ZSBfZG9tU3RvcmFnZVt0aGlzLnNlc3Npb25Pbmx5XS5fa2V5c1twS2V5XTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IG9mIGFsbCBrZXlzIHN0b3JlZCBieSB0aGlzIGluc3RhbmNlIG9mIERPTVN0b3JhZ2VcbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRnZXRBbGxLZXlzKCkge1xuICAgIHZhciBzdG9yZWRLZXlzID0gT2JqZWN0LmtleXModGhpcy5fa2V5cyk7XG4gICAgdmFyIGtleXNJblN0b3JhZ2UgPSBzdG9yZWRLZXlzLmZpbHRlcihmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSXRlbShrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSBkZWxldGUgdGhpcy5fa2V5c1trZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBrZXlzSW5TdG9yYWdlO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWFwIHdpdGggYWxsIGtleXMgYW5kIHZhbHVlcyAoZGVzZXJpYWxpemVkKSBzdG9yZWQgdXNpbmcgdGhpcyBpbnN0YW5jZSBvZiBET01TdG9yYWdlXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGdldEFsbEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLmdldEFsbEtleXMoKSk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHByZWZpeGVkIGtleSBmb3IgRE9NIHN0b3JhZ2UgZm9yIGdpdmVuIHVucHJlZml4ZWQga2V5LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRfc3RvcmFnZUtleShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5rZXlQcmVmaXggKyBrZXk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHVucHJlZml4ZWQga2V5IHRvIGJlIHVzZWQgd2l0aCB0aGlzIGluc3RhbmNlIG9mIERPTVN0b3JhZ2UgZmlyIGdpdmVuIGFjdHVhbCBrZXkgaW4gc3RvcmFnZVxuICogSWYga2V5IGhhcyBkaWZmZXJlbnQgcHJlZml4IGZyb20gdGhlIGtleVByZWZpeCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdG9yYWdlS2V5IGFjdHVhbCBrZXkgaW4gbG9jYWwvc2Vzc2lvbiBzdG9yYWdlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkX2RvbVN0b3JhZ2VLZXkoc3RvcmFnZUtleSkge1xuICAgIGlmIChzdG9yYWdlS2V5LmluZGV4T2YodGhpcy5fdHlwZVN1ZmZpeCkgPj0gMCkgcmV0dXJuO1xuICAgIHJldHVybiBfLnVuUHJlZml4KHN0b3JhZ2VLZXksIHRoaXMua2V5UHJlZml4KTtcbn1cblxuXG4vKipcbiAqIEdldHMgb3JpZ2luYWxseSBzdG9yZWQgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gcEtleSBwcmVmaXhlZCBrZXkgb2Ygc3RvcmVkIHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9nZXRLZXlEYXRhVHlwZShwS2V5KSB7XG4gICAgcEtleSA9IF9kYXRhVHlwZUtleS5jYWxsKHRoaXMsIHBLZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLmdldEl0ZW0ocEtleSk7XG59XG5cblxuLyoqXG4gKiBTdG9yZXMgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgIGFuZCBgdmFsdWVgLlxuICogUmV0dXJucyBkYXRhIHR5cGUgZm9yIGB2YWx1ZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICogQHBhcmFtIHtBbnl9IHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9zZXRLZXlEYXRhVHlwZShwS2V5LCB2YWx1ZSkge1xuICAgIHZhciBkYXRhVHlwZSA9IF9nZXRWYWx1ZVR5cGUodmFsdWUpO1xuICAgIHBLZXkgPSBfZGF0YVR5cGVLZXkuY2FsbCh0aGlzLCBwS2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnNldEl0ZW0ocEtleSwgZGF0YVR5cGUpO1xuICAgIHJldHVybiBkYXRhVHlwZTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgc3RvcmVkIGRhdGEgdHlwZSBmb3IgZ2l2ZW4gKHByZWZpeGVkKSBga2V5YC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICovXG5mdW5jdGlvbiBfcmVtb3ZlS2V5RGF0YVR5cGUocEtleSkge1xuICAgIHBLZXkgPSBfZGF0YVR5cGVLZXkuY2FsbCh0aGlzLCBwS2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0ocEtleSk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXkgdG8gc3RvcmUgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gcEtleSBwcmVmaXhlZCBrZXkgb2Ygc3RvcmVkIHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9kYXRhVHlwZUtleShwS2V5KSB7XG4gICAgcmV0dXJuIHBLZXkgKyB0aGlzLl90eXBlU3VmZml4O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0eXBlIG9mIHZhbHVlIGFzIHN0cmluZy4gQ2xhc3MgbmFtZSByZXR1cm5lZCBmb3Igb2JqZWN0cyAoJ251bGwnIGZvciBudWxsKS5cbiAqIEBwYXJhbSAge0FueX0gdmFsdWVcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX2dldFZhbHVlVHlwZSh2YWx1ZSkge1xuICAgIHZhciB2YWx1ZVR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgICAgICAgLCBjbGFzc05hbWUgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgICwgZGF0YVR5cGUgPSB2YWx1ZXNEYXRhVHlwZXNbY2xhc3NOYW1lXTtcbiAgICByZXR1cm4gZGF0YVR5cGUgfHwgKFxuICAgICAgICAgICAgdmFsdWVUeXBlICE9ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyB2YWx1ZVR5cGVcbiAgICAgICAgICAgICAgICA6IHZhbHVlID09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgPyAnbnVsbCdcbiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKTtcbn1cbnZhciB2YWx1ZXNEYXRhVHlwZXMgPSB7XG4gICAgLy8gY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCBgcmVnaXN0ZXJEYXRhVHlwZWBcbn1cblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdmFsdWUgdG8gYmUgc3RvcmVkIGluIERPTSBzdG9yYWdlLlxuICpcbiAqIEBwYXJhbSAge0FueX0gdmFsdWUgdmFsdWUgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtICB7U3RyaW5nfSB2YWx1ZVR5cGUgb3B0aW9uYWwgZGF0YSB0eXBlIHRvIGRlZmluZSBzZXJpYWxpemVyLCBfZ2V0VmFsdWVUeXBlIGlzIHVzZWQgaWYgbm90IHBhc3NlZC5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX3NlcmlhbGl6ZURhdGEodmFsdWUsIHZhbHVlVHlwZSkge1xuICAgIHZhbHVlVHlwZSA9IHZhbHVlVHlwZSB8fCBfZ2V0VmFsdWVUeXBlKHZhbHVlKTtcbiAgICB2YXIgc2VyaWFsaXplciA9IGRhdGFTZXJpYWxpemVyc1t2YWx1ZVR5cGVdO1xuICAgIHJldHVybiBzZXJpYWxpemVyXG4gICAgICAgICAgICA/IHNlcmlhbGl6ZXIodmFsdWUsIHZhbHVlVHlwZSlcbiAgICAgICAgICAgIDogdmFsdWUgJiYgdmFsdWUudG9TdHJpbmcgPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gICAgICAgICAgICAgICAgOiAnJyArIHZhbHVlO1xufVxudmFyIGRhdGFTZXJpYWxpemVycyA9IHtcbiAgICAnQXJyYXknOiBKU09OLnN0cmluZ2lmeVxufVxuXG5cbi8qKlxuICogUGFyc2VzIHN0cmluZyByZXRyaWV2ZWQgZnJvbSBET00gc3RvcmFnZS5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHZhbHVlU3RyXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHZhbHVlVHlwZSBkYXRhIHR5cGUgdGhhdCBkZWZpbmVzIHBhcnNlci4gT3JpZ2luYWwgc3Jpbmcgd2lsbCBiZSByZXR1cm5lZCBpZiBwYXJzZXIgaXMgbm90IGRlZmluZWQuXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIF9wYXJzZURhdGEodmFsdWVTdHIsIHZhbHVlVHlwZSkge1xuICAgIHZhciBwYXJzZXIgPSBkYXRhUGFyc2Vyc1t2YWx1ZVR5cGVdO1xuICAgIHJldHVybiBwYXJzZXJcbiAgICAgICAgICAgID8gcGFyc2VyKHZhbHVlU3RyLCB2YWx1ZVR5cGUpXG4gICAgICAgICAgICA6IHZhbHVlU3RyO1xufVxudmFyIGRhdGFQYXJzZXJzID0ge1xuICAgIE9iamVjdDogXy5qc29uUGFyc2UsXG4gICAgQXJyYXk6IF8uanNvblBhcnNlLFxuICAgIERhdGU6IGZ1bmN0aW9uKHZhbFN0cikgeyByZXR1cm4gbmV3IERhdGUodmFsU3RyKTsgfSxcbiAgICBib29sZWFuOiBmdW5jdGlvbih2YWxTdHIpIHsgcmV0dXJuIHZhbFN0ciA9PSAndHJ1ZSc7IH0sXG4gICAgbnVtYmVyOiBOdW1iZXIsXG4gICAgZnVuY3Rpb246IF8udG9GdW5jdGlvbixcbiAgICBSZWdFeHA6IF8udG9SZWdFeHBcbn07XG5cblxuLyoqXG4gKiBSZWdpc3RlcnMgZGF0YSB0eXBlIHRvIGJlIHNhdmVkIGluIERPTSBzdG9yYWdlLiBDbGFzcyBuYW1lIGNhbiBiZSB1c2VkIG9yIHJlc3VsdCBvZiBgdHlwZW9mYCBvcGVyYXRvciBmb3Igbm9uLW9iamVjdHMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBjb252ZXJzaW9ucy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVUeXBlIGNsYXNzIChjb25zdHJ1Y3RvcikgbmFtZSBvciB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IHR5cGVvZi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlcmlhbGl6ZXIgb3B0aW9uYWwgc2VyaWFsaXplciBmb3IgdGhpcyB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJzZXIgb3B0aW9uYWwgcGFyc2VyIGZvciB0aGlzIHR5cGVcbiAqIEBwYXJhbSB7W1N0cmluZ119IHN0b3JlQXNEYXRhVHlwZSBvcHRpb25hbCBuYW1lIG9mIHN0b3JlZCBkYXRhIHR5cGUgaWYgZGlmZmVyZW50IGZyb20gdmFsdWVUeXBlXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkJHJlZ2lzdGVyRGF0YVR5cGUodmFsdWVUeXBlLCBzZXJpYWxpemVyLCBwYXJzZXIsIHN0b3JlQXNEYXRhVHlwZSkge1xuICAgIGlmIChzZXJpYWxpemVyKSBkYXRhU2VyaWFsaXplcnNbdmFsdWVUeXBlXSA9IHNlcmlhbGl6ZXI7XG4gICAgaWYgKHBhcnNlcikgZGF0YVBhcnNlcnNbdmFsdWVUeXBlXSA9IHBhcnNlcjtcbiAgICB2YWx1ZXNEYXRhVHlwZXNbdmFsdWVUeXBlXSA9IHN0b3JlQXNEYXRhVHlwZSB8fCB2YWx1ZVR5cGU7XG59XG5cblxuZnVuY3Rpb24gRE9NU3RvcmFnZSRjcmVhdGVNZXNzZW5nZXIoKSB7XG4gICAgdmFyIHN0b3JhZ2VNZXNzYWdlU291cmNlID0gbmV3IFN0b3JhZ2VNZXNzYWdlU291cmNlKHRoaXMpO1xuICAgIHZhciBtZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHRoaXMsIHVuZGVmaW5lZCwgc3RvcmFnZU1lc3NhZ2VTb3VyY2UpO1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9tZXNzZW5nZXI6IG1lc3NlbmdlcixcbiAgICAgICAgX21lc3NhZ2VTb3VyY2U6IHN0b3JhZ2VNZXNzYWdlU291cmNlXG4gICAgfSwgXy5XUklUKTtcbn1cblxuXG5mdW5jdGlvbiBET01TdG9yYWdlJGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3RvcmFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndpbmRvdyA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5fbWVzc2VuZ2VyKSB0aGlzLl9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cbk1vZGVsLnJlZ2lzdGVyV2l0aERPTVN0b3JhZ2UgPSBNb2RlbCQkcmVnaXN0ZXJXaXRoRE9NU3RvcmFnZTtcblxuXG5mdW5jdGlvbiBNb2RlbCQkcmVnaXN0ZXJXaXRoRE9NU3RvcmFnZSgpIHtcbiAgICB2YXIgRE9NU3RvcmFnZSA9IHJlcXVpcmUoJy4vaW5kZXgnKTtcbiAgICBET01TdG9yYWdlLnJlZ2lzdGVyRGF0YVR5cGUoJ01vZGVsJywgTW9kZWxfZG9tU3RvcmFnZVNlcmlhbGl6ZXIsIE1vZGVsX2RvbVN0b3JhZ2VQYXJzZXIpO1xuICAgIERPTVN0b3JhZ2UucmVnaXN0ZXJEYXRhVHlwZSgnTW9kZWxQYXRoJywgTW9kZWxfZG9tU3RvcmFnZVNlcmlhbGl6ZXIsIE1vZGVsX2RvbVN0b3JhZ2VQYXJzZXIsICdNb2RlbCcpO1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsX2RvbVN0b3JhZ2VTZXJpYWxpemVyKHZhbHVlKSB7XG4gICAgdmFyIGRhdGEgPSB2YWx1ZS5nZXQoKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxfZG9tU3RvcmFnZVBhcnNlcih2YWx1ZVN0cikge1xuICAgIHZhciBkYXRhID0gXy5qc29uUGFyc2UodmFsdWVTdHIpO1xuICAgIHJldHVybiBuZXcgTW9kZWwoZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnJylcbiAgICAsIHVuaXF1ZUlkID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91bmlxdWVfaWQnKTtcblxudmFyIFN0b3JhZ2VNZXNzYWdlU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnU3RvcmFnZU1lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKFN0b3JhZ2VNZXNzYWdlU291cmNlLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgaW5pdDogaW5pdCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgcG9zdE1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlLFxuICAgIHRyaWdnZXI6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHRyaWdnZXIsXG5cbiAgICAvL2NsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQgIC8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JhZ2VNZXNzYWdlU291cmNlO1xuXG5cbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzKSB7XG4gICAgaWYgKGhvc3RPYmplY3QuY29uc3RydWN0b3IubmFtZSAhPSAnRE9NU3RvcmFnZScpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaG9zdE9iamVjdCBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgRE9NU3RvcmFnZScpO1xuICAgIHRoaXMuc3RvcmFnZSA9IGhvc3RPYmplY3Q7XG4gICAgdGhpcy5tZXNzYWdlS2V5ID0gY29uZmlnLmRvbVN0b3JhZ2UubWVzc2FnZUtleTtcbiAgICB0aGlzLndpbmRvdyA9IGhvc3RPYmplY3Qud2luZG93O1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRhZGRTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgdGhpcywgZmFsc2UpO1xufVxuXG5cbmZ1bmN0aW9uIFN0b3JhZ2VNZXNzYWdlU291cmNlJHJlbW92ZVNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLCBmYWxzZSk7XG59XG5cblxuZnVuY3Rpb24gU3RvcmFnZU1lc3NhZ2VTb3VyY2UkcG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2VuZ2VyLnBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBTdG9yYWdlTWVzc2FnZVNvdXJjZSR0cmlnZ2VyKG1zZ1R5cGUsIGRhdGEpIHtcbiAgICB2YXIga2V5ID0gdGhpcy5tZXNzYWdlS2V5ICsgbXNnVHlwZTtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhW2NvbmZpZy5kb21TdG9yYWdlLm1lc3NhZ2VUaW1lc3RhbXBdID0gdW5pcXVlSWQoKTtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMuc3RvcmFnZSwgJ3NldEl0ZW0nLCBrZXksIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnN0b3JhZ2VBcmVhICE9IHRoaXMuc3RvcmFnZS5fc3RvcmFnZSkgcmV0dXJuO1xuICAgIHZhciBrZXkgPSB0aGlzLnN0b3JhZ2UuX2RvbVN0b3JhZ2VLZXkoZXZlbnQua2V5KTsgaWYgKCEga2V5KSByZXR1cm47XG4gICAgdmFyIG1zZ1R5cGUgPSBfLnVuUHJlZml4KGtleSwgdGhpcy5tZXNzYWdlS2V5KTsgaWYgKCEgbXNnVHlwZSkgcmV0dXJuO1xuICAgIHZhciBkYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTsgaWYgKCEgZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKG1zZ1R5cGUsIGRhdGEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdGltZXN0YW1wID0gRGF0ZS5ub3coKVxuICAgICwgY291bnQgPSAnJ1xuICAgICwgdW5pcXVlSUQgPSAnJyArIHRpbWVzdGFtcDtcblxuZnVuY3Rpb24gdW5pcXVlQ291bnQoKSB7XG4gICAgdmFyIG5ld1RpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgdW5pcXVlSUQgPSAnJyArIG5ld1RpbWVzdGFtcDtcbiAgICBpZiAodGltZXN0YW1wID09IG5ld1RpbWVzdGFtcCkge1xuICAgICAgICBjb3VudCA9IGNvdW50ID09PSAnJyA/IDAgOiBjb3VudCArIDE7XG4gICAgICAgIHVuaXF1ZUlEICs9ICdfJyArIGNvdW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRpbWVzdGFtcCA9IG5ld1RpbWVzdGFtcDtcbiAgICAgICAgY291bnQgPSAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pcXVlSUQ7XG59XG5cbnVuaXF1ZUNvdW50LmdldCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB1bmlxdWVJRDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlxdWVDb3VudDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgbWlsby51dGlsLndlYnNvY2tldGAgXG4qKi9cblxuXG52YXIgTWVzc2VuZ2VyID0gcmVxdWlyZSgnbWlsby1jb3JlJykuTWVzc2VuZ2VyXG4gICAgLCBXU01lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21zZ19zcmMnKVxuICAgICwgV1NNc2dBUEkgPSByZXF1aXJlKCcuL21zZ19hcGknKTtcblxuXG5mdW5jdGlvbiB3ZWJzb2NrZXQoKSB7XG4gICAgdmFyIHdzTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcjtcbiAgICB2YXIgd3NNc2dTb3VyY2UgPSBuZXcgV1NNZXNzYWdlU291cmNlKHdzTWVzc2VuZ2VyLCB7IHNlbmQ6ICd0cmlnZ2VyJywgY29ubmVjdDogJ2Nvbm5lY3QnIH0sIG5ldyBXU01zZ0FQSSk7XG4gICAgd3NNZXNzZW5nZXIuX3NldE1lc3NhZ2VTb3VyY2Uod3NNc2dTb3VyY2UpO1xuICAgIHJldHVybiB3c01lc3Nlbmdlcjtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHdlYnNvY2tldDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlckFQSSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2VuZ2VyQVBJXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgV1NNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ1dTTXNnQVBJJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhXU01zZ0FQSSwge1xuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxuICAgIGZpbHRlclNvdXJjZU1lc3NhZ2U6IGZpbHRlclNvdXJjZU1lc3NhZ2UsXG4gICAgY3JlYXRlSW50ZXJuYWxEYXRhOiBjcmVhdGVJbnRlcm5hbERhdGFcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdTTXNnQVBJO1xuXG5cbnZhciBTT0NLRVRfTUVTU0FHRVMgPSBbJ29wZW4nLCAnY2xvc2UnLCAnZXJyb3InLCAnbWVzc2FnZSddO1xuXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiBTT0NLRVRfTUVTU0FHRVMuaW5kZXhPZihtZXNzYWdlKSA+PSAwXG4gICAgICAgICAgICA/IG1lc3NhZ2VcbiAgICAgICAgICAgIDogJ21lc3NhZ2UnO1xufVxuXG5cbmZ1bmN0aW9uIGZpbHRlclNvdXJjZU1lc3NhZ2Uoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgbXNnRGF0YSkge1xuICAgIGlmIChTT0NLRVRfTUVTU0FHRVMuaW5kZXhPZihtZXNzYWdlKSA+PSAwKSByZXR1cm4gdHJ1ZTsgLy8gaW50ZXJuYWwgbWVzc2FnZSBpcyBvbmUgb2YgZXh0ZXJuYWwgbWVzc2FnZXNcbiAgICBpZiAoc291cmNlTWVzc2FnZSA9PSAnbWVzc2FnZScpIHtcbiAgICAgICAgdmFyIG1zZ1R5cGUgPSBtc2dEYXRhICYmIG1zZ0RhdGEudHlwZTtcbiAgICAgICAgcmV0dXJuIG1zZ1R5cGUgPT0gbWVzc2FnZTsgLy8gdHlwZSBlcXVhbHMgaW50ZXJuYWwgbWVzc2FnZVxuICAgIH1cbn07XG5cblxuZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxEYXRhKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGV2ZW50KSB7XG4gICAgdmFyIGludGVybmFsRGF0YSA9IHNvdXJjZU1lc3NhZ2UgPT0gJ21lc3NhZ2UnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF8uanNvblBhcnNlKGV2ZW50LmRhdGEpIHx8IGV2ZW50LmRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZXZlbnQ7XG4gICAgcmV0dXJuIGludGVybmFsRGF0YTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgdW5pcXVlSWQgPSByZXF1aXJlKCcuLi8uLi91dGlsL3VuaXF1ZV9pZCcpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi8uLi9jb25maWcnKVxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbnZhciBXU01lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdXU01lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKFdTTWVzc2FnZVNvdXJjZSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IGFkZFNvdXJjZVN1YnNjcmliZXIsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogcmVtb3ZlU291cmNlU3Vic2NyaWJlcixcbiAgICBcbiAgICAvLyBjbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgaGFuZGxlRXZlbnQ6IFdTTWVzc2FnZVNvdXJjZSRoYW5kbGVFdmVudCxcbiAgICBjb25uZWN0OiBXU01lc3NhZ2VTb3VyY2UkY29ubmVjdCxcbiAgICB0cmlnZ2VyOiBXU01lc3NhZ2VTb3VyY2UkdHJpZ2dlclxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBXU01lc3NhZ2VTb3VyY2U7XG5cblxuZnVuY3Rpb24gV1NNZXNzYWdlU291cmNlJGNvbm5lY3Qob3B0aW9ucykge1xuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciBob3N0ID0gb3B0aW9ucy5ob3N0IHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0LnJlcGxhY2UoLzouKi8sICcnKVxuICAgICAgICAsIHBvcnQgPSBvcHRpb25zLnBvcnQgfHwgJzgwODAnO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuX3dzKSB7XG4gICAgICAgIC8vIFRPRE8gc2hvdWxkIHVuc3Vic2NyaWJlIGRpZmZlcmVudGx5XG4gICAgICAgIHRoaXMuX3dzLm9ub3BlbiA9IHRoaXMud3Mub25tZXNzYWdlID0gdGhpcy53cy5vbmNsb3NlID0gdGhpcy53cy5vbmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl93cy5jbG9zZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3dzID0gbmV3IFdlYlNvY2tldCgnd3M6Ly8nICsgaG9zdCArICc6JyArIHBvcnQpO1xuXG4gICAgLy8gVE9ETyByZWNvbm5lY3Rcbn1cblxuXG5cbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIgKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICBfd3NTdWJzY3JpYmVyTWV0aG9kLmNhbGwodGhpcywgJ2FkZEV2ZW50TGlzdGVuZXInLCBzb3VyY2VNZXNzYWdlKTtcbn1cblxuXG5mdW5jdGlvbiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyIChzb3VyY2VNZXNzYWdlKSB7XG4gICAgX3dzU3Vic2NyaWJlck1ldGhvZC5jYWxsKHRoaXMsICdyZW1vdmVFdmVudExpc3RlbmVyJywgc291cmNlTWVzc2FnZSk7XG59XG5cblxuZnVuY3Rpb24gX3dzU3Vic2NyaWJlck1ldGhvZCAobWV0aG9kLCBzb3VyY2VNZXNzYWdlKSB7ICAgIFxuICAgIGlmICghdGhpcy5fd3MpIHJldHVybiBsb2dnZXIuZXJyb3IoJ3dlYnNvY2tldCBpcyBub3QgY3JlYXRlZCcpO1xuICAgIHRoaXMuX3dzW21ldGhvZF0oc291cmNlTWVzc2FnZSwgdGhpcyk7XG59XG5cblxuLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxuZnVuY3Rpb24gV1NNZXNzYWdlU291cmNlJGhhbmRsZUV2ZW50IChldmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKGV2ZW50LnR5cGUsIGV2ZW50KTtcbn1cblxuXG5mdW5jdGlvbiBXU01lc3NhZ2VTb3VyY2UkdHJpZ2dlciAobXNnLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fd3MpIHJldHVybiBsb2dnZXIuZXJyb3IoJ3dlYnNvY2tldCBpcyBub3QgY3JlYXRlZCcpO1xuXG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YS50eXBlID0gbXNnO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIFxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBkYXRhLmNhbGxiYWNrQ29ycklkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgdmFyIGludGVydmFsID0gXy5kZWxheShvblRpbWVvdXQsIGNvbmZpZy53ZWJzb2NrZXQucnBjLnRpbWVvdXQpO1xuICAgICAgICB0b2dnbGVScGNTdWJzY3JpcHRpb24oJ29uY2UnLCBkYXRhLmNhbGxiYWNrQ29ycklkKTtcbiAgICB9ICAgIFxuXG4gICAgdGhpcy5fd3Muc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XG5cblxuICAgIGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgICAgdG9nZ2xlUnBjU3Vic2NyaXB0aW9uKCdvZmYnLCBkYXRhLmNhbGxiYWNrQ29ycklkKTtcbiAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKCd3ZWJzb2NrZXQgcnBjOiB0aW1lb3V0JykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uUmVzcG9uc2UobXNnLCBtc2dEYXRhKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICBpZiAodHlwZW9mIG1zZ0RhdGEgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBtc2dEYXRhLmVycm9yID8gbmV3IEVycm9yKG1zZ0RhdGEuZXJyb3IpIDogbnVsbDtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbXNnRGF0YS5kYXRhKVxuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignd2Vic29ja2V0IHJwYzogaW52YWxpZCByZXNwb25zZSBkYXRhJyksIG1zZ0RhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvZ2dsZVJwY1N1YnNjcmlwdGlvbihvbk9mZiwgY29ycklkKSB7XG4gICAgICAgIHNlbGYubWVzc2VuZ2VyW29uT2ZmXShjb25maWcud2Vic29ja2V0LnJwYy5yZXNwb25zZVByZWZpeCArIGNvcnJJZCwgb25SZXNwb25zZSk7XG4gICAgfVxufVxuIiwiOyhmdW5jdGlvbigpe1xuXG4vLyBUaGlzIHdvdWxkIGJlIHRoZSBwbGFjZSB0byBlZGl0IGlmIHlvdSB3YW50IGEgZGlmZmVyZW50XG4vLyBCYXNlMzIgaW1wbGVtZW50YXRpb25cblxudmFyIGFscGhhYmV0ID0gJzAxMjM0NTY3ODlhYmNkZWZnaGprbW5wcXJ0dXZ3eHl6J1xudmFyIGFsaWFzID0geyBvOjAsIGk6MSwgbDoxLCBzOjUgfVxuXG4vKipcbiAqIEJ1aWxkIGEgbG9va3VwIHRhYmxlIGFuZCBtZW1vaXplIGl0XG4gKlxuICogUmV0dXJuIGFuIG9iamVjdCB0aGF0IG1hcHMgYSBjaGFyYWN0ZXIgdG8gaXRzXG4gKiBieXRlIHZhbHVlLlxuICovXG5cbnZhciBsb29rdXAgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGFibGUgPSB7fVxuICAgIC8vIEludmVydCAnYWxwaGFiZXQnXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbHBoYWJldC5sZW5ndGg7IGkrKykge1xuICAgICAgICB0YWJsZVthbHBoYWJldFtpXV0gPSBpXG4gICAgfVxuICAgIC8vIFNwbGljZSBpbiAnYWxpYXMnXG4gICAgZm9yICh2YXIga2V5IGluIGFsaWFzKSB7XG4gICAgICAgIGlmICghYWxpYXMuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgICAgICAgdGFibGVba2V5XSA9IHRhYmxlWycnICsgYWxpYXNba2V5XV1cbiAgICB9XG4gICAgbG9va3VwID0gZnVuY3Rpb24oKSB7IHJldHVybiB0YWJsZSB9XG4gICAgcmV0dXJuIHRhYmxlXG59XG5cbi8qKlxuICogQSBzdHJlYW1pbmcgZW5jb2RlclxuICpcbiAqICAgICB2YXIgZW5jb2RlciA9IG5ldyBiYXNlMzIuRW5jb2RlcigpXG4gKiAgICAgdmFyIG91dHB1dDEgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dDEpXG4gKiAgICAgdmFyIG91dHB1dDIgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dDIpXG4gKiAgICAgdmFyIGxhc3RvdXRwdXQgPSBlbmNvZGUudXBkYXRlKGxhc3RpbnB1dCwgdHJ1ZSlcbiAqL1xuXG5mdW5jdGlvbiBFbmNvZGVyKCkge1xuICAgIHZhciBza2lwID0gMCAvLyBob3cgbWFueSBiaXRzIHdlIHdpbGwgc2tpcCBmcm9tIHRoZSBmaXJzdCBieXRlXG4gICAgdmFyIGJpdHMgPSAwIC8vIDUgaGlnaCBiaXRzLCBjYXJyeSBmcm9tIG9uZSBieXRlIHRvIHRoZSBuZXh0XG5cbiAgICB0aGlzLm91dHB1dCA9ICcnXG5cbiAgICAvLyBSZWFkIG9uZSBieXRlIG9mIGlucHV0XG4gICAgLy8gU2hvdWxkIG5vdCByZWFsbHkgYmUgdXNlZCBleGNlcHQgYnkgXCJ1cGRhdGVcIlxuICAgIHRoaXMucmVhZEJ5dGUgPSBmdW5jdGlvbihieXRlKSB7XG4gICAgICAgIC8vIGNvZXJjZSB0aGUgYnl0ZSB0byBhbiBpbnRcbiAgICAgICAgaWYgKHR5cGVvZiBieXRlID09ICdzdHJpbmcnKSBieXRlID0gYnl0ZS5jaGFyQ29kZUF0KDApXG5cbiAgICAgICAgaWYgKHNraXAgPCAwKSB7IC8vIHdlIGhhdmUgYSBjYXJyeSBmcm9tIHRoZSBwcmV2aW91cyBieXRlXG4gICAgICAgICAgICBiaXRzIHw9IChieXRlID4+ICgtc2tpcCkpXG4gICAgICAgIH0gZWxzZSB7IC8vIG5vIGNhcnJ5XG4gICAgICAgICAgICBiaXRzID0gKGJ5dGUgPDwgc2tpcCkgJiAyNDhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChza2lwID4gMykge1xuICAgICAgICAgICAgLy8gbm90IGVub3VnaCBkYXRhIHRvIHByb2R1Y2UgYSBjaGFyYWN0ZXIsIGdldCB1cyBhbm90aGVyIG9uZVxuICAgICAgICAgICAgc2tpcCAtPSA4XG4gICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNraXAgPCA0KSB7XG4gICAgICAgICAgICAvLyBwcm9kdWNlIGEgY2hhcmFjdGVyXG4gICAgICAgICAgICB0aGlzLm91dHB1dCArPSBhbHBoYWJldFtiaXRzID4+IDNdXG4gICAgICAgICAgICBza2lwICs9IDVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgLy8gRmx1c2ggYW55IHJlbWFpbmluZyBiaXRzIGxlZnQgaW4gdGhlIHN0cmVhbVxuICAgIHRoaXMuZmluaXNoID0gZnVuY3Rpb24oY2hlY2spIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMub3V0cHV0ICsgKHNraXAgPCAwID8gYWxwaGFiZXRbYml0cyA+PiAzXSA6ICcnKSArIChjaGVjayA/ICckJyA6ICcnKVxuICAgICAgICB0aGlzLm91dHB1dCA9ICcnXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG59XG5cbi8qKlxuICogUHJvY2VzcyBhZGRpdGlvbmFsIGlucHV0XG4gKlxuICogaW5wdXQ6IHN0cmluZyBvZiBieXRlcyB0byBjb252ZXJ0XG4gKiBmbHVzaDogYm9vbGVhbiwgc2hvdWxkIHdlIGZsdXNoIGFueSB0cmFpbGluZyBiaXRzIGxlZnRcbiAqICAgICAgICBpbiB0aGUgc3RyZWFtXG4gKiByZXR1cm5zOiBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyAnaW5wdXQnIGluIGJhc2UzMlxuICovXG5cbkVuY29kZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGlucHV0LCBmbHVzaCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyApIHtcbiAgICAgICAgaSArPSB0aGlzLnJlYWRCeXRlKGlucHV0W2ldKVxuICAgIH1cbiAgICAvLyBjb25zdW1lIGFsbCBvdXRwdXRcbiAgICB2YXIgb3V0cHV0ID0gdGhpcy5vdXRwdXRcbiAgICB0aGlzLm91dHB1dCA9ICcnXG4gICAgaWYgKGZsdXNoKSB7XG4gICAgICBvdXRwdXQgKz0gdGhpcy5maW5pc2goKVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0XG59XG5cbi8vIEZ1bmN0aW9ucyBhbmFsb2dvdXNseSB0byBFbmNvZGVyXG5cbmZ1bmN0aW9uIERlY29kZXIoKSB7XG4gICAgdmFyIHNraXAgPSAwIC8vIGhvdyBtYW55IGJpdHMgd2UgaGF2ZSBmcm9tIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXJcbiAgICB2YXIgYnl0ZSA9IDAgLy8gY3VycmVudCBieXRlIHdlJ3JlIHByb2R1Y2luZ1xuXG4gICAgdGhpcy5vdXRwdXQgPSAnJ1xuXG4gICAgLy8gQ29uc3VtZSBhIGNoYXJhY3RlciBmcm9tIHRoZSBzdHJlYW0sIHN0b3JlXG4gICAgLy8gdGhlIG91dHB1dCBpbiB0aGlzLm91dHB1dC4gQXMgYmVmb3JlLCBiZXR0ZXJcbiAgICAvLyB0byB1c2UgdXBkYXRlKCkuXG4gICAgdGhpcy5yZWFkQ2hhciA9IGZ1bmN0aW9uKGNoYXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGFyICE9ICdzdHJpbmcnKXtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hhciA9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hhciA9IGNoYXIudG9Mb3dlckNhc2UoKVxuICAgICAgICB2YXIgdmFsID0gbG9va3VwKClbY2hhcl1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGNoYXJhY3RlciBkb2VzIG5vdCBleGlzdCBpbiBvdXIgbG9va3VwIHRhYmxlXG4gICAgICAgICAgICByZXR1cm4gLy8gc2tpcCBzaWxlbnRseS4gQW4gYWx0ZXJuYXRpdmUgd291bGQgYmU6XG4gICAgICAgICAgICAvLyB0aHJvdyBFcnJvcignQ291bGQgbm90IGZpbmQgY2hhcmFjdGVyIFwiJyArIGNoYXIgKyAnXCIgaW4gbG9va3VwIHRhYmxlLicpXG4gICAgICAgIH1cbiAgICAgICAgdmFsIDw8PSAzIC8vIG1vdmUgdG8gdGhlIGhpZ2ggYml0c1xuICAgICAgICBieXRlIHw9IHZhbCA+Pj4gc2tpcFxuICAgICAgICBza2lwICs9IDVcbiAgICAgICAgaWYgKHNraXAgPj0gOCkge1xuICAgICAgICAgICAgLy8gd2UgaGF2ZSBlbm91Z2ggdG8gcHJlZHVjZSBvdXRwdXRcbiAgICAgICAgICAgIHRoaXMub3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSlcbiAgICAgICAgICAgIHNraXAgLT0gOFxuICAgICAgICAgICAgaWYgKHNraXAgPiAwKSBieXRlID0gKHZhbCA8PCAoNSAtIHNraXApKSAmIDI1NVxuICAgICAgICAgICAgZWxzZSBieXRlID0gMFxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uKGNoZWNrKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLm91dHB1dCArIChza2lwIDwgMCA/IGFscGhhYmV0W2JpdHMgPj4gM10gOiAnJykgKyAoY2hlY2sgPyAnJCcgOiAnJylcbiAgICAgICAgdGhpcy5vdXRwdXQgPSAnJ1xuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxufVxuXG5EZWNvZGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihpbnB1dCwgZmx1c2gpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucmVhZENoYXIoaW5wdXRbaV0pXG4gICAgfVxuICAgIHZhciBvdXRwdXQgPSB0aGlzLm91dHB1dFxuICAgIHRoaXMub3V0cHV0ID0gJydcbiAgICBpZiAoZmx1c2gpIHtcbiAgICAgIG91dHB1dCArPSB0aGlzLmZpbmlzaCgpXG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRcbn1cblxuLyoqIENvbnZlbmllbmNlIGZ1bmN0aW9uc1xuICpcbiAqIFRoZXNlIGFyZSB0aGUgb25lcyB0byB1c2UgaWYgeW91IGp1c3QgaGF2ZSBhIHN0cmluZyBhbmRcbiAqIHdhbnQgdG8gY29udmVydCBpdCB3aXRob3V0IGRlYWxpbmcgd2l0aCBzdHJlYW1zIGFuZCB3aGF0bm90LlxuICovXG5cbi8vIFN0cmluZyBvZiBkYXRhIGdvZXMgaW4sIEJhc2UzMi1lbmNvZGVkIHN0cmluZyBjb21lcyBvdXQuXG5mdW5jdGlvbiBlbmNvZGUoaW5wdXQpIHtcbiAgdmFyIGVuY29kZXIgPSBuZXcgRW5jb2RlcigpXG4gIHZhciBvdXRwdXQgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dCwgdHJ1ZSlcbiAgcmV0dXJuIG91dHB1dFxufVxuXG4vLyBCYXNlMzItZW5jb2RlZCBzdHJpbmcgZ29lcyBpbiwgZGVjb2RlZCBkYXRhIGNvbWVzIG91dC5cbmZ1bmN0aW9uIGRlY29kZShpbnB1dCkge1xuICAgIHZhciBkZWNvZGVyID0gbmV3IERlY29kZXIoKVxuICAgIHZhciBvdXRwdXQgPSBkZWNvZGVyLnVwZGF0ZShpbnB1dCwgdHJ1ZSlcbiAgICByZXR1cm4gb3V0cHV0XG59XG5cbnZhciBiYXNlMzIgPSB7XG4gICAgRGVjb2RlcjogRGVjb2RlcixcbiAgICBFbmNvZGVyOiBFbmNvZGVyLFxuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGRlY29kZTogZGVjb2RlXG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXIgLSBPTUchXG4gIHdpbmRvdy5iYXNlMzIgPSBiYXNlMzJcbn1cblxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIC8vIG5vZGVqcy9icm93c2VyaWZ5XG4gIG1vZHVsZS5leHBvcnRzID0gYmFzZTMyXG59XG59KSgpO1xuIiwiXG4vLyBub3QgaW1wbGVtZW50ZWRcbi8vIFRoZSByZWFzb24gZm9yIGhhdmluZyBhbiBlbXB0eSBmaWxlIGFuZCBub3QgdGhyb3dpbmcgaXMgdG8gYWxsb3dcbi8vIHVudHJhZGl0aW9uYWwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2R1bGUuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1peGluO1xuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWl4aW5gIC0gYW4gYWJzdHJhY3QgTWl4aW4gY2xhc3MuXG4gKiBDYW4gYmUgc3ViY2xhc3NlZCB1c2luZzpcbiAqIGBgYFxuICogdmFyIE15TWl4aW4gPSBfLmNyZWF0ZVN1YmNsYXNzKG1pbG8uY2xhc3Nlcy5NaXhpbiwgJ015TWl4aW4nKTtcbiAqIGBgYFxuICpcbiAqIE1peGluIHBhdHRlcm4gaXMgYWxzbyB1c2VkLCBidXQgTWl4aW4gaW4gbWlsbyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNlcGFyYXRlIG9iamVjdCB0aGF0IGlzIHN0b3JlZCBvbiB0aGUgcHJvcGVydHkgb2YgdGhlIGhvc3Qgb2JqZWN0IGFuZCBjYW4gY3JlYXRlIHByb3h5IG1ldGhvZHMgb24gdGhlIGhvc3Qgb2JqZWN0IGlmIHJlcXVpcmVkLlxuICogQ2xhc3NlcyBbTWVzc2VuZ2VyXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkgYW5kIFtNZXNzYWdlU291cmNlXSguLi9tZXNzZW5nZXIvbV9zb3VyY2UuanMuaHRtbCkgYXJlIHN1YmNsYXNzZXMgb2YgTWl4aW4gYWJzdHJhY3QgY2xhc3MuIGB0aGlzYCBpbiBwcm94eSBtZXRob2RzIHJlZmVycyB0byBNaXhpbiBpbnN0YW5jZSwgdGhlIHJlZmVyZW5jZSB0byB0aGUgaG9zdCBvYmplY3QgaXMgYHRoaXMuX2hvc3RPYmplY3RgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IE9wdGlvbmFsIG9iamVjdCB3aGVyZSBhIE1peGluIGluc3RhbmNlIHdpbGwgYmUgc3RvcmVkIG9uLiBJdCBpcyB1c2VkIHRvIHByb3h5IG1ldGhvZHMgYW5kIGFsc28gdG8gZmluZCB0aGUgcmVmZXJlbmNlIHdoZW4gaXQgaXMgbmVlZGVkIGZvciBob3N0IG9iamVjdCBpbXBsZW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm94eU1ldGhvZHMgT3B0aW9uYWwgbWFwIG9mIHByb3h5IG1ldGhvZCBuYW1lcyBhcyBrZXlzIGFuZCBNaXhpbiBtZXRob2RzIG5hbWVzIGFzIHZhbHVlcywgc28gcHJveGllZCBtZXRob2RzIGNhbiBiZSByZW5hbWVkIHRvIGF2b2lkIG5hbWUtc3BhY2UgY29uZmxpY3RzIGlmIHR3byBkaWZmZXJlbnQgTWl4aW4gaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUgbWV0aG9kIG5hbWVzIGFyZSBwdXQgb24gdGhlIG9iamVjdFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWxsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBpbml0IG1ldGhvZCBvZiBNaXhpbiBzdWJjbGFzcyB0b2dldGhlciB3aXRoIGhvc3RPYmplY3QgYW5kIHByb3h5TWV0aG9kc1xuICogQHJldHVybiB7TWl4aW59XG4gKi9cbmZ1bmN0aW9uIE1peGluKGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcykgeyAvLyAsIG90aGVyIGFyZ3MgLSBwYXNzZWQgdG8gaW5pdCBtZXRob2RcbiAgICBjaGVjayhob3N0T2JqZWN0LCBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihPYmplY3QsIEZ1bmN0aW9uKSkpO1xuXG4gICAgLy8gc3RvcmUgaG9zdE9iamVjdFxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19ob3N0T2JqZWN0JywgaG9zdE9iamVjdCk7XG5cbiAgICAvLyBwcm94eSBtZXRob2RzIHRvIGhvc3RPYmplY3RcbiAgICBpZiAocHJveHlNZXRob2RzKVxuICAgICAgICB0aGlzLl9jcmVhdGVQcm94eU1ldGhvZHMocHJveHlNZXRob2RzKTtcblxuICAgIC8vIGNhbGxpbmcgaW5pdCBpZiBpdCBpcyBkZWZpbmVkIGluIHRoZSBjbGFzc1xuICAgIGlmICh0aGlzLmluaXQpXG4gICAgICAgIHRoaXMuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogIyMjI01peGluIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKiBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgY29uc3RydWN0b3IsIHRoZXkgYXJlIG5vdCB0byBiZSBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzLlxuICpcbiAqIC0gW19jcmVhdGVQcm94eU1ldGhvZF0oI19jcmVhdGVQcm94eU1ldGhvZClcbiAqIC0gW19jcmVhdGVQcm94eU1ldGhvZHNdKCNfY3JlYXRlUHJveHlNZXRob2RzKVxuICovXG5fLmV4dGVuZFByb3RvKE1peGluLCB7XG4gICAgX2NyZWF0ZVByb3h5TWV0aG9kOiBfY3JlYXRlUHJveHlNZXRob2QsICAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbiAgICBfY3JlYXRlUHJveHlNZXRob2RzOiBfY3JlYXRlUHJveHlNZXRob2RzICAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbn0pO1xuXG5cbi8qKlxuICogIyMjI01peGluIGNsYXNzIG1ldGhvZHMjIyMjXG4gKiBUaGVzZSBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbiBob3N0IGNsYXNzIGRlY2xhcmF0aW9uLlxuICpcbiAqIC0gW3VzZVdpdGhdKCNNaXhpbiQkdXNlV2l0aClcbiAqL1xuXy5leHRlbmQoTWl4aW4sIHtcbiAgICB1c2VXaXRoOiBNaXhpbiQkdXNlV2l0aFxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJveGllZCBtZXRob2Qgb2YgTWl4aW4gc3ViY2xhc3Mgb24gaG9zdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1peGluTWV0aG9kTmFtZSBuYW1lIG9mIG1ldGhvZCBpbiBNaXhpbiBzdWJjbGFzc1xuICogQHBhcmFtIHtTdHJpbmd9IHByb3h5TWV0aG9kTmFtZSBuYW1lIG9mIGNyZWF0ZWQgcHJveHkgbWV0aG9kIG9uIGhvc3Qgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBPcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIGhvc3Qgb2JqZWN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZSBob3N0IG9iamVjdCBwYXNzZWQgdG8gY29uc3RydWN0b3Igd2lsIGJlIHVzZWQuIEl0IGFsbG93cyB0byB1c2UgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgTWl4aW4gb24gdHdvIGhvc3Qgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZVByb3h5TWV0aG9kKHByb3h5TWV0aG9kTmFtZSwgbWl4aW5NZXRob2ROYW1lLCBob3N0T2JqZWN0KSB7XG4gICAgaG9zdE9iamVjdCA9IGhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcblxuICAgIC8vIE1peGluIGNsYXNzIGRvZXMgbm90IGFsbG93IHNoYWRvd2luZyBtZXRob2RzIHRoYXQgZXhpc3Qgb24gdGhlIGhvc3Qgb2JqZWN0XG4gICAgaWYgKGhvc3RPYmplY3RbcHJveHlNZXRob2ROYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXRob2QgJyArIHByb3h5TWV0aG9kTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGFscmVhZHkgZGVmaW5lZCBpbiBob3N0IG9iamVjdCcpO1xuXG4gICAgdmFyIG1ldGhvZCA9IHRoaXNbbWl4aW5NZXRob2ROYW1lXVxuICAgIGNoZWNrKG1ldGhvZCwgRnVuY3Rpb24pO1xuXG4gICAgLy8gQmluZCBwcm94aWVkIE1peGluJ3MgbWV0aG9kIHRvIE1peGluIGluc3RhbmNlXG4gICAgdmFyIGJvdW5kTWV0aG9kID0gbWV0aG9kLmJpbmQodGhpcyk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kTmFtZSwgYm91bmRNZXRob2QsIF8uV1JJVCk7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHByb3hpZWQgbWV0aG9kcyBvZiBNaXhpbiBzdWJjbGFzcyBvbiBob3N0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0hhc2hbU3RyaW5nXXxBcnJheVtTdHJpbmddfSBwcm94eU1ldGhvZHMgbWFwIG9mIG5hbWVzIG9mIG1ldGhvZHMsIGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIG1peGluIG1ldGhvZCBuYW1lLiBDYW4gYmUgYXJyYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBhbiBvcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIGhvc3Qgb2JqZWN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZSBob3N0IG9iamVjdCBwYXNzZWQgdG8gY29uc3RydWN0b3Igd2lsIGJlIHVzZWQuIEl0IGFsbG93cyB0byB1c2UgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgTWl4aW4gb24gdHdvIGhvc3Qgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZVByb3h5TWV0aG9kcyhwcm94eU1ldGhvZHMsIGhvc3RPYmplY3QpIHtcbiAgICBjaGVjayhwcm94eU1ldGhvZHMsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKFtTdHJpbmddLCBNYXRjaC5PYmplY3RIYXNoKFN0cmluZykpKSk7XG5cbiAgICAvLyBjcmVhdGluZyBhbmQgYmluZGluZyBwcm94eSBtZXRob2RzIG9uIHRoZSBob3N0IG9iamVjdFxuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3h5TWV0aG9kcykpXG4gICAgICAgIHByb3h5TWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIC8vIG1ldGhvZCBjYWxsZWQgdGhpcyB3YXkgdG8gYWxsb3cgdXNpbmcgX2NyZWF0ZVByb3h5TWV0aG9kcyB3aXRoIG9iamVjdHNcbiAgICAgICAgICAgIC8vIHRoYXQgYXJlIG5vdCBpbmhlcml0aW5nIGZyb20gTWl4aW5cbiAgICAgICAgICAgIF9jcmVhdGVQcm94eU1ldGhvZC5jYWxsKHRoaXMsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGhvc3RPYmplY3QpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZWFjaEtleShwcm94eU1ldGhvZHMsIGZ1bmN0aW9uKG1peGluTWV0aG9kTmFtZSwgcHJveHlNZXRob2ROYW1lKSB7XG4gICAgICAgICAgICAvLyBtZXRob2QgY2FsbGVkIHRoaXMgd2F5IHRvIGFsbG93IHVzaW5nIF9jcmVhdGVQcm94eU1ldGhvZHMgd2l0aCBvYmplY3RzXG4gICAgICAgICAgICAvLyB0aGF0IGFyZSBub3QgaW5oZXJpdGluZyBmcm9tIE1peGluXG4gICAgICAgICAgICBfY3JlYXRlUHJveHlNZXRob2QuY2FsbCh0aGlzLCBwcm94eU1ldGhvZE5hbWUsIG1peGluTWV0aG9kTmFtZSwgaG9zdE9iamVjdCk7XG4gICAgICAgIH0sIHRoaXMpO1xufVxuXG5cbi8qKlxuICogU2V0cyBtaXhpbiBpbnN0YW5jZSBwcm9wZXJ0eSBuYW1lIG9uIHRoZSBob3N0IGNsYXNzXG4gKiBDYW4gYmUgY2FsbGVkIG9ubHkgb25jZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzIE1peGluIHN1YmNsYXNzIChub3QgaW5zdGFuY2UpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBob3N0Q2xhc3NcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnN0YW5jZUtleVxuICovXG5mdW5jdGlvbiBNaXhpbl9zZXRJbnN0YW5jZUtleShob3N0Q2xhc3MsIG1ldGhvZCwgaW5zdGFuY2VLZXkpIHtcbiAgICBjaGVjayhob3N0Q2xhc3MsIEZ1bmN0aW9uKTtcbiAgICBjaGVjayhpbnN0YW5jZUtleSwgTWF0Y2guSWRlbnRpZmllclN0cmluZyk7XG5cbiAgICB2YXIgcHJvcCA9IGNvbmZpZy5taXhpbi5pbnN0YW5jZVByb3BlcnRpZXNNYXBcbiAgICAgICAgLCBpbnN0YW5jZUtleXMgPSBob3N0Q2xhc3NbcHJvcF0gPSBob3N0Q2xhc3NbcHJvcF0gfHwge307XG5cbiAgICBpZiAoaW5zdGFuY2VLZXlzW21ldGhvZC5uYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXhpbjogaW5zdGFuY2UgcHJvcGVydHkgZm9yIG1ldGhvZCB3aXRoIG5hbWUgJ1xuICAgICAgICAgICAgKyBtZXRob2QubmFtZSArICcgaXMgYWxyZWFkeSBzZXQnKTtcblxuICAgIGluc3RhbmNlS2V5c1ttZXRob2QubmFtZV0gPSBpbnN0YW5jZUtleTtcbn1cblxuXG4vKipcbiAqIEFkZHMgbWV0aG9kIG9mIE1peGluIHN1YmNsYXNzIHRvIGhvc3QgY2xhc3MgcHJvdG90eXBlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzIE1peGluIHN1YmNsYXNzIChub3QgaW5zdGFuY2UpXG4gKiBAcGFyYW0ge1N0cmluZ30gbWl4aW5NZXRob2ROYW1lIG5hbWUgb2YgbWV0aG9kIGluIE1peGluIHN1YmNsYXNzXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdE1ldGhvZE5hbWUgKG9wdGlvbmFsKSBuYW1lIG9mIGNyZWF0ZWQgcHJveHkgbWV0aG9kIG9uIGhvc3Qgb2JqZWN0LCBzYW1lIGlmIG5vdCBzcGVjaWZpZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IG9iamVjdCBjbGFzcywgbXVzdCBiZSBzcGVjaWZpZWQgYXMgdGhlIGxhc3QgcGFyYW1ldGVyICgybmQgb3IgM3JkKVxuICovXG5mdW5jdGlvbiBNaXhpbl9hZGRNZXRob2QoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSkge1xuICAgIHZhciBtZXRob2QgPSB0aGlzLnByb3RvdHlwZVttaXhpbk1ldGhvZE5hbWVdO1xuICAgIGNoZWNrKG1ldGhvZCwgRnVuY3Rpb24pO1xuXG4gICAgdmFyIHdyYXBwZWRNZXRob2QgPSBfd3JhcE1peGluTWV0aG9kLmNhbGwodGhpcywgbWV0aG9kKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkoaG9zdENsYXNzLnByb3RvdHlwZSwgaG9zdE1ldGhvZE5hbWUsIHdyYXBwZWRNZXRob2QsIF8uV1JJVCk7XG5cbiAgICBNaXhpbl9zZXRJbnN0YW5jZUtleShob3N0Q2xhc3MsIG1ldGhvZCwgaW5zdGFuY2VLZXkpXG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIG1ldGhvZCB0aGF0IHdpbGwgYmUgZXhwb3NlZCBvbiB0aGUgaG9zdCBjbGFzcyBwcm90b3R5cGVcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGhpcyBNaXhpbiBzdWJjbGFzcyAobm90IGluc3RhbmNlKVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIF93cmFwTWl4aW5NZXRob2QobWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyAvLyAsLi4uIGFyZ3VtZW50c1xuICAgICAgICB2YXIgbWl4aW5JbnN0YW5jZSA9IF9nZXRNaXhpbkluc3RhbmNlLmNhbGwodGhpcywgbWV0aG9kLm5hbWUpO1xuICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KG1peGluSW5zdGFuY2UsIGFyZ3VtZW50cyk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbnN0YW5jZSBvZiBtaXhpbiBzdWJjbGFzcy5cbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiBtZXRob2RzIGFyZSBleHBvc2VkIG9uIHRoZSBob3N0IGNsYXNzIHByb3RvdHlwZSAodXNpbmcgYWRkTWVodG9kcykgcmF0aGVyIHRoYW4gb24gaG9zdCBpbnN0YW5jZS5cbiAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCB1c2UgdGhpcyBtZXRob2RzIC0gd2hlbmV2ZXIgc3ViY2xhc3MgbWV0aG9kIGlzIGV4cG9zZWQgb24gdGhlIHByb3RvdHlwZSBpdCB3aWxsIGJlIHdyYXBwZWQgdG8gc2V0IGNvcnJlY3QgY29udGV4dCBmb3IgdGhlIHN1YmNsYXNzIG1ldGhvZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBfZ2V0TWl4aW5JbnN0YW5jZShtZXRob2ROYW1lKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNaXhpbikgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGluc3RhbmNlS2V5cyA9IHRoaXMuY29uc3RydWN0b3JbY29uZmlnLm1peGluLmluc3RhbmNlUHJvcGVydGllc01hcF1cbiAgICByZXR1cm4gdGhpc1tpbnN0YW5jZUtleXNbbWV0aG9kTmFtZV1dO1xufVxuXG5cbi8qKlxuICogQWRkcyBtZXRob2RzIG9mIE1peGluIHN1YmNsYXNzIHRvIGhvc3QgY2xhc3MgcHJvdG90eXBlLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRoaXMgTWl4aW4gc3ViY2xhc3MgKG5vdCBpbnN0YW5jZSlcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0Q2xhc3MgaG9zdCBvYmplY3QgY2xhc3M7IG11c3QgYmUgc3BlY2lmaWVkLlxuICogQHBhcmFtIHtTdHJpbmd9IGluc3RhbmNlS2V5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgaG9zdCBjbGFzcyBpbnN0YW5jZSB3aWxsIHN0b3JlIG1peGluIGluc3RhbmNlIG9uXG4gKiBAcGFyYW0ge0hhc2hbU3RyaW5nXXxBcnJheVtTdHJpbmddfSBtaXhpbk1ldGhvZHMgbWFwIG9mIG5hbWVzIG9mIG1ldGhvZHMsIGtleSAtIGhvc3QgbWV0aG9kIG5hbWUsIHZhbHVlIC0gbWl4aW4gbWV0aG9kIG5hbWUuIENhbiBiZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gTWl4aW4kJHVzZVdpdGgoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2RzKSB7XG4gICAgY2hlY2sobWl4aW5NZXRob2RzLCBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihbU3RyaW5nXSwgTWF0Y2guT2JqZWN0SGFzaChTdHJpbmcpKSkpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWl4aW5NZXRob2RzKSlcbiAgICAgICAgbWl4aW5NZXRob2RzLmZvckVhY2goZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgTWl4aW5fYWRkTWV0aG9kLmNhbGwodGhpcywgaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIGVsc2VcbiAgICAgICAgXy5lYWNoS2V5KG1peGluTWV0aG9kcywgZnVuY3Rpb24obWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgTWl4aW5fYWRkTWV0aG9kLmNhbGwodGhpcywgaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSk7XG4gICAgICAgIH0sIHRoaXMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwiY2xhc3Nlc1wiPjwvYT5cbi8vIG1pbG8uY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gVGhpcyBtb2R1bGUgY29udGFpbnMgZm91bmRhdGlvbiBjbGFzc2VzXG5cbnZhciBjbGFzc2VzID0ge1xuICAgIE1peGluOiByZXF1aXJlKCcuL2Fic3RyYWN0L21peGluJyksXG4gICAgTWVzc2FnZVNvdXJjZTogcmVxdWlyZSgnLi9tZXNzZW5nZXIvbV9zb3VyY2UnKSxcbiAgICBNZXNzZW5nZXJNZXNzYWdlU291cmNlOiByZXF1aXJlKCcuL21lc3Nlbmdlci9tc25ncl9zb3VyY2UnKSxcbiAgICBNZXNzZW5nZXJBUEk6IHJlcXVpcmUoJy4vbWVzc2VuZ2VyL21fYXBpJyksXG4gICAgTWVzc2VuZ2VyUmVnZXhwQVBJOiByZXF1aXJlKCcuL21lc3Nlbmdlci9tX2FwaV9yeCcpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzZXM7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbmZpZztcblxuZnVuY3Rpb24gY29uZmlnKG9wdGlvbnMpIHtcbiAgICBfLmRlZXBFeHRlbmQoY29uZmlnLCBvcHRpb25zKTtcbn1cblxuY29uZmlnKHtcbiAgICBtaXhpbjoge1xuICAgICAgICBpbnN0YW5jZVByb3BlcnRpZXNNYXA6ICdfX19taXhpbl9pbnN0YW5jZXMnXG4gICAgfSxcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBkZWJ1ZzogZmFsc2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWl4aW4gPSByZXF1aXJlKCcuLi9hYnN0cmFjdC9taXhpbicpXG4gICAgLCBNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi9tX3NvdXJjZScpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbi8qKlxuICogYG1pbG8uTWVzc2VuZ2VyYFxuICogQSBnZW5lcmljIE1lc3NlbmdlciBjbGFzcyB0aGF0IGlzIHVzZWQgZm9yIGFsbCBraW5kcyBvZiBtZXNzYWdpbmcgaW4gbWlsby4gSXQgaXMgc3ViY2xhc3NlZCBmcm9tIFtNaXhpbl0oLi4vYWJzdHJhY3QvbWl4aW4uanMuaHRtbCkgYW5kIGl0IHByb3hpZXMgaXRzIG1ldGhvZHMgdG8gdGhlIGhvc3Qgb2JqZWN0IGZvciBjb252ZW5pZW5jZS5cbiAqIEFsbCBmYWNldHMgYW5kIGNvbXBvbmVudHMgaGF2ZSBtZXNzZW5nZXIgYXR0YWNoZWQgdG8gdGhlbS4gTWVzc2VuZ2VyIGNsYXNzIGludGVyb3BlcmF0ZXMgd2l0aCBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBjbGFzcyB0aGF0IGNvbm5lY3RzIHRoZSBtZXNzZW5nZXIgdG8gc29tZSBleHRlcm5hbCBzb3VyY2Ugb2YgbWVzc2FnZXMgKGUuZy4sIERPTSBldmVudHMpIGFuZCBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIGNsYXNzIHRoYXQgYWxsb3dzIHRvIGRlZmluZSBoaWdoZXIgbGV2ZWwgbWVzc2FnZXMgdGhhbiBtZXNzYWdlcyB0aGF0IGV4aXN0IG9uIHRoZSBzb3VyY2UuXG4gKiBNZXNzZW5nZXIgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGluIG1pbG8gYW5kIGNhbiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggYW55IG9iamVjdHMvY2xhc3NlcyBpbiB0aGUgYXBwbGljYXRpb24uXG4gKiBtaWxvIGFsc28gZGVmaW5lcyBhIGdsb2JhbCBtZXNzZW5nZXIgW21pbG8ubWFpbF0oLi4vbWFpbC9pbmRleC5qcy5odG1sKSB0aGF0IGRpc3BhdGNoZXMgYGRvbXJlYWR5YCBldmVudCBhbmQgY2FuIGJlIHVzZWQgZm9yIGFueSBhcHBsaWNhdGlvbiB3aWRlIG1lc3NhZ2luZy5cbiAqIFRvIGluaXRpYWxpemUgeW91ciBhcHAgYWZ0ZXIgRE9NIGlzIHJlYWR5IHVzZTpcbiAqIGBgYFxuICogbWlsby5tYWlsLm9uKCdkb21yZWFkeScsIGZ1bmN0aW9uKCkge1xuICogICAgIC8vIGFwcGxpY2F0aW9uIHN0YXJ0c1xuICogfSk7XG4gKiBgYGBcbiAqIG9yIHRoZSBmb2xsb3dpbmcgc2hvcnRlciBmb3JtIG9mIHRoZSBzYW1lOlxuICogYGBgXG4gKiBtaWxvKGZ1bmN0aW9uKCkge1xuICogICAgIC8vIGFwcGxpY2F0aW9uIHN0YXJ0c1xuICogfSk7XG4gKiBgYGBcbiAqL1xudmFyIE1lc3NlbmdlciA9IF8uY3JlYXRlU3ViY2xhc3MoTWl4aW4sICdNZXNzZW5nZXInKTtcblxudmFyIG1lc3NhZ2VzU3BsaXRSZWdFeHAgPSBNZXNzZW5nZXIubWVzc2FnZXNTcGxpdFJlZ0V4cCA9IC9cXHMqKD86XFwsfFxccylcXHMqLztcblxuXG4vKipcbiAqICMjIyNNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjaW5pdClcbiAqIC0gW29uXSgjTWVzc2VuZ2VyJG9uKSAoYWxpYXMgLSBvbk1lc3NhZ2UsIGRlcHJlY2F0ZWQpXG4gKiAtIFtvZmZdKCNNZXNzZW5nZXIkb2ZmKSAoYWxpYXMgLSBvZmZNZXNzYWdlLCBkZXByZWNhdGVkKVxuICogLSBbb25NZXNzYWdlc10oI29uTWVzc2FnZXMpXG4gKiAtIFtvZmZNZXNzYWdlc10oI29mZk1lc3NhZ2VzKVxuICogLSBbb25jZV0oI29uY2UpXG4gKiAtIFtvbmNlU3luY10oI29uY2VTeW5jKVxuICogLSBbcG9zdE1lc3NhZ2VdKCNwb3N0TWVzc2FnZSlcbiAqIC0gW2dldFN1YnNjcmliZXJzXSgjZ2V0U3Vic2NyaWJlcnMpXG4gKlxuICogXCJQcml2YXRlXCIgbWV0aG9kc1xuICpcbiAqIC0gW19jaG9vc2VTdWJzY3JpYmVyc0hhc2hdKCNfY2hvb3NlU3Vic2NyaWJlcnNIYXNoKVxuICogLSBbX3JlZ2lzdGVyU3Vic2NyaWJlcl0oI19yZWdpc3RlclN1YnNjcmliZXIpXG4gKiAtIFtfcmVtb3ZlU3Vic2NyaWJlcl0oI19yZW1vdmVTdWJzY3JpYmVyKVxuICogLSBbX3JlbW92ZUFsbFN1YnNjcmliZXJzXSgjX3JlbW92ZUFsbFN1YnNjcmliZXJzKVxuICogLSBbX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnNdKCNfY2FsbFBhdHRlcm5TdWJzY3JpYmVycylcbiAqIC0gW19jYWxsU3Vic2NyaWJlcnNdKCNfY2FsbFN1YnNjcmliZXJzKVxuICogLSBbX3NldE1lc3NhZ2VTb3VyY2VdKCNfc2V0TWVzc2FnZVNvdXJjZSlcbiAqIC0gW2dldE1lc3NhZ2VTb3VyY2VdKCNnZXRNZXNzYWdlU291cmNlKVxuICovXG5fLmV4dGVuZFByb3RvKE1lc3Nlbmdlciwge1xuICAgIGluaXQ6IGluaXQsIC8vIGNhbGxlZCBieSBNaXhpbiAoc3VwZXJjbGFzcylcbiAgICBkZXN0cm95OiBNZXNzZW5nZXIkZGVzdHJveSxcbiAgICBvbjogTWVzc2VuZ2VyJG9uLFxuICAgIG9uY2U6IE1lc3NlbmdlciRvbmNlLFxuICAgIG9uY2VTeW5jOiBNZXNzZW5nZXIkb25jZVN5bmMsXG4gICAgb25TeW5jOiBNZXNzZW5nZXIkb25TeW5jLFxuICAgIG9uQXN5bmM6IE1lc3NlbmdlciRvbkFzeW5jLFxuICAgIG9uTWVzc2FnZTogTWVzc2VuZ2VyJG9uLCAvLyBkZXByZWNhdGVkXG4gICAgb2ZmOiBNZXNzZW5nZXIkb2ZmLFxuICAgIG9mZk1lc3NhZ2U6IE1lc3NlbmdlciRvZmYsIC8vIGRlcHJlY2F0ZWRcbiAgICBvbk1lc3NhZ2VzOiBvbk1lc3NhZ2VzLFxuICAgIG9mZk1lc3NhZ2VzOiBvZmZNZXNzYWdlcyxcbiAgICBvZmZBbGw6IE1lc3NlbmdlciRvZmZBbGwsXG4gICAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlLFxuICAgIHBvc3RNZXNzYWdlU3luYzogcG9zdE1lc3NhZ2VTeW5jLFxuICAgIGdldFN1YnNjcmliZXJzOiBnZXRTdWJzY3JpYmVycyxcbiAgICBnZXRNZXNzYWdlU291cmNlOiBnZXRNZXNzYWdlU291cmNlLFxuICAgIF9jaG9vc2VTdWJzY3JpYmVyc0hhc2g6IF9jaG9vc2VTdWJzY3JpYmVyc0hhc2gsXG4gICAgX3JlZ2lzdGVyU3Vic2NyaWJlcjogX3JlZ2lzdGVyU3Vic2NyaWJlcixcbiAgICBfcmVtb3ZlU3Vic2NyaWJlcjogX3JlbW92ZVN1YnNjcmliZXIsXG4gICAgX3JlbW92ZUFsbFN1YnNjcmliZXJzOiBfcmVtb3ZlQWxsU3Vic2NyaWJlcnMsXG4gICAgX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnM6IF9jYWxsUGF0dGVyblN1YnNjcmliZXJzLFxuICAgIF9jYWxsU3Vic2NyaWJlcnM6IF9jYWxsU3Vic2NyaWJlcnMsXG4gICAgX2NhbGxTdWJzY3JpYmVyOiBfY2FsbFN1YnNjcmliZXIsXG4gICAgX3NldE1lc3NhZ2VTb3VyY2U6IF9zZXRNZXNzYWdlU291cmNlXG59KTtcblxuXG4vKipcbiAqIEEgZGVmYXVsdCBtYXAgb2YgcHJveHkgbWV0aG9kcyB1c2VkIGJ5IENvbXBvbmVudEZhY2V0IGFuZCBDb21wb25lbnQgY2xhc3NlcyB0byBwYXNzIHRvIE1lc3NlbmdlciB3aGVuIGl0IGlzIGluc3RhbnRpYXRlZC5cbiAqIFRoaXMgbWFwIGlzIGZvciBjb252ZW5pZW5jZSBvbmx5LCBpdCBpcyBOT1QgdXNlZCBpbnRlcm5hbGx5IGJ5IE1lc3NlbmdlciwgYSBob3N0IGNsYXNzIHNob3VsZCBwYXNzIGl0IGZvciBtZXRob2RzIHRvIGJlIHByb3hpZWQgdGhpcyB3YXkuXG4gKi9cbk1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcyA9IHtcbiAgICBvbjogJ29uJyxcbiAgICBvblN5bmM6ICdvblN5bmMnLFxuICAgIG9uY2U6ICdvbmNlJyxcbiAgICBvbmNlU3luYzogJ29uY2VTeW5jJyxcbiAgICBvZmY6ICdvZmYnLFxuICAgIG9uTWVzc2FnZXM6ICdvbk1lc3NhZ2VzJyxcbiAgICBvZmZNZXNzYWdlczogJ29mZk1lc3NhZ2VzJyxcbiAgICBwb3N0TWVzc2FnZTogJ3Bvc3RNZXNzYWdlJyxcbiAgICBwb3N0TWVzc2FnZVN5bmM6ICdwb3N0TWVzc2FnZVN5bmMnLFxuICAgIGdldFN1YnNjcmliZXJzOiAnZ2V0U3Vic2NyaWJlcnMnXG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2VuZ2VyO1xuXG5cbk1lc3Nlbmdlci5zdWJzY3JpcHRpb25zID0gW107XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBNZXNzZW5nZXIuIE1ldGhvZCBpcyBjYWxsZWQgYnkgTWl4aW4gY2xhc3MgY29uc3RydWN0b3IuXG4gKiBTZWUgW29uXSgjTWVzc2VuZ2VyJG9uKSBtZXRob2QsIFtNZXNzZW5nZXJdKCNNZXNzZW5nZXIpIGNsYXNzIGFib3ZlIGFuZCBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBPcHRpb25hbCBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIG1lc3NlbmdlciBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIEl0IGlzIHVzZWQgdG8gcHJveHkgbWV0aG9kcyBvZiBtZXNzZW5nZXIgYW5kIGFsc28gYXMgYSBjb250ZXh0IGZvciBzdWJzY3JpYmVycyB3aGVuIHRoZXkgYXJlIGNhbGxlZCBieSB0aGUgTWVzc2VuZ2VyLiBTZWUgYG9uYCBtZXRob2QuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJveHlNZXRob2RzIE9wdGlvbmFsIG1hcCBvZiBtZXRob2QgbmFtZXM7IGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIG1lc3NlbmdlcidzIG1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtNZXNzYWdlU291cmNlfSBtZXNzYWdlU291cmNlIE9wdGlvbmFsIG1lc3NhZ2VTb3VyY2UgbGlua2VkIHRvIHRoZSBtZXNzZW5nZXIuIElmIG1lc3NhZ2VTb3VyY2UgaXMgc3VwcGxpZWQsIHRoZSByZWZlcmVuY2UgdG8gdGhlIG1lc3NlbmdlciB3aWxsIHN0b3JlZCBvbiBpdHMgJ21lc3NlbmdlcicgcHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NhZ2VTb3VyY2UpIHtcbiAgICAvLyBob3N0T2JqZWN0IGFuZCBwcm94eU1ldGhvZHMgYXJlIHVzZWQgaW4gTWl4aW4gYW5kIGNoZWNrZWQgdGhlcmVcbiAgICBpZiAobWVzc2FnZVNvdXJjZSlcbiAgICAgICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKTtcblxuICAgIF9pbml0aWFsaXplU3Vic2NyaWJlcnMuY2FsbCh0aGlzKTtcbn1cblxuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZVN1YnNjcmliZXJzKCkge1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9tZXNzYWdlU3Vic2NyaWJlcnM6IHt9LFxuICAgICAgICBfcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVyczoge30sXG4gICAgfSwgXy5DT05GKTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3lzIG1lc3Nlbmdlci4gTWF5YmUgbmVlZHMgdG8gdW5zdWJzY3JpYmUgYWxsIHN1YnNjcmliZXJzXG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRkZXN0cm95KCkge1xuICAgIHRoaXMub2ZmQWxsKCk7XG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSB0aGlzLmdldE1lc3NhZ2VTb3VyY2UoKTtcbiAgICBpZiAobWVzc2FnZVNvdXJjZSlcbiAgICAgICAgbWVzc2FnZVNvdXJjZS5kZXN0cm95KCk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogUmVnaXN0ZXJzIGEgc3Vic2NyaWJlciBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIG1lc3NhZ2UocykuXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3Vic2NyaXB0aW9uIHdhcyBzdWNjZXNzZnVsLiBJdCBjYW4gYmUgdW5zdWNjZXNzZnVsIGlmIHRoZSBwYXNzZWQgc3Vic2NyaWJlciBoYXMgYWxyZWFkeSBiZWVuIHN1YnNjcmliZWQgdG8gdGhpcyBtZXNzYWdlIHR5cGUgLSBkb3VibGUgc3Vic2NyaXB0aW9uIG5ldmVyIGhhcHBlbnMgYW5kIGl0IGlzIHNhZmUgdG8gc3Vic2NyaWJlIGFnYWluIC0gbm8gZXJyb3Igb3Igd2FybmluZyBpcyB0aHJvd24gb3IgbG9nZ2VkLlxuICogU3Vic2NyaWJlciBpcyBwYXNzZWQgdHdvIHBhcmFtZXRlcnM6IGBtZXNzYWdlYCAoc3RyaW5nKSBhbmQgYGRhdGFgIChvYmplY3QpLiBEYXRhIG9iamVjdCBpcyBzdXBwbGllZCB3aGVuIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZCwgTWVzc2VuZ2VyIGl0c2VsZiBhZGRzIG5vdGhpbmcgdG8gaXQuIEZvciBleGFtcGxlLCBbZXZlbnRzIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0V2ZW50cy5qcy5odG1sKSBzZW5kcyBhY3R1YWwgRE9NIGV2ZW50IHdoZW4gaXQgcG9zdHMgbWVzc2FnZS5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiAvLyBzdWJzY3JpYmVzIG9uTW91c2VVcERvd24gdG8gdHdvIERPTSBldmVudHMgb24gY29tcG9uZW50IHZpYSBldmVudHMgZmFjZXQuXG4gKiBteUNvbXAuZXZlbnRzLm9uKCdtb3VzZWRvd24gbW91c2V1cCcsIG9uTW91c2VVcERvd24pO1xuICogZnVuY3Rpb24gb25Nb3VzZVVwRG93bihldmVudFR5cGUsIGV2ZW50KSB7XG4gKiAgICAgLy8gLi4uXG4gKiB9XG4gKlxuICogbXlDb21wLmRhdGEub24oLy4rLywgZnVuY3Rpb24obXNnLCBkYXRhKSB7XG4gKiAgICAgbG9nZ2VyLmRlYnVnKG1zZywgZGF0YSk7XG4gKiB9KTsgLy8gc3Vic2NyaWJlcyBhbm9ueW1vdXMgZnVuY3Rpb24gdG8gYWxsIG5vbi1lbXB0eSBtZXNzYWdlcyBvbiBkYXRhIGZhY2V0XG4gKiAvLyBpdCB3aWxsIG5vdCBiZSBwb3NzaWJsZSB0byB1bnN1YnNjcmliZSBhbm9ueW1vdXMgc3Vic2NyaWJlciBzZXBhcmF0ZWx5LFxuICogLy8gYnV0IG15Q29tcC5kYXRhLm9mZigvLisvKSB3aWxsIHVuc3Vic2NyaWJlIGl0XG4gKiBgYGBcbiAqIElmIG1lc3NlbmdlciBoYXMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgYXR0YWNoZWQgdG8gaXQsIE1lc3NhZ2VTb3VyY2Ugd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBmaXJzdCBzdWJzY3JpYmVyIGZvciBhIGdpdmVuIG1lc3NhZ2UgaXMgYWRkZWQsIHNvIGl0IGNhbiBzdWJzY3JpYmUgdG8gdGhlIHNvdXJjZS5cbiAqIFtDb21wb25lbnRzXSguLi9jb21wb25lbnRzL2NfY2xhc3MuanMuaHRtbCkgYW5kIFtmYWNldHNdKC4uL2NvbXBvbmVudHMvY19mYWNldC5qcy5odG1sKSBjaGFuZ2UgdGhpcyBtZXRob2QgbmFtZSB0byBgb25gIHdoZW4gdGhleSBwcm94eSBpdC5cbiAqIFNlZSBbcG9zdE1lc3NhZ2VdKCNwb3N0TWVzc2FnZSkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlbU3RyaW5nXXxSZWdFeHB9IG1lc3NhZ2VzIE1lc3NhZ2UgdHlwZXMgdGhhdCBzaG91bGQgZW52b2tlIHRoZSBzdWJzY3JpYmVyLlxuICogIElmIHN0cmluZyBpcyBwYXNzZWQsIGl0IGNhbiBiZSBhIHNpZ2xlIG1lc3NhZ2Ugb3IgbXVsdGlwbGUgbWVzc2FnZSB0eXBlcyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB3aXRoIG9wdGlvbmFsIGNvbW1hcy5cbiAqICBJZiBhbiBhcnJheSBvZiBzdHJpbmdzIGlzIHBhc3NlZCwgZWFjaCBzdHJpbmcgaXMgYSBtZXNzYWdlIHR5cGUgdG8gc3Vic2NyaWJlIGZvci5cbiAqICBJZiBhIFJlZ0V4cCBpcyBwYXNzZWQsIHRoZSBzdWJzY3JpYmVyIHdpbGwgYmUgZW52b2tlZCB3aGVuIHRoZSBtZXNzYWdlIGRpc3BhdGNoZWQgb24gdGhlIG1lc3NlbmdlciBtYXRjaGVzIHRoZSBwYXR0ZXJuIChvciBJUyB0aGUgUmVnRXhwIHdpdGggaWRlbnRpY2FsIHBhdHRlcm4pLlxuICogIFBhdHRlcm4gc3Vic2NyaWJlciBkb2VzIE5PVCBjYXVzZSBhbnkgc3Vic2NyaXB0aW9uIHRvIE1lc3NhZ2VTb3VyY2UsIGl0IG9ubHkgY2FwdHVyZXMgbWVzc2FnZXMgdGhhdCBhcmUgYWxyZWFkeSBzdWJzY3JpYmVkIHRvIHdpdGggcHJlY2lzZSBtZXNzYWdlIHR5cGVzLlxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IHN1YnNjcmliZXIgTWVzc2FnZSBzdWJzY3JpYmVyIC0gYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZCBvbiB0aGUgbWVzc2VuZ2VyICh1c3VhbGx5IHZpYSBwcm94aWVkIHBvc3RNZXNzYWdlIG1ldGhvZCBvZiBob3N0IG9iamVjdCkuXG4gKiAgSWYgaG9zdE9iamVjdCB3YXMgc3VwcGxpZWQgdG8gTWVzc2VuZ2VyIGNvbnN0cnVjdG9yLCBob3N0T2JqZWN0IHdpbGwgYmUgdGhlIGNvbnRleHQgKHRoZSB2YWx1ZSBvZiB0aGlzKSBmb3IgdGhlIHN1YnNjcmliZXIgZW52b2NhdGlvbi5cbiAqICBTdWJzY3JpYmVyIGNhbiBhbHNvIGJlIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgYHN1YnNjcmliZXJgIChmdW5jdGlvbikgYW5kIGBjb250ZXh0YCAoXCJ0aGlzXCIgdmFsdWUgd2hlbiBzdWJzY3JpYmVyIGlzIGNhbGxlZClcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRvbihtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG59XG5cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uY2UobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICByZXR1cm4gX01lc3Nlbmdlcl9vbldpdGhPcHRpb25zLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIsIHsgZGlzcGF0Y2hUaW1lczogMSB9KTtcbn1cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uY2VTeW5jKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucy5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyLCB7IGRpc3BhdGNoVGltZXM6IDEsIHN5bmM6IHRydWUgfSk7XG59XG5cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uU3luYyhtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlciwgeyBzeW5jOiB0cnVlIH0pO1xufVxuXG5cbmZ1bmN0aW9uIE1lc3NlbmdlciRvbkFzeW5jKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucy5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyLCB7IHN5bmM6IGZhbHNlIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucyhtZXNzYWdlcywgc3Vic2NyaWJlciwgb3B0aW9ucykge1xuICAgIGNoZWNrKG1lc3NhZ2VzLCBNYXRjaC5PbmVPZihTdHJpbmcsIFtTdHJpbmddLCBSZWdFeHApKTtcbiAgICBjaGVjayhzdWJzY3JpYmVyLCBNYXRjaC5PbmVPZihGdW5jdGlvbiwge1xuICAgICAgICBzdWJzY3JpYmVyOiBGdW5jdGlvbixcbiAgICAgICAgY29udGV4dDogTWF0Y2guQW55LFxuICAgICAgICBvcHRpb25zOiBNYXRjaC5PcHRpb25hbChPYmplY3QpLFxuICAgIH0pKTtcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHN1YnNjcmliZXIgPSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyLFxuICAgICAgICAgICAgY29udGV4dDogdGhpcy5faG9zdE9iamVjdCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgICBzdWJzY3JpYmVyLm9wdGlvbnMgPSBzdWJzY3JpYmVyLm9wdGlvbnMgfHwge307XG4gICAgICAgIF8uZXh0ZW5kKHN1YnNjcmliZXIub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb24uY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG59XG5cblxuZnVuY3Rpb24gX01lc3Nlbmdlcl9vbihtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIF8uZGVmaW5lUHJvcGVydHkoc3Vic2NyaWJlciwgJ19fbWVzc2FnZXMnLCBtZXNzYWdlcyk7XG4gICAgcmV0dXJuIF9lYWNoTWVzc2FnZS5jYWxsKHRoaXMsICdfcmVnaXN0ZXJTdWJzY3JpYmVyJywgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9lYWNoTWVzc2FnZShtZXRob2ROYW1lLCBtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZXMgPT0gJ3N0cmluZycpXG4gICAgICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMuc3BsaXQobWVzc2FnZXNTcGxpdFJlZ0V4cCk7XG5cbiAgICB2YXIgc3Vic2NyaWJlcnNIYXNoID0gdGhpcy5fY2hvb3NlU3Vic2NyaWJlcnNIYXNoKG1lc3NhZ2VzKTtcblxuICAgIGlmIChtZXNzYWdlcyBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAgICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0oc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG5cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHZhciBzdWJzY3JpcHRpb25DaGFuZ2VkID0gdGhpc1ttZXRob2ROYW1lXShzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UsIHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgc3Vic2NyaXB0aW9uQ2hhbmdlZDtcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogSXQgaXMgY2FsbGVkIGJ5IFtvbl0oI01lc3NlbmdlciRvbikgdG8gcmVnaXN0ZXIgc3Vic2NyaWJlciBmb3Igb25lIG1lc3NhZ2UgdHlwZS5cbiAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3Vic2NyaWJlciBpcyBub3QgeWV0IHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSBvZiBtZXNzYWdlLlxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGZpcnN0IHN1YnNjcmliZXIgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBpcyBhZGRlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29uXSgjTWVzc2VuZ2VyJG9uKSBiYXNlZCBvbiBNZXNzYWdlIHR5cGUsIGNhbiBiZSBgdGhpcy5fcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVyc2Agb3IgYHRoaXMuX21lc3NhZ2VTdWJzY3JpYmVyc2BcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2UgdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IHN1YnNjcmliZXIgU3Vic2NyaWJlciBmdW5jdGlvbiB0byBiZSBhZGRlZCBvciBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGBzdWJzY3JpYmVyYCAoZnVuY3Rpb24pIGFuZCBgY29udGV4dGAgKHZhbHVlIG9mIFwidGhpc1wiIHdoZW4gc3Vic2NyaWJlciBpcyBjYWxsZWQpXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBfcmVnaXN0ZXJTdWJzY3JpYmVyKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSwgc3Vic2NyaWJlcikge1xuICAgIGlmICghIChzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV0gJiYgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdLmxlbmd0aCkpIHtcbiAgICAgICAgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdID0gW107XG4gICAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgICAgICAgICAgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdLnBhdHRlcm4gPSBtZXNzYWdlO1xuICAgICAgICBpZiAodGhpcy5fbWVzc2FnZVNvdXJjZSlcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTb3VyY2Uub25TdWJzY3JpYmVyQWRkZWQobWVzc2FnZSk7XG4gICAgICAgIHZhciBub1N1YnNjcmliZXJzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbXNnU3Vic2NyaWJlcnMgPSBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV07XG4gICAgdmFyIG5vdFlldFJlZ2lzdGVyZWQgPSBub1N1YnNjcmliZXJzIHx8IF9pbmRleE9mU3Vic2NyaWJlci5jYWxsKHRoaXMsIG1zZ1N1YnNjcmliZXJzLCBzdWJzY3JpYmVyKSA9PSAtMTtcblxuICAgIGlmIChub3RZZXRSZWdpc3RlcmVkKVxuICAgICAgICBtc2dTdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpO1xuXG4gICAgcmV0dXJuIG5vdFlldFJlZ2lzdGVyZWQ7XG59XG5cblxuLyoqXG4gKiBGaW5kcyBzdWJzY3JpYmVyIGluZGV4IGluIHRoZSBsaXN0XG4gKlxuICogQHBhcmFtIHtBcnJheVtGdW5jdGlvbnxPYmplY3RdfSBsaXN0IGxpc3Qgb2Ygc3Vic2NyaWJlcnNcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBzdWJzY3JpYmVyIHN1YnNjcmliZXIgZnVuY3Rpb24gb3Igb2JqZWN0IHdpdGggcHJvcGVydGllcyBgc3Vic2NyaWJlcmAgKGZ1bmN0aW9uKSBhbmQgYGNvbnRleHRgIChcInRoaXNcIiBvYmplY3QpXG4gKi9cbmZ1bmN0aW9uIF9pbmRleE9mU3Vic2NyaWJlcihsaXN0LCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBfLmZpbmRJbmRleChsaXN0LCBmdW5jdGlvbihzdWJzY3Ipe1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVyID09IHN1YnNjci5zdWJzY3JpYmVyXG4gICAgICAgICAgICAgICAgJiYgc3Vic2NyaWJlci5jb250ZXh0ID09IHN1YnNjci5jb250ZXh0XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogU3Vic2NyaWJlcyB0byBtdWx0aXBsZSBtZXNzYWdlcyBwYXNzZWQgYXMgbWFwIHRvZ2V0aGVyIHdpdGggc3Vic2NyaWJlcnMuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogbXlDb21wLmV2ZW50cy5vbk1lc3NhZ2VzKHtcbiAqICAgICAnbW91c2Vkb3duJzogb25Nb3VzZURvd24sXG4gKiAgICAgJ21vdXNldXAnOiBvbk1vdXNlVXBcbiAqIH0pO1xuICogZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnRUeXBlLCBldmVudCkge31cbiAqIGZ1bmN0aW9uIG9uTW91c2VVcChldmVudFR5cGUsIGV2ZW50KSB7fVxuICogYGBgXG4gKiBSZXR1cm5zIG1hcCB3aXRoIHRoZSBzYW1lIGtleXMgKG1lc3NhZ2UgdHlwZXMpIGFuZCBib29sZWFuIHZhbHVlcyBpbmRpY2F0aW5nIHdoZXRoZXIgcGFydGljdWxhciBzdWJzY3JpYmVyIHdhcyBhZGRlZC5cbiAqIEl0IGlzIE5PVCBwb3NzaWJsZSB0byBhZGQgcGF0dGVybiBzdWJzY3JpYmVyIHVzaW5nIHRoaXMgbWV0aG9kLCBhcyBhbHRob3VnaCB5b3UgY2FuIHVzZSBSZWdFeHAgYXMgdGhlIGtleSwgSmF2YVNjcmlwdCB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCBpdCB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtPYmplY3RbRnVuY3Rpb25dfSBtZXNzYWdlU3Vic2NyaWJlcnMgTWFwIG9mIG1lc3NhZ2Ugc3Vic2NyaWJlcnMgdG8gYmUgYWRkZWRcbiAqIEByZXR1cm4ge09iamVjdFtCb29sZWFuXX1cbiAqL1xuZnVuY3Rpb24gb25NZXNzYWdlcyhtZXNzYWdlU3Vic2NyaWJlcnMpIHtcbiAgICBjaGVjayhtZXNzYWdlU3Vic2NyaWJlcnMsIE1hdGNoLk9iamVjdEhhc2goTWF0Y2guT25lT2YoRnVuY3Rpb24sIHsgc3Vic2NyaWJlcjogRnVuY3Rpb24sIGNvbnRleHQ6IE1hdGNoLkFueSB9KSkpO1xuXG4gICAgdmFyIG5vdFlldFJlZ2lzdGVyZWRNYXAgPSBfLm1hcEtleXMobWVzc2FnZVN1YnNjcmliZXJzLCBmdW5jdGlvbihzdWJzY3JpYmVyLCBtZXNzYWdlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5vbihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbm90WWV0UmVnaXN0ZXJlZE1hcDtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBSZW1vdmVzIGEgc3Vic2NyaWJlciBmb3IgbWVzc2FnZShzKS4gUmVtb3ZlcyBhbGwgc3Vic2NyaWJlcnMgZm9yIHRoZSBtZXNzYWdlIGlmIHN1YnNjcmliZXIgaXNuJ3QgcGFzc2VkLlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN1YnNjcmliZXIgd2FzIHJlZ2lzdGVyZWQuIE5vIGVycm9yIG9yIHdhcm5pbmcgaXMgdGhyb3duIG9yIGxvZ2dlZCBpZiB5b3UgcmVtb3ZlIHN1YnNjcmliZXIgdGhhdCB3YXMgbm90IHJlZ2lzdGVyZWQuXG4gKiBbQ29tcG9uZW50c10oLi4vY29tcG9uZW50cy9jX2NsYXNzLmpzLmh0bWwpIGFuZCBbZmFjZXRzXSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgY2hhbmdlIHRoaXMgbWV0aG9kIG5hbWUgdG8gYG9mZmAgd2hlbiB0aGV5IHByb3h5IGl0LlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIC8vIHVuc3Vic2NyaWJlcyBvbk1vdXNlVXBEb3duIGZyb20gdHdvIERPTSBldmVudHMuXG4gKiBteUNvbXAuZXZlbnRzLm9mZignbW91c2Vkb3duIG1vdXNldXAnLCBvbk1vdXNlVXBEb3duKTtcbiAqIGBgYFxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYSBnaXZlbiBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRoZXJlIGlzIG5vIG1vcmUgc3Vic2NyaWJlcnMgZm9yIHRoaXMgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheVtTdHJpbmddfFJlZ0V4cH0gbWVzc2FnZXMgTWVzc2FnZSB0eXBlcyB0aGF0IGEgc3Vic2NyaWJlciBzaG91bGQgYmUgcmVtb3ZlZCBmb3IuXG4gKiAgSWYgc3RyaW5nIGlzIHBhc3NlZCwgaXQgY2FuIGJlIGEgc2lnbGUgbWVzc2FnZSBvciBtdWx0aXBsZSBtZXNzYWdlIHR5cGVzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHdpdGggb3B0aW9uYWwgY29tbWFzLlxuICogIElmIGFuIGFycmF5IG9mIHN0cmluZ3MgaXMgcGFzc2VkLCBlYWNoIHN0cmluZyBpcyBhIG1lc3NhZ2UgdHlwZSB0byByZW1vdmUgYSBzdWJzY3JpYmVyIGZvci5cbiAqICBJZiBhIFJlZ0V4cCBpcyBwYXNzZWQsIHRoZSBwYXR0ZXJuIHN1YnNjcmliZXIgd2lsbCBiZSByZW1vdmVkLlxuICogIFJlZ0V4cCBzdWJzY3JpYmVyIGRvZXMgTk9UIGNhdXNlIGFueSBzdWJzY3JpcHRpb24gdG8gTWVzc2FnZVNvdXJjZSwgaXQgb25seSBjYXB0dXJlcyBtZXNzYWdlcyB0aGF0IGFyZSBhbHJlYWR5IHN1YnNjcmliZWQgdG8gd2l0aCBwcmVjaXNlIG1lc3NhZ2UgdHlwZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWJzY3JpYmVyIE1lc3NhZ2Ugc3Vic2NyaWJlciAtIE9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2Ygc3Vic2NyaWJlcnMgZm9yIHRoZSBtZXNzYWdlKHMpLiBJZiBzdWJzY3JpYmVyIGlzIG5vdCBzdXBwbGllZCwgYWxsIHN1YnNjcmliZXJzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoaXMgbWVzc2FnZShzKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRvZmYobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICBjaGVjayhtZXNzYWdlcywgTWF0Y2guT25lT2YoU3RyaW5nLCBbU3RyaW5nXSwgUmVnRXhwKSk7XG4gICAgY2hlY2soc3Vic2NyaWJlciwgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoRnVuY3Rpb24sIHtcbiAgICAgICAgc3Vic2NyaWJlcjogRnVuY3Rpb24sXG4gICAgICAgIGNvbnRleHQ6IE1hdGNoLkFueSxcbiAgICAgICAgb3B0aW9uczogTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSxcbiAgICAgICAgLy8gX19tZXNzYWdlczogTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoU3RyaW5nLCBbU3RyaW5nXSwgUmVnRXhwKSlcbiAgICB9KSkpO1xuXG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb2ZmLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9NZXNzZW5nZXJfb2ZmKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9lYWNoTWVzc2FnZS5jYWxsKHRoaXMsICdfcmVtb3ZlU3Vic2NyaWJlcicsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIEl0IGlzIGNhbGxlZCBieSBbb2ZmXSgjTWVzc2VuZ2VyJG9mZikgdG8gcmVtb3ZlIHN1YnNjcmliZXIgZm9yIG9uZSBtZXNzYWdlIHR5cGUuXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHN1YnNjcmliZXIgd2FzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSBvZiBtZXNzYWdlLlxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYSBnaXZlbiBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRoZXJlIGlzIG5vIG1vcmUgc3Vic2NyaWJlcnMgZm9yIHRoaXMgbWVzc2FnZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29mZl0oI01lc3NlbmdlciRvZmYpIGJhc2VkIG9uIG1lc3NhZ2UgdHlwZSwgY2FuIGJlIGB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzYCBvciBgdGhpcy5fbWVzc2FnZVN1YnNjcmliZXJzYFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWJzY3JpYmVyIFN1YnNjcmliZXIgZnVuY3Rpb24gdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gX3JlbW92ZVN1YnNjcmliZXIoc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIG1zZ1N1YnNjcmliZXJzID0gc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdO1xuICAgIGlmICghIG1zZ1N1YnNjcmliZXJzIHx8ICEgbXNnU3Vic2NyaWJlcnMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdGhpbmcgcmVtb3ZlZFxuXG4gICAgaWYgKHN1YnNjcmliZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBzdWJzY3JpYmVyID0geyBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyLCBjb250ZXh0OiB0aGlzLl9ob3N0T2JqZWN0IH07XG5cbiAgICAgICAgdmFyIHN1YnNjcmliZXJJbmRleCA9IF9pbmRleE9mU3Vic2NyaWJlci5jYWxsKHRoaXMsIG1zZ1N1YnNjcmliZXJzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXJJbmRleCA9PSAtMSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90aGluZyByZW1vdmVkXG4gICAgICAgIG1zZ1N1YnNjcmliZXJzLnNwbGljZShzdWJzY3JpYmVySW5kZXgsIDEpO1xuICAgICAgICBpZiAoISBtc2dTdWJzY3JpYmVycy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpO1xuXG4gICAgfSBlbHNlXG4gICAgICAgIHRoaXMuX3JlbW92ZUFsbFN1YnNjcmliZXJzKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gc3Vic2NyaWJlcihzKSByZW1vdmVkXG59XG5cblxuLyoqXG4gKiBcIlByaXZhdGVcIiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBJdCBpcyBjYWxsZWQgYnkgW19yZW1vdmVTdWJzY3JpYmVyXSgjX3JlbW92ZVN1YnNjcmliZXIpIHRvIHJlbW92ZSBhbGwgc3Vic2NyaWJlcnMgZm9yIG9uZSBtZXNzYWdlIHR5cGUuXG4gKiBJZiBtZXNzZW5nZXIgaGFzIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGF0dGFjaGVkIHRvIGl0LCBNZXNzYWdlU291cmNlIHdpbGwgYmUgbm90aWZpZWQgdGhhdCBhbGwgbWVzc2FnZSBzdWJzY3JpYmVycyB3ZXJlIHJlbW92ZWQgc28gaXQgY2FuIHVuc3Vic2NyaWJlIGZyb20gdGhlIHNvdXJjZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29mZl0oI01lc3NlbmdlciRvZmYpIGJhc2VkIG9uIG1lc3NhZ2UgdHlwZSwgY2FuIGJlIGB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzYCBvciBgdGhpcy5fbWVzc2FnZVN1YnNjcmliZXJzYFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0eXBlXG4gKi9cbmZ1bmN0aW9uIF9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpIHtcbiAgICBkZWxldGUgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdO1xuICAgIGlmICh0aGlzLl9tZXNzYWdlU291cmNlICYmIHR5cGVvZiBtZXNzYWdlID09ICdzdHJpbmcnKVxuICAgICAgICB0aGlzLl9tZXNzYWdlU291cmNlLm9uU3Vic2NyaWJlclJlbW92ZWQobWVzc2FnZSk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogVW5zdWJzY3JpYmVzIGZyb20gbXVsdGlwbGUgbWVzc2FnZXMgcGFzc2VkIGFzIG1hcCB0b2dldGhlciB3aXRoIHN1YnNjcmliZXJzLlxuICogUmV0dXJucyBtYXAgd2l0aCB0aGUgc2FtZSBrZXlzIChtZXNzYWdlIHR5cGVzKSBhbmQgYm9vbGVhbiB2YWx1ZXMgaW5kaWNhdGluZyB3aGV0aGVyIHBhcnRpY3VsYXIgc3Vic2NyaWJlciB3YXMgcmVtb3ZlZC5cbiAqIElmIGEgc3Vic2NyaWJlciBmb3Igb25lIG9mIHRoZSBtZXNzYWdlcyBpcyBub3Qgc3VwcGxpZWQsIGFsbCBzdWJzY3JpYmVycyBmb3IgdGhpcyBtZXNzYWdlIHdpbGwgYmUgcmVtb3ZlZC5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiBteUNvbXAuZXZlbnRzLm9mZk1lc3NhZ2VzKHtcbiAqICAgICAnbW91c2Vkb3duJzogb25Nb3VzZURvd24sXG4gKiAgICAgJ21vdXNldXAnOiBvbk1vdXNlVXAsXG4gKiAgICAgJ2NsaWNrJzogdW5kZWZpbmVkIC8vIGFsbCBzdWJzY3JpYmVycyB0byB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSByZW1vdmVkXG4gKiB9KTtcbiAqIGBgYFxuICogSXQgaXMgTk9UIHBvc3NpYmxlIHRvIHJlbW92ZSBwYXR0ZXJuIHN1YnNjcmliZXIocykgdXNpbmcgdGhpcyBtZXRob2QsIGFzIGFsdGhvdWdoIHlvdSBjYW4gdXNlIFJlZ0V4cCBhcyB0aGUga2V5LCBKYXZhU2NyaXB0IHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IGl0IHRvIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdFtGdW5jdGlvbl19IG1lc3NhZ2VTdWJzY3JpYmVycyBNYXAgb2YgbWVzc2FnZSBzdWJzY3JpYmVycyB0byBiZSByZW1vdmVkXG4gKiBAcmV0dXJuIHtPYmplY3RbQm9vbGVhbl19XG4gKi9cbmZ1bmN0aW9uIG9mZk1lc3NhZ2VzKG1lc3NhZ2VTdWJzY3JpYmVycykge1xuICAgIGNoZWNrKG1lc3NhZ2VTdWJzY3JpYmVycywgTWF0Y2guT2JqZWN0SGFzaChNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihGdW5jdGlvbiwgeyBzdWJzY3JpYmVyOiBGdW5jdGlvbiwgY29udGV4dDogTWF0Y2guQW55IH0pKSkpO1xuXG4gICAgdmFyIHN1YnNjcmliZXJSZW1vdmVkTWFwID0gXy5tYXBLZXlzKG1lc3NhZ2VTdWJzY3JpYmVycywgZnVuY3Rpb24oc3Vic2NyaWJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2ZmKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHJldHVybiBzdWJzY3JpYmVyUmVtb3ZlZE1hcDtcbn1cblxuXG4vKipcbiAqIFVuc3Vic2NyaWJlcyBhbGwgc3Vic2NyaWJlcnNcbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyJG9mZkFsbCgpIHtcbiAgICBfb2ZmQWxsU3Vic2NyaWJlcnMuY2FsbCh0aGlzLCB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzKTtcbiAgICBfb2ZmQWxsU3Vic2NyaWJlcnMuY2FsbCh0aGlzLCB0aGlzLl9tZXNzYWdlU3Vic2NyaWJlcnMpO1xufVxuXG5cbmZ1bmN0aW9uIF9vZmZBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gpIHtcbiAgICBfLmVhY2hLZXkoc3Vic2NyaWJlcnNIYXNoLCBmdW5jdGlvbihzdWJzY3JpYmVycywgbWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpO1xuICAgIH0sIHRoaXMpO1xufVxuXG5cbi8vIFRPRE8gLSBzZW5kIGV2ZW50IHRvIG1lc3NhZ2VTb3VyY2VcblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBEaXNwYXRjaGVzIHRoZSBtZXNzYWdlIGNhbGxpbmcgYWxsIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbWVzc2FnZSBhbmQsIGlmIHRoZSBtZXNzYWdlIGlzIGEgc3RyaW5nLCBjYWxsaW5nIGFsbCBwYXR0ZXJuIHN1YnNjcmliZXJzIHdoZW4gbWVzc2FnZSBtYXRjaGVzIHRoZSBwYXR0ZXJuLlxuICogRWFjaCBzdWJzY3JpYmVyIGlzIHBhc3NlZCB0aGUgc2FtZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGVpcyBtZXRob2QuXG4gKiBUaGUgY29udGV4dCBvZiB0aGUgc3Vic2NyaWJlciBlbnZvY2F0aW9uIGlzIHNldCB0byB0aGUgaG9zdCBvYmplY3QgKGB0aGlzLl9ob3N0T2JqZWN0YCkgdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSBtZXNzZW5nZXIgY29uc3RydWN0b3IuXG4gKiBTdWJzY3JpYmVycyBhcmUgY2FsbGVkIGluIHRoZSBuZXh0IHRpY2sgKFwiYXN5bmNocm9ub3VzbHlcIikgYXBhcnQgZnJvbSB0aG9zZSB0aGF0IHdlcmUgc3Vic2NyaWJlZCB3aXRoIGBvblN5bmNgIChvciB0aGF0IGhhdmUgYG9wdGlvbnMuc3luYyA9PSB0cnVlYCkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGF0Y2hlZFxuICogIElmIHRoZSBtZXNzYWdlIGlzIGEgc3RyaW5nLCB0aGUgc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIGV4YWN0bHkgdGhpcyBtZXNzYWdlIHdpbGwgYmUgY2FsbGVkIGFuZCBhbHNvIHBhdHRlcm4gc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgZGlzcGF0Y2hlZCBtZXNzYWdlLlxuICogIElmIHRoZSBtZXNzYWdlIGlzIFJlZ0V4cCwgb25seSB0aGUgc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIGV4YWN0bHkgdGhpcyBwYXR0ZXJuIHdpbGwgYmUgY2FsbGVkLlxuICogQHBhcmFtIHtBbnl9IGRhdGEgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzdWJzY3JpYmVyIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBNZXNzZW5nZXIgZG9lcyBub3QgbW9kaWZ5IHRoaXMgZGF0YSBpbiBhbnkgd2F5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2sgdG8gcGFzcyB0byBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IF9zeW5jaHJvbm91cyBpZiB0cnVlIHBhc3NlZCwgc3Vic2NyaWJlcnMgd2lsbCBiZSBlbnZva2VkIHN5bmNocm9ub3VzbHkgYXBhcnQgZnJvbSB0aG9zZSB0aGF0IGhhdmUgYG9wdGlvbnMuc3luYyA9PSBmYWxzZWAuIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgdXNlZCwgaW5zdGVhZCBwb3N0TWVzc2FnZVN5bmMgc2hvdWxkIGJlIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBfc3luY2hyb25vdXMpIHtcbiAgICBjaGVjayhtZXNzYWdlLCBNYXRjaC5PbmVPZihTdHJpbmcsIFJlZ0V4cCkpO1xuICAgIGNoZWNrKGNhbGxiYWNrLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuXG4gICAgdmFyIHN1YnNjcmliZXJzSGFzaCA9IHRoaXMuX2Nob29zZVN1YnNjcmliZXJzSGFzaChtZXNzYWdlKTtcbiAgICB2YXIgbXNnU3Vic2NyaWJlcnMgPSBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV07XG5cbiAgICB0aGlzLl9jYWxsU3Vic2NyaWJlcnMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIG1zZ1N1YnNjcmliZXJzLCBfc3luY2hyb25vdXMpO1xuXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09ICdzdHJpbmcnKVxuICAgICAgICB0aGlzLl9jYWxsUGF0dGVyblN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBtc2dTdWJzY3JpYmVycywgX3N5bmNocm9ub3VzKTtcbn1cblxuXG4vKipcbiAqIFNhbWUgYXMgcG9zdE1lc3NhZ2UgYXBhcnQgZnJvbSBlbnZva2luZyBzdWJzY3JpYmVycyBzeW5jaHJvbm91c2x5LCBhcGFydCBmcm9tIHRob3NlIHN1YnNjcmliZWQgd2l0aCBgb25Bc3luY2AgKG9yIHdpdGggYG9wdGlvbnMuc3luYyA9PSBmYWxzZWApLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbWVzc2FnZVxuICogQHBhcmFtIHtBbnl9IGRhdGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIHRydWUpO1xufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogRW52b2tlcyBwYXR0ZXJuIHN1YnNjcmliZXJzIHdpdGggdGhlIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZSBtZXNzYWdlLlxuICogVGhlIG1ldGhvZCBpcyBjYWxsZWQgYnkgW3Bvc3RNZXNzYWdlXSgjcG9zdE1lc3NhZ2UpIC0gc2VlIG1vcmUgaW5mb3JtYXRpb24gdGhlcmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGF0Y2hlZC4gUGF0dGVybiBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggdGhlIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZSBkaXNwYXRjaGVkIG1lc3NhZ2Ugd2lsbCBiZSBjYWxsZWQuXG4gKiBAcGFyYW0ge0FueX0gZGF0YSBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHN1YnNjcmliZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuIE1lc3NlbmdlciBkb2VzIG5vdCBtb2RpZnkgdGhpcyBkYXRhIGluIGFueSB3YXkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBvcHRpb25hbCBjYWxsYmFjayB0byBwYXNzIHRvIHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7QXJyYXlbRnVuY3Rpb258T2JqZWN0XX0gY2FsbGVkTXNnU3Vic2NyaWJlcnMgYXJyYXkgb2Ygc3Vic2NyaWJlcnMgYWxyZWFkeSBjYWxsZWQsIHRoZXkgd29uJ3QgYmUgY2FsbGVkIGFnYWluIGlmIHRoZXkgYXJlIGFtb25nIHBhdHRlcm4gc3Vic2NyaWJlcnMuXG4gKi9cbmZ1bmN0aW9uIF9jYWxsUGF0dGVyblN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBjYWxsZWRNc2dTdWJzY3JpYmVycywgX3N5bmNocm9ub3VzKSB7XG4gICAgXy5lYWNoS2V5KHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnMsXG4gICAgICAgIGZ1bmN0aW9uKHBhdHRlcm5TdWJzY3JpYmVycykge1xuICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSBwYXR0ZXJuU3Vic2NyaWJlcnMucGF0dGVybjtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuLnRlc3QobWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGVkTXNnU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdHRlcm5TdWJzY3JpYmVycyA9IHBhdHRlcm5TdWJzY3JpYmVycy5maWx0ZXIoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gX2luZGV4T2ZTdWJzY3JpYmVyLmNhbGwodGhpcywgY2FsbGVkTXNnU3Vic2NyaWJlcnMsIHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09IC0xO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbFN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBwYXR0ZXJuU3Vic2NyaWJlcnMsIF9zeW5jaHJvbm91cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogRW52b2tlcyBzdWJzY3JpYmVycyBmcm9tIHRoZSBwYXNzZWQgbGlzdC5cbiAqIFRoZSBtZXRob2QgaXMgY2FsbGVkIGJ5IFtwb3N0TWVzc2FnZV0oI3Bvc3RNZXNzYWdlKSBhbmQgW19jYWxsUGF0dGVyblN1YnNjcmliZXJzXSgjX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnMpLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBtZXNzYWdlIHRvIGJlIGRpc3BhdGNoZWQsIHBhc3NlZCB0byBzdWJzY3JpYmVycyBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtBbnl9IGRhdGEgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzdWJzY3JpYmVyIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBNZXNzZW5nZXIgZG9lcyBub3QgbW9kaWZ5IHRoaXMgZGF0YSBpbiBhbnkgd2F5LlxuICogQHBhcmFtIHtBcnJheVtGdW5jdGlvbnxPYmplY3RdfSBtc2dTdWJzY3JpYmVycyB0aGUgYXJyYXkgb2YgbWVzc2FnZSBzdWJzY3JpYmVycyB0byBiZSBjYWxsZWQuIEVhY2ggc3Vic2NyaWJlciBpcyBjYWxsZWQgd2l0aCB0aGUgaG9zdCBvYmplY3QgKHNlZSBNZXNzZW5nZXIgY29uc3RydWN0b3IpIGFzIHRoZSBjb250ZXh0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2sgdG8gcGFzcyB0byBzdWJzY3JpYmVyXG4gKi9cbmZ1bmN0aW9uIF9jYWxsU3Vic2NyaWJlcnMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIG1zZ1N1YnNjcmliZXJzLCBfc3luY2hyb25vdXMpIHtcbiAgICBpZiAobXNnU3Vic2NyaWJlcnMgJiYgbXNnU3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIGNsb25pbmcgaXMgbmVjZXNzYXJ5IGFzIHNvbWUgb2YgdGhlIHN1YnNjcmliZXJzXG4gICAgICAgIC8vIGNhbiBiZSB1bnN1YnNjcmliZWQgZHVyaW5nIHRoZSBkaXNwYXRjaFxuICAgICAgICAvLyBzbyB0aGlzIGFycmF5IHdvdWxkIGNoYW5nZSBpbiB0aGUgcHJvY2Vzc1xuICAgICAgICBtc2dTdWJzY3JpYmVycyA9IG1zZ1N1YnNjcmliZXJzLnNsaWNlKCk7XG5cbiAgICAgICAgbXNnU3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxsU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgX3N5bmNocm9ub3VzKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9jYWxsU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgX3N5bmNocm9ub3VzKSB7XG4gICAgdmFyIHN5bmNTdWJzY3JpYmVyID0gc3Vic2NyaWJlci5vcHRpb25zICYmIHN1YnNjcmliZXIub3B0aW9ucy5zeW5jXG4gICAgICAgICwgc3luY2hybyA9IChfc3luY2hyb25vdXMgJiYgc3luY1N1YnNjcmliZXIgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgfHwgc3luY1N1YnNjcmliZXI7XG5cbiAgICB2YXIgZGlzcGF0Y2hUaW1lcyA9IHN1YnNjcmliZXIub3B0aW9ucyAmJiBzdWJzY3JpYmVyLm9wdGlvbnMuZGlzcGF0Y2hUaW1lcztcbiAgICBpZiAoZGlzcGF0Y2hUaW1lcykge1xuICAgICAgICBpZiAoZGlzcGF0Y2hUaW1lcyA8PSAxKSB7XG4gICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBzdWJzY3JpYmVyLl9fbWVzc2FnZXM7XG4gICAgICAgICAgICB0aGlzLm9mZihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzcGF0Y2hUaW1lcyA+IDEpXG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9wdGlvbnMuZGlzcGF0Y2hUaW1lcy0tO1xuICAgIH1cblxuICAgIGlmIChzeW5jaHJvKVxuICAgICAgICBzdWJzY3JpYmVyLnN1YnNjcmliZXIuY2FsbChzdWJzY3JpYmVyLmNvbnRleHQsIG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZGVmZXJNZXRob2Qoc3Vic2NyaWJlci5zdWJzY3JpYmVyLCAnY2FsbCcsIHN1YnNjcmliZXIuY29udGV4dCwgbWVzc2FnZSwgZGF0YSwgY2FsbGJhY2spO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZC5cbiAqIFJldHVybnMgdGhlIGFycmF5IG9mIHN1YnNjcmliZXJzIHRoYXQgd291bGQgYmUgY2FsbGVkIGlmIHRoZSBtZXNzYWdlIHdlcmUgZGlzcGF0Y2hlZC5cbiAqIElmIGBpbmNsdWRlUGF0dGVyblN1YnNjcmliZXJzID09PSBmYWxzZWAsIHBhdHRlcm4gc3Vic2NyaWJlcnMgd2l0aCBtYXRjaGluZyBwYXR0ZXJzIHdpbGwgbm90IGJlIGluY2x1ZGVkIChieSBkZWZhdWx0IHRoZXkgYXJlIGluY2x1ZGVkKS5cbiAqIElmIHRoZXJlIGFyZSBubyBzdWJzY3JpYmVycyB0byB0aGUgbWVzc2FnZSwgYHVuZGVmaW5lZGAgd2lsbCBiZSByZXR1cm5lZCwgbm90IGFuIGVtcHR5IGFycmF5LCBzbyBpdCBpcyBzYWZlIHRvIHVzZSB0aGUgcmVzdWx0IGluIGJvb2xlYW4gdGVzdHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtZXNzYWdlIE1lc3NhZ2UgdG8gZ2V0IHN1YnNjcmliZXJzIGZvci5cbiAqICBJZiB0aGUgbWVzc2FnZSBpcyBSZWdFeHAsIG9ubHkgcGF0dGVybiBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggZXhhY3RseSB0aGlzIHBhdHRlcm4gd2lsbCBiZSByZXR1cm5lZC5cbiAqICBJZiB0aGUgbWVzc2FnZSBpcyBTdHJpbmcsIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3RyaW5nIG1lc3NhZ2VzIGFuZCBwYXR0ZXJuIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCBtYXRjaGluZyBwYXR0ZXJuIHdpbGwgYmUgcmV0dXJuZWQgKHVubGVzcyB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBmYWxzZSkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVQYXR0ZXJuU3Vic2NyaWJlcnMgT3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBpbmNsdXNpb24gb2YgcGF0dGVyIHN1YnNjcmliZXJzLCBieSBkZWZhdWx0IHRoZXkgYXJlIGluY2x1ZGVkLlxuICogQHJldHVybiB7QXJyYXl8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRTdWJzY3JpYmVycyhtZXNzYWdlLCBpbmNsdWRlUGF0dGVyblN1YnNjcmliZXJzKSB7XG4gICAgY2hlY2sobWVzc2FnZSwgTWF0Y2guT25lT2YoU3RyaW5nLCBSZWdFeHApKTtcblxuICAgIHZhciBzdWJzY3JpYmVyc0hhc2ggPSB0aGlzLl9jaG9vc2VTdWJzY3JpYmVyc0hhc2gobWVzc2FnZSk7XG4gICAgdmFyIG1zZ1N1YnNjcmliZXJzID0gc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbXS5jb25jYXQoc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG5cbiAgICAvLyBwYXR0ZXJuIHN1YnNjcmliZXJzIGFyZSBpbmN1ZGVkIGJ5IGRlZmF1bHRcbiAgICBpZiAoaW5jbHVkZVBhdHRlcm5TdWJzY3JpYmVycyAhPT0gZmFsc2UgJiYgdHlwZW9mIG1lc3NhZ2UgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgXy5lYWNoS2V5KHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnMsXG4gICAgICAgICAgICBmdW5jdGlvbihwYXR0ZXJuU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGF0dGVybiA9IHBhdHRlcm5TdWJzY3JpYmVycy5wYXR0ZXJuO1xuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuU3Vic2NyaWJlcnMgJiYgcGF0dGVyblN1YnNjcmliZXJzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGF0dGVybi50ZXN0KG1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICBfLmFwcGVuZEFycmF5KG1zZ1N1YnNjcmliZXJzLCBwYXR0ZXJuU3Vic2NyaWJlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIHN1YnNjcmliZXJzXG4gICAgcmV0dXJuIG1zZ1N1YnNjcmliZXJzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gbXNnU3Vic2NyaWJlcnNcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIG1hcCBvZiBzdWJzY3JpYmVycyBmb3IgYSBnaXZlbiBtZXNzYWdlIHR5cGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbWVzc2FnZSBNZXNzYWdlIHRvIGNob29zZSB0aGUgbWFwIG9mIHN1YnNjcmliZXJzIGZvclxuICogQHJldHVybiB7T2JqZWN0W0Z1bmN0aW9uXX1cbiAqL1xuZnVuY3Rpb24gX2Nob29zZVN1YnNjcmliZXJzSGFzaChtZXNzYWdlKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UgaW5zdGFuY2VvZiBSZWdFeHBcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnNcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21lc3NhZ2VTdWJzY3JpYmVycztcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgZm9yIHRoZSBtZXNzZW5nZXIgYWxzbyBzZXR0aW5nIHRoZSByZWZlcmVuY2UgdG8gdGhlIG1lc3NlbmdlciBpbiB0aGUgTWVzc2FnZVNvdXJjZS5cbiAqIE1lc3NhZ2VTb3VyY2UgY2FuIGJlIHBhc3NlZCB0byBtZXNzYWdlIGNvbnN0cnVjdG9yOyB0aGlzIG1ldGhvZCBhbGxvd3MgdG8gc2V0IGl0IGF0IGEgbGF0ZXIgdGltZS4gRm9yIGV4YW1wbGUsIHRoZSBzdWJjbGFzc2VzIG9mIFtDb21wb25lbnRGYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0LmpzLmh0bWwpIHVzZSB0aGlzIG1ldGhvZCB0byBzZXQgZGlmZmVyZW50IE1lc3NhZ2VTb3VyY2UnZXMgaW4gdGhlIG1lc3NlbmdlciB0aGF0IGlzIGNyZWF0ZWQgYnkgQ29tcG9uZW50RmFjZXQuXG4gKiBDdXJyZW50bHkgdGhlIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiBzdWNoIHdheSB0aGF0IGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIC0gTWVzc2FnZVNvdXJjZSBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHtNZXNzYWdlU291cmNlfSBtZXNzYWdlU291cmNlIGFuIGluc3RhbmNlIG9mIE1lc3NhZ2VTb3VyY2UgY2xhc3MgdG8gYXR0YWNoIHRvIHRoaXMgbWVzc2VuZ2VyIChhbmQgdG8gaGF2ZSB0aGlzIG1lc3NlbmdlciBhdHRhY2hlZCB0byBpdCB0b28pXG4gKi9cbmZ1bmN0aW9uIF9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpIHtcbiAgICBjaGVjayhtZXNzYWdlU291cmNlLCBNZXNzYWdlU291cmNlKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19tZXNzYWdlU291cmNlJywgbWVzc2FnZVNvdXJjZSk7XG4gICAgbWVzc2FnZVNvdXJjZS5tZXNzZW5nZXIgPSB0aGlzO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBtZXNzZW5nZXIgTWVzc2FnZVNvdXJjZVxuICpcbiAqIEByZXR1cm4ge01lc3NhZ2VTb3VyY2V9XG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VTb3VyY2Vcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1lc3NlbmdlckFQSTtcblxuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWVzc2VuZ2VyQVBJYFxuICogQmFzZSBjbGFzcywgc3ViY2xhc3NlcyBvZiB3aGljaCBjYW4gc3VwcGxlbWVudCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBieSBpbXBsZW1lbnRpbmcgdGhyZWUgbWV0aG9kczpcbiAqXG4gKiAtIGB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2VgIHRvIHRyYW5zbGF0ZSBzb3VyY2UgbWVzc2FnZXMgKHJlY2lldmVkIGZyb20gZXh0ZXJuYWwgc291cmNlIHZpYSBgTWVzc2FnZVNPdXJjZWApIHRvIGludGVybmFsIG1lc3NhZ2VzICh0aGF0IGFyZSBkaXNwYXRjaGVkIG9uIE1lc3NlbmdlciksIGFsbG93aW5nIHRvIG1ha2UgaW50ZXJuYWwgbWVzc2FnZXMgbW9yZSBkZXRhaWxlZCB0aGFuIHNvdXJjZSBtZXNzYWdlcy4gRm9yIGV4YW1wbGUsIFtEYXRhIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgdXNlcyBbRGF0YU1zZ0FQSV0oLi4vY29tcG9uZW50cy9tc2dfYXBpL2RhdGEuanMuaHRtbCkgdG8gZGVmaW5lIHNldmVyYWwgaW50ZXJuYWwgbWVzc2FnZXMgcmVsYXRlZCB0byB0aGUgY2hhbmdlIG9mIHN0YXRlIGluIGNvbnRlbnRlZGl0YWJsZSBET00gZWxlbWVudC5cbiAqIC0gYGNyZWF0ZUludGVybmFsRGF0YWAgdG8gbW9kaWZ5IG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHNvdXJjZSB0byBzb21lIG1vcmUgbWVhbmluZ2Z1bCBvciBtb3JlIGRldGFpbGVkIG1lc3NhZ2UgZGF0YSB0aGF0IHdpbGwgYmUgZGlzcGF0Y2hlZCBvbiBNZXNzZW5nZXIuIEZvciBleGFtcGxlLCBbRGF0YSBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzLmh0bWwpIHVzZXMgW0RhdGFNc2dBUEldKC4uL2NvbXBvbmVudHMvbXNnX2FwaS9kYXRhLmpzLmh0bWwpIChzdWJjbGFzcyBvZiBNZXNzZW5nZXJBUEkpIHRvIHRyYW5zbGF0ZSBET00gbWVzc2FnZXMgdG8gZGF0YSBjaGFuZ2UgbWVzc2FnZXMuXG4gKiAtIGBmaWx0ZXJTb3VyY2VNZXNzYWdlYCB0byBlbmFibGUvZGlzYWJsZSBtZXNzYWdlIGRpc3BhdGNoIGJhc2VkIG9uIHNvbWUgY29uZGl0aW9ucyBpbiBkYXRhLlxuICpcbiAqIElmIGBNZXNzYWdlU291cmNlYCBjb25zdHJ1Y3RvciBpcyBub3QgcGFzc2VkIGFuIGluc3RhbmNlIG9mIHNvbWUgc3ViY2xhc3Mgb2YgYE1lc3NlbmdlckFQSWAsIGl0IGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBNZXNzZW5nZXJBUEkgdGhhdCBkZWZpbmVzIGFsbCAzIG9mIHRob3NlIG1ldGhvZHMgaW4gYSB0cml2aWFsIHdheS4gU2VlIHRoZXNlIG1ldGhvZHMgYmVsb3cgZm9yIHRoZWlyIHNpZ25hdHVyZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAdGhpcyB7TWVzc2VuZ2VyQVBJfVxuICogQHJldHVybiB7TWVzc2VuZ2VyQVBJfVxuICovXG5mdW5jdGlvbiBNZXNzZW5nZXJBUEkoKSB7XG4gICAgaWYgKHRoaXMuaW5pdClcbiAgICAgICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiAjIyMjTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI2luaXQpIC0gaW5pdGlhbGl6ZXMgTWVzc2VuZ2VyQVBJXG4gKiAtIFthZGRJbnRlcm5hbE1lc3NhZ2VdKCNhZGRJbnRlcm5hbE1lc3NhZ2UpIC0gYWRkcyBpbnRlcm5hbCBtZXNzYWdlXG4gKiAtIFtyZW1vdmVJbnRlcm5hbE1lc3NhZ2VdKCNyZW1vdmVJbnRlcm5hbE1lc3NhZ2UpIC0gcmVtb3ZlcyBpbnRlcm5hbCBtZXNzYWdlXG4gKiAtIFtnZXRJbnRlcm5hbE1lc3NhZ2VzXSgjZ2V0SW50ZXJuYWxNZXNzYWdlcykgLSByZXR1cm5zIHRoZSBsaXN0IG9mIGludGVybmFsIG1lc3NhZ2VzIGZvciBnaXZlbiBzb3VyY2UgbWVzc2FnZVxuICpcbiAqIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIHJlZGVmaW5lZCBieSBzdWJjbGFzczpcbiAqXG4gKiAtIFt0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2VdKCN0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UpIC0gY29udmVydHMgaW50ZXJuYWwgbWVzc2FnZSB0eXBlIHRvIHNvdXJjZSAoZXh0ZXJuYWwpIG1lc3NhZ2UgdHlwZVxuICogLSBbY3JlYXRlSW50ZXJuYWxEYXRhXSgjY3JlYXRlSW50ZXJuYWxEYXRhKSAtIGNvbnZlcnRzIHNvdXJjZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgdmlhIE1lc3NhZ2VTb3VyY2UgdG8gaW50ZXJuYWwgbWVzc2FnZSBkYXRhXG4gKiAtIFtmaWx0ZXJTb3VyY2VNZXNzYWdlXSgjZmlsdGVyU291cmNlTWVzc2FnZSkgLSBmaWx0ZXJzIHNvdXJjZSBtZXNzYWdlIGJhc2VkIG9uIHRoZSBkYXRhIG9mIHRoZSBtZXNzYWdlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbnRlcm5hbCBtZXNzYWdlIHRoYXQgaXMgYWJvdXQgdG8gYmUgc2VudCBvbiBNZXNzZW5nZXJcbiAqL1xuXy5leHRlbmRQcm90byhNZXNzZW5nZXJBUEksIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGRlc3Ryb3k6IE1lc3NlbmdlckFQSSRkZXN0cm95LFxuICAgIGFkZEludGVybmFsTWVzc2FnZTogYWRkSW50ZXJuYWxNZXNzYWdlLFxuICAgIHJlbW92ZUludGVybmFsTWVzc2FnZTogcmVtb3ZlSW50ZXJuYWxNZXNzYWdlLFxuICAgIGdldEludGVybmFsTWVzc2FnZXM6IGdldEludGVybmFsTWVzc2FnZXMsXG5cbiAgICAvLyBzaG91bGQgYmUgcmVkZWZpbmVkIGJ5IHN1YmNsYXNzXG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgY3JlYXRlSW50ZXJuYWxEYXRhOiBjcmVhdGVJbnRlcm5hbERhdGEsXG4gICAgZmlsdGVyU291cmNlTWVzc2FnZTogZmlsdGVyU291cmNlTWVzc2FnZVxufSk7XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgTWVzc2VuZ2VyQVBJIGNvbnN0cnVjdG9yLiBTdWJjbGFzc2VzIHRoYXQgcmUtaW1wbGVtZW50IGBpbml0YCBtZXRob2Qgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgdXNpbmc6IGBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKWBcbiAqL1xuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfaW50ZXJuYWxNZXNzYWdlcycsIHt9KTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3lzIG1lc3NlbmdlciBBUElcbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyQVBJJGRlc3Ryb3koKSB7XG5cbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIFRyYW5zbGF0ZXMgaW50ZXJuYWwgYG1lc3NhZ2VgIHRvIHNvdXJjZSBtZXNzYWdlLCBhZGRzIGludGVybmFsIGBtZXNzYWdlYCB0byB0aGUgbGlzdCwgbWFraW5nIHN1cmUgdGhlIHNhbWUgYG1lc3NhZ2VgIHdhc24ndCBwYXNzZWQgYmVmb3JlIChpdCB3b3VsZCBpbmRpY2F0ZSBNZXNzZW5nZXIgZXJyb3IpLlxuICogUmV0dXJucyBzb3VyY2UgbWVzc2FnZSBpZiBpdCBpcyB1c2VkIGZpcnN0IHRpbWUgKHNvIHRoYXQgYE1lc3NhZ2VTb3VyY2VgIHN1YmNyaWJlcyB0byB0aGlzIHNvdXJjZSBtZXNzYWdlKSBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBtZXNzYWdlIHRvIGJlIHRyYW5zbGF0ZWQgYW5kIGFkZGVkXG4gKiBAcmV0dXJuIHtTdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBhZGRJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBpbnRlcm5hbE1zZ3NcbiAgICAgICAgLCBzb3VyY2VNZXNzYWdlID0gdGhpcy50cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSk7XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzLmhhc093blByb3BlcnR5KHNvdXJjZU1lc3NhZ2UpKSB7XG4gICAgICAgIGludGVybmFsTXNncyA9IHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgIGlmIChpbnRlcm5hbE1zZ3MuaW5kZXhPZihtZXNzYWdlKSA9PSAtMSlcbiAgICAgICAgICAgIGludGVybmFsTXNncy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignRHVwbGljYXRlIGFkZEludGVybmFsTWVzc2FnZSBjYWxsIGZvciBpbnRlcm5hbCBtZXNzYWdlICcgKyBtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlcm5hbE1zZ3MgPSB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdID0gW107XG4gICAgICAgIGludGVybmFsTXNncy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gc291cmNlTWVzc2FnZTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGludGVybmFsIGBtZXNzYWdlYCBmcm9tIHRoZSBsaXN0IGNvbm5lY3RlZCB0byBjb3JyZXNwb25kaW5nIHNvdXJjZSBtZXNzYWdlIChgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlYCBpcyB1c2VkIGZvciB0cmFuc2xhdGlvbikuXG4gKiBSZXR1cm5zIHNvdXJjZSBtZXNzYWdlLCBpZiB0aGUgbGFzdCBpbnRlcm5hbCBtZXNzYWdlIHdhcyByZW1vdmVkIChzbyB0aGF0IGBNZXNzYWdlU291cmNlYCBjYW4gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIHNvdXJjZSBtZXNzYWdlKSwgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCByZW1vdmVkXG4gKiBAcmV0dXJuIHtTdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiByZW1vdmVJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBzb3VyY2VNZXNzYWdlID0gdGhpcy50cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSk7XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIHZhciBpbnRlcm5hbE1zZ3MgPSB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdO1xuXG4gICAgaWYgKGludGVybmFsTXNncyAmJiBpbnRlcm5hbE1zZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciBtZXNzYWdlSW5kZXggPSBpbnRlcm5hbE1zZ3MuaW5kZXhPZihtZXNzYWdlKTtcbiAgICAgICAgaWYgKG1lc3NhZ2VJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBpbnRlcm5hbE1zZ3Muc3BsaWNlKG1lc3NhZ2VJbmRleCwgMSk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxNc2dzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKTtcbiAgICB9IGVsc2VcbiAgICAgICAgdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKTtcblxuXG4gICAgZnVuY3Rpb24gdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdub3RpZmljYXRpb24gcmVjZWl2ZWQ6IHVuLXN1YnNjcmliZSBmcm9tIGludGVybmFsIG1lc3NhZ2UgJyArIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICsgJyB3aXRob3V0IHByZXZpb3VzIHN1YnNjcmlwdGlvbiBub3RpZmljYXRpb24nKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBpbnRlcm5hbCBtZXNzYWdlcyB0aGF0IHdlcmUgdHJhbnNsYXRlZCB0byBnaXZlbiBgc291cmNlTWVzc2FnZWAuXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGBNZXNzYWdlU291cmNlYCB0byBkaXNwYXRjaCBzb3VyY2UgbWVzc2FnZSBvbiB0aGUgYE1lc2VuZ2VyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc291cmNlTWVzc2FnZSBzb3VyY2UgbWVzc2FnZVxuICogQHJldHVybiB7QXJyYXlbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gZ2V0SW50ZXJuYWxNZXNzYWdlcyhzb3VyY2VNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBydWxlIGZvciB0cmFuc2xhdGlvbiBvZiBpbnRlcm5hbCBgbWVzc2FnZWAgdG8gc291cmNlIG1lc3NhZ2UuIFRoaXMgY2xhc3Mgc2ltcGx5IHJldHVybnMgdGhlIHNhbWUgYG1lc3NhZ2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UgdG8gYmUgdHJhbnNsYXRlZFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiBtZXNzYWdlXG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBydWxlIGZvciB0cmFuc2xhdGlvbiBvZiBzb3VyY2UgbWVzc2FnZSBkYXRhIHRvIGludGVybmFsIG1lc3NhZ2UgZGF0YS4gVGhpcyBjbGFzcyBzaW1wbHkgcmV0dXJucyB0aGUgc2FtZSBgc291cmNlRGF0YWAuXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIFtkaXNwYXRjaE1lc3NhZ2VdKC4vbV9zb3VyY2UuanMuaHRtbCNkaXNwYXRjaE1lc3NhZ2UpIG1ldGhvZCBvZiBgTWVzc2FnZVNvdXJjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UsIGNhbiBiZSB1c2VkIGluIHRyYW5zbGF0aW9uIHJ1bGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UsIGNhbiBiZSB1c2VkIGluIHRyYW5zbGF0aW9uIHJ1bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VEYXRhIGRhdGEgcmVjZWl2ZWQgZnJvbSBzb3VyY2UgdGhhdCBoYXMgdG8gYmUgdHJhbnNsYXRlZCB0byBkYXRhIHRoYXQgd2lsbCBiZSBzZW50IHRvIGludGVybmFsIE1lc3NlbmdlciBzdWJzY3JpYmVyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBzb3VyY2VEYXRhKSB7XG4gICAgcmV0dXJuIHNvdXJjZURhdGE7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBkaXNwYXRjaCBmaWx0ZXIgZm9yIGludGVybmFsIG1lc3NhZ2VzLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGB0cnVlYCB0byBhbGxvdyBhbmQgYGZhbHNlYCB0byBwcmV2ZW50IGludGVybmFsIG1lc3NhZ2UgZGlzcGF0Y2guIFRoaXMgY2xhc3MgYWx3YXlzIHJldHVybnMgYHRydWVgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiBbZGlzcGF0Y2hNZXNzYWdlXSguL21fc291cmNlLmpzLmh0bWwjZGlzcGF0Y2hNZXNzYWdlKSBtZXRob2Qgb2YgYE1lc3NhZ2VTb3VyY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlLCBjYW4gYmUgdXNlZCBpbiBmaWx0ZXIgcnVsZVxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSwgY2FuIGJlIHVzZWQgaW4gZmlsdGVyIHJ1bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnRlcm5hbERhdGEgZGF0YSB0cmFuc2xhdGVkIGJ5IGBjcmVhdGVJbnRlcm5hbERhdGFgIG1ldGhvZCBmcm9tIHNvdXJjZSBkYXRhLCBjYW4gYmUgdXNlZCBpbiBmaWx0ZXIgcnVsZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBpbnRlcm5hbERhdGEpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1lc3NlbmdlckFQSSA9IHJlcXVpcmUoJy4vbV9hcGknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogQSBnZW5lcmljIHN1YnNjbGFzcyBvZiBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIHRoYXQgc3VwcG9ydHMgcGF0dGVybiBzdWJzY3JpcHRpb25zIHRvIHNvdXJjZS5cbiAqIENhbiBiZSB1c2VmdWwgaWYgdGhlIHNvdXJjZSBpcyBhbm90aGVyIE1lc3Nlbmdlci5cbiAqL1xuIHZhciBNZXNzZW5nZXJSZWdleHBBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ01lc3NlbmdlclJlZ2V4cEFQSScpO1xuXG4gbW9kdWxlLmV4cG9ydHMgPSBNZXNzZW5nZXJSZWdleHBBUEk7XG5cblxuXy5leHRlbmRQcm90byhNZXNzZW5nZXJSZWdleHBBUEksIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGFkZEludGVybmFsTWVzc2FnZTogYWRkSW50ZXJuYWxNZXNzYWdlLFxuICAgIHJlbW92ZUludGVybmFsTWVzc2FnZTogcmVtb3ZlSW50ZXJuYWxNZXNzYWdlLFxuICAgIGdldEludGVybmFsTWVzc2FnZXM6IGdldEludGVybmFsTWVzc2FnZXNcbn0pO1xuXG5cbi8qKlxuICogTWVzc2VuZ2VyUmVnZXhwQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IE1lc3NlbmdlclJlZ2V4cEFQSSBjb25zdHJ1Y3Rvci5cbiAqL1xuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfcGF0dGVybkludGVybmFsTWVzc2FnZXM6IHt9XG4gICAgfSk7XG4gICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJSZWdleHBBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBBdWdtZW50cyBNZXNzZW5nZXJBUEkgbWV0aG9kIGJ5IHN0b3JpbmcgcmVnZXhwXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCBhZGRlZFxuICogQHJldHVybiB7U3RyaW5nfFJlZ0V4cHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGFkZEludGVybmFsTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdmFyIHNvdXJjZU1lc3NhZ2UgPSBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmFkZEludGVybmFsTWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIFxuICAgIC8vIHN0b3JlIHJlZ2V4cCBpdHNlbGYgaWYgc291cmNlTWVzc2FnZSBpcyByZWdleHBcbiAgICBpZiAoc291cmNlTWVzc2FnZSAmJiBzb3VyY2VNZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV0ucGF0dGVybiA9IHNvdXJjZU1lc3NhZ2U7XG4gICAgICAgIHRoaXMuX3BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdID0gdGhpcy5faW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXTtcbiAgICAgICAgaWYgKHRoaXMuX2NhdGNoQWxsU3Vic2NyaWJlZCkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIC8uKi87XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2U7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJSZWdleHBBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBBdWdtZW50cyBNZXNzZW5nZXJBUEkgbWV0aG9kIGJ5IHJlbW92aW5nIHJlZ2V4cCBzdWJzY2lycHRpb25cbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCBhZGRlZFxuICogQHJldHVybiB7U3RyaW5nfFJlZ0V4cHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUludGVybmFsTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdmFyIHNvdXJjZU1lc3NhZ2UgPSBNZXNzZW5nZXJBUEkucHJvdG90eXBlLnJlbW92ZUludGVybmFsTWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKHNvdXJjZU1lc3NhZ2UgJiYgc291cmNlTWVzc2FnZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fcGF0dGVybkludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgIHZhciBub1BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzID0gISBPYmplY3Qua2V5cyh0aGlzLl9wYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcykubGVuZ3RoO1xuICAgICAgICBpZiAobm9QYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcykge1xuICAgICAgICAgICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gLy4qLztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2VNZXNzYWdlO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQXVnbWVudHMgTWVzc2VuZ2VyQVBJIG1ldGhvZCBieSByZXR1cm5pbmcgbWVzc2FnZXMgc3Vic2NyaWJlZCB3aXRoIHJlZ2V4cFxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBgTWVzc2FnZVNvdXJjZWAgdG8gZGlzcGF0Y2ggc291cmNlIG1lc3NhZ2Ugb24gdGhlIGBNZXNlbmdlcmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlXG4gKiBAcmV0dXJuIHtBcnJheVtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBnZXRJbnRlcm5hbE1lc3NhZ2VzKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB2YXIgaW50ZXJuYWxNZXNzYWdlcyA9IE1lc3NlbmdlckFQSS5wcm90b3R5cGUuZ2V0SW50ZXJuYWxNZXNzYWdlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gYWRkIGludGVybmFsIG1lc3NhZ2VzIGZvciByZWdleHAgc291cmNlIHN1YnNjcmlwdGlvbnNcbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaW50ZXJuYWxNZXNzYWdlcyA9IGludGVybmFsTWVzc2FnZXMgfHwgW107XG4gICAgICAgIHZhciBpbnRlcm5hbE1lc3NhZ2VzSGFzaCA9IF8ub2JqZWN0KGludGVybmFsTWVzc2FnZXMsIHRydWUpO1xuXG4gICAgICAgIF8uZWFjaEtleSh0aGlzLl9wYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcywgZnVuY3Rpb24ocGF0dGVybk1lc3NhZ2VzKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlUGF0dGVybiA9IHBhdHRlcm5NZXNzYWdlcy5wYXR0ZXJuO1xuXG4gICAgICAgICAgICBpZiAoc291cmNlUGF0dGVybi50ZXN0KHNvdXJjZU1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgIHBhdHRlcm5NZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsTWVzc2FnZXNIYXNoW21lc3NhZ2VdKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsTWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxNZXNzYWdlc0hhc2hbbWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IFxuXG4gICAgcmV0dXJuIGludGVybmFsTWVzc2FnZXM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBNaXhpbiA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L21peGluJylcbiAgICAsIE1lc3NlbmdlckFQSSA9IHJlcXVpcmUoJy4vbV9hcGknKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWVzc2FnZVNvdXJjZWBcbiAqIEFuIGFic3RyYWN0IGNsYXNzIChzdWJjbGFzcyBvZiBbTWl4aW5dKC4uL2Fic3RyYWN0L21peGluLmpzLmh0bWwpKSBmb3IgY29ubmVjdGluZyBbTWVzc2VuZ2VyXSguL2luZGV4LmpzLmh0bWwpIHRvIGV4dGVybmFsIHNvdXJjZXMgb2YgbWVzc2FnZXMgKGxpa2UgRE9NIGV2ZW50cykgYW5kIGRlZmluaW5nIGhpZ2hlciBsZXZlbCBtZXNzYWdlcy5cbiAqIEFuIGluc3RhbmNlIG9mIE1lc3NhZ2VTb3VyY2UgY2FuIGVpdGhlciBiZSBwYXNzZWQgdG8gTWVzc2VuZ2VyIGNvbnN0cnVjdG9yIG9yIGxhdGVyIHVzaW5nIGBfc2V0TWVzc2FnZVNvdXJjZWAgbWV0aG9kIG9mIE1lc3Nlbmdlci4gT25jZSBzZXQsIE1lc3NhZ2VTb3VyY2Ugb2YgTWVzc2VuZ2VyIGNhbm5vdCBiZSBjaGFuZ2VkLlxuICovXG52YXIgTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWl4aW4sICdNZXNzYWdlU291cmNlJywgdHJ1ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZVNvdXJjZTtcblxuXG4vKipcbiAqICMjIyNNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI2luaXQpIC0gaW5pdGlhbGl6ZXMgbWVzc2FnZVNvdXJjZSAtIGNhbGxlZCBieSBNaXhpbiBzdXBlcmNsYXNzXG4gKiAtIFtzZXRNZXNzZW5nZXJdKCNzZXRNZXNzZW5nZXIpIC0gY29ubmVjdHMgTWVzc2VuZ2VyIHRvIE1lc3NhZ2VTb3VyY2UsIGlzIGNhbGxlZCBmcm9tIGBpbml0YCBvciBgX3NldE1lc3NhZ2VTb3VyY2VgIG1ldGhvZHMgb2YgW01lc3Nlbmdlcl0oLi9pbmRleC5qcy5odG1sKS5cbiAqIC0gW29uU3Vic2NyaWJlckFkZGVkXSgjb25TdWJzY3JpYmVyQWRkZWQpIC0gY2FsbGVkIGJ5IE1lc3NlbmdlciB0byBub3RpZnkgd2hlbiB0aGUgZmlyc3Qgc3Vic2NyaWJlciBmb3IgYW4gaW50ZXJuYWwgbWVzc2FnZSB3YXMgYWRkZWQsIHNvIE1lc3NhZ2VTb3VyY2UgY2FuIHN1YnNjcmliZSB0byBzb3VyY2VcbiAqIC0gW29uU3Vic2NyaWJlclJlbW92ZWRdKCNvblN1YnNjcmliZXJSZW1vdmVkKSAtIGNhbGxlZCBieSBNZXNzZW5nZXIgdG8gbm90aWZ5IHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYW4gaW50ZXJuYWwgbWVzc2FnZSB3YXMgcmVtb3ZlZCwgc28gTWVzc2FnZVNvdXJjZSBjYW4gdW5zdWJzY3JpYmUgZnJvbSBzb3VyY2VcbiAqIC0gW2Rpc3BhdGNoTWVzc2FnZV0oI2Rpc3BhdGNoTWVzc2FnZSkgLSBkaXNwYXRjaGVzIHNvdXJjZSBtZXNzYWdlLiBNZXNzYWdlU291cmNlIHN1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgbWVjaGFuaXNtIHdoZW4gb24gYWN0dWFsIHNvdXJjZSBtZXNzYWdlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC5cbiAqXG4gKiBNZXRob2RzIGJlbG93IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzczpcbiAqXG4gKiAtIFt0cmlnZ2VyXSgjdHJpZ2dlcikgLSB0cmlnZ2VycyBtZXNzYWdlcyBvbiB0aGUgc291cmNlIChhbiBvcHRpb25hbCBtZXRob2QpXG4gKiAtIFthZGRTb3VyY2VTdWJzY3JpYmVyXSgjYWRkU291cmNlU3Vic2NyaWJlcikgLSBhZGRzIGxpc3RlbmVyL3N1YnNjcmliZXIgdG8gZXh0ZXJuYWwgbWVzc2FnZVxuICogLSBbcmVtb3ZlU291cmNlU3Vic2NyaWJlcl0oI3JlbW92ZVNvdXJjZVN1YnNjcmliZXIpIC0gcmVtb3ZlcyBsaXN0ZW5lci9zdWJzY3JpYmVyIGZyb20gZXh0ZXJuYWwgbWVzc2FnZVxuICovXG5fLmV4dGVuZFByb3RvKE1lc3NhZ2VTb3VyY2UsIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGRlc3Ryb3k6IE1lc3NhZ2VTb3VyY2UkZGVzdHJveSxcbiAgICBzZXRNZXNzZW5nZXI6IHNldE1lc3NlbmdlcixcbiAgICBvblN1YnNjcmliZXJBZGRlZDogb25TdWJzY3JpYmVyQWRkZWQsXG4gICAgb25TdWJzY3JpYmVyUmVtb3ZlZDogb25TdWJzY3JpYmVyUmVtb3ZlZCwgXG4gICAgZGlzcGF0Y2hNZXNzYWdlOiBkaXNwYXRjaE1lc3NhZ2UsXG4gICAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlLFxuICAgIF9wcmVwYXJlTWVzc2VuZ2VyQVBJOiBfcHJlcGFyZU1lc3NlbmdlckFQSSxcblxuICAgIC8vIE1ldGhvZHMgYmVsb3cgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc1xuICAgIHRyaWdnZXI6IHRvQmVJbXBsZW1lbnRlZCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiB0b0JlSW1wbGVtZW50ZWQsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogdG9CZUltcGxlbWVudGVkXG59KTtcblxuXG4vKipcbiAqIE1lc3NhZ2VTb3VyY2UgaW5zdGFuY2UgbWV0aG9kLlxuICogQ2FsbGVkIGJ5IE1peGluIGNvbnN0cnVjdG9yLlxuICogTWVzc2FnZVNvdXJjZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgcGFzc2VkIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhpcyBtZXRob2Qgc2lnbmF0dXJlLlxuICogSWYgYW4gaW5zdGFuY2Ugb2YgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSBpcyBwYXNzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciwgaXQgZXh0ZW5kcyBNZXNzYWdlU291cmNlIGZ1bmN0aW9uYWxpdHkgdG8gYWxsb3cgaXQgdG8gZGVmaW5lIG5ldyBtZXNzYWdlcywgdG8gZmlsdGVyIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZWlyIGRhdGEgYW5kIHRvIGNoYW5nZSBtZXNzYWdlIGRhdGEuIFNlZSBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IE9wdGlvbmFsIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUgTWVzc2FnZVNvdXJjZSBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIEl0IGlzIHVzZWQgdG8gcHJveHkgbWV0aG9kcyBvZiBNZXNzYWdlU291cmNlLlxuICogQHBhcmFtIHtPYmplY3RbU3RyaW5nXX0gcHJveHlNZXRob2RzIE9wdGlvbmFsIG1hcCBvZiBtZXRob2QgbmFtZXM7IGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIE1lc3NhZ2VTb3VyY2UncyBtZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7TWVzc2VuZ2VyQVBJfSBtZXNzZW5nZXJBUEkgT3B0aW9uYWwgaW5zdGFuY2Ugb2YgTWVzc2VuZ2VyQVBJLlxuICovXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJKSB7XG4gICAgdGhpcy5fcHJlcGFyZU1lc3NlbmdlckFQSShtZXNzZW5nZXJBUEkpO1xufVxuXG5cbi8qKlxuICogRGVzdHJveXMgbWVzc2FnZSBzb3VyY2VcbiAqL1xuZnVuY3Rpb24gTWVzc2FnZVNvdXJjZSRkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLm1lc3NlbmdlckFQSSlcbiAgICAgICAgdGhpcy5tZXNzZW5nZXJBUEkuZGVzdHJveSgpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBTZXRzIHJlZmVyZW5jZSB0byBNZXNzZW5nZXIgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtNZXNzZW5nZXJ9IG1lc3NlbmdlciByZWZlcmVuY2UgdG8gTWVzc2VuZ2VyIGluc3RhbmNlIGxpbmtlZCB0byB0aGlzIE1lc3NhZ2VTb3VyY2VcbiAqL1xuZnVuY3Rpb24gc2V0TWVzc2VuZ2VyKG1lc3Nlbmdlcikge1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ21lc3NlbmdlcicsIG1lc3Nlbmdlcik7XG59XG5cblxuLyoqXG4gKiBNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZC5cbiAqIFByZXBhcmVzIFtNZXNzZW5nZXJBUEldKC4vbV9hcGkuanMuaHRtbCkgcGFzc2VkIHRvIGNvbnN0cnVjdG9yIGJ5IHByb3h5aW5nIGl0cyBtZXRob2RzIHRvIGl0c2VsZiBvciBpZiBNZXNzZW5nZXJBUEkgd2Fzbid0IHBhc3NlZCBkZWZpbmVzIHR3byBtZXRob2RzIHRvIGF2b2lkIGNoZWNraW5nIHRoZWlyIGF2YWlsYWJpbGl0eSBldmVyeSB0aW1lIHRoZSBtZXNzYWdlIGlzIGRpc3BhdGNoZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TWVzc2VuZ2VyQVBJfSBtZXNzZW5nZXJBUEkgT3B0aW9uYWwgaW5zdGFuY2Ugb2YgTWVzc2VuZ2VyQVBJXG4gKi9cbmZ1bmN0aW9uIF9wcmVwYXJlTWVzc2VuZ2VyQVBJKG1lc3NlbmdlckFQSSkge1xuICAgIGNoZWNrKG1lc3NlbmdlckFQSSwgTWF0Y2guT3B0aW9uYWwoTWVzc2VuZ2VyQVBJKSk7XG5cbiAgICBpZiAoISBtZXNzZW5nZXJBUEkpXG4gICAgICAgIG1lc3NlbmdlckFQSSA9IG5ldyBNZXNzZW5nZXJBUEk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdtZXNzZW5nZXJBUEknLCBtZXNzZW5nZXJBUEkpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBTdWJzY3JpYmVzIHRvIGV4dGVybmFsIHNvdXJjZSB1c2luZyBgYWRkU291cmNlU3Vic2NyaWJlcmAgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzLlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFtNZXNzZW5nZXJdKC4vaW5kZXguanMuaHRtbCkgd2hlbiB0aGUgZmlyc3Qgc3Vic2NyaWJlciB0byB0aGUgYG1lc3NhZ2VgIGlzIGFkZGVkLlxuICogRGVsZWdhdGVzIHRvIHN1cHBsaWVkIG9yIGRlZmF1bHQgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSBmb3IgdHJhbnNsYXRpb24gb2YgYG1lc3NhZ2VgIHRvIGBzb3VyY2VNZXNzYWdlYC4gYE1lc3NhZ2VBUEkucHJvdG90eXBlLmFkZEludGVybmFsTWVzc2FnZWAgd2lsbCByZXR1cm4gdW5kZWZpbmVkIGlmIHRoaXMgYHNvdXJjZU1lc3NhZ2VgIHdhcyBhbHJlYWR5IHN1YnNjcmliZWQgdG8gdG8gcHJldmVudCBkdXBsaWNhdGUgc3Vic2NyaXB0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIE1lc3NlbmdlciBtZXNzYWdlIHRoYXQgaGFzIHRvIGJlIHN1YnNjcmliZWQgdG8gYXQgdGhlIGV4dGVybmFsIHNvdXJjZSBvZiBtZXNzYWdlcy5cbiAqL1xuZnVuY3Rpb24gb25TdWJzY3JpYmVyQWRkZWQobWVzc2FnZSkge1xuICAgIHZhciBuZXdTb3VyY2VNZXNzYWdlID0gdGhpcy5tZXNzZW5nZXJBUEkuYWRkSW50ZXJuYWxNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIGlmICh0eXBlb2YgbmV3U291cmNlTWVzc2FnZSAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhpcy5hZGRTb3VyY2VTdWJzY3JpYmVyKG5ld1NvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBVbnN1YnNjcmliZXMgZnJvbSBleHRlcm5hbCBzb3VyY2UgdXNpbmcgYHJlbW92ZVNvdXJjZVN1YnNjcmliZXJgIG1ldGhvZCB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBbTWVzc2VuZ2VyXSguL2luZGV4LmpzLmh0bWwpIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciB0byB0aGUgYG1lc3NhZ2VgIGlzIHJlbW92ZWQuXG4gKiBEZWxlZ2F0ZXMgdG8gc3VwcGxpZWQgb3IgZGVmYXVsdCBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIGZvciB0cmFuc2xhdGlvbiBvZiBgbWVzc2FnZWAgdG8gYHNvdXJjZU1lc3NhZ2VgLiBgTWVzc2FnZUFQSS5wcm90b3R5cGUucmVtb3ZlSW50ZXJuYWxNZXNzYWdlYCB3aWxsIHJldHVybiB1bmRlZmluZWQgaWYgdGhpcyBgc291cmNlTWVzc2FnZWAgd2FzIG5vdCB5ZXQgc3Vic2NyaWJlZCB0byB0byBwcmV2ZW50IHVuc3Vic2NyaXB0aW9uIHdpdGhvdXQgcHJldmlvdXMgc3Vic2NyaXB0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIE1lc3NlbmdlciBtZXNzYWdlIHRoYXQgaGFzIHRvIGJlIHVuc3Vic2NyaWJlZCBmcm9tIGF0IHRoZSBleHRlcm5hbCBzb3VyY2Ugb2YgbWVzc2FnZXMuXG4gKi9cbmZ1bmN0aW9uIG9uU3Vic2NyaWJlclJlbW92ZWQobWVzc2FnZSkge1xuICAgIHZhciByZW1vdmVkU291cmNlTWVzc2FnZSA9IHRoaXMubWVzc2VuZ2VyQVBJLnJlbW92ZUludGVybmFsTWVzc2FnZShtZXNzYWdlKTtcbiAgICBpZiAodHlwZW9mIHJlbW92ZWRTb3VyY2VNZXNzYWdlICE9ICd1bmRlZmluZWQnKVxuICAgICAgICB0aGlzLnJlbW92ZVNvdXJjZVN1YnNjcmliZXIocmVtb3ZlZFNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBEaXNwYXRjaGVzIHNvdXJjZU1lc3NhZ2UgdG8gTWVzc2VuZ2VyLlxuICogTWVjaGFuaXNtIHRoYXQgY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiB0aGUgc291cmNlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzIChzZWUgW0RPTUV2ZW50c1NvdXJjZV0oLi4vY29tcG9uZW50cy9tc2dfc3JjL2RvbV9ldmVudHMuanMuaHRtbCkgZm9yIGV4YW1wbGUpLlxuICogRGVsZWdhdGVzIHRvIHN1cHBsaWVkIG9yIGRlZmF1bHQgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSB0byBjcmVhdGUgaW50ZXJuYWwgbWVzc2FnZSBkYXRhIChgY3JlYXRlSW50ZXJuYWxEYXRhYCkgYW5kIHRvIGZpbHRlciB0aGUgbWVzc2FnZSBiYXNlZCBvbiBpdHMgZGF0YSBhbmQvb3IgbWVzc2FnZSAoYGZpbHRlclNvdXJjZU1lc3NhZ2VgKS5cbiAqIEJhc2UgTWVzc2VuZ2VyQVBJIGNsYXNzIGltcGxlbWVudHMgdGhlc2UgdHdvIG1ldGhvZHMgaW4gYSB0cml2aWFsIHdheSAoYGNyZWF0ZUludGVybmFsRGF0YWAgc2ltcGx5IHJldHVybnMgZXh0ZXJuYWwgZGF0YSwgYGZpbHRlclNvdXJjZU1lc3NhZ2VgIHJldHVybnMgYHRydWVgKSwgdGhleSBhcmUgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VEYXRhIGRhdGEgcmVjZWl2ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAqL1xuZnVuY3Rpb24gZGlzcGF0Y2hNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIHNvdXJjZURhdGEpIHtcbiAgICB2YXIgYXBpID0gdGhpcy5tZXNzZW5nZXJBUElcbiAgICAgICAgLCBpbnRlcm5hbE1lc3NhZ2VzID0gYXBpLmdldEludGVybmFsTWVzc2FnZXMoc291cmNlTWVzc2FnZSk7XG5cbiAgICBpZiAoaW50ZXJuYWxNZXNzYWdlcykgXG4gICAgICAgIGludGVybmFsTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICAgICAgdmFyIGludGVybmFsRGF0YSA9IGFwaS5jcmVhdGVJbnRlcm5hbERhdGEoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgc291cmNlRGF0YSk7XG5cbiAgICAgICAgICAgIHZhciBzaG91bGREaXNwYXRjaCA9IGFwaS5maWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGludGVybmFsRGF0YSk7XG4gICAgICAgICAgICBpZiAoc2hvdWxkRGlzcGF0Y2gpIFxuICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgaW50ZXJuYWxEYXRhKTsgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIFBvc3RzIG1lc3NhZ2Ugb24gdGhlIG1lc3Nlbmdlci4gVGhpcyBtZXRob2QgaXMgc2VwYXJhdGVkIHNvIHNwZWNpZmljIG1lc3NhZ2Ugc291cmNlcyBjYW4gbWFrZSBtZXNzYWdlIGRpc3BhdGNoIHN5bmNocm9ub3VzIGJ5IHVzaW5nIGBwb3N0TWVzc2FnZVN5bmNgXG4gKiBcbiAqIEBwYXJhbSAge1N0cmluZ30gbWVzc2FnZVxuICogQHBhcmFtICB7T2JqZWN0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZShtZXNzYWdlLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiB0b0JlSW1wbGVtZW50ZWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRoZSBtZXRob2Qgb2YgYW4gYWJzY3RyYWN0IGNsYXNzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIE1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21fc291cmNlJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgY2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrJyk7XG5cblxuLyoqXG4gKiBTdWJjbGFzcyBvZiBNZXNzYWdlU291cmNlIHRoYXQgYWxsb3dzIHRvIGNvbm5lY3QgTWVzc2VuZ2VyIHRvIGFub3RoZXIgTWVzc2VuZ2VyIHVzaW5nIGl0IGFzIGV4dGVybmFsIHNvdXJjZS5cbiAqL1xudmFyIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdNZXNzZW5nZXJNZXNzYWdlU291cmNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZTtcblxuXG4vKipcbiAqICMjIyNNZXNzZW5nZXJNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSwge1xuICAgIGluaXQ6IGluaXQsXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogYWRkU291cmNlU3Vic2NyaWJlcixcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHBvc3RNZXNzYWdlOiBNZXNzZW5nZXJNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlXG59KTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBNZXNzZW5nZXJNZXNzYWdlU291cmNlXG4gKiBEZWZpbmVzIG9uZSBwYXJhbWV0ZXIgaW4gYWRkaXRpb24gdG8gW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgcGFyYW1ldGVyc1xuICpcbiAqIEBwYXJhbSB7TWVzc2VuZ2VyfSBzb3VyY2VNZXNzZW5nZXIgbWVzc2VuZ2VyIHRoaXMgbWVzc2FnZSBzb3VyY2UgY29ubmVjdHMgdG9cbiAqL1xuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NlbmdlckFQSSwgc291cmNlTWVzc2VuZ2VyKSB7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuc291cmNlTWVzc2VuZ2VyID0gc291cmNlTWVzc2VuZ2VyO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byBzb3VyY2UgbWVzc2FnZS4gU2VlIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGRvY3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnZXh9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UgdG8gc3Vic2NyaWJlIHRvXG4gKi9cbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHRoaXMuc291cmNlTWVzc2VuZ2VyLm9uU3luYyhzb3VyY2VNZXNzYWdlLCB7IGNvbnRleHQ6IHRoaXMsIHN1YnNjcmliZXI6IHRoaXMuZGlzcGF0Y2hNZXNzYWdlIH0pO1xufVxuXG5cbi8qKlxuICogVW5zdWJzY3JpYmVzIGZyb20gc291cmNlIG1lc3NhZ2UuIFNlZSBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBkb2NzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ2V4fSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlIHRvIHVuc3Vic2NyaWJlIGZyb21cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgdGhpcy5zb3VyY2VNZXNzZW5nZXIub2ZmKHNvdXJjZU1lc3NhZ2UsIHsgY29udGV4dDogdGhpcywgc3Vic2NyaWJlcjogdGhpcy5kaXNwYXRjaE1lc3NhZ2UgfSk7XG59XG5cblxuLyoqXG4gKiBPdmVycmlkZXMgZGVmYWx1dCBtZXNzYWdlIHNvdXJjZSB0byBkaXNwYXRjaCBtZXNzYWdlcyBzeW5jaHJvbm91c2x5XG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICovXG5mdW5jdGlvbiBNZXNzZW5nZXJNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZVN5bmMobWVzc2FnZSwgZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxuLyoqXG4gKiAjIyMjTWlsbyBwYWNrYWdlcyMjIyNcbiAqXG4gKiAtIFttaW5kZXJdKC4vbWluZGVyLmpzLmh0bWwpIC0gZGF0YSByZWFjdGl2aXR5LCBvbmUgb3IgdHdvIHdheSwgc2hhbGxvdyBvciBkZWVwLCBhcyB5b3UgbGlrZSBpdFxuICogLSBbY29uZmlnXSguL2NvbmZpZy5qcy5odG1sKSAtIG1pbG8gY29uZmlndXJhdGlvblxuICogLSBbdXRpbF0oLi91dGlsL2luZGV4LmpzLmh0bWwpIC0gbG9nZ2VyLCByZXF1ZXN0LCBkb20sIGNoZWNrLCBlcnJvciwgZXRjLlxuICogLSBbY2xhc3Nlc10oLi9jbGFzc2VzLmpzLmh0bWwpIC0gYWJzdHJhY3QgYW5kIGJhc2UgY2xhc3Nlc1xuICogLSBbTWVzc2VuZ2VyXSguL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSAtIGdlbmVyaWMgTWVzc2VuZ2VyIHVzZWQgaW4gbW9zdCBvdGhlciBtaWxvIGNsYXNzZXMsIGNhbiBiZSBtaXhlZCBpbnRvIGFwcCBjbGFzc2VzIHRvby5cbiAqIC0gW01vZGVsXSguL21vZGVsL2luZGV4LmpzLmh0bWwpIC0gTW9kZWwgY2xhc3MgdGhhdCBlbWl0cyBtZXNzYWdlcyBvbiBjaGFuZ2VzIHRvIGFueSBkZXB0aCB3aXRob3V0IHRpbWVyIGJhc2VkIHdhdGNoaW5nXG4gKi9cbnZhciBtaWxvID0ge1xuICAgIG1pbmRlcjogcmVxdWlyZSgnLi9taW5kZXInKSxcbiAgICBjb25maWc6IHJlcXVpcmUoJy4vY29uZmlnJyksXG4gICAgdXRpbDogcmVxdWlyZSgnLi91dGlsJyksXG4gICAgY2xhc3NlczogcmVxdWlyZSgnLi9jbGFzc2VzJyksXG4gICAgTWVzc2VuZ2VyOiByZXF1aXJlKCcuL21lc3NlbmdlcicpLFxuICAgIE1vZGVsOiByZXF1aXJlKCcuL21vZGVsJyksXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBwcm90bzogX1xufTtcblxuXG4vLyBleHBvcnQgZm9yIG5vZGUvYnJvd3NlcmlmeVxuaWYgKHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpICAgIFxuICAgIG1vZHVsZS5leHBvcnRzID0gbWlsbztcblxuLy8gZ2xvYmFsIG1pbG8gZm9yIGJyb3dzZXJcbmlmICh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnKVxuICAgIHdpbmRvdy5taWxvID0gbWlsbztcblxuXG5mdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIG1pbG8ubWluZGVyLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbm5lY3RvciA9IHJlcXVpcmUoJy4vbW9kZWwvY29ubmVjdG9yJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4vbWVzc2VuZ2VyJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi91dGlsL2xvZ2dlcicpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbWluZGVyO1xuXG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIG9uZSBvciBtYW55IENvbm5lY3RvciBvYmplY3RzIHRoYXRcbiAqIGNyZWF0ZSBsaXZlIHJlYWN0aXZlIGNvbm5lY3Rpb24gYmV0d2VlbiBvYmplY3RzIGltcGxlbWVudGluZ1xuICogZGF0YVNvdXJjZSBpbnRlcmZhY2U6XG4gKiBPYmplY3RzIHNob3VsZCBlbWl0IG1lc3NhZ2VzIHdoZW4gYW55IHBhcnQgb2YgdGhlaXIgZGF0YSBjaGFuZ2VzLFxuICogbWV0aG9kcyBgb25gIGFuZCBgb2ZmYCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gc3Vic2NyaWJlL3Vuc3Vic2NyaWJlXG4gKiB0byBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1lc3NhZ2VzLCBtZXRob2RzIGBzZXRgIGFuZCBgZ2V0YCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gZ2V0L3NldCBkYXRhXG4gKiBvbiBwYXRoIG9iamVjdHMsIHBvaW50aW5nIHRvIHBhcnRpY3VsYXIgcGFydHMgb2YgdGhlIG9iamVjdCwgbWV0aG9kIGBwYXRoYFxuICogc2hvdWxkIHJldHVybiBwYXRoIG9iamVjdCBmb3IgYSBnaXZlbiBwYXRoIHN0cmluZyAoc2VlIHBhdGggdXRpbHMgZm9yIHBhdGggc3RyaW5nIHN5bnRheCkuXG4gKiBCb3RoIE1vZGVsIGFuZCBEYXRhIGZhY2V0IGFyZSBzdWNoIGRhdGEgc291cmNlcywgdGhleSBjYW4gYmUgbGlua2VkIGJ5IENvbm5lY3RvciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRzMSB0aGUgZmlyc3QgZGF0YSBzb3VyY2UuIEluc3RlYWQgb2YgdGhlIGZpcnN0IGRhdGEgc291cmNlIGFuIGFycmF5IGNhbiBiZSBwYXNzZWQgd2l0aCBhcnJheXMgb2YgQ29ubmVjdGlvbiBvYmplY3RzIHBhcmFtZXRlcnMgaW4gZWFjaCBhcnJheSBlbGVtZW50LlxuICogQHBhcmFtIHtTdHJpbmd9IG1vZGUgdGhlIGNvbm5lY3Rpb24gbW9kZSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIGRlcHRoIG9mIGNvbm5lY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmUgJy0+JywgJzw8LScsICc8PDwtPj4+JywgZXRjLlxuICogQHBhcmFtIHtPYmplY3R9IGRzMiB0aGUgc2Vjb25kIGRhdGEgc291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBub3QgaW1wbGVtZW50ZWQgeWV0XG4gKi9cbmZ1bmN0aW9uIG1pbmRlcihkczEsIG1vZGUsIGRzMiwgb3B0aW9ucykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRzMSkpIHtcbiAgICAgICAgdmFyIGNvbm5EZXNjcmlwdGlvbnMgPSBkczE7XG4gICAgICAgIHZhciBjb25uZWN0b3JzID0gY29ubkRlc2NyaXB0aW9ucy5tYXAoZnVuY3Rpb24oZGVzY3IpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdG9yKGRlc2NyWzBdLCBkZXNjclsxXSwgZGVzY3JbMl0sIGRlc2NyWzNdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbm5lY3RvcnMuZm9yRWFjaChfYWRkQ29ubmVjdG9yKTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3RvcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGNuY3QgPSBuZXcgQ29ubmVjdG9yKGRzMSwgbW9kZSwgZHMyLCBvcHRpb25zKTtcbiAgICAgICAgX2FkZENvbm5lY3RvcihjbmN0KTtcbiAgICAgICAgcmV0dXJuIGNuY3Q7XG4gICAgfVxufVxuXG5cbi8qKlxuICogbWVzc2VuZ2VyIG9mIG1pbmRlciB3aGVyZSBpdCBlbWl0cyBldmVudHMgcmVsYXRlZCB0byBhbGwgY29ubmVjdG9yc1xuICogQHR5cGUge01lc3Nlbmdlcn1cbiAqL1xudmFyIF9tZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1pbmRlciwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG52YXIgX2Nvbm5lY3RvcnMgPSBbXVxuICAgICwgX3JlY2VpdmVkTWVzc2FnZXMgPSBbXVxuICAgICwgX2lzUHJvcGFnYXRpbmcgPSBmYWxzZTtcblxuXG5fLmV4dGVuZChtaW5kZXIsIHtcbiAgICBnZXRDb25uZWN0b3JzOiBtaW5kZXJfZ2V0Q29ubmVjdG9ycyxcbiAgICBnZXRFeHBhbmRlZENvbm5lY3Rpb25zOiBtaW5kZXJfZ2V0RXhwYW5kZWRDb25uZWN0aW9ucyxcbiAgICBpc1Byb3BhZ2F0aW5nOiBtaW5kZXJfaXNQcm9wYWdhdGluZyxcbiAgICB3aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQ6IG1pbmRlcl93aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQsXG4gICAgZGVzdHJveUNvbm5lY3RvcjogbWluZGVyX2Rlc3Ryb3lDb25uZWN0b3IsXG4gICAgZGVzdHJveTogbWluZGVyX2Rlc3Ryb3lcbn0pO1xuXG5cbmZ1bmN0aW9uIF9hZGRDb25uZWN0b3IoY25jdCkge1xuICAgIGNuY3QuX19fbWluZGVyX2lkID0gX2Nvbm5lY3RvcnMucHVzaChjbmN0KSAtIDE7XG4gICAgY25jdC5vbigvLiovLCBvbkNvbm5lY3Rvck1lc3NhZ2UpO1xuICAgIG1pbmRlci5wb3N0TWVzc2FnZSgnYWRkZWQnLCB7IGNvbm5lY3RvcjogY25jdCB9KTtcbiAgICBtaW5kZXIucG9zdE1lc3NhZ2UoJ3R1cm5lZG9uJywgeyBjb25uZWN0b3I6IGNuY3QgfSk7XG59XG5cblxuZnVuY3Rpb24gb25Db25uZWN0b3JNZXNzYWdlKG1zZywgZGF0YSkge1xuICAgIHZhciBkYXRhID0gZGF0YSA/IF8uY2xvbmUoZGF0YSkgOiB7fTtcbiAgICBfLmV4dGVuZChkYXRhLCB7XG4gICAgICAgIGlkOiB0aGlzLl9fX21pbmRlcl9pZCxcbiAgICAgICAgY29ubmVjdG9yOiB0aGlzXG4gICAgfSk7XG4gICAgbWluZGVyLnBvc3RNZXNzYWdlKG1zZywgZGF0YSk7XG4gICAgaWYgKCEgX3JlY2VpdmVkTWVzc2FnZXMubGVuZ3RoICYmICEgX2lzUHJvcGFnYXRpbmcpIHtcbiAgICAgICAgXy5kZWZlcihfaWRsZUNoZWNrKTtcbiAgICAgICAgX2lzUHJvcGFnYXRpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIF9yZWNlaXZlZE1lc3NhZ2VzLnB1c2goeyBtc2c6IG1zZywgZGF0YTogZGF0YSB9KTtcbn1cblxuXG5mdW5jdGlvbiBfaWRsZUNoZWNrKCkge1xuICAgIGlmIChfcmVjZWl2ZWRNZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgX3JlY2VpdmVkTWVzc2FnZXMubGVuZ3RoID0gMDtcbiAgICAgICAgXy5kZWZlcihfaWRsZUNoZWNrKTtcbiAgICAgICAgbWluZGVyLnBvc3RNZXNzYWdlKCdwcm9wYWdhdGlvbnRpY2tlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIF9pc1Byb3BhZ2F0aW5nID0gZmFsc2U7XG4gICAgICAgIG1pbmRlci5wb3N0TWVzc2FnZSgncHJvcGFnYXRpb25jb21wbGV0ZWQnKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gbWluZGVyX2lzUHJvcGFnYXRpbmcoKSB7XG4gICAgcmV0dXJuIF9pc1Byb3BhZ2F0aW5nO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl93aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQoY2FsbGJhY2spIHtcbiAgICBpZiAoX2lzUHJvcGFnYXRpbmcpXG4gICAgICAgIG1pbmRlci5vbmNlKCdwcm9wYWdhdGlvbmNvbXBsZXRlZCcsIGV4ZWN1dGVDYWxsYmFjayk7XG4gICAgZWxzZVxuICAgICAgICBfLmRlZmVyKGV4ZWN1dGVDYWxsYmFjayk7XG5cbiAgICBmdW5jdGlvbiBleGVjdXRlQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmIChfaXNQcm9wYWdhdGluZylcbiAgICAgICAgICAgIG1pbmRlci5vbmNlKCdwcm9wYWdhdGlvbmNvbXBsZXRlZCcsIGV4ZWN1dGVDYWxsYmFjayk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9nZXRDb25uZWN0b3JzKG9uT2ZmKSB7XG4gICAgaWYgKHR5cGVvZiBvbk9mZiA9PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIF9jb25uZWN0b3JzO1xuXG4gICAgcmV0dXJuIF9jb25uZWN0b3JzLmZpbHRlcihmdW5jdGlvbihjbmN0KSB7XG4gICAgICAgIHJldHVybiBjbmN0LmlzT24gPT09IG9uT2ZmO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9kZXN0cm95Q29ubmVjdG9yKGNuY3QpIHtcbiAgICBjbmN0LmRlc3Ryb3koKTtcbiAgICB2YXIgaW5kZXggPSBfY29ubmVjdG9ycy5pbmRleE9mKGNuY3QpO1xuICAgIGlmIChpbmRleCA+PSAwKVxuICAgICAgICBkZWxldGUgX2Nvbm5lY3RvcnNbaW5kZXhdO1xuICAgIGVsc2VcbiAgICAgICAgbG9nZ2VyLndhcm4oJ21pbmRlcjogY29ubmVjdG9yIGRlc3Ryb3llZCB0aGF0IGlzIG5vdCByZWdpc3RlcmVkIGluIG1pbmRlcicpO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9nZXRFeHBhbmRlZENvbm5lY3Rpb25zKG9uT2ZmLCBzZWFyY2hTdHIpIHtcbiAgICB2YXIgY29ubmVjdG9ycyA9IG1pbmRlci5nZXRDb25uZWN0b3JzKG9uT2ZmKTtcbiAgICB2YXIgY29ubmVjdGlvbnMgPSAgY29ubmVjdG9ycy5tYXAoZnVuY3Rpb24oY25jdCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgIGxlZnRTb3VyY2U6IF9nZXRFeHBhbmRlZFNvdXJjZShjbmN0LmRzMSksXG4gICAgICAgICAgICByaWdodFNvdXJjZTogX2dldEV4cGFuZGVkU291cmNlKGNuY3QuZHMyKSxcbiAgICAgICAgICAgIG1vZGU6IGNuY3QubW9kZSxcbiAgICAgICAgICAgIGlzT246IGNuY3QuaXNPblxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgaWYgKGNuY3Qub3B0aW9ucylcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ub3B0aW9ucyA9IGNuY3Qub3B0aW9ucztcblxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9KTtcblxuICAgIGlmIChzZWFyY2hTdHIpXG4gICAgICAgIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGNuY3RuKSB7XG4gICAgICAgICAgICByZXR1cm4gX3NvdXJjZU1hdGNoZXNTdHJpbmcoY25jdG4ubGVmdFNvdXJjZSwgc2VhcmNoU3RyKVxuICAgICAgICAgICAgICAgICAgICB8fCBfc291cmNlTWF0Y2hlc1N0cmluZyhjbmN0bi5yaWdodFNvdXJjZSwgc2VhcmNoU3RyKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY29ubmVjdGlvbnM7XG59XG5cblxuZnVuY3Rpb24gX2dldEV4cGFuZGVkU291cmNlKGRzKSB7XG4gICAgdmFyIHNvdXJjZSA9IFtdO1xuICAgIGlmICh0eXBlb2YgZHMgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoZHMuX21vZGVsICYmIGRzLl9hY2Nlc3NQYXRoKSB7XG4gICAgICAgICAgICBzb3VyY2UudW5zaGlmdChkcy5fYWNjZXNzUGF0aCk7XG4gICAgICAgICAgICBkcyA9IGRzLl9tb2RlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZS51bnNoaWZ0KGRzKTtcbiAgICAgICAgZHMgPSBkcy5faG9zdE9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRzID09ICdvYmplY3QnKSB7XG4gICAgICAgIHNvdXJjZS51bnNoaWZ0KGRzKTtcblxuICAgICAgICBpZiAoZHMub3duZXIpXG4gICAgICAgICAgICBzb3VyY2UudW5zaGlmdChkcy5vd25lcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuXG5mdW5jdGlvbiBfc291cmNlTWF0Y2hlc1N0cmluZyhzb3VyY2UsIG1hdGNoU3RyKSB7XG4gICAgcmV0dXJuIHNvdXJjZS5zb21lKGZ1bmN0aW9uKHNyY05vZGUpIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHNyY05vZGUuY29uc3RydWN0b3IgJiYgc3JjTm9kZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICByZXR1cm4gX3N0cmluZ01hdGNoKGNsYXNzTmFtZSwgbWF0Y2hTdHIpXG4gICAgICAgICAgICAgICAgfHwgX3N0cmluZ01hdGNoKHNyY05vZGUubmFtZSwgbWF0Y2hTdHIpXG4gICAgICAgICAgICAgICAgfHwgX3N0cmluZ01hdGNoKHNyY05vZGUsIG1hdGNoU3RyKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBfc3RyaW5nTWF0Y2goc3RyLCBzdWJzdHIpIHtcbiAgICByZXR1cm4gc3RyICYmIHR5cGVvZiBzdHIgPT0gJ3N0cmluZycgJiYgc3RyLmluZGV4T2Yoc3Vic3RyKSA+PSAwO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9kZXN0cm95KCkge1xuICAgIF9jb25uZWN0b3JzLmZvckVhY2goZnVuY3Rpb24oY25jdCkge1xuICAgICAgICBkZXN0cm95RFMoY25jdC5kczEpO1xuICAgICAgICBkZXN0cm95RFMoY25jdC5kczIpO1xuICAgICAgICBjbmN0LmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICBfbWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICBtaW5kZXIuX2Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95RFMoZHMpIHtcbiAgICAgICAgaWYgKGRzICYmICFkcy5fZGVzdHJveWVkKSBkcy5kZXN0cm95KCk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgcGF0aFV0aWxzID0gcmVxdWlyZSgnLi9wYXRoX3V0aWxzJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByb2Nlc3MgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZXMgZW1pdHRlZCBieSBDb25uZWN0b3Igb2JqZWN0LlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGNoYW5nZURhdGFIYW5kbGVyO1xuXG5cbl8uZXh0ZW5kKGNoYW5nZURhdGFIYW5kbGVyLCB7XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnOiBzZXRUcmFuc2FjdGlvbkZsYWcsXG4gICAgZ2V0VHJhbnNhY3Rpb25GbGFnOiBnZXRUcmFuc2FjdGlvbkZsYWcsXG4gICAgcGFzc1RyYW5zYWN0aW9uRmxhZzogcGFzc1RyYW5zYWN0aW9uRmxhZyxcbiAgICBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZDogcG9zdFRyYW5zYWN0aW9uRmluaXNoZWRcbn0pO1xuXG5cbi8qKlxuICogQ2hhbmdlIGRhdGEgdXNlcyBoaWRkZW4gcHJvcGVydHkgb24gYWNjZXNzb3IgbWV0aG9kcyB0byBwYXNzIGZsYWcgdGhhdCB0aGUgYWNjZXNzb3IgaXMgZXhlY3V0ZWQgYXMgYSBwYXJ0IG9mIGNoYW5nZSB0cmFuc2FjdGlvbi5cbiAqIEFjY2Vzc29yIG1ldGhvZHMgYXJlIHN1cHBvc2VkIHRvIHN0b3JlIHRoaXMgZmxhZyBpbiBhIGxvY2FsIHZhcmlhYmxlIGFuZCB0byBjbGVhciBpdCAoYmVjYXVzZSBhbm90aGVyIGFjY2Vzc29yIGNhbiBiZSBleGVjdXRlZCBpbiBvciBvdXQgb2YgdHJhbnNhY3Rpb24pIHVzaW5nIGBnZXRUcmFuc2FjdGlvbkZsYWdgXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgYWNjZXNzb3IgbWV0aG9kIHJlZmVyZW5jZVxuICogQHBhcmFtIHtCb29sZWFufSBmbGFnIGEgZmxhZyB0byBiZSBzZXRcbiAqL1xuZnVuY3Rpb24gc2V0VHJhbnNhY3Rpb25GbGFnKGZ1bmMsIGZsYWcpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KGZ1bmMsICdfX2luQ2hhbmdlVHJhbnNhY3Rpb24nLCBmbGFnLCBfLkNPTkYgfCBfLldSSVQpO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCBjbGVhcnMgdHJhbnNhY3Rpb24gZmxhZyBmcm9tIGFjY2Vzc29yIG1ldGhvZFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGFjY2Vzc29yIG1ldGhvZCByZWZlcmVuY2VcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRmxhZyhmdW5jKSB7XG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBmdW5jLl9faW5DaGFuZ2VUcmFuc2FjdGlvbjtcbiAgICBkZWxldGUgZnVuYy5fX2luQ2hhbmdlVHJhbnNhY3Rpb247XG4gICAgcmV0dXJuIGluVHJhbnNhY3Rpb247XG59XG5cblxuZnVuY3Rpb24gcGFzc1RyYW5zYWN0aW9uRmxhZyhmcm9tRnVuYywgdG9GdW5jKSB7XG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoZnJvbUZ1bmMpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0b0Z1bmMsIGluVHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBpblRyYW5zYWN0aW9uO1xufVxuXG5cbi8qKlxuICogUG9zdHMgbWVzc2FnZSBvbiB0aGlzIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gdW5sZXNzIGBpbkNoYW5nZVRyYW5zYWN0aW9uYCBpcyBgdHJ1ZWAuXG4gKi9cbmZ1bmN0aW9uIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkKCkge1xuICAgIHRoaXMucG9zdE1lc3NhZ2VTeW5jKCdkYXRhY2hhbmdlcycsIHsgdHJhbnNhY3Rpb246IGZhbHNlLCBjaGFuZ2VzOiBbXSB9KTtcbn1cblxuXG4vKipcbiAqIHN1YnNjcmliZXIgdG8gXCJjaGFuZ2VkYXRhXCIgZXZlbnQgZW1pdHRlZCBieSBbQ29ubmVjdG9yXSguL2Nvbm5lY3Rvci5qcy5odG1sKSBvYmplY3QgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gKiBVc2VkIGJ5IERhdGEgZmFjZXQsIE1vZGVsIGFuZCBNb2RlbFBhdGguIENhbiBiZSB1c2VkIGJ5IGFueSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGdldC9zZXQvZGVsL3NwbGljZSBhcGkgYW5kIHNldHMgZGF0YSBkZWVwbHkgdG8gdGhlIHdob2xlIHRyZWUuXG4gKiBPYmplY3Qgc2hvdWxkIGNhbGwgYGNoYW5nZURhdGFIYW5kbGVyLmluaXRpYWxpemUuY2FsbCh0aGlzKWAgaW4gaXRzIGNvbnN0cnVjdG9yLlxuICogVE9ETzogb3B0aW1pemUgbWVzc2FnZXMgbGlzdCB0byBhdm9pZCBzZXR0aW5nIGR1cGxpY2F0ZSB2YWx1ZXMgZG93biB0aGUgdHJlZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgc2hvdWxkIGJlIFwiY2hhbmdlZGF0YVwiIGhlcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIGJhdGNoIG9mIGRhdGEgY2hhbmdlIGRlc2NpcHRpb24gb2JqZWN0c1xuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGJhY2sgdG8gY2FsbCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkYXRhIGlzIHByb2Nlc3NlZFxuICovXG5mdW5jdGlvbiBjaGFuZ2VEYXRhSGFuZGxlcihtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIHByb2Nlc3NDaGFuZ2VzLmNhbGwodGhpcywgZGF0YS5jaGFuZ2VzLCBjYWxsYmFjayk7XG59XG5cblxuLy8gbWFwIG9mIG1lc3NhZ2UgdHlwZXMgdG8gbWV0aG9kc1xudmFyIENIQU5HRV9UWVBFX1RPX01FVEhPRF9NQVAgPSB7XG4gICAgJ2FkZGVkJzogICAnc2V0JyxcbiAgICAnY2hhbmdlZCc6ICdzZXQnLFxuICAgICdkZWxldGVkJzogJ2RlbCcsXG4gICAgJ3JlbW92ZWQnOiAnZGVsJ1xufTtcblxuXG4vKipcbiAqIFByb2Nlc3NlcyBxdWV1ZWQgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZXMuXG4gKiBQb3N0cyBcImNoYW5nZXN0YXJ0ZWRcIiBhbmQgXCJjaGFuZ2Vjb21wbGV0ZWRcIiBtZXNzYWdlcyBhbmQgY2FsbHMgY2FsbGJhY2tcbiAqXG4gKiBAcGFyYW0ge1tGdW5jdGlvbl19IGNhbGxiYWNrIG9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdpdGggYChudWxsLCBmYWxzZSlgIHBhcmFtZXRlcnMgYmVmb3JlIGNoYW5nZSBwcm9jZXNzaW5nIHN0YXJ0cyBhbmQgYChudWxsLCB0cnVlKWAgYWZ0ZXIgaXQncyBmaW5pc2hlZC5cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NoYW5nZXModHJhbnNhY3Rpb24sIGNhbGxiYWNrKSB7XG4gICAgbm90aWZ5LmNhbGwodGhpcywgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICBwcm9jZXNzVHJhbnNhY3Rpb24uY2FsbCh0aGlzLFxuICAgICAgICBwcmVwYXJlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSkpO1xuICAgIG5vdGlmeS5jYWxsKHRoaXMsIGNhbGxiYWNrLCB0cnVlKTtcbn1cblxuXG5mdW5jdGlvbiBub3RpZnkoY2FsbGJhY2ssIGNoYW5nZUZpbmlzaGVkKSB7XG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbCwgY2hhbmdlRmluaXNoZWQpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoY2hhbmdlRmluaXNoZWQgPyAnY2hhbmdlY29tcGxldGVkJyA6ICdjaGFuZ2VzdGFydGVkJyk7XG59XG5cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBhbGwgbWVzc2FnZXMgZnJvbSB0aGUgdHJhbnNhY3Rpb24gY29tZSBmcm9tIHRoZSBzYW1lIHNvdXJjZS5cbiAqIEhhY2s6IHJldmVyc2VzIHRoZSB0cmFuc2FjdGlvbiBpZiBpdCBjb21lcyBmcm9tIHRoZSBEYXRhIGZhY2V0XG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gdGhlIHRyYW5zYWN0aW9uIChmb3IgY2hhaW5pbmcpXG4gKiBcbiAqIEBwYXJhbSAge0FycmF5fSB0cmFuc2FjdGlvbiB0cmFuc2FjdGlvbiBvZiBkYXRhIGNoYW5nZXNcbiAqIEByZXR1cm4ge0FycmF5fSBcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgIHZhciBzb3VyY2UgPSB0cmFuc2FjdGlvblswXS5zb3VyY2VcbiAgICAgICAgLCBzYW1lU291cmNlID0gdHJ1ZTtcblxuICAgIGlmICh0cmFuc2FjdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxLCBsZW4gPSB0cmFuc2FjdGlvbi5sZW5ndGg7IGkgPCBsZW47IGkrKylcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbltpXS5zb3VyY2UgIT0gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdjaGFuZ2VkYXRhOiBjaGFuZ2VzIGZyb20gZGlmZmVyZW50IHNvdXJjZXMgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24sIHNvdXJjZXM6JywgdHJhbnNhY3Rpb25baV0uc291cmNlLm5hbWUsIHNvdXJjZS5uYW1lKTtcbiAgICAgICAgICAgICAgICBzYW1lU291cmNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc291cmNlID0gdHJhbnNhY3Rpb25baV0uc291cmNlO1xuICAgICAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbn1cblxuXG5mdW5jdGlvbiBwcmVwYXJlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICB2YXIgdG9kbyA9IFtdXG4gICAgICAgICwgcGF0aHNUb1NwbGljZSA9IFtdXG4gICAgICAgICwgcGF0aHNUb0NoYW5nZSA9IFtdXG4gICAgICAgICwgaGFkU3BsaWNlXG4gICAgICAgICwgZXhpdExvb3AgPSB7fTtcblxuXG4gICAgdHJ5IHsgdHJhbnNhY3Rpb24uZm9yRWFjaChjaGVja0NoYW5nZSk7IH1cbiAgICBjYXRjaCAoZSkgeyBpZiAoZSAhPSBleGl0TG9vcCkgdGhyb3cgZTsgfVxuXG4gICAgcmV0dXJuIHRvZG87XG5cblxuICAgIGZ1bmN0aW9uIGNoZWNrQ2hhbmdlKGRhdGEpIHtcbiAgICAgICAgKGRhdGEudHlwZSA9PSAnc3BsaWNlJyA/IGNoZWNrU3BsaWNlIDogY2hlY2tNZXRob2QpKGRhdGEpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY2hlY2tTcGxpY2UoZGF0YSkge1xuICAgICAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoZGF0YS5wYXRoKTtcbiAgICAgICAgdmFyIHBhcmVudFBhdGhDaGFuZ2VkID0gcGF0aHNUb0NoYW5nZS5zb21lKGZ1bmN0aW9uKHBhcmVudFBhdGgpIHtcbiAgICAgICAgICAgIGlmIChwYXJzZWRQYXRoLmxlbmd0aCA8IHBhcmVudFBhdGgubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICByZXR1cm4gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIHBhcnNlZFBhdGgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGFyZW50UGF0aENoYW5nZWQpIHJldHVybjtcblxuICAgICAgICB0b2RvLnB1c2goZGF0YSk7XG5cbiAgICAgICAgaWYgKCEgY29uZmlnLmRlYnVnKSB0aHJvdyBleGl0TG9vcDtcbiAgICAgICAgcGF0aHNUb1NwbGljZS5wdXNoKHBhcnNlZFBhdGgpO1xuICAgICAgICBoYWRTcGxpY2UgPSB0cnVlO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY2hlY2tNZXRob2QoZGF0YSkge1xuICAgICAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoZGF0YS5wYXRoKTtcbiAgICAgICAgdmFyIHBhcmVudFBhdGhTcGxpY2VkID0gcGF0aHNUb1NwbGljZSAmJiBwYXRoc1RvU3BsaWNlLnNvbWUoZnVuY3Rpb24ocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKHBhcnNlZFBhdGgubGVuZ3RoIDw9IHBhcmVudFBhdGgubGVuZ3RoXG4gICAgICAgICAgICAgICAgfHwgcGFyc2VkUGF0aFtwYXJlbnRQYXRoLmxlbmd0aF0uc3ludGF4ICE9ICdhcnJheScpIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBfcGF0aElzUGFyZW50T2YocGFyZW50UGF0aCwgcGFyc2VkUGF0aCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwYXJlbnRQYXRoU3BsaWNlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoaGFkU3BsaWNlKSBsb2dnZXIuZXJyb3IoJ2NoYW5nZWRhdGE6IGNoaWxkIGNoYW5nZSBpcyBleGVjdXRlZCBhZnRlciBzcGxpY2U7IHByb2JhYmx5IGRhdGEgc291cmNlIGRpZCBub3QgZW1pdCBtZXNzYWdlIHdpdGggZGF0YS50eXBlPT1cImZpbmlzaGVkXCInKTtcblxuICAgICAgICB2YXIgcGFyZW50UGF0aENoYW5nZWQgPSBwYXRoc1RvQ2hhbmdlLnNvbWUoZnVuY3Rpb24ocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKHBhcnNlZFBhdGgubGVuZ3RoIDw9IHBhcmVudFBhdGgubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICByZXR1cm4gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIHBhcnNlZFBhdGgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGFyZW50UGF0aENoYW5nZWQpIHJldHVybjtcblxuICAgICAgICBwYXRoc1RvQ2hhbmdlLnB1c2gocGFyc2VkUGF0aCk7XG5cbiAgICAgICAgdG9kby5wdXNoKGRhdGEpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIGNoaWxkUGF0aCkge1xuICAgICAgICByZXR1cm4gcGFyZW50UGF0aC5ldmVyeShmdW5jdGlvbihwYXRoTm9kZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoTm9kZS5wcm9wZXJ0eSA9PSBjaGlsZFBhdGhbaW5kZXhdLnByb3BlcnR5O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcHJvY2Vzc1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdHJhbnNhY3Rpb24uZm9yRWFjaChwcm9jZXNzQ2hhbmdlLCB0aGlzKTtcbiAgICBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZC5jYWxsKHRoaXMsIGZhbHNlKTtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NDaGFuZ2UoZGF0YSkge1xuICAgICAgICB2YXIgbW9kZWxQYXRoID0gdGhpcy5wYXRoKGRhdGEucGF0aCwgZGF0YS50eXBlICE9ICdyZW1vdmVkJyAmJiBkYXRhLnR5cGUgIT0gJ2RlbGV0ZWQnKTtcbiAgICAgICAgaWYgKCEgbW9kZWxQYXRoKSByZXR1cm47XG4gICAgICAgIChkYXRhLnR5cGUgPT0gJ3NwbGljZScgPyBleGVjdXRlU3BsaWNlIDogZXhlY3V0ZU1ldGhvZCkobW9kZWxQYXRoLCBkYXRhKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gZXhlY3V0ZVNwbGljZShtb2RlbFBhdGgsIGRhdGEpIHtcbiAgICB2YXIgaW5kZXggPSBkYXRhLmluZGV4XG4gICAgICAgICwgaG93TWFueSA9IGRhdGEucmVtb3ZlZC5sZW5ndGhcbiAgICAgICAgLCBzcGxpY2VBcmdzID0gW2luZGV4LCBob3dNYW55XTtcblxuICAgIHNwbGljZUFyZ3MgPSBzcGxpY2VBcmdzLmNvbmNhdChkYXRhLm5ld1ZhbHVlLnNsaWNlKGluZGV4LCBpbmRleCArIGRhdGEuYWRkZWRDb3VudCkpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyhtb2RlbFBhdGguc3BsaWNlLCB0cnVlKTtcbiAgICBtb2RlbFBhdGguc3BsaWNlLmFwcGx5KG1vZGVsUGF0aCwgc3BsaWNlQXJncyk7XG59XG5cblxuZnVuY3Rpb24gZXhlY3V0ZU1ldGhvZChtb2RlbFBhdGgsIGRhdGEpIHtcbiAgICB2YXIgbWV0aG9kTmFtZSA9IENIQU5HRV9UWVBFX1RPX01FVEhPRF9NQVBbZGF0YS50eXBlXTtcbiAgICBpZiAobWV0aG9kTmFtZSkge1xuICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWcobW9kZWxQYXRoW21ldGhvZE5hbWVdLCB0cnVlKTtcbiAgICAgICAgbW9kZWxQYXRoW21ldGhvZE5hbWVdKGRhdGEubmV3VmFsdWUpO1xuICAgIH0gZWxzZVxuICAgICAgICBsb2dnZXIuZXJyb3IoJ3Vua25vd24gZGF0YSBjaGFuZ2UgdHlwZScpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWVzc2VuZ2VyID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyJylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGxvZ2dlciA9IHJlcXVpcmUoJy4uL3V0aWwvbG9nZ2VyJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb25uZWN0b3I7XG5cblxudmFyIG1vZGVQYXR0ZXJuID0gL14oXFw8KilcXC0rKFxcPiopJC87XG5cblxuLyoqXG4gKiBDb25uZWN0b3JcbiAqIENsYXNzIHRoYXQgY3JlYXRlcyBjb25uZWN0b3Igb2JqZWN0IGZvciBkYXRhIGNvbm5lY3Rpb24gYmV0d2VlblxuICogdHdvIGRhdGEtc291cmNlc1xuICogRGF0YS1zb3VyY2VzIHNob3VsZCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBBUEk6XG4gKiBnZXQoKSAtIGdldCB2YWx1ZSBmcm9tIGRhdGFzb3VyY2Ugb3IgaXRzIHBhdGhcbiAqIHNldCh2YWx1ZSkgLSBzZXQgdmFsdWUgdG8gZGF0YXNvdXJjZSBvciB0byBpdHMgcGF0aFxuICogb24ocGF0aCwgc3Vic2NyaWJlcikgLSBzdWJzY3JpcHRpb24gdG8gZGF0YSBjaGFuZ2VzIHdpdGggXCIqXCIgc3VwcG9ydFxuICogb2ZmKHBhdGgsIHN1YnNjcmliZXIpXG4gKiBwYXRoKGFjY2Vzc1BhdGgpIC0gdG8gcmV0dXJuIHRoZSBvYmplY3QgdGhhdCBnaXZlcyByZWZlcmVuY2UgdG8gc29tZSBwYXJ0IG9mIGRhdGFzb3VyY2VcbiAqIGFuZCBjb21wbGllcyB3aXRoIHRoYXQgYXBpIHRvby5cbiAqXG4gKiAjIyMjRXZlbnRzIyMjI1xuICpcbiAqIC0gJ3R1cm5lZG9uJyAtIGNvbm5lY3RvciB3YXMgdHVybmVkIG9uXG4gKiAtICd0dXJuZWRvZmYnIC0gY29ubmVjdG9yIHdhcyB0dXJuZWQgb2ZmXG4gKiAtICdjaGFuZ2VzdGFydGVkJyAtIGNoYW5nZSBvbiBjb25uZWN0ZWQgZGF0YXNvdXJjZSBpcyBzdGFydGVkXG4gKiAtICdjaGFuZ2Vjb21wbGV0ZWQnIC0gY2hhbmdlIG9uIGNvbm5lY3RlZCBkYXRhc291cmNlIGlzIGNvbXBsZXRlZFxuICogLSAnZGVzdHJveWVkJyAtIGNvbm5lY3RvciB3YXMgZGVzdHJveWVkXG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBkczEgdGhlIGZpcnN0IGRhdGEgc291cmNlLlxuICogQHBhcmFtIHtTdHJpbmd9IG1vZGUgdGhlIGNvbm5lY3Rpb24gbW9kZSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIGRlcHRoIG9mIGNvbm5lY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmUgJy0+JywgJzw8LScsICc8PDwtPj4+JywgZXRjLlxuICogQHBhcmFtIHtPYmplY3R9IGRzMiB0aGUgc2Vjb25kIGRhdGEgc291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBub3QgaW1wbGVtZW50ZWQgeWV0XG4gKiBAcmV0dXJuIHtDb25uZWN0b3J9IHdoZW4gY2FsbGVkIHdpdGggYG5ld2AsIGNyZWF0ZXMgYSBDb25uZWN0b3Igb2JqZWN0LlxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IoZHMxLCBtb2RlLCBkczIsIG9wdGlvbnMpIHtcbiAgICBzZXR1cE1vZGUuY2FsbCh0aGlzLCBtb2RlKTtcblxuICAgIF8uZXh0ZW5kKHRoaXMsIHtcbiAgICAgICAgZHMxOiBkczEsXG4gICAgICAgIGRzMjogZHMyLFxuICAgICAgICBpc09uOiBmYWxzZSxcbiAgICAgICAgX2NoYW5nZXNRdWV1ZTE6IFtdLFxuICAgICAgICBfY2hhbmdlc1F1ZXVlMjogW10sXG4gICAgICAgIF9tZXNzZW5nZXI6IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKVxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICB2YXIgcGF0aFRyYW5zbGF0aW9uID0gb3B0aW9ucy5wYXRoVHJhbnNsYXRpb247XG4gICAgICAgIGlmIChwYXRoVHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIHBhdGhUcmFuc2xhdGlvbiA9IF8uY2xvbmUocGF0aFRyYW5zbGF0aW9uKTtcbiAgICAgICAgICAgIHZhciBwYXR0ZXJuVHJhbnNsYXRpb24gPSBnZXRQYXR0ZXJuVHJhbnNsYXRpb25zKHBhdGhUcmFuc2xhdGlvbik7XG4gICAgICAgICAgICBfLmV4dGVuZCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGF0aFRyYW5zbGF0aW9uMTogcmV2ZXJzZVRyYW5zbGF0aW9uUnVsZXMocGF0aFRyYW5zbGF0aW9uKSxcbiAgICAgICAgICAgICAgICBwYXRoVHJhbnNsYXRpb24yOiBwYXRoVHJhbnNsYXRpb24sXG4gICAgICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uMTogcmV2ZXJzZVBhdHRlcm5UcmFuc2xhdGlvblJ1bGVzKHBhdHRlcm5UcmFuc2xhdGlvbiksXG4gICAgICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uMjogcGF0dGVyblRyYW5zbGF0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXRhVHJhbnNsYXRpb24gPSBvcHRpb25zLmRhdGFUcmFuc2xhdGlvbjtcbiAgICAgICAgaWYgKGRhdGFUcmFuc2xhdGlvbikge1xuICAgICAgICAgICAgXy5leHRlbmQodGhpcywge1xuICAgICAgICAgICAgICAgIGRhdGFUcmFuc2xhdGlvbjE6IGRhdGFUcmFuc2xhdGlvblsnPC0nXSxcbiAgICAgICAgICAgICAgICBkYXRhVHJhbnNsYXRpb24yOiBkYXRhVHJhbnNsYXRpb25bJy0+J11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRhdGFWYWxpZGF0aW9uID0gb3B0aW9ucy5kYXRhVmFsaWRhdGlvbjtcbiAgICAgICAgaWYgKGRhdGFWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICBfLmV4dGVuZCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgZGF0YVZhbGlkYXRpb24xOiBkYXRhVmFsaWRhdGlvblsnPC0nXSxcbiAgICAgICAgICAgICAgICBkYXRhVmFsaWRhdGlvbjI6IGRhdGFWYWxpZGF0aW9uWyctPiddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudHVybk9uKCk7XG59XG5cblxuZnVuY3Rpb24gc2V0dXBNb2RlKG1vZGUpe1xuICAgIHZhciBwYXJzZWRNb2RlID0gbW9kZS5tYXRjaChtb2RlUGF0dGVybik7XG5cbiAgICBpZiAoISBwYXJzZWRNb2RlKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgdmFyIGRlcHRoMSA9IHBhcnNlZE1vZGVbMV0ubGVuZ3RoXG4gICAgICAgICwgZGVwdGgyID0gcGFyc2VkTW9kZVsyXS5sZW5ndGg7XG5cbiAgICBpZiAoZGVwdGgxICYmIGRlcHRoMiAmJiBkZXB0aDEgIT0gZGVwdGgyKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgaWYgKCEgZGVwdGgxICYmICEgZGVwdGgyKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgXy5leHRlbmQodGhpcywge1xuICAgICAgICBtb2RlOiBtb2RlLFxuICAgICAgICBkZXB0aDE6IGRlcHRoMSxcbiAgICAgICAgZGVwdGgyOiBkZXB0aDIsXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtb2RlUGFyc2VFcnJvcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIENvbm5lY3RvciBtb2RlOiAnICsgbW9kZSk7XG4gICAgfVxufVxuXG5cbl8uZXh0ZW5kUHJvdG8oQ29ubmVjdG9yLCB7XG4gICAgdHVybk9uOiBDb25uZWN0b3IkdHVybk9uLFxuICAgIHR1cm5PZmY6IENvbm5lY3RvciR0dXJuT2ZmLFxuICAgIGRlc3Ryb3k6IENvbm5lY3RvciRkZXN0cm95LFxuICAgIGNoYW5nZU1vZGU6IENvbm5lY3RvciRjaGFuZ2VNb2RlLFxuICAgIGRlZmVyQ2hhbmdlTW9kZTogQ29ubmVjdG9yJGRlZmVyQ2hhbmdlTW9kZVxufSk7XG5cbi8qKlxuICogRnVuY3Rpb24gY2hhbmdlIHRoZSBtb2RlIG9mIHRoZSBjb25uZWN0aW9uXG4gKlxuICogQHBhcmFtIEBwYXJhbSB7U3RyaW5nfSBtb2RlIHRoZSBjb25uZWN0aW9uIG1vZGUgdGhhdCBkZWZpbmVzIHRoZSBkaXJlY3Rpb24gYW5kIHRoZSBkZXB0aCBvZiBjb25uZWN0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICctPicsICc8PC0nLCAnPDw8LT4+PicsIGV0Yy5cbiAqIEByZXR1cm4ge09iamVjdFtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkY2hhbmdlTW9kZShtb2RlKSB7XG4gICAgdGhpcy50dXJuT2ZmKCk7XG4gICAgc2V0dXBNb2RlLmNhbGwodGhpcywgbW9kZSk7XG4gICAgdGhpcy50dXJuT24oKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIGNoYW5nZSB0aGUgbW9kZSBvZiB0aGUgY29ubmVjdGlvblxuICpcbiAqIEBwYXJhbSBAcGFyYW0ge1N0cmluZ30gbW9kZSB0aGUgY29ubmVjdGlvbiBtb2RlIHRoYXQgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIGFuZCB0aGUgZGVwdGggb2YgY29ubmVjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZSAnLT4nLCAnPDwtJywgJzw8PC0+Pj4nLCBldGMuXG4gKiBAcmV0dXJuIHtPYmplY3RbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gQ29ubmVjdG9yJGRlZmVyQ2hhbmdlTW9kZShtb2RlKSB7XG4gICAgXy5kZWZlck1ldGhvZCh0aGlzLCAnY2hhbmdlTW9kZScsIG1vZGUpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCByZXZlcnNlcyB0cmFuc2xhdGlvbiBydWxlcyBmb3IgcGF0aHMgb2YgY29ubmVjdGVkIG9kYXRhIHNvdXJjZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdFtTdHJpbmddfSBydWxlcyBtYXAgb2YgcGF0aHMgZGVmaW5pbmcgdGhlIHRyYW5zbGF0aW9uIHJ1bGVzXG4gKiBAcmV0dXJuIHtPYmplY3RbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZVRyYW5zbGF0aW9uUnVsZXMocnVsZXMpIHtcbiAgICB2YXIgcmV2ZXJzZVJ1bGVzID0ge307XG4gICAgXy5lYWNoS2V5KHJ1bGVzLCBmdW5jdGlvbihwYXRoMl92YWx1ZSwgcGF0aDFfa2V5KSB7XG4gICAgICAgIHJldmVyc2VSdWxlc1twYXRoMl92YWx1ZV0gPSBwYXRoMV9rZXk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldmVyc2VSdWxlcztcbn1cblxuXG5mdW5jdGlvbiBnZXRQYXR0ZXJuVHJhbnNsYXRpb25zKHBhdGhUcmFuc2xhdGlvbikge1xuICAgIHZhciBwYXR0ZXJuVHJhbnNsYXRpb24gPSBbXTtcbiAgICBfLmVhY2hLZXkocGF0aFRyYW5zbGF0aW9uLCBmdW5jdGlvbihwYXRoMl92YWx1ZSwgcGF0aDFfa2V5KSB7XG4gICAgICAgIHZhciBzdGFySW5kZXgxID0gcGF0aDFfa2V5LmluZGV4T2YoJyonKVxuICAgICAgICAgICAgLCBzdGFySW5kZXgyID0gcGF0aDJfdmFsdWUuaW5kZXhPZignKicpO1xuICAgICAgICBpZiAoc3RhckluZGV4MSA+PSAwICYmIHN0YXJJbmRleDIgPj0gMCkgeyAvLyBwYXR0ZXJuIHRyYW5zbGF0aW9uXG4gICAgICAgICAgICBpZiAocGF0aDFfa2V5LnNsaWNlKHN0YXJJbmRleDEpICE9IHBhdGgyX3ZhbHVlLnNsaWNlKHN0YXJJbmRleDIpKVxuICAgICAgICAgICAgICAgIF90aHJvd0ludmFsaWRUcmFuc2xhdGlvbihwYXRoMV9rZXksIHBhdGgyX3ZhbHVlKTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYXRoVHJhbnNsYXRpb25bcGF0aDFfa2V5XTsgICAgICAgICAgICBcblxuICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uLnB1c2goe1xuICAgICAgICAgICAgICAgIGZyb21QYXR0ZXJuOiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKHBhdGgxX2tleSksXG4gICAgICAgICAgICAgICAgZnJvbVN0YXRpY1BhdGg6IF9nZXRTdGF0aWNQYXRoKHBhdGgxX2tleSwgc3RhckluZGV4MSksXG4gICAgICAgICAgICAgICAgdG9QYXR0ZXJuOiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKHBhdGgyX3ZhbHVlKSxcbiAgICAgICAgICAgICAgICB0b1N0YXRpY1BhdGg6IF9nZXRTdGF0aWNQYXRoKHBhdGgyX3ZhbHVlLCBzdGFySW5kZXgyKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhckluZGV4MSA+PSAwIHx8IHN0YXJJbmRleDIgPj0gMCkgLy8gcGF0dGVybiBvbmx5IG9uIG9uZSBzaWRlIG9mIHRyYW5zbGF0aW9uXG4gICAgICAgICAgICBfdGhyb3dJbnZhbGlkVHJhbnNsYXRpb24ocGF0aDFfa2V5LCBwYXRoMl92YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGF0dGVyblRyYW5zbGF0aW9uO1xuXG5cbiAgICBmdW5jdGlvbiBfdGhyb3dJbnZhbGlkVHJhbnNsYXRpb24ocGF0aDEsIHBhdGgyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXR0ZXJuIHRyYW5zbGF0aW9uOiAnICsgcGF0aDEgKyAnLCAnICsgcGF0aDIpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gX2dldFN0YXRpY1BhdGgocGF0aCwgc3RhckluZGV4KSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1tcXC5cXFtdP1xcKi4qJC8sICcnKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmV2ZXJzZVBhdHRlcm5UcmFuc2xhdGlvblJ1bGVzKHBhdHRlcm5UcmFuc2xhdGlvbikge1xuICAgIHJldHVybiBwYXR0ZXJuVHJhbnNsYXRpb24ubWFwKGZ1bmN0aW9uKHB0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcm9tUGF0dGVybjogcHQudG9QYXR0ZXJuLFxuICAgICAgICAgICAgZnJvbVN0YXRpY1BhdGg6IHB0LnRvU3RhdGljUGF0aCxcbiAgICAgICAgICAgIHRvUGF0dGVybjogcHQuZnJvbVBhdHRlcm4sXG4gICAgICAgICAgICB0b1N0YXRpY1BhdGg6IHB0LmZyb21TdGF0aWNQYXRoXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiB0dXJuT25cbiAqIE1ldGhvZCBvZiBDb25uZWN0b3IgdGhhdCBlbmFibGVzIGNvbm5lY3Rpb24gKGlmIGl0IHdhcyBwcmV2aW91c2x5IGRpc2FibGVkKVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkdHVybk9uKCkge1xuICAgIGlmICh0aGlzLmlzT24pXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignZGF0YSBzb3VyY2VzIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCcpO1xuXG4gICAgdmFyIHN1YnNjcmlwdGlvblBhdGggPSB0aGlzLl9zdWJzY3JpcHRpb25QYXRoID1cbiAgICAgICAgbmV3IEFycmF5KHRoaXMuZGVwdGgxIHx8IHRoaXMuZGVwdGgyKS5qb2luKCcqJyk7XG5cbiAgICB2YXIgc3Vic2NyaXB0aW9uUGF0dGVybiA9IHBhdGhVdGlscy5jcmVhdGVSZWdleFBhdGgoc3Vic2NyaXB0aW9uUGF0aCk7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHRoaXMuZGVwdGgxKVxuICAgICAgICB0aGlzLl9saW5rMSA9IGxpbmtEYXRhU291cmNlKCdfbGluazInLCB0aGlzLmRzMiwgdGhpcy5kczEsIHRoaXMuX2NoYW5nZXNRdWV1ZTEsIHRoaXMucGF0aFRyYW5zbGF0aW9uMSwgdGhpcy5wYXR0ZXJuVHJhbnNsYXRpb24xLCB0aGlzLmRhdGFUcmFuc2xhdGlvbjEsIHRoaXMuZGF0YVZhbGlkYXRpb24xKTtcbiAgICBpZiAodGhpcy5kZXB0aDIpXG4gICAgICAgIHRoaXMuX2xpbmsyID0gbGlua0RhdGFTb3VyY2UoJ19saW5rMScsIHRoaXMuZHMxLCB0aGlzLmRzMiwgdGhpcy5fY2hhbmdlc1F1ZXVlMiwgdGhpcy5wYXRoVHJhbnNsYXRpb24yLCB0aGlzLnBhdHRlcm5UcmFuc2xhdGlvbjIsIHRoaXMuZGF0YVRyYW5zbGF0aW9uMiwgdGhpcy5kYXRhVmFsaWRhdGlvbjIpO1xuXG4gICAgdGhpcy5pc09uID0gdHJ1ZTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCd0dXJuZWRvbicpO1xuXG5cbiAgICBmdW5jdGlvbiBsaW5rRGF0YVNvdXJjZShyZXZlcnNlTGluaywgZnJvbURTLCB0b0RTLCBjaGFuZ2VzUXVldWUsIHBhdGhUcmFuc2xhdGlvbiwgcGF0dGVyblRyYW5zbGF0aW9uLCBkYXRhVHJhbnNsYXRpb24sIGRhdGFWYWxpZGF0aW9uKSB7XG4gICAgICAgIGZyb21EUy5vblN5bmMoJ2RhdGFjaGFuZ2VzJywgb25EYXRhKTtcbiAgICAgICAgcmV0dXJuIG9uRGF0YTtcblxuICAgICAgICBmdW5jdGlvbiBvbkRhdGEobWVzc2FnZSwgYmF0Y2gpIHtcbiAgICAgICAgICAgIHZhciBzZW5kRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbjogYmF0Y2gudHJhbnNhY3Rpb25cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmF0Y2guY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uKGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2VQYXRoID0gY2hhbmdlLnBhdGhcbiAgICAgICAgICAgICAgICAgICAgLCB0YXJnZXRQYXRoID0gdHJhbnNsYXRlUGF0aChzb3VyY2VQYXRoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0UGF0aCA9PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgdmFyIGNoYW5nZSA9IF8uY2xvbmUoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICBfLmV4dGVuZChjaGFuZ2UsIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmcm9tRFMsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHRhcmdldFBhdGhcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZURhdGEoc291cmNlUGF0aCwgY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZURhdGEoc291cmNlUGF0aCwgY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoISBjaGFuZ2VzUXVldWUubGVuZ3RoKVxuICAgICAgICAgICAgICAgIF8uZGVmZXIocG9zdENoYW5nZURhdGEpO1xuXG4gICAgICAgICAgICBjaGFuZ2VzUXVldWUucHVzaChzZW5kRGF0YSk7XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gdHJhbnNsYXRlUGF0aChzb3VyY2VQYXRoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGhUcmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHJhbnNsYXRlZFBhdGggPSBwYXRoVHJhbnNsYXRpb25bc291cmNlUGF0aF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGVkUGF0aCkgcmV0dXJuIHRyYW5zbGF0ZWRQYXRoO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhdHRlcm5UcmFuc2xhdGlvbi5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ID0gXy5maW5kKHBhdHRlcm5UcmFuc2xhdGlvbiwgZnVuY3Rpb24ocFRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcFRyYW5zbGF0aW9uLmZyb21QYXR0ZXJuLnRlc3Qoc291cmNlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc2xhdGVkUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZShwdC5mcm9tU3RhdGljUGF0aCwgcHQudG9TdGF0aWNQYXRoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEgKChzdWJzY3JpcHRpb25QYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzdWJzY3JpcHRpb25QYXR0ZXJuLnRlc3Qoc291cmNlUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdWJzY3JpcHRpb25QYXR0ZXJuID09IHNvdXJjZVBhdGgpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZFBhdGggfHwgc291cmNlUGF0aDtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiB0cmFuc2xhdGVEYXRhKHNvdXJjZVBhdGgsIGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhVHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZSA9IGRhdGFUcmFuc2xhdGlvbltzb3VyY2VQYXRoXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0ZSAmJiB0eXBlb2YgdHJhbnNsYXRlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZS5vbGRWYWx1ZSA9IHRyYW5zbGF0ZShjaGFuZ2Uub2xkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlLm5ld1ZhbHVlID0gdHJhbnNsYXRlKGNoYW5nZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICBcbiAgICAgICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlRGF0YShzb3VyY2VQYXRoLCBjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdGVEYXRhKGNoYW5nZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbGlkYXRvcnMgPSBkYXRhVmFsaWRhdGlvbltzb3VyY2VQYXRoXVxuICAgICAgICAgICAgICAgICAgICAgICAgLCBwYXNzZWRDb3VudCA9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICwgYWxyZWFkeUZhaWxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3JzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5mb3JFYWNoKGNhbGxWYWxpZGF0b3IpOyAgIFxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbFZhbGlkYXRvcih2YWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yKGNoYW5nZS5uZXdWYWx1ZSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucGF0aCA9IHNvdXJjZVBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBhbHJlYWR5RmFpbGVkICYmIChlcnIgfHwgcmVzcG9uc2UudmFsaWQpICYmICsrcGFzc2VkQ291bnQgPT0gdmFsaWRhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tRFMucG9zdE1lc3NhZ2UoJ3ZhbGlkYXRlZCcsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoISByZXNwb25zZS52YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21EUy5wb3N0TWVzc2FnZSgndmFsaWRhdGVkJywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gcHJvcGFnYXRlRGF0YShjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBzZW5kRGF0YS5jaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBwb3N0Q2hhbmdlRGF0YSgpIHtcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGVuZGxlc3MgbG9vcCBvZiB1cGRhdGVzIGZvciAyLXdheSBjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHNlbGZbcmV2ZXJzZUxpbmtdKSB2YXIgY2FsbGJhY2sgPSBzdWJzY3JpcHRpb25Td2l0Y2g7XG5cbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNhY3Rpb25zID0gbWVyZ2VUcmFuc2FjdGlvbnMoY2hhbmdlc1F1ZXVlKTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzUXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGRhdGEgY2hhbmdlIGluc3RydWN0aW9uIGFzIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgdG9EUy5wb3N0TWVzc2FnZVN5bmMoJ2NoYW5nZWRhdGEnLCB7IGNoYW5nZXM6IHRyYW5zYWN0aW9uIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBzdWJzY3JpcHRpb25Td2l0Y2goZXJyLCBjaGFuZ2VGaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2YXIgb25PZmYgPSBjaGFuZ2VGaW5pc2hlZCA/ICdvblN5bmMnIDogJ29mZic7XG4gICAgICAgICAgICAgICAgdG9EU1tvbk9mZl0oJ2RhdGFjaGFuZ2VzJywgc2VsZltyZXZlcnNlTGlua10pO1xuXG4gICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBjaGFuZ2VGaW5pc2hlZCA/ICdjaGFuZ2Vjb21wbGV0ZWQnIDogJ2NoYW5nZXN0YXJ0ZWQnO1xuICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UobWVzc2FnZSwgeyBzb3VyY2U6IGZyb21EUywgdGFyZ2V0OiB0b0RTIH0pO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIG1lcmdlVHJhbnNhY3Rpb25zKGJhdGNoZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNhY3Rpb25zID0gW11cbiAgICAgICAgICAgICAgICAgICAgLCBjdXJyZW50VHJhbnNhY3Rpb247XG5cbiAgICAgICAgICAgICAgICBiYXRjaGVzLmZvckVhY2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYmF0Y2gudHJhbnNhY3Rpb24pIGN1cnJlbnRUcmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYmF0Y2guY2hhbmdlcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYmF0Y2gudHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VHJhbnNhY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBlbmRBcnJheShjdXJyZW50VHJhbnNhY3Rpb24sIGJhdGNoLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYW5zYWN0aW9uID0gXy5jbG9uZShiYXRjaC5jaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMucHVzaChjdXJyZW50VHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5wdXNoKGJhdGNoLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vKipcbiAqIHR1cm5PZmZcbiAqIE1ldGhvZCBvZiBDb25uZWN0b3IgdGhhdCBkaXNhYmxlcyBjb25uZWN0aW9uIChpZiBpdCB3YXMgcHJldmlvdXNseSBlbmFibGVkKVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkdHVybk9mZigpIHtcbiAgICBpZiAoISB0aGlzLmlzT24pXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignZGF0YSBzb3VyY2VzIGFyZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZCcpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHVubGlua0RhdGFTb3VyY2UodGhpcy5kczEsICdfbGluazInLCB0aGlzLnBhdGhUcmFuc2xhdGlvbjIpO1xuICAgIHVubGlua0RhdGFTb3VyY2UodGhpcy5kczIsICdfbGluazEnLCB0aGlzLnBhdGhUcmFuc2xhdGlvbjEpO1xuXG4gICAgdGhpcy5pc09uID0gZmFsc2U7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgndHVybmVkb2ZmJyk7XG5cblxuICAgIGZ1bmN0aW9uIHVubGlua0RhdGFTb3VyY2UoZnJvbURTLCBsaW5rTmFtZSwgcGF0aFRyYW5zbGF0aW9uKSB7XG4gICAgICAgIGlmIChzZWxmW2xpbmtOYW1lXSkge1xuICAgICAgICAgICAgZnJvbURTLm9mZignZGF0YWNoYW5nZXMnLCBzZWxmW2xpbmtOYW1lXSk7XG4gICAgICAgICAgICBkZWxldGUgc2VsZltsaW5rTmFtZV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBEZXN0cm95cyBjb25uZWN0b3Igb2JqZWN0IGJ5IHR1cm5pbmcgaXQgb2ZmIGFuZCByZW1vdmluZyByZWZlcmVuY2VzIHRvIGNvbm5lY3RlZCBzb3VyY2VzXG4gKi9cbmZ1bmN0aW9uIENvbm5lY3RvciRkZXN0cm95KCkge1xuICAgIHRoaXMudHVybk9mZigpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ2Rlc3Ryb3llZCcpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5kZXN0cm95KCk7XG4gICAgZGVsZXRlIHRoaXMuZHMxO1xuICAgIGRlbGV0ZSB0aGlzLmRzMjtcbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTW9kZWxQYXRoID0gcmVxdWlyZSgnLi9tX3BhdGgnKVxuICAgICwgc3ludGhlc2l6ZSA9IHJlcXVpcmUoJy4vc3ludGhlc2l6ZScpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgbW9kZWxVdGlscyA9IHJlcXVpcmUoJy4vbW9kZWxfdXRpbHMnKVxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSByZXF1aXJlKCcuL2NoYW5nZV9kYXRhJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4uL21lc3NlbmdlcicpXG4gICAgLCBNZXNzZW5nZXJNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZScpXG4gICAgLCBNb2RlbE1zZ0FQSSA9IHJlcXVpcmUoJy4vbV9tc2dfYXBpJylcbiAgICAsIE1peGluID0gcmVxdWlyZSgnLi4vYWJzdHJhY3QvbWl4aW4nKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsO1xuXG5cbi8qKlxuICogYG1pbG8uTW9kZWxgXG4gKiBNb2RlbCBjbGFzcyBpbnN0YW50aWF0ZXMgb2JqZWN0cyB0aGF0IGFsbG93IGRlZXAgZGF0YSBhY2Nlc3Mgd2l0aCBfX3NhZmUgZ2V0dGVyc19fIHRoYXQgcmV0dXJuIHVuZGVmaW5lZCAocmF0aGVyIHRoYW4gdGhyb3dpbmcgZXhjZXB0aW9uKSB3aGVuIHByb3BlcnRpZXMvaXRlbXMgb2YgdW5leGlzdGluZyBvYmplY3RzL2FycmF5cyBhcmUgcmVxdWVzdGVkIGFuZCBfX3NhZmUgc2V0dGVyc19fIHRoYXQgY3JlYXRlIG9iamVjdCB0cmVlcyB3aGVuIHByb3BlcnRpZXMvaXRlbXMgb2YgdW5leGlzdGluZyBvYmplY3RzL2FycmF5cyBhcmUgc2V0IGFuZCBhbHNvIHBvc3QgbWVzc2FnZXMgdG8gYWxsb3cgc3Vic2NyaXB0aW9uIG9uIGNoYW5nZXMgYW5kIGVuYWJsZSBkYXRhIHJlYWN0aXZpdHkuXG4gKiBSZWFjdGl2aXR5IGlzIGltcGxlbWVtbnRlZCB2aWEgW0Nvbm5lY3Rvcl0oLi9jb25uZWN0b3IuanMuaHRtbCkgdGhhdCBjYW4gYmUgaW5zdGFudGlhdGVkIGVpdGhlciBkaXJlY3RseSBvciB3aXRoIG1vcmUgY29udmVuaWVudCBpbnRlcmZhY2Ugb2YgW21pbG8ubWluZGVyXSguLi9taW5kZXIuanMuaHRtbCkuIEF0IHRoZSBtb21lbnQgbW9kZWwgY2FuIGJlIGNvbm5lY3RlZCB0byBbRGF0YSBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzLmh0bWwpIG9yIHRvIGFub3RoZXIgbW9kZWwgb3IgW01vZGVsUGF0aF0oLi9tX3BhdGguanMuaHRtbCkuXG4gKiBNb2RlbCBjb25zdHJ1Y3RvciByZXR1cm5zIG9iamVjdHMgdGhhdCBhcmUgZnVuY3Rpb25zIGF0IHRoZSBzYW1lIHRpbWU7IHdoZW4gY2FsbGVkIHRoZXkgcmV0dXJuIE1vZGVsUGF0aCBvYmplY3RzIHRoYXQgYWxsb3cgZ2V0L3NldCBhY2Nlc3MgdG8gYW55IHBvaW50IGluIG1vZGVsIGRhdGEuIFNlZSBbTW9kZWxEYXRhXSgjTW9kZWxEYXRhKSBiZWxvdy5cbiAqXG4gKiBZb3UgY2FuIHN1YnNjcmliZSB0byBtb2RlbCBjaGFuZ2VzIHdpdGggYG9uYCBtZXRob2QgYnkgcGFzc2luZyBtb2RlbCBhY2Nlc3MgcGF0aCBpbiBwbGFjZSBvZiBtZXNzYWdlLCBwYXR0ZXJuIG9yIHN0cmluZyB3aXRoIGFueSBudW1iZXIgb2Ygc3RhcnMgdG8gc3Vic2NyaWJlIHRvIGEgY2VydGFpbiBkZXB0aCBpbiBtb2RlbCAoZS5nLiwgYCcqKionYCB0byBzdWJzY3JpYmUgdG8gdGhyZWUgbGV2ZWxzKS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBkYXRhIG9wdGlvbmFsIGluaXRpYWwgYXJyYXkgZGF0YS4gSWYgaXQgaXMgcGxhbm5lZCB0byBjb25uZWN0IG1vZGVsIHRvIHZpZXcgaXQgaXMgdXN1YWxseSBiZXR0ZXIgdG8gaW5zdGFudGlhdGUgYW4gZW1wdHkgTW9kZWwgKGB2YXIgbSA9IG5ldyBNb2RlbGApLCBjb25uZWN0IGl0IHRvIFtDb21wb25lbnRdKC4uL2NvbXBvbmVudHMvY19jbGFzcy5qcy5odG1sKSdzIFtEYXRhIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgKGUuZy4sIGBtaWxvLm1pbmRlcihtLCAnPDwtPj4nLCBjLmRhdGEpO2ApIGFuZCB0aGVuIHNldCB0aGUgbW9kZWwgd2l0aCBgbS5zZXQoZGF0YSlgIC0gdGhlIHZpZXcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBvcHRpb25hbCBvYmplY3QgdGhhdCBob3N0cyBtb2RlbCBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIENhbiBiZSB1c2VkIHdoZW4gbW9kZWwgaXRzZWxmIGlzIHRoZSBjb250ZXh0IG9mIHRoZSBtZXNzYWdlIHN1YnNjcmliZXIgYW5kIHlvdSBuZWVkIHRvIHRyYXZlcnMgdG8gdGhpcyBvYmplY3QgKGFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvIHNldCBhbnkgY29udGV4dCkuIENhbiBhbHNvIGJlIHVzZWQgdG8gcHJveHkgbW9kZWwncyBtZXRob2RzIHRvIHRoZSBob3N0IGxpa2UgW01vZGVsIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL01vZGVsRmFjZXQuanMuaHRtbCkgaXMgZG9pbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBwYXNzIHsgcmVhY3RpdmU6IGZhbHNlIH0gdG8gdXNlIG1vZGVsIHdpdGhvdXQgbWVzc2FnaW5nIHdoZW4gaXQgaXMgbm90IG5lZWRlZCAtIGl0IG1ha2VzIGl0IG11Y2ggZmFzdGVyXG4gKiBAcmV0dXJuIHtNb2RlbH1cbiAqL1xuZnVuY3Rpb24gTW9kZWwoZGF0YSwgaG9zdE9iamVjdCwgb3B0aW9ucykge1xuICAgIC8vIGBtb2RlbGAgd2lsbCBiZSByZXR1cm5lZCBieSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGB0aGlzYC4gYG1vZGVsYFxuICAgIC8vIChgbW9kZWxQYXRoYCBmdW5jdGlvbikgc2hvdWxkIHJldHVybiBhIE1vZGVsUGF0aCBvYmplY3Qgd2l0aCBcInN5bnRoZXNpemVkXCIgbWV0aG9kc1xuICAgIC8vIHRvIGdldC9zZXQgbW9kZWwgcHJvcGVydGllcywgdG8gc3Vic2NyaWJlIHRvIHByb3BlcnR5IGNoYW5nZXMsIGV0Yy5cbiAgICAvLyBBZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiBtb2RlbFBhdGggY2FuIGJlIHVzZWQgaW4gdGhlIHBhdGggdXNpbmcgaW50ZXJwb2xhdGlvbiAtIHNlZSBNb2RlbFBhdGggYmVsb3cuXG4gICAgdmFyIG1vZGVsID0gZnVuY3Rpb24gbW9kZWxQYXRoKGFjY2Vzc1BhdGgpIHsgLy8gLCAuLi4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBpbnRlcnBvbGF0ZWRcbiAgICAgICAgcmV0dXJuIE1vZGVsJHBhdGguYXBwbHkobW9kZWwsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBtb2RlbC5fX3Byb3RvX18gPSBNb2RlbC5wcm90b3R5cGU7XG5cbiAgICBtb2RlbC5faG9zdE9iamVjdCA9IGhvc3RPYmplY3Q7XG4gICAgbW9kZWwuX29wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgaWYgKG1vZGVsLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICBtb2RlbC5fcHJlcGFyZU1lc3NlbmdlcnMoKTtcbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgICAgIG1vZGVsLm9uU3luYygnY2hhbmdlZGF0YScsIGNoYW5nZURhdGFIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSkgbW9kZWwuX2RhdGEgPSBkYXRhO1xuXG4gICAgcmV0dXJuIG1vZGVsO1xufVxuXG5Nb2RlbC5wcm90b3R5cGUuX19wcm90b19fID0gTW9kZWwuX19wcm90b19fO1xuXG5cbi8qKlxuICogIyMjI01vZGVsIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbcGF0aF0oI3BhdGgpIC0gcmV0dXJucyBNb2RlbFBhdGggb2JqZWN0IHRoYXQgYWxsb3dzIGFjY2VzcyB0byBhbnkgcG9pbnQgaW4gTW9kZWxcbiAqIC0gW2dldF0oI01vZGVsJGdldCkgLSBnZXQgbW9kZWwgZGF0YVxuICogLSBzZXQgLSBzZXQgbW9kZWwgZGF0YSwgc3ludGhlc2l6ZWRcbiAqIC0gc3BsaWNlIC0gc3BsaWNlIG1vZGVsIGRhdGEgKGFzIGFycmF5IG9yIHBzZXVkby1hcnJheSksIHN5bnRoZXNpemVkXG4gKiAtIFtsZW5dKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJGxlbikgLSByZXR1cm5zIGxlbmd0aCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBtb2RlbCBpbiBzYWZlIHdheSwgMCBpZiBubyBsZW5ndGggaXMgc2V0XG4gKiAtIFtwdXNoXSguL21fcGF0aC5qcy5odG1sI01vZGVsUGF0aCRwdXNoKSAtIGFkZCBpdGVtcyB0byB0aGUgZW5kIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIG1vZGVsXG4gKiAtIFtwb3BdKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJHBvcCkgLSByZW1vdmUgaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3Vuc2hpZnRdKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJHVuc2hpZnQpIC0gYWRkIGl0ZW1zIHRvIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3NoaWZ0XSguL21fcGF0aC5qcy5odG1sI01vZGVsUGF0aCRzaGlmdCkgLSByZW1vdmUgaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3Byb3h5TWVzc2VuZ2VyXSgjcHJveHlNZXNzZW5nZXIpIC0gcHJveHkgbW9kZWwncyBNZXNzZW5nZXIgbWV0aG9kcyB0byBob3N0IG9iamVjdFxuICogLSBbcHJveHlNZXRob2RzXSgjcHJveHlNZXRob2RzKSAtIHByb3h5IG1vZGVsIG1ldGhvZHMgdG8gaG9zdCBvYmplY3RcbiAqL1xuXy5leHRlbmRQcm90byhNb2RlbCwge1xuICAgIHBhdGg6IE1vZGVsJHBhdGgsXG4gICAgZ2V0OiBNb2RlbCRnZXQsXG4gICAgcHJveHlNZXNzZW5nZXI6IHByb3h5TWVzc2VuZ2VyLCAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbiAgICBwcm94eU1ldGhvZHM6IHByb3h5TWV0aG9kcyxcbiAgICBfcHJlcGFyZU1lc3NlbmdlcnM6IF9wcmVwYXJlTWVzc2VuZ2VycyxcbiAgICBfZ2V0SG9zdE9iamVjdDogX2dldEhvc3RPYmplY3QsXG4gICAgZGVzdHJveTogTW9kZWwkZGVzdHJveVxufSk7XG5cbi8vIHNldCwgZGVsLCBzcGxpY2UgYXJlIGFkZGVkIHRvIG1vZGVsXG5fLmV4dGVuZFByb3RvKE1vZGVsLCBzeW50aGVzaXplLm1vZGVsTWV0aG9kcyk7XG5cblxuLyoqXG4gKiAtIFBhdGg6IE1vZGVsUGF0aCBjbGFzcyBhcyBgbWlsby5Nb2RlbC5QYXRoYFxuICovXG5fLmV4dGVuZChNb2RlbCwge1xuICAgIFBhdGg6IE1vZGVsUGF0aCxcbiAgICB1c2VXaXRoOiBNb2RlbCQkdXNlV2l0aCxcbiAgICBfdXRpbHM6IHtcbiAgICAgICAgcGF0aDogcGF0aFV0aWxzLFxuICAgICAgICBtb2RlbDogbW9kZWxVdGlscyxcbiAgICAgICAgY2hhbmdlRGF0YUhhbmRsZXI6IGNoYW5nZURhdGFIYW5kbGVyXG4gICAgfVxufSk7XG5cblxuLyoqXG4gKiBFeHBvc2UgTWVzc2VuZ2VyIG1ldGhvZHMgb24gRmFjZXQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChNb2RlbCwgTUVTU0VOR0VSX1BST1BFUlRZLCBNZXNzZW5nZXIuZGVmYXVsdE1ldGhvZHMpO1xuXG5cbi8qKlxuICogTW9kZWxQYXRoIG1ldGhvZHMgYWRkZWQgdG8gTW9kZWwgcHJvdG90eXBlXG4gKi9cblsnbGVuJywgJ3B1c2gnLCAncG9wJywgJ3Vuc2hpZnQnLCAnc2hpZnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gTW9kZWxQYXRoLnByb3RvdHlwZVttZXRob2ROYW1lXTtcbiAgICBfLmRlZmluZVByb3BlcnR5KE1vZGVsLnByb3RvdHlwZSwgbWV0aG9kTmFtZSwgbWV0aG9kKTtcbn0pO1xuXG5cbi8qKlxuICogTW9kZWwgaW5zdGFuY2UgbWV0aG9kLlxuICogR2V0IG1vZGVsIGRhdGEuXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbCRnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG59XG5cblxuLyoqXG4gKiBNb2RlbCBpbnN0YW5jZSBtZXRob2QuXG4gKiBSZXR1cm5zIE1vZGVsUGF0aCBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBzYW1lIEFQSSBhcyBtb2RlbCBidXQgYWxsb3dzIGFjY2VzcyB0byBhbnkgcG9pbnQgaW5zaWRlIG1vZGVsIGFzIGRlZmluZWQgYnkgYGFjY2Vzc1BhdGhgLlxuICogU2VlIFtNb2RlbFBhdGhdKC4vbV9wYXRoLmpzLmh0bWwpIGNsYXNzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHN0cmluZyB0aGF0IGRlZmluZXMgcGF0aCB0byBhY2Nlc3MgbW9kZWwuXG4gKiAgUGF0aCBzdHJpbmcgY29uc2lzdHMgb2YgcGFydHMgdG8gZGVmaW5lIGVpdGhlciBwcm9wZXJ0eSBhY2Nlc3MgKGBcIi5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBuYW1lKSBvciBhcnJheSBpdGVtIGFjY2VzcyAoYFwiWzFdXCJgIHRvIGFjY2VzcyBpdGVtIHdpdGggaW5kZXggMSkuXG4gKiAgQWNjZXNzIHBhdGggY2FuIGNvbnRhaW4gYXMgbWFueSBwYXJ0cyBhcyBuZWNlc3NhcnkgKGUuZy4gYFwiLmxpc3RbMF0ubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgYG5hbWVgIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFycmF5IHN0b3JlZCBpbiBwcm9wZXJ0eSBgbGlzdGAuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW50ZXJwb2xhdGVkIHBhdGhzLlxuICogIEUuZy4gYG0ucGF0aChcIlskMV0uJDJcIiwgaWQsIHByb3ApYCByZXR1cm5zIE1vZGVsUGF0aCB0byBhY2Nlc3MgcHJvcGVydHkgd2l0aCBuYW1lIGBwcm9wYCBpbiBhcnJheSBpdGVtIHdpdGggaW5kZXggYGlkYC4gQWx0aG91Z2ggdGhpcyBNb2RlbFBhdGggb2JqZWN0IHdpbGwgd29yayBleGFjdGx5IGFzIGBtKFwiW1wiICsgaWQgKyBcIl0uXCIgKyBwcm9wKWAsIHRoZSBpbnRlcnBvbGF0ZWQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCBhcyBNb2RlbFBhdGggd2l0aCBpbnRlcnBvbGF0aW9uIHdpbGwgbm90IHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMsIHdoaWxlIE1vZGVsUGF0aCB3aXRoIGNvbXB1dGVkIGFjY2VzcyBwYXRoIHdpbGwgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBwYWlyIG9mIHZhbHVlcyBvZiBgaWRgIGFuZCBgcHJvcGAuXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsJHBhdGgoYWNjZXNzUGF0aCkgeyAgLy8gLCAuLi4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBpbnRlcnBvbGF0ZWRcbiAgICBpZiAoISBhY2Nlc3NQYXRoKSByZXR1cm4gdGhpcztcblxuICAgIC8vIFwibnVsbFwiIGlzIGNvbnRleHQgdG8gcGFzcyB0byBNb2RlbFBhdGgsIGZpcnN0IHBhcmFtZXRlciBvZiBiaW5kXG4gICAgLy8gXCJ0aGlzXCIgKG1vZGVsKSBpcyBhZGRlZCBpbiBmcm9udCBvZiBhbGwgYXJndW1lbnRzXG4gICAgXy5zcGxpY2UoYXJndW1lbnRzLCAwLCAwLCBudWxsLCB0aGlzKTtcblxuICAgIC8vIGNhbGxpbmcgTW9kZWxQYXRoIGNvbnN0cnVjdG9yIHdpdGggbmV3IGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHM6IHRoaXMgKG1vZGVsKSwgYWNjZXNzUGF0aCwgLi4uXG4gICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoTW9kZWxQYXRoLCBhcmd1bWVudHMpKTtcbn1cblxuXG4vKipcbiAqIE1vZGVsIGluc3RhbmNlIG1ldGhvZC5cbiAqIFByb3h5IG1vZGVsJ3MgTWVzc2VuZ2VyIG1ldGhvZHMgdG8gaG9zdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1vZGVsSG9zdE9iamVjdCBvcHRpb25hbCBob3N0IG9iamVjdC4gSWYgbm90IHBhc3NlZCwgaG9zdE9iamVjdCBwYXNzZWQgdG8gTW9kZWwgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiBwcm94eU1lc3Nlbmdlcihtb2RlbEhvc3RPYmplY3QpIHtcbiAgICBtb2RlbEhvc3RPYmplY3QgPSBtb2RlbEhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcbiAgICBNaXhpbi5wcm90b3R5cGUuX2NyZWF0ZVByb3h5TWV0aG9kcy5jYWxsKHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzLCBtb2RlbEhvc3RPYmplY3QpO1xufVxuXG5cbnZhciBtb2RlbE1ldGhvZHNUb1Byb3h5ID0gWydwYXRoJywgJ2dldCcsICdzZXQnLCAnZGVsJywgJ3NwbGljZScsICdsZW4nLCAncHVzaCcsICdwb3AnLCAndW5zaGlmdCcsICdzaGlmdCddO1xuXG5cbi8qKlxuICogRXhwb3NlIG1vZGVsIG1ldGhvZHMgb25cbiAqIFNlZSBzYW1lIG1ldGhvZCBpbiBNaXhpbiBjbGFzcyBmb3IgcGFyYW1ldGVycyBtZWFuaW5nXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaG9zdENsYXNzXG4gKiBAcGFyYW0ge1t0eXBlXX0gaW5zdGFuY2VLZXlcbiAqIEBwYXJhbSB7W3R5cGVdfSBtaXhpbk1ldGhvZHMgb3B0aW9uYWxcbiAqL1xuZnVuY3Rpb24gTW9kZWwkJHVzZVdpdGgoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2RzKSB7XG4gICAgbWl4aW5NZXRob2RzID0gbWl4aW5NZXRob2RzIHx8IG1vZGVsTWV0aG9kc1RvUHJveHk7XG4gICAgTWl4aW4udXNlV2l0aC5jYWxsKE1vZGVsLCBob3N0Q2xhc3MsIGluc3RhbmNlS2V5LCBtaXhpbk1ldGhvZHMpO1xufVxuXG5cbi8qKlxuICogTW9kZWwgaW5zdGFuY2UgbWV0aG9kLlxuICogUHJveHkgbW9kZWwgbWV0aG9kcyB0byBob3N0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbW9kZWxIb3N0T2JqZWN0IG9wdGlvbmFsIGhvc3Qgb2JqZWN0LiBJZiBub3QgcGFzc2VkLCBob3N0T2JqZWN0IHBhc3NlZCB0byBNb2RlbCBjb25zdHJ1Y3RvciB3aWxsIGJlIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHByb3h5TWV0aG9kcyhtb2RlbEhvc3RPYmplY3QpIHtcbiAgICBtb2RlbEhvc3RPYmplY3QgPSBtb2RlbEhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcbiAgICBNaXhpbi5wcm90b3R5cGUuX2NyZWF0ZVByb3h5TWV0aG9kcy5jYWxsKHRoaXMsIG1vZGVsTWV0aG9kc1RvUHJveHksIG1vZGVsSG9zdE9iamVjdCk7XG59XG5cblxuLyoqXG4gKiBNb2RlbCBpbnN0YW5jZSBtZXRob2QuXG4gKiBDcmVhdGUgYW5kIGNvbm5lY3QgaW50ZXJuYWwgYW5kIGV4dGVybmFsIG1vZGVsJ3MgbWVzc2VuZ2Vycy5cbiAqIEV4dGVybmFsIG1lc3NlbmdlcidzIG1ldGhvZHMgYXJlIHByb3hpZWQgb24gdGhlIG1vZGVsIGFuZCB0aGV5IGFsbG93cyBcIipcIiBzdWJzY3JpcHRpb25zLlxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcnMoKSB7XG4gICAgLy8gbW9kZWwgd2lsbCBwb3N0IGFsbCBpdHMgY2hhbmdlcyBvbiBpbnRlcm5hbCBtZXNzZW5nZXJcbiAgICB2YXIgaW50ZXJuYWxNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHRoaXMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblxuICAgIC8vIG1lc3NhZ2Ugc291cmNlIHRvIGNvbm5lY3QgaW50ZXJuYWwgbWVzc2VuZ2VyIHRvIGV4dGVybmFsXG4gICAgdmFyIGludGVybmFsTWVzc2VuZ2VyU291cmNlID0gbmV3IE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UodGhpcywgdW5kZWZpbmVkLCBuZXcgTW9kZWxNc2dBUEksIGludGVybmFsTWVzc2VuZ2VyKTtcblxuICAgIC8vIGV4dGVybmFsIG1lc3NlbmdlciB0byB3aGljaCBhbGwgbW9kZWwgdXNlcnMgd2lsbCBzdWJzY3JpYmUsXG4gICAgLy8gdGhhdCB3aWxsIGFsbG93IFwiKlwiIHN1YnNjcmlwdGlvbnMgYW5kIHN1cHBvcnQgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZSBhcGkuXG4gICAgdmFyIGV4dGVybmFsTWVzc2VuZ2VyID0gbmV3IE1lc3Nlbmdlcih0aGlzLCB1bmRlZmluZWQsIGludGVybmFsTWVzc2VuZ2VyU291cmNlKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTUVTU0VOR0VSX1BST1BFUlRZLCBleHRlcm5hbE1lc3Nlbmdlcik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2ludGVybmFsTWVzc2VuZ2VyJywgaW50ZXJuYWxNZXNzZW5nZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRIb3N0T2JqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLl9ob3N0T2JqZWN0O1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsJGRlc3Ryb3koKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pbnRlcm5hbE1lc3Nlbmdlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1lc3NlbmdlclJlZ2V4cEFQSSA9IHJlcXVpcmUoJy4uL21lc3Nlbmdlci9tX2FwaV9yeCcpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogU3ViY2xhc3Mgb2YgTWVzc2VuZ2VyUmVnZXhwQVBJIHRoYXQgaXMgdXNlZCB0byB0cmFuc2xhdGUgbWVzc2FnZXMgb2YgZXh0ZXJuYWwgbWVzc2VuZ2VyIG9mIE1vZGVsIHRvIGludGVybmFsIG1lc3NlbmdlciBvZiBNb2RlbC5cbiAqL1xudmFyIE1vZGVsTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJSZWdleHBBUEksICdNb2RlbE1zZ0FQSScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsTXNnQVBJO1xuXG5cbi8qKlxuICogIyMjI01vZGVsTXNnQVBJIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlXSgjdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKSAtIHRyYW5zbGF0ZXMgc3Vic2NyaXB0aW9uIHBhdGhzIHdpdGggXCIqXCJzIHRvIHJlZ2V4LCBsZWF2aW5nIG90aGVyIHN0cmluZ3MgdW50b3VjaGVkXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTW9kZWxNc2dBUEksIHtcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbn0pO1xuXG5cbi8qKlxuICogTW9kZWxNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBUcmFuc2xhdGVzIHN1YnNjcmlwdGlvbiBwYXRocyB3aXRoIFwiKlwicyB0byByZWdleCwgbGVhdmluZyBvdGhlciBzdHJpbmdzIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzUGF0aCByZWxhdGl2ZSBhY2Nlc3MgcGF0aCB0byBiZSB0cmFuc2xhdGVkXG4gKiBAcmV0dXJuIHtSZWdFeHB8U3RyaW5nfVxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UoYWNjZXNzUGF0aCkge1xuICAgIGlmIChhY2Nlc3NQYXRoIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gYWNjZXNzUGF0aDtcblxuICAgIHJldHVybiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKGFjY2Vzc1BhdGgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3ludGhlc2l6ZSA9IHJlcXVpcmUoJy4vc3ludGhlc2l6ZScpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSByZXF1aXJlKCcuL2NoYW5nZV9kYXRhJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4uL21lc3NlbmdlcicpXG4gICAgLCBNb2RlbFBhdGhNc2dBUEkgPSByZXF1aXJlKCcuL3BhdGhfbXNnX2FwaScpXG4gICAgLCBNZXNzZW5nZXJNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZScpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWxQYXRoO1xuXG5cbi8qKlxuICogYG1pbG8uTW9kZWwuUGF0aGBcbiAqIE1vZGVsUGF0aCBvYmplY3QgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIGFueSBwb2ludCBpbnNpZGUgW01vZGVsXSguL2luZGV4LmpzLmh0bWwpIGFzIGRlZmluZWQgYnkgYGFjY2Vzc1BhdGhgXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge01vZGVsfSBtb2RlbCBNb2RlbCBpbnN0YW5jZSB0aGF0IE1vZGVsUGF0aCBnaXZlcyBhY2Nlc3MgdG8uXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzUGF0aCBzdHJpbmcgdGhhdCBkZWZpbmVzIHBhdGggdG8gYWNjZXNzIG1vZGVsLlxuICogIFBhdGggc3RyaW5nIGNvbnNpc3RzIG9mIHBhcnRzIHRvIGRlZmluZSBlaXRoZXIgcHJvcGVydHkgYWNjZXNzIChgXCIubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgbmFtZSkgb3IgYXJyYXkgaXRlbSBhY2Nlc3MgKGBcIlsxXVwiYCB0byBhY2Nlc3MgaXRlbSB3aXRoIGluZGV4IDEpLlxuICogIEFjY2VzcyBwYXRoIGNhbiBjb250YWluIGFzIG1hbnkgcGFydHMgYXMgbmVjZXNzYXJ5IChlLmcuIGBcIi5saXN0WzBdLm5hbWVcImAgdG8gYWNjZXNzIHByb3BlcnR5IGBuYW1lYCBpbiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhcnJheSBzdG9yZWQgaW4gcHJvcGVydHkgYGxpc3RgLlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWRkaXRpb25hbCBhcmd1bWVudHMgb2YgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGludGVycG9sYXRlZCBwYXRocy5cbiAqICBFLmcuIGBtLnBhdGgoXCJbJDFdLiQyXCIsIGlkLCBwcm9wKWAgcmV0dXJucyBNb2RlbFBhdGggdG8gYWNjZXNzIHByb3BlcnR5IHdpdGggbmFtZSBgcHJvcGAgaW4gYXJyYXkgaXRlbSB3aXRoIGluZGV4IGBpZGAuIEFsdGhvdWdoIHRoaXMgTW9kZWxQYXRoIG9iamVjdCB3aWxsIHdvcmsgZXhhY3RseSBhcyBgbShcIltcIiArIGlkICsgXCJdLlwiICsgcHJvcClgLCB0aGUgaW50ZXJwb2xhdGVkIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgYXMgTW9kZWxQYXRoIHdpdGggaW50ZXJwb2xhdGlvbiB3aWxsIG5vdCBzeW50aGVzaXplIG5ldyBnZXR0ZXJzIGFuZCBzZXR0ZXJzLCB3aGlsZSBNb2RlbFBhdGggd2l0aCBjb21wdXRlZCBhY2Nlc3MgcGF0aCB3aWxsIHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVhY2ggcGFpciBvZiB2YWx1ZXMgb2YgYGlkYCBhbmQgYHByb3BgLlxuICogQHJldHVybiB7TW9kZWxQYXRofVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgobW9kZWwsIHBhdGgpIHsgLy8gLC4uLiAtIGFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBpbnRlcnBvbGF0aW9uXG4gICAgLy8gY2hlY2sobW9kZWwsIE1vZGVsKTtcbiAgICBjaGVjayhwYXRoLCBTdHJpbmcpO1xuXG4gICAgLy8gYG1vZGVsUGF0aGAgd2lsbCBiZSByZXR1cm5lZCBieSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGB0aGlzYC4gYG1vZGVsUGF0aGBcbiAgICAvLyAoYG1vZGVsUGF0aF9wYXRoYCBmdW5jdGlvbikgc2hvdWxkIGFsc28gcmV0dXJuIGEgTW9kZWxQYXRoIG9iamVjdCB3aXRoIFwic3ludGhlc2l6ZWRcIiBtZXRob2RzXG4gICAgLy8gdG8gZ2V0L3NldCBtb2RlbCBwcm9wZXJ0aWVzLCB0byBzdWJzY3JpYmUgdG8gcHJvcGVydHkgY2hhbmdlcywgZXRjLlxuICAgIC8vIEFkZGl0aW9uYWwgYXJndW1lbnRzIG9mIG1vZGVsUGF0aCBjYW4gYmUgdXNlZCBpbiB0aGUgcGF0aCB1c2luZyBpbnRlcnBvbGF0aW9uIC0gc2VlIE1vZGVsUGF0aCBiZWxvdy5cbiAgICB2YXIgbW9kZWxQYXRoID0gZnVuY3Rpb24gbW9kZWxQYXRoX3BhdGgoYWNjZXNzUGF0aCkgeyAvLyAsIC4uLiBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIGludGVycG9sYXRlZFxuICAgICAgICByZXR1cm4gTW9kZWxQYXRoJHBhdGguYXBwbHkobW9kZWxQYXRoLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgbW9kZWxQYXRoLl9fcHJvdG9fXyA9IE1vZGVsUGF0aC5wcm90b3R5cGU7XG5cblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyhtb2RlbFBhdGgsIHtcbiAgICAgICAgX21vZGVsOiBtb2RlbCxcbiAgICAgICAgX3BhdGg6IHBhdGgsXG4gICAgICAgIF9hcmdzOiBfLnNsaWNlKGFyZ3VtZW50cywgMSksIC8vIHBhdGggd2lsbCBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIGFycmF5XG4gICAgICAgIF9vcHRpb25zOiBtb2RlbC5fb3B0aW9uc1xuICAgIH0pO1xuXG4gICAgLy8gcGFyc2UgYWNjZXNzIHBhdGhcbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgocGF0aCk7XG5cbiAgICAvLyBjb21wdXRlIGFjY2VzcyBwYXRoIHN0cmluZ1xuICAgIF8uZGVmaW5lUHJvcGVydHkobW9kZWxQYXRoLCAnX2FjY2Vzc1BhdGgnLCBpbnRlcnBvbGF0ZUFjY2Vzc1BhdGgocGFyc2VkUGF0aCwgbW9kZWxQYXRoLl9hcmdzKSk7XG5cbiAgICBpZiAobW9kZWxQYXRoLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICAvLyBtZXNzZW5nZXIgZmFpbHMgb24gXCIqXCIgc3Vic2NyaXB0aW9uc1xuICAgICAgICBtb2RlbFBhdGguX3ByZXBhcmVNZXNzZW5nZXIoKTtcbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgICAgIG1vZGVsUGF0aC5vblN5bmMoJ2NoYW5nZWRhdGEnLCBjaGFuZ2VEYXRhSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gY29tcGlsaW5nIGdldHRlciBhbmQgc2V0dGVyXG4gICAgdmFyIG1ldGhvZHMgPSBzeW50aGVzaXplKHBhdGgsIHBhcnNlZFBhdGgpO1xuXG4gICAgLy8gYWRkaW5nIG1ldGhvZHMgdG8gbW9kZWwgcGF0aFxuICAgIF8uZGVmaW5lUHJvcGVydGllcyhtb2RlbFBhdGgsIG1ldGhvZHMpO1xuXG4gICAgT2JqZWN0LmZyZWV6ZShtb2RlbFBhdGgpO1xuXG4gICAgcmV0dXJuIG1vZGVsUGF0aDtcbn1cblxuTW9kZWxQYXRoLnByb3RvdHlwZS5fX3Byb3RvX18gPSBNb2RlbFBhdGguX19wcm90b19fO1xuXG5cbi8qKlxuICogSW50ZXJwb2xhdGVzIHBhdGggZWxlbWVudHMgdG8gY29tcHV0ZSByZWFsIHBhdGhcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJzZWRQYXRoIHBhcnNlZCBwYXRoIC0gYXJyYXkgb2YgcGF0aCBub2Rlc1xuICogQHBhcmFtIHtBcnJheX0gYXJncyBwYXRoIGludGVycG9sYXRpb24gYXJndW1lbnRzLCBhcmdzWzBdIGlzIHBhdGggaXRzZWxmXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGludGVycG9sYXRlQWNjZXNzUGF0aChwYXJzZWRQYXRoLCBhcmdzKSB7XG4gICAgcmV0dXJuIHBhcnNlZFBhdGgucmVkdWNlKGZ1bmN0aW9uKGFjY2Vzc1BhdGhTdHIsIGN1cnJOb2RlLCBpbmRleCkge1xuICAgICAgICB2YXIgaW50ZXJwb2xhdGUgPSBjdXJyTm9kZS5pbnRlcnBvbGF0ZTtcbiAgICAgICAgcmV0dXJuIGFjY2Vzc1BhdGhTdHIgK1xuICAgICAgICAgICAgICAgIChpbnRlcnBvbGF0ZVxuICAgICAgICAgICAgICAgICAgICA/IChjdXJyTm9kZS5zeW50YXggPT0gJ2FycmF5J1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnWycgKyBhcmdzW2ludGVycG9sYXRlXSArICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnLicgKyBhcmdzW2ludGVycG9sYXRlXSlcbiAgICAgICAgICAgICAgICAgICAgOiBjdXJyTm9kZS5wcm9wZXJ0eSk7XG4gICAgfSwgJycpO1xufVxuXG5cbi8qKlxuICogIyMjI01vZGVsUGF0aCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW3BhdGhdKCNNb2RlbFBhdGgkcGF0aCkgLSBnaXZlcyBhY2Nlc3MgdG8gcGF0aCBpbnNpZGUgTW9kZWxQYXRoXG4gKiAtIGdldCAtIHN5bnRoZXNpemVkXG4gKiAtIHNldCAtIHN5bnRoZXNpemVkXG4gKiAtIHNwbGljZSAtIHNwbGljZSBtb2RlbCBkYXRhIChhcyBhcnJheSBvciBwc2V1ZG8tYXJyYXkpLCBzeW50aGVzaXplZFxuICogLSBbbGVuXSgjTW9kZWxQYXRoJGxlbikgLSByZXR1cm5zIGxlbmd0aCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBzYWZlIHdheSwgMCBpZiBubyBsZW5ndGggaXMgc2V0XG4gKiAtIFtwdXNoXSgjTW9kZWxQYXRoJHB1c2gpIC0gYWRkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gTW9kZWxQYXRoXG4gKiAtIFtwb3BdKCNNb2RlbFBhdGgkcG9wKSAtIHJlbW92ZSBpdGVtIGZyb20gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqIC0gW3Vuc2hpZnRdKCNNb2RlbFBhdGgkdW5zaGlmdCkgLSBhZGQgaXRlbXMgdG8gdGhlIGJlZ2lubmluZyBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqIC0gW3NoaWZ0XSgjTW9kZWxQYXRoJHNoaWZ0KSAtIHJlbW92ZSBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqL1xuXy5leHRlbmRQcm90byhNb2RlbFBhdGgsIHtcbiAgICBwYXRoOiBNb2RlbFBhdGgkcGF0aCxcbiAgICBsZW46IE1vZGVsUGF0aCRsZW4sXG4gICAgcHVzaDogTW9kZWxQYXRoJHB1c2gsXG4gICAgcG9wOiBNb2RlbFBhdGgkcG9wLFxuICAgIHVuc2hpZnQ6IE1vZGVsUGF0aCR1bnNoaWZ0LFxuICAgIHNoaWZ0OiBNb2RlbFBhdGgkc2hpZnQsXG4gICAgX3ByZXBhcmVNZXNzZW5nZXI6IF9wcmVwYXJlTWVzc2VuZ2VyLFxuICAgIF9nZXREZWZpbml0aW9uOiBfZ2V0RGVmaW5pdGlvbixcbiAgICBkZXN0cm95OiBNb2RlbFBhdGgkZGVzdHJveVxufSk7XG5cblxuXy5leHRlbmQoTW9kZWxQYXRoLCB7XG4gICAgX2NyZWF0ZUZyb21EZWZpbml0aW9uOiBfY3JlYXRlRnJvbURlZmluaXRpb25cbn0pXG5cblxuLyoqXG4gKiBFeHBvc2UgTWVzc2VuZ2VyIG1ldGhvZHMgb24gRmFjZXQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChNb2RlbFBhdGgsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG4vKipcbiAqIE1vZGVsUGF0aCBpbnN0YW5jZSBtZXRob2RcbiAqIEdpdmVzIGFjY2VzcyB0byBwYXRoIGluc2lkZSBNb2RlbFBhdGguIE1ldGhvZCB3b3JrcyBzaW1pbGFybHkgdG8gW3BhdGggbWV0aG9kXSgjTW9kZWwkcGF0aCkgb2YgbW9kZWwsIHVzaW5nIHJlbGF0aXZlIHBhdGhzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHN0cmluZyB0aGF0IGRlZmluZXMgcGF0aCB0byBhY2Nlc3MgbW9kZWwuXG4gKiAgUGF0aCBzdHJpbmcgY29uc2lzdHMgb2YgcGFydHMgdG8gZGVmaW5lIGVpdGhlciBwcm9wZXJ0eSBhY2Nlc3MgKGBcIi5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBuYW1lKSBvciBhcnJheSBpdGVtIGFjY2VzcyAoYFwiWzFdXCJgIHRvIGFjY2VzcyBpdGVtIHdpdGggaW5kZXggMSkuXG4gKiAgQWNjZXNzIHBhdGggY2FuIGNvbnRhaW4gYXMgbWFueSBwYXJ0cyBhcyBuZWNlc3NhcnkgKGUuZy4gYFwiLmxpc3RbMF0ubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgYG5hbWVgIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFycmF5IHN0b3JlZCBpbiBwcm9wZXJ0eSBgbGlzdGAuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW50ZXJwb2xhdGVkIHBhdGhzLlxuICogIEUuZy4gYG0ucGF0aChcIlskMV0uJDJcIiwgaWQsIHByb3ApYCByZXR1cm5zIE1vZGVsUGF0aCB0byBhY2Nlc3MgcHJvcGVydHkgd2l0aCBuYW1lIGBwcm9wYCBpbiBhcnJheSBpdGVtIHdpdGggaW5kZXggYGlkYC4gQWx0aG91Z2ggdGhpcyBNb2RlbFBhdGggb2JqZWN0IHdpbGwgd29yayBleGFjdGx5IGFzIGBtKFwiW1wiICsgaWQgKyBcIl0uXCIgKyBwcm9wKWAsIHRoZSBpbnRlcnBvbGF0ZWQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCBhcyBNb2RlbFBhdGggd2l0aCBpbnRlcnBvbGF0aW9uIHdpbGwgbm90IHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMsIHdoaWxlIE1vZGVsUGF0aCB3aXRoIGNvbXB1dGVkIGFjY2VzcyBwYXRoIHdpbGwgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBwYWlyIG9mIHZhbHVlcyBvZiBgaWRgIGFuZCBgcHJvcGAuXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCRwYXRoKGFjY2Vzc1BhdGgpIHsgIC8vICwgLi4uIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgaW50ZXJwb2xhdGVkXG4gICAgaWYgKCEgYWNjZXNzUGF0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgdGhpc1BhdGhBcmdzQ291bnQgPSB0aGlzLl9hcmdzLmxlbmd0aCAtIDE7XG5cbiAgICBpZiAodGhpc1BhdGhBcmdzQ291bnQgPiAwKSB7Ly8gdGhpcyBwYXRoIGhhcyBpbnRlcnBvbGF0ZWQgYXJndW1lbnRzIHRvb1xuICAgICAgICBhY2Nlc3NQYXRoID0gYWNjZXNzUGF0aC5yZXBsYWNlKC9cXCRbMS05XVswLTldKi9nLCBmdW5jdGlvbihzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiAnJCcgKyAoK3N0ci5zbGljZSgxKSArIHRoaXNQYXRoQXJnc0NvdW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIG5ld1BhdGggPSB0aGlzLl9wYXRoICsgYWNjZXNzUGF0aDtcblxuICAgIC8vIHRoaXMuX21vZGVsIGlzIGFkZGVkIGluIGZyb250IG9mIGFsbCBhcmd1bWVudHMgYXMgdGhlIGZpcnN0IHBhcmFtZXRlclxuICAgIC8vIG9mIE1vZGVsUGF0aCBjb25zdHJ1Y3RvclxuICAgIHZhciBhcmdzID0gW3RoaXMuX21vZGVsLCBuZXdQYXRoXVxuICAgICAgICAgICAgICAgIC5jb25jYXQodGhpcy5fYXJncy5zbGljZSgxKSkgLy8gcmVtb3ZlIG9sZCBwYXRoIGZyb20gX2FyZ3MsIGFzIGl0IGlzIDEgYmFzZWRcbiAgICAgICAgICAgICAgICAuY29uY2F0KF8uc2xpY2UoYXJndW1lbnRzLCAxKSk7IC8vIGFkZCBuZXcgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHNcblxuICAgIC8vIGNhbGxpbmcgTW9kZWxQYXRoIGNvbnN0cnVjdG9yIHdpdGggbmV3IGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHM6IHRoaXMgKG1vZGVsKSwgYWNjZXNzUGF0aCwgLi4uXG4gICAgcmV0dXJuIF8ubmV3QXBwbHkoTW9kZWxQYXRoLCBhcmdzKTtcbn1cblxuXG4vKipcbiAqIE1vZGVsUGF0aCBhbmQgTW9kZWwgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGxlbmd0aCBwcm9wZXJ0eSBhbmQgc2V0cyBpdCB0byAwIGlmIGl0IHdhc24ndCBzZXQuXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkbGVuKCkge1xuICAgIHJldHVybiB0aGlzLnBhdGgoJy5sZW5ndGgnKS5nZXQoKSB8fCAwO1xufVxuXG5cbi8qKlxuICogTW9kZWxQYXRoIGFuZCBNb2RlbCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgaXRlbXMgdG8gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KS4gUmV0dXJucyBuZXcgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGxpc3Qgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGFycmF5IChwc2V1ZG8gYXJyYXkpXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkcHVzaCgpIHsgLy8gYXJndW1lbnRzXG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuKCk7XG4gICAgdmFyIG5ld0xlbmd0aCA9IGxlbmd0aCArIGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICBfLnNwbGljZShhcmd1bWVudHMsIDAsIDAsIGxlbmd0aCwgMCk7XG4gICAgdGhpcy5zcGxpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHJldHVybiBuZXdMZW5ndGg7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyBpdGVtIGZyb20gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KS4gUmV0dXJucyB0aGlzIGl0ZW0uXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkcG9wKCkge1xuICAgIHJldHVybiB0aGlzLnNwbGljZSh0aGlzLmxlbigpIC0gMSwgMSlbMF07XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogSW5zZXJ0cyBpdGVtcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gUmV0dXJucyBuZXcgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGl0ZW1zIHRvIGJlIGluc2VydGVkIGluIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXlcbiAqIEByZXR1cm4ge0ludGVnZXJ9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCR1bnNoaWZ0KCkgeyAvLyBhcmd1bWVudHNcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW4oKTtcbiAgICBsZW5ndGggKz0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIF8uc3BsaWNlKGFyZ3VtZW50cywgMCwgMCwgMCwgMCk7XG4gICAgdGhpcy5zcGxpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHJldHVybiBsZW5ndGg7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyB0aGUgaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkuIFJldHVybnMgdGhpcyBpdGVtLlxuICpcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gTW9kZWxQYXRoJHNoaWZ0KCkgeyAvLyBhcmd1bWVudHNcbiAgICByZXR1cm4gdGhpcy5zcGxpY2UoMCwgMSlbMF07XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBNb2RlbFBhdGggbWVzZW5nZXIgd2l0aCBNb2RlbCdzIG1lc3NlbmdlciBhcyBpdHMgc291cmNlIChbTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZV0oLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZS5qcy5odG1sKSkgYW5kIFtNb2RlbFBhdGhNc2dBUEldKC4vcGF0aF9tc2dfYXBpLmpzLmh0bWwpIGFzIFtNZXNzZW5nZXJBUEldKC4uL21lc3Nlbmdlci9tX2FwaS5qcy5odG1sKVxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcigpIHtcbiAgICB2YXIgbVBhdGhBUEkgPSBuZXcgTW9kZWxQYXRoTXNnQVBJKHRoaXMuX2FjY2Vzc1BhdGgpO1xuXG4gICAgLy8gY3JlYXRlIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UgY29ubmVjdGVkIHRvIE1vZGVsJ3MgbWVzc2VuZ2VyXG4gICAgdmFyIG1vZGVsTWVzc2FnZVNvdXJjZSA9IG5ldyBNZXNzZW5nZXJNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgbVBhdGhBUEksIHRoaXMuX21vZGVsKTtcblxuICAgIC8vIGNyZWF0ZSBtZXNzZW5nZXIgd2l0aCBtb2RlbCBwYXNzZWQgYXMgaG9zdE9iamVjdCAoZGVmYXVsdCBtZXNzYWdlIGRpc3BhdGNoIGNvbnRleHQpXG4gICAgLy8gYW5kIHdpdGhvdXQgcHJveHlpbmcgbWV0aG9kcyAod2UgZG9uJ3Qgd2FudCB0byBwcm94eSB0aGVtIHRvIE1vZGVsKVxuICAgIHZhciBtUGF0aE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgdW5kZWZpbmVkLCBtb2RlbE1lc3NhZ2VTb3VyY2UpO1xuXG4gICAgLy8gc3RvcmUgbWVzc2VuZ2VyIG9uIE1vZGVsUGF0aCBpbnN0YW5jZVxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTUVTU0VOR0VSX1BST1BFUlRZLCBtUGF0aE1lc3Nlbmdlcik7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvYmplY3QgYWxsb3dpbmcgdG8gcmVjcmVhdGUgbW9kZWwgcGF0aFxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gX2dldERlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZWw6IHRoaXMuX21vZGVsLFxuICAgICAgICBwYXRoOiB0aGlzLl9wYXRoLFxuICAgICAgICBhcmdzOiB0aGlzLl9hcmdzXG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBtb2RlbFBhdGggb2JqZWN0IGZyb20gZGVmaW5pdGlvbiBjcmVhdGVkIGJ5IF9nZXREZWZpbml0aW9uXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBkZWZpbml0aW9uXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVGcm9tRGVmaW5pdGlvbihkZWZpbml0aW9uKSB7XG4gICAgY2hlY2soZGVmaW5pdGlvbiwge1xuICAgICAgICBtb2RlbDogRnVuY3Rpb24sIC8vIE1vZGVsXG4gICAgICAgIHBhdGg6IFN0cmluZyxcbiAgICAgICAgYXJnczogQXJyYXlcbiAgICB9KTtcblxuICAgIHZhciBtID0gZGVmaW5pdGlvbi5tb2RlbDtcblxuICAgIHJldHVybiBtLmFwcGx5KG0sIGRlZmluaXRpb24uYXJncyk7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxQYXRoJGRlc3Ryb3koKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbW9kZWxVdGlscyA9IHtcbiAgICBub3JtYWxpemVTcGxpY2VJbmRleDogbm9ybWFsaXplU3BsaWNlSW5kZXhcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbW9kZWxVdGlscztcblxuXG5mdW5jdGlvbiBub3JtYWxpemVTcGxpY2VJbmRleChzcGxpY2VJbmRleCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHNwbGljZUluZGV4ID4gbGVuZ3RoXG4gICAgICAgICAgICA/IGxlbmd0aFxuICAgICAgICAgICAgOiBzcGxpY2VJbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgPyBzcGxpY2VJbmRleFxuICAgICAgICAgICAgICAgIDogc3BsaWNlSW5kZXggKyBsZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gc3BsaWNlSW5kZXggKyBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgOiAwO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWVzc2VuZ2VyQVBJID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21fYXBpJylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxuLyoqXG4gKiBTdWJjbGFzcyBvZiBNZXNzZW5nZXJBUEkgdGhhdCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSBtZXNzYWdlcyBvZiBNZXNzZW5nZXIgb24gTW9kZWxQYXRoIHRvIE1lc3NlbmdlciBvbiBNb2RlbC5cbiAqL1xudmFyIE1vZGVsUGF0aE1zZ0FQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyQVBJLCAnTW9kZWxQYXRoTXNnQVBJJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWxQYXRoTXNnQVBJO1xuXG5cbi8qKlxuICogIyMjI01vZGVsUGF0aE1zZ0FQSSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNpbml0KSAtIGluaXRpYWxpemVzIE1vZGVsUGF0aE1zZ0FQSVxuICogLSBbdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlXSgjdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKSAtIHRyYW5zbGF0ZXMgcmVsYXRpdmUgYWNjZXNzIHBhdGhzIG9mIE1vZGVsUGF0aCB0byBmdWxsIHBhdGggb2YgTW9kZWxcbiAqIC0gW2NyZWF0ZUludGVybmFsRGF0YV0oI2NyZWF0ZUludGVybmFsRGF0YSkgLSBjaGFuZ2VzIHBhdGggaW4gbWVzc2FnZSBvbiBtb2RlbCB0byByZWxhdGl2ZSBwYXRoIGFuZCBhZGRzIGBmdWxsUGF0aGAgcHJvcGVydHkgdG8gbWVzc2FnZSBkYXRhXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTW9kZWxQYXRoTXNnQVBJLCB7XG4gICAgaW5pdDogaW5pdCxcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBjcmVhdGVJbnRlcm5hbERhdGE6IGNyZWF0ZUludGVybmFsRGF0YSxcbn0pO1xuXG5cbi8qKlxuICogTW9kZWxQYXRoTXNnQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IE1lc3NlbmdlckFQSSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcm9vdFBhdGggcm9vdCBwYXRoIG9mIG1vZGVsIHBhdGhcbiAqL1xuZnVuY3Rpb24gaW5pdChyb290UGF0aCkge1xuICAgIE1lc3NlbmdlckFQSS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMucm9vdFBhdGggPSByb290UGF0aDtcbn1cblxuLyoqXG4gKiBNb2RlbFBhdGhNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBUcmFuc2xhdGVzIHJlbGF0aXZlIGFjY2VzcyBwYXRocyBvZiBNb2RlbFBhdGggdG8gZnVsbCBwYXRoIG9mIE1vZGVsLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHJlbGF0aXZlIGFjY2VzcyBwYXRoIHRvIGJlIHRyYW5zbGF0ZWRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAvLyBUT0RPIHNob3VsZCBwcmVwZW5kIFJlZ0V4ZXNcbiAgICAvLyBUT0RPIHNob3VsZCBub3QgcHJlcGVuZCBjaGFuZ2VkYXRhIHRvbz8/P1xuICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICBpZiAobWVzc2FnZSA9PSAnZGF0YWNoYW5nZXMnKVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5yb290UGF0aCArIG1lc3NhZ2U7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGhNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBDaGFuZ2VzIHBhdGggaW4gbWVzc2FnZSBvbiBtb2RlbCB0byByZWxhdGl2ZSBwYXRoIGFuZCBhZGRzIGBmdWxsUGF0aGAgcHJvcGVydHkgdG8gbWVzc2FnZSBkYXRhLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VNZXNzYWdlIGZ1bGwgYWNjZXNzIHBhdGggb24gTW9kZWxcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIHJlbGF0aXZlIGFjY2VzcyBwYXRoIG9uIE1vZGVsUGF0aFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZURhdGEgZGF0YSByZWNlaXZlZCBmcm9tIE1vZGVsLCB3aWxsIGJlIHRyYW5zbGF0ZWQgYXMgZGVzY3JpYmVkIHRvIGJlIGRpc3BhdGNoZWQgdG8gTW9kZWxQYXRoXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBzb3VyY2VEYXRhKSB7XG4gICAgLy8gVE9ETyByZXR1cm4gb24gY2hhbmdlZGF0YSB0b28/Pz9cbiAgICBpZiAobWVzc2FnZSA9PSAnZGF0YWNoYW5nZXMnKSB7XG4gICAgICAgIHZhciBpbnRlcm5hbENoYW5nZXMgPSBzb3VyY2VEYXRhLmNoYW5nZXNcbiAgICAgICAgICAgIC5tYXAodHJ1bmNhdGVDaGFuZ2VQYXRoLCB0aGlzKVxuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihjaGFuZ2UpIHsgcmV0dXJuIGNoYW5nZTsgfSk7XG4gICAgICAgIHZhciBpbnRlcm5hbERhdGEgPSB7XG4gICAgICAgICAgICBjaGFuZ2VzOiBpbnRlcm5hbENoYW5nZXMsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogc291cmNlRGF0YS50cmFuc2FjdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBpbnRlcm5hbERhdGFcbiAgICB9XG5cbiAgICB2YXIgaW50ZXJuYWxEYXRhID0gdHJ1bmNhdGVDaGFuZ2VQYXRoLmNhbGwodGhpcywgc291cmNlRGF0YSk7XG4gICAgcmV0dXJuIGludGVybmFsRGF0YTtcbn1cblxuXG5mdW5jdGlvbiB0cnVuY2F0ZUNoYW5nZVBhdGgoY2hhbmdlKSB7XG4gICAgdmFyIGZ1bGxQYXRoID0gY2hhbmdlLnBhdGhcbiAgICAgICAgLCBwYXRoID0gXy51blByZWZpeChmdWxsUGF0aCwgdGhpcy5yb290UGF0aCk7XG5cbiAgICBpZiAodHlwZW9mIHBhdGggPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIGNoYW5nZSA9IF8uY2xvbmUoY2hhbmdlKTtcbiAgICAgICAgY2hhbmdlLmZ1bGxQYXRoID0gZnVsbFBhdGg7XG4gICAgICAgIGNoYW5nZS5wYXRoID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIDxhIG5hbWU9XCJtb2RlbC1wYXRoXCI+PC9hPlxuLy8gIyMjIG1vZGVsIHBhdGggdXRpbHNcblxudmFyIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cbnZhciBwYXRoVXRpbHMgPSB7XG4gICAgcGFyc2VBY2Nlc3NQYXRoOiBwYXJzZUFjY2Vzc1BhdGgsXG4gICAgY3JlYXRlUmVnZXhQYXRoOiBjcmVhdGVSZWdleFBhdGgsXG4gICAgZ2V0UGF0aE5vZGVLZXk6IGdldFBhdGhOb2RlS2V5LFxuICAgIHdyYXBNZXNzZW5nZXJNZXRob2RzOiB3cmFwTWVzc2VuZ2VyTWV0aG9kc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoVXRpbHM7XG5cblxudmFyIHByb3BlcnR5UGF0aFN5bnRheCA9ICdcXFxcLltBLVphLXpfLV1bQS1aYS16MC05Xy1dKidcbiAgICAsIGFycmF5UGF0aFN5bnRheCA9ICdcXFxcW1swLTldK1xcXFxdJ1xuICAgICwgaW50ZXJwb2xhdGlvblN5bnRheCA9ICdcXFxcJFsxLTldWzAtOV0qJ1xuICAgICwgcHJvcGVydHlJbnRlcnBvbGF0ZVN5bnRheCA9ICdcXFxcLicgKyBpbnRlcnBvbGF0aW9uU3ludGF4XG4gICAgLCBhcnJheUludGVycG9sYXRlU3ludGF4ID0gJ1xcXFxbJyArIGludGVycG9sYXRpb25TeW50YXggKyAnXFxcXF0nXG5cbiAgICAsIHByb3BlcnR5U3RhclN5bnRheCA9ICdcXFxcLlxcXFwqJ1xuICAgICwgYXJyYXlTdGFyU3ludGF4ID0gJ1xcXFxbXFxcXCpcXFxcXSdcbiAgICAsIHN0YXJTeW50YXggPSAnXFxcXConXG5cbiAgICAsIHBhdGhQYXJzZVN5bnRheCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGhTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlQYXRoU3ludGF4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW50ZXJwb2xhdGVTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlJbnRlcnBvbGF0ZVN5bnRheFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCd8JylcbiAgICAsIHBhdGhQYXJzZVBhdHRlcm4gPSBuZXcgUmVnRXhwKHBhdGhQYXJzZVN5bnRheCwgJ2cnKVxuXG4gICAgLCBwYXR0ZXJuUGF0aFBhcnNlU3ludGF4ID0gIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhQYXJzZVN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U3RhclN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5U3RhclN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJTeW50YXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCd8JylcbiAgICAsIHBhdHRlcm5QYXRoUGFyc2VQYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuUGF0aFBhcnNlU3ludGF4LCAnZycpXG5cbiAgICAvLywgdGFyZ2V0UGF0aFBhcnNlUGF0dGVybiA9IC9cXC5bQS1aYS16XVtBLVphLXowLTlfXSp8XFxbWzAtOV0rXFxdfFxcLlxcJFsxLTldWzAtOV0qfFxcW1xcJFsxLTldWzAtOV0qXFxdfFxcJFsxLTldWzAtOV0vZ1xuICAgICwgcGF0aE5vZGVUeXBlcyA9IHtcbiAgICAgICAgJy4nOiB7IHN5bnRheDogJ29iamVjdCcsIGVtcHR5OiAne30nIH0sXG4gICAgICAgICdbJzogeyBzeW50YXg6ICdhcnJheScsIGVtcHR5OiAnW10nfSxcbiAgICAgICAgJyonOiB7IHN5bnRheDogJ21hdGNoJywgZW1wdHk6ICd7fSd9LFxuICAgIH07XG5cbmZ1bmN0aW9uIHBhcnNlQWNjZXNzUGF0aChwYXRoLCBub2RlUGFyc2VQYXR0ZXJuKSB7XG4gICAgbm9kZVBhcnNlUGF0dGVybiA9IG5vZGVQYXJzZVBhdHRlcm4gfHwgcGF0aFBhcnNlUGF0dGVybjtcblxuICAgIHZhciBwYXJzZWRQYXRoID0gW107XG5cbiAgICBpZiAoISBwYXRoKVxuICAgICAgICByZXR1cm4gcGFyc2VkUGF0aDtcblxuICAgIHZhciB1bnBhcnNlZCA9IHBhdGgucmVwbGFjZShub2RlUGFyc2VQYXR0ZXJuLCBmdW5jdGlvbihub2RlU3RyKSB7XG4gICAgICAgIHZhciBwYXRoTm9kZSA9IHsgcHJvcGVydHk6IG5vZGVTdHIgfTtcbiAgICAgICAgXy5leHRlbmQocGF0aE5vZGUsIHBhdGhOb2RlVHlwZXNbbm9kZVN0clswXV0pO1xuICAgICAgICBpZiAobm9kZVN0clsxXSA9PSAnJCcpXG4gICAgICAgICAgICBwYXRoTm9kZS5pbnRlcnBvbGF0ZSA9IGdldFBhdGhOb2RlS2V5KHBhdGhOb2RlLCB0cnVlKTtcblxuICAgICAgICBwYXJzZWRQYXRoLnB1c2gocGF0aE5vZGUpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG4gICAgaWYgKHVucGFyc2VkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luY29ycmVjdCBtb2RlbCBwYXRoOiAnICsgcGF0aCk7XG5cbiAgICByZXR1cm4gcGFyc2VkUGF0aDtcbn1cblxuXG52YXIgbm9kZVJlZ2V4ID0ge1xuICAgICcuKic6IHByb3BlcnR5UGF0aFN5bnRheCxcbiAgICAnWypdJzogYXJyYXlQYXRoU3ludGF4XG59O1xubm9kZVJlZ2V4WycqJ10gPSBub2RlUmVnZXhbJy4qJ10gKyAnfCcgKyBub2RlUmVnZXhbJ1sqXSddO1xuXG5mdW5jdGlvbiBjcmVhdGVSZWdleFBhdGgocGF0aCkge1xuICAgIGNoZWNrKHBhdGgsIE1hdGNoLk9uZU9mKFN0cmluZywgUmVnRXhwKSk7XG5cbiAgICBpZiAocGF0aCBpbnN0YW5jZW9mIFJlZ0V4cCB8fCBwYXRoLmluZGV4T2YoJyonKSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIHBhdGg7XG5cbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgocGF0aCwgcGF0dGVyblBhdGhQYXJzZVBhdHRlcm4pXG4gICAgICAgICwgcmVnZXhTdHIgPSAnXidcbiAgICAgICAgLy8gLCByZWdleFN0ckVuZCA9ICcnXG4gICAgICAgICwgcGF0dGVybnNTdGFydGVkID0gZmFsc2U7XG5cbiAgICBwYXJzZWRQYXRoLmZvckVhY2goZnVuY3Rpb24ocGF0aE5vZGUpIHtcbiAgICAgICAgdmFyIHByb3AgPSBwYXRoTm9kZS5wcm9wZXJ0eVxuICAgICAgICAgICAgLCByZWdleCA9IG5vZGVSZWdleFtwcm9wXTtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZWdleCkge1xuICAgICAgICAgICAgLy8gcmVnZXhTdHIgKz0gJygnICsgcmVnZXg7XG4gICAgICAgICAgICAvLyByZWdleFN0ckVuZCArPSAnfCknO1xuICAgICAgICAgICAgcmVnZXhTdHIgKz0gJygnICsgcmVnZXggKyAnfCknO1xuICAgICAgICAgICAgLy8gcmVnZXhTdHJFbmQgKz0gJ3wpJztcbiAgICAgICAgICAgIHBhdHRlcm5zU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiAocGF0dGVybnNTdGFydGVkKVxuICAgICAgICAgICAgLy8gIHRocm93IG5ldyBFcnJvcignXCIqXCIgcGF0aCBzZWdtZW50IGNhbm5vdCBiZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYXRoOiAnICsgcGF0aCk7XG4gICAgICAgICAgICByZWdleFN0ciArPSBwcm9wLnJlcGxhY2UoLyhcXC58XFxbfFxcXSkvZywgJ1xcXFwkMScpOyAvLyBhZGQgc2xhc2ggaW4gZnJvbnQgb2Ygc3ltYm9scyB0aGF0IGhhdmUgc3BlY2lhbCBtZWFuaW5nIGluIHJlZ2V4XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZ2V4U3RyICs9IC8qIHJlZ2V4U3RyRW5kICsgKi8gJyQnO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocmVnZXhTdHIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IGNvbnN0cnVjdCByZWdleCBmb3IgcGF0aCBwYXR0ZXJuOiAnICsgcGF0aCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIGdldFBhdGhOb2RlS2V5KHBhdGhOb2RlLCBpbnRlcnBvbGF0ZWQpIHtcbiAgICB2YXIgcHJvcCA9IHBhdGhOb2RlLnByb3BlcnR5XG4gICAgICAgICwgc3RhcnRJbmRleCA9IGludGVycG9sYXRlZCA/IDIgOiAxO1xuICAgIHJldHVybiBwYXRoTm9kZS5zeW50YXggPT0gJ2FycmF5J1xuICAgICAgICA/IHByb3Auc2xpY2Uoc3RhcnRJbmRleCwgcHJvcC5sZW5ndGggLSAxKVxuICAgICAgICA6IHByb3Auc2xpY2Uoc3RhcnRJbmRleCk7XG59XG5cblxuLy8gVE9ETyBhbGxvdyBmb3IgbXVsdGlwbGUgbWVzc2FnZXMgaW4gYSBzdHJpbmdcbmZ1bmN0aW9uIHdyYXBNZXNzZW5nZXJNZXRob2RzKG1ldGhvZHNOYW1lcykge1xuICAgIG1ldGhvZHNOYW1lcyA9IG1ldGhvZHNOYW1lcyB8fCBbJ29uJywgJ29mZiddO1xuICAgIHZhciB3cmFwcGVkTWV0aG9kcyA9IF8ubWFwVG9PYmplY3QobWV0aG9kc05hbWVzLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBvcmlnTWV0aG9kID0gdGhpc1ttZXRob2ROYW1lXTtcbiAgICAgICAgLy8gcmVwbGFjaW5nIG1lc3NhZ2Ugc3Vic3JpYmUvdW5zdWJzY3JpYmUvZXRjLiB0byBjb252ZXJ0IFwiKlwiIG1lc3NhZ2UgcGF0dGVybnMgdG8gcmVnZXhwc1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCwgc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgdmFyIHJlZ2V4UGF0aCA9IGNyZWF0ZVJlZ2V4UGF0aChwYXRoKTtcbiAgICAgICAgICAgIG9yaWdNZXRob2QuY2FsbCh0aGlzLCByZWdleFBhdGgsIHN1YnNjcmliZXIpO1xuICAgICAgICB9O1xuICAgIH0sIHRoaXMpO1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB3cmFwcGVkTWV0aG9kcyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXRoVXRpbHMgPSByZXF1aXJlKCcuLi9wYXRoX3V0aWxzJylcbiAgICAsIG1vZGVsVXRpbHMgPSByZXF1aXJlKCcuLi9tb2RlbF91dGlscycpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi8uLi91dGlsL2xvZ2dlcicpXG4gICAgLCBmcyA9IHJlcXVpcmUoJ2ZzJylcbiAgICAsIGRvVCA9IHJlcXVpcmUoJ2RvdCcpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoYW5nZURhdGFIYW5kbGVyID0gcmVxdWlyZSgnLi4vY2hhbmdlX2RhdGEnKVxuICAgICwgZ2V0VHJhbnNhY3Rpb25GbGFnID0gY2hhbmdlRGF0YUhhbmRsZXIuZ2V0VHJhbnNhY3Rpb25GbGFnXG4gICAgLCBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZCA9IGNoYW5nZURhdGFIYW5kbGVyLnBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkO1xuXG5cbi8qKlxuICogVGVtcGxhdGVzIHRvIHN5bnRoZXNpemUgbW9kZWwgZ2V0dGVycyBhbmQgc2V0dGVyc1xuICovXG52YXIgdGVtcGxhdGVzID0ge1xuICAgIGdldDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG5tZXRob2QgPSBmdW5jdGlvbiBnZXQoKSB7XFxuICAgIHZhciBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fTtcXG4gICAgcmV0dXJuIG0ge3t+IGl0LnBhcnNlZFBhdGggOnBhdGhOb2RlIH19XFxuICAgICAgICB7ez8gcGF0aE5vZGUuaW50ZXJwb2xhdGV9fVxcbiAgICAgICAgICAgICYmIChtID0gbVt0aGlzLl9hcmdzWyB7ez0gcGF0aE5vZGUuaW50ZXJwb2xhdGUgfX0gXV0pXFxuICAgICAgICB7ez8/fX1cXG4gICAgICAgICAgICAmJiAobSA9IG17ez0gcGF0aE5vZGUucHJvcGVydHkgfX0pXFxuICAgICAgICB7ez99fSB7e359fTtcXG59O1xcblwiLFxuICAgIHNldDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG57eyMgZGVmLmluY2x1ZGVfZGVmaW5lcyB9fVxcbnt7IyBkZWYuaW5jbHVkZV9jcmVhdGVfdHJlZSB9fVxcblxcblxcbi8qKlxcbiAqIFRlbXBsYXRlIHRoYXQgc3ludGhlc2l6ZXMgc2V0dGVyIGZvciBNb2RlbCBhbmQgZm9yIE1vZGVsUGF0aFxcbiAqL1xcbm1ldGhvZCA9IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidzZXQnIH19XFxuXFxuICAgIHt7IyBkZWYuY3JlYXRlVHJlZTonc2V0JyB9fVxcblxcbiAgICB7e1xcbiAgICAgICAgY3Vyck5vZGUgPSBuZXh0Tm9kZTtcXG4gICAgICAgIGN1cnJQcm9wID0gY3Vyck5vZGUgJiYgY3Vyck5vZGUucHJvcGVydHk7XFxuICAgIH19XFxuXFxuICAgIHt7IC8qIGFzc2lnbiB2YWx1ZSB0byB0aGUgbGFzdCBwcm9wZXJ0eSAqLyB9fVxcbiAgICB7ez8gY3VyclByb3AgfX1cXG4gICAgICAgIHdhc0RlZiA9IHt7IyBkZWYud2FzRGVmaW5lZH19O1xcbiAgICAgICAge3sjIGRlZi5jaGFuZ2VBY2Nlc3NQYXRoIH19XFxuXFxuICAgICAgICB2YXIgb2xkID0gbXt7IyBkZWYuY3VyclByb3AgfX07XFxuXFxuICAgICAgICB7eyAvKiBjbG9uZSB2YWx1ZSB0byBwcmV2ZW50IHNhbWUgcmVmZXJlbmNlIGluIGxpbmtlZCBtb2RlbHMgKi8gfX1cXG4gICAgICAgIG17eyMgZGVmLmN1cnJQcm9wIH19ID0gY2xvbmVUcmVlKHZhbHVlKTtcXG4gICAge3s/fX1cXG5cXG4gICAge3sgLyogYWRkIG1lc3NhZ2UgcmVsYXRlZCB0byB0aGUgbGFzdCBwcm9wZXJ0eSBjaGFuZ2UgKi8gfX1cXG4gICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICBpZiAoISB3YXNEZWYpXFxuICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ2FkZGVkJyxcXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHZhbHVlIH0pO1xcbiAgICAgICAgZWxzZSBpZiAob2xkICE9IHZhbHVlKVxcbiAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGFjY2Vzc1BhdGgsIHR5cGU6ICdjaGFuZ2VkJyxcXG4gICAgICAgICAgICAgICAgb2xkVmFsdWU6IG9sZCwgbmV3VmFsdWU6IHZhbHVlIH0pO1xcblxcbiAgICAgICAge3sgLyogYWRkIG1lc3NhZ2UgcmVsYXRlZCB0byBjaGFuZ2VzIGluIChzdWIpcHJvcGVydGllcyBpbnNpZGUgcmVtb3ZlZCBhbmQgYXNzaWduZWQgdmFsdWUgKi8gfX1cXG4gICAgICAgIGlmICghIHdhc0RlZiB8fCBvbGQgIT0gdmFsdWUpXFxuICAgICAgICAgICAgYWRkVHJlZUNoYW5nZXNNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLFxcbiAgICAgICAgICAgICAgICBhY2Nlc3NQYXRoLCBvbGQsIHZhbHVlKTsgLyogZGVmaW5lZCBpbiB0aGUgZnVuY3Rpb24gdGhhdCBzeW50aGVzaXplcyBNb2RlbFBhdGggc2V0dGVyICovXFxuXFxuICAgICAgICB7eyAvKiBwb3N0IGFsbCBzdG9yZWQgbWVzc2FnZXMgKi8gfX1cXG4gICAgICAgIHt7IyBkZWYucG9zdE1lc3NhZ2VzIH19XFxuICAgIH1cXG59O1xcblwiLFxuICAgIGRlbDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG57eyMgZGVmLmluY2x1ZGVfZGVmaW5lcyB9fVxcbnt7IyBkZWYuaW5jbHVkZV90cmF2ZXJzZV90cmVlIH19XFxuXFxubWV0aG9kID0gZnVuY3Rpb24gZGVsKCkge1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidkZWwnIH19XFxuXFxuICAgIHt7PyBpdC5wYXJzZWRQYXRoLmxlbmd0aCB9fVxcbiAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWUgfX1cXG5cXG4gICAgICAgIHt7XFxuICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gaXQucGFyc2VkUGF0aFtjb3VudF07XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7ICAgICAgIFxcbiAgICAgICAgfX1cXG5cXG4gICAgICAgIGlmICghIHRyZWVEb2VzTm90RXhpc3QgJiYgbSAmJiBtLmhhc093blByb3BlcnR5ICYmIHt7IyBkZWYud2FzRGVmaW5lZH19KSB7XFxuICAgICAgICAgICAgdmFyIG9sZCA9IG17eyMgZGVmLmN1cnJQcm9wIH19O1xcbiAgICAgICAgICAgIGRlbGV0ZSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgICAgICAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG4gICAgICAgICAgICB2YXIgZGlkRGVsZXRlID0gdHJ1ZTtcXG4gICAgICAgIH1cXG4gICAge3s/P319XFxuICAgICAgICBpZiAodHlwZW9mIG0gIT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgICAgICAgICB2YXIgb2xkID0gbTtcXG4gICAgICAgICAgICB7eyMgZGVmLm1vZGVsQWNjZXNzUHJlZml4IH19ID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgIHZhciBkaWREZWxldGUgPSB0cnVlO1xcbiAgICAgICAgfVxcbiAgICB7ez99fVxcblxcbiAgICBpZiAoZGlkRGVsZXRlICYmIHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnZGVsZXRlZCcsIG9sZFZhbHVlOiBvbGQgfSk7XFxuXFxuICAgICAgICBhZGRUcmVlQ2hhbmdlc01lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsXFxuICAgICAgICAgICAgYWNjZXNzUGF0aCwgb2xkLCB1bmRlZmluZWQpOyAvKiBkZWZpbmVkIGluIHRoZSBmdW5jdGlvbiB0aGF0IHN5bnRoZXNpemVzIE1vZGVsUGF0aCBzZXR0ZXIgKi9cXG5cXG4gICAgICAgIHt7IC8qIHBvc3QgYWxsIHN0b3JlZCBtZXNzYWdlcyAqLyB9fVxcbiAgICAgICAge3sjIGRlZi5wb3N0TWVzc2FnZXMgfX1cXG4gICAgfVxcbn07XFxuXCIsXG4gICAgc3BsaWNlOiBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbnt7IyBkZWYuaW5jbHVkZV9kZWZpbmVzIH19XFxue3sjIGRlZi5pbmNsdWRlX2NyZWF0ZV90cmVlIH19XFxue3sjIGRlZi5pbmNsdWRlX3RyYXZlcnNlX3RyZWUgfX1cXG5cXG5tZXRob2QgPSBmdW5jdGlvbiBzcGxpY2Uoc3BsaWNlSW5kZXgsIHNwbGljZUhvd01hbnkpIHsgLyogLC4uLiAtIGV4dHJhIGFyZ3VtZW50cyB0byBzcGxpY2UgaW50byBhcnJheSAqL1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidzcGxpY2UnIH19XFxuXFxuICAgIHZhciBhcmdzTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcXG4gICAgdmFyIGFkZEl0ZW1zID0gYXJnc0xlbiA+IDI7XFxuXFxuICAgIGlmIChhZGRJdGVtcykge1xcbiAgICAgICAge3sgLyogb25seSBjcmVhdGUgbW9kZWwgdHJlZSBpZiBpdGVtcyBhcmUgaW5zZXJ0ZWQgaW4gYXJyYXkgKi8gfX1cXG5cXG4gICAgICAgIHt7IC8qIGlmIG1vZGVsIGlzIHVuZGVmaW5lZCBpdCB3aWxsIGJlIHNldCB0byBhbiBlbXB0eSBhcnJheSAqLyB9fSAgXFxuICAgICAgICB2YXIgdmFsdWUgPSBbXTtcXG4gICAgICAgIHt7IyBkZWYuY3JlYXRlVHJlZTonc3BsaWNlJyB9fVxcblxcbiAgICAgICAge3s/IG5leHROb2RlIH19XFxuICAgICAgICAgICAge3tcXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gbmV4dE5vZGU7XFxuICAgICAgICAgICAgICAgIHZhciBjdXJyUHJvcCA9IGN1cnJOb2RlLnByb3BlcnR5O1xcbiAgICAgICAgICAgICAgICB2YXIgZW1wdHlQcm9wID0gJ1tdJztcXG4gICAgICAgICAgICB9fVxcblxcbiAgICAgICAgICAgIHt7IyBkZWYuY3JlYXRlVHJlZVN0ZXAgfX1cXG4gICAgICAgIHt7P319XFxuXFxuICAgIH0gZWxzZSBpZiAoc3BsaWNlSG93TWFueSA+IDApIHtcXG4gICAgICAgIHt7IC8qIGlmIGl0ZW1zIGFyZSBub3QgaW5zZXJ0ZWQsIG9ubHkgdHJhdmVyc2UgbW9kZWwgdHJlZSBpZiBpdGVtcyBhcmUgZGVsZXRlZCBmcm9tIGFycmF5ICovIH19XFxuICAgICAgICB7ez8gaXQucGFyc2VkUGF0aC5sZW5ndGggfX1cXG4gICAgICAgICAgICB7eyMgZGVmLnRyYXZlcnNlVHJlZSB9fVxcblxcbiAgICAgICAgICAgIHt7XFxuICAgICAgICAgICAgICAgIHZhciBjdXJyTm9kZSA9IGl0LnBhcnNlZFBhdGhbY291bnRdO1xcbiAgICAgICAgICAgICAgICB2YXIgY3VyclByb3AgPSBjdXJyTm9kZS5wcm9wZXJ0eTsgICAgICAgXFxuICAgICAgICAgICAgfX1cXG5cXG4gICAgICAgICAgICB7eyAvKiBleHRyYSBicmFjZSBjbG9zZXMgJ2Vsc2UnIGluIGRlZi50cmF2ZXJzZVRyZWVTdGVwICovIH19XFxuICAgICAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWVTdGVwIH19IH1cXG4gICAgICAgIHt7P319XFxuICAgIH1cXG5cXG4gICAge3sgLyogc3BsaWNlIGl0ZW1zICovIH19XFxuICAgIGlmIChhZGRJdGVtcyB8fCAoISB0cmVlRG9lc05vdEV4aXN0ICYmIG1cXG4gICAgICAgICAgICAmJiBtLmxlbmd0aCA+IHNwbGljZUluZGV4ICkgKSB7XFxuICAgICAgICB2YXIgb2xkTGVuZ3RoID0gbS5sZW5ndGggPSBtLmxlbmd0aCB8fCAwO1xcblxcbiAgICAgICAgYXJndW1lbnRzWzBdID0gc3BsaWNlSW5kZXggPSBub3JtYWxpemVTcGxpY2VJbmRleChzcGxpY2VJbmRleCwgbS5sZW5ndGgpO1xcblxcbiAgICAgICAge3sgLyogY2xvbmUgYWRkZWQgYXJndW1lbnRzIHRvIHByZXZlbnQgc2FtZSByZWZlcmVuY2VzIGluIGxpbmtlZCBtb2RlbHMgKi8gfX1cXG4gICAgICAgIGlmIChhZGRJdGVtcylcXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3NMZW47IGkrKylcXG4gICAgICAgICAgICAgICAgYXJndW1lbnRzW2ldID0gY2xvbmVUcmVlKGFyZ3VtZW50c1tpXSk7XFxuXFxuICAgICAgICB7eyAvKiBhY3R1YWwgc3BsaWNlIGNhbGwgKi8gfX1cXG4gICAgICAgIHZhciByZW1vdmVkID0gQXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShtLCBhcmd1bWVudHMpO1xcblxcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ3NwbGljZScsXFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogc3BsaWNlSW5kZXgsIHJlbW92ZWQ6IHJlbW92ZWQsIGFkZGVkQ291bnQ6IGFkZEl0ZW1zID8gYXJnc0xlbiAtIDIgOiAwLFxcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IG0gfSk7XFxuXFxuICAgICAgICAgICAgaWYgKHJlbW92ZWQgJiYgcmVtb3ZlZC5sZW5ndGgpXFxuICAgICAgICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpbmRleCkge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1QYXRoID0gYWNjZXNzUGF0aCArICdbJyArIChzcGxpY2VJbmRleCArIGluZGV4KSArICddJztcXG4gICAgICAgICAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGl0ZW1QYXRoLCB0eXBlOiAncmVtb3ZlZCcsIG9sZFZhbHVlOiBpdGVtIH0pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlSXNUcmVlKGl0ZW0pKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIGl0ZW1QYXRoLCBpdGVtLCAncmVtb3ZlZCcsICdvbGRWYWx1ZScpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICBpZiAoYWRkSXRlbXMpXFxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJnc0xlbjsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGFyZ3VtZW50c1tpXTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtUGF0aCA9IGFjY2Vzc1BhdGggKyAnWycgKyAoc3BsaWNlSW5kZXggKyBpIC0gMikgKyAnXSc7XFxuICAgICAgICAgICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBpdGVtUGF0aCwgdHlwZTogJ2FkZGVkJywgbmV3VmFsdWU6IGl0ZW0gfSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVJc1RyZWUoaXRlbSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgaXRlbVBhdGgsIGl0ZW0sICdhZGRlZCcsICduZXdWYWx1ZScpO1xcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAge3sgLyogcG9zdCBhbGwgc3RvcmVkIG1lc3NhZ2VzICovIH19XFxuICAgICAgICAgICAge3sjIGRlZi5wb3N0TWVzc2FnZXMgfX1cXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICByZXR1cm4gcmVtb3ZlZCB8fCBbXTtcXG59XFxuXCJcbn07XG5cbnZhciBpbmNsdWRlX2RlZmluZXMgPSBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbi8qKlxcbiAqIEluc2VydHMgaW5pdGlhbGl6YXRpb24gY29kZVxcbiAqL1xcbiB7eyMjIGRlZi5pbml0VmFyczptZXRob2Q6XFxuICAgIHZhciBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fTtcXG4gICAgdmFyIG1lc3NhZ2VzID0gW10sIG1lc3NhZ2VzSGFzaCA9IHt9O1xcbiAgICB2YXIgYWNjZXNzUGF0aCA9ICcnO1xcbiAgICB2YXIgdHJlZURvZXNOb3RFeGlzdDtcXG4gICAgLyogaGFjayB0byBwcmV2ZW50IHNlbmRpbmcgZmluaXNoZWQgZXZlbnRzIHRvIGFsbG93IGZvciBwcm9wYWdhdGlvbiBvZiBiYXRjaGVzIHdpdGhvdXQgc3BsaXR0aW5nIHRoZW0gKi9cXG4gICAgdmFyIGluQ2hhbmdlVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoIHt7PSBtZXRob2QgfX0gKTtcXG4gI319XFxuXFxuLyoqXFxuICogSW5zZXJ0cyB0aGUgYmVnaW5uaW5nIG9mIGZ1bmN0aW9uIGNhbGwgdG8gYWRkIG1lc3NhZ2UgdG8gbGlzdFxcbiAqL1xcbnt7IyMgZGVmLmFkZE1zZzogYWRkQ2hhbmdlTWVzc2FnZShtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCB7IHBhdGg6ICN9fVxcblxcbi8qKlxcbiAqIEluc2VydHMgY3VycmVudCBwcm9wZXJ0eS9pbmRleCBmb3IgYm90aCBub3JtYWwgYW5kIGludGVycG9sYXRlZCBwcm9wZXJ0aWVzL2luZGV4ZXNcXG4gKi9cXG57eyMjIGRlZi5jdXJyUHJvcDp7ez8gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX1bdGhpcy5fYXJnc1sge3s9IGN1cnJOb2RlLmludGVycG9sYXRlIH19IF1de3s/P319e3s9IGN1cnJQcm9wIH19e3s/fX0gI319XFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb25kaXRpb24gdG8gdGVzdCB3aGV0aGVyIG5vcm1hbC9pbnRlcnBvbGF0ZWQgcHJvcGVydHkvaW5kZXggZXhpc3RzXFxuICovXFxue3sjIyBkZWYud2FzRGVmaW5lZDogbS5oYXNPd25Qcm9wZXJ0eShcXG4gICAge3s/IGN1cnJOb2RlLmludGVycG9sYXRlIH19XFxuICAgICAgICB0aGlzLl9hcmdzWyB7ez0gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX0gXVxcbiAgICB7ez8/fX1cXG4gICAgICAgICd7ez0gaXQuZ2V0UGF0aE5vZGVLZXkoY3Vyck5vZGUpIH19J1xcbiAgICB7ez99fVxcbikgI319XFxuXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIHVwZGF0ZSBhY2Nlc3MgcGF0aCBmb3IgY3VycmVudCBwcm9wZXJ0eVxcbiAqIEJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IG9mIGludGVycG9sYXRlZCBwcm9wZXJ0aWVzLCBpdCBjYW4ndCBiZSBjYWxjdWxhdGVkIGluIHRlbXBsYXRlLCBpdCBjYW4gb25seSBiZSBjYWxjdWxhdGVkIGR1cmluZyBhY2Nlc3NvciBjYWxsLlxcbiAqL1xcbnt7IyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGg6XFxuICAgIGFjY2Vzc1BhdGggKz0ge3s/IGN1cnJOb2RlLmludGVycG9sYXRlIH19XFxuICAgICAgICB7ez8gY3Vyck5vZGUuc3ludGF4ID09ICdhcnJheScgfX1cXG4gICAgICAgICAgICAnWycgKyB0aGlzLl9hcmdzWyB7ez0gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX0gXSArICddJztcXG4gICAgICAgIHt7Pz99fVxcbiAgICAgICAgICAgICcuJyArIHRoaXMuX2FyZ3NbIHt7PSBjdXJyTm9kZS5pbnRlcnBvbGF0ZSB9fSBdO1xcbiAgICAgICAge3s/fX1cXG4gICAge3s/P319XFxuICAgICAgICAne3s9IGN1cnJQcm9wIH19JztcXG4gICAge3s/fX1cXG4jfX1cXG5cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gcG9zdCBzdG9yZWQgbWVzc2FnZXNcXG4gKi9cXG57eyMjIGRlZi5wb3N0TWVzc2FnZXM6XFxuICAgIGlmIChtZXNzYWdlcy5sZW5ndGgpIHtcXG4gICAgICAgIHt7IyBkZWYubW9kZWxQb3N0QmF0Y2hDb2RlIH19KCdkYXRhY2hhbmdlcycsIHtcXG4gICAgICAgICAgICBjaGFuZ2VzOiBtZXNzYWdlcyxcXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogaW5DaGFuZ2VUcmFuc2FjdGlvblxcbiAgICAgICAgfSk7XFxuXFxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1zZykge1xcbiAgICAgICAgICAgIHt7IyBkZWYubW9kZWxQb3N0TWVzc2FnZUNvZGUgfX0obXNnLnBhdGgsIG1zZyk7XFxuICAgICAgICB9LCB0aGlzKTtcXG4gICAgfVxcbiN9fVxcblwiXG4gICAgLCBpbmNsdWRlX2NyZWF0ZV90cmVlID0gXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gY3JlYXRlIG1vZGVsIHRyZWUgYXMgbmVjY2Vzc2FyeSBmb3IgYHNldGAgYW5kIGBzcGxpY2VgIGFjY2Vzc29ycyBhbmQgdG8gYWRkIG1lc3NhZ2VzIHRvIHNlbmQgbGlzdCBpZiB0aGUgdHJlZSBjaGFuZ2VzLlxcbiAqL1xcbnt7IyMgZGVmLmNyZWF0ZVRyZWU6bWV0aG9kOlxcbiAgICB2YXIgd2FzRGVmID0gdHJ1ZTtcXG4gICAgdmFyIG9sZCA9IG07XFxuXFxuICAgIHt7IHZhciBlbXB0eVByb3AgPSBpdC5wYXJzZWRQYXRoWzBdICYmIGl0LnBhcnNlZFBhdGhbMF0uZW1wdHk7IH19XFxuICAgIHt7PyBlbXB0eVByb3AgfX1cXG4gICAgICAgIHt7IC8qIGNyZWF0ZSB0b3AgbGV2ZWwgbW9kZWwgaWYgaXQgd2FzIG5vdCBwcmV2aW91c2x5IGRlZmluZWQgKi8gfX1cXG4gICAgICAgIGlmICghIG0pIHtcXG4gICAgICAgICAgICBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuICAgICAgICAgICAgd2FzRGVmID0gZmFsc2U7XFxuXFxuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19ICcnLCB0eXBlOiAnYWRkZWQnLFxcbiAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZTogbSB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIHt7Pz99fVxcbiAgICAgICAge3s/IG1ldGhvZCA9PSAnc3BsaWNlJyB9fVxcbiAgICAgICAgICAgIGlmICghIG0pIHtcXG4gICAgICAgIHt7P319XFxuICAgICAgICAgICAgICAgIG0gPSB7eyMgZGVmLm1vZGVsQWNjZXNzUHJlZml4IH19ID0gY2xvbmVUcmVlKHZhbHVlKTtcXG4gICAgICAgICAgICAgICAgd2FzRGVmID0gdHlwZW9mIG9sZCAhPSAndW5kZWZpbmVkJztcXG4gICAgICAgIHt7PyBtZXRob2QgPT0gJ3NwbGljZScgfX1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB7ez99fSAgICAgICBcXG4gICAge3s/fX1cXG5cXG5cXG4gICAge3sgLyogY3JlYXRlIG1vZGVsIHRyZWUgaWYgaXQgZG9lc24ndCBleGlzdCAqLyB9fVxcbiAgICB7eyAgdmFyIG1vZGVsRGF0YVByb3BlcnR5ID0gJyc7XFxuICAgICAgICB2YXIgbmV4dE5vZGUgPSBpdC5wYXJzZWRQYXRoWzBdO1xcbiAgICAgICAgdmFyIGNvdW50ID0gaXQucGFyc2VkUGF0aC5sZW5ndGggLSAxO1xcblxcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XFxuICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gbmV4dE5vZGU7XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7XFxuICAgICAgICAgICAgbmV4dE5vZGUgPSBpdC5wYXJzZWRQYXRoW2kgKyAxXTtcXG4gICAgICAgICAgICB2YXIgZW1wdHlQcm9wID0gbmV4dE5vZGUgJiYgbmV4dE5vZGUuZW1wdHk7XFxuICAgIH19XFxuXFxuICAgICAgICB7eyMgZGVmLmNyZWF0ZVRyZWVTdGVwIH19XFxuXFxuICAgIHt7ICB9IC8qIGZvciBsb29wICovIH19XFxuI319XFxuXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIGNyZWF0ZSBvbmUgc3RlcCBpbiB0aGUgbW9kZWwgdHJlZVxcbiAqL1xcbnt7IyMgZGVmLmNyZWF0ZVRyZWVTdGVwOlxcbiAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG5cXG4gICAgaWYgKCEge3sjIGRlZi53YXNEZWZpbmVkIH19KSB7IFxcbiAgICAgICAge3sgLyogcHJvcGVydHkgZG9lcyBub3QgZXhpc3QgKi8gfX1cXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuXFxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnYWRkZWQnLCBcXG4gICAgICAgICAgICAgICAgICBuZXdWYWx1ZTogbSB9KTtcXG4gICAgICAgIH1cXG5cXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbXt7IyBkZWYuY3VyclByb3AgfX0gIT0gJ29iamVjdCcpIHtcXG4gICAgICAgIHt7IC8qIHByb3BlcnR5IGlzIG5vdCBvYmplY3QgKi8gfX1cXG4gICAgICAgIHZhciBvbGQgPSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuXFxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnY2hhbmdlZCcsIFxcbiAgICAgICAgICAgICAgICAgIG9sZFZhbHVlOiBvbGQsIG5ld1ZhbHVlOiBtIH0pO1xcbiAgICAgICAgfVxcblxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAge3sgLyogcHJvcGVydHkgZXhpc3RzLCBqdXN0IHRyYXZlcnNlIGRvd24gdGhlIG1vZGVsIHRyZWUgKi8gfX1cXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgfVxcbiN9fVxcblwiXG4gICAgLCBpbmNsdWRlX3RyYXZlcnNlX3RyZWUgPSBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byB0cmF2ZXJzZSBtb2RlbCB0cmVlIGZvciBgZGVsZXRlYCBhbmQgYHNwbGljZWAgYWNjZXNzb3JzLlxcbiAqL1xcbnt7IyMgZGVmLnRyYXZlcnNlVHJlZTpcXG4gICAge3sgXFxuICAgICAgICB2YXIgY291bnQgPSBpdC5wYXJzZWRQYXRoLmxlbmd0aC0xO1xcblxcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7IFxcbiAgICAgICAgICAgIHZhciBjdXJyTm9kZSA9IGl0LnBhcnNlZFBhdGhbaV07XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7XFxuICAgIH19XFxuICAgICAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWVTdGVwIH19XFxuXFxuICAgIHt7IH0gLyogZm9yIGxvb3AgKi9cXG5cXG4gICAgICAgIHZhciBpID0gY291bnQ7XFxuICAgICAgICB3aGlsZSAoaS0tKSB7IC8qIGNsb3NpbmcgYnJhY2VzIGZvciBlbHNlJ3MgYWJvdmUgKi9cXG4gICAgfX1cXG4gICAgICAgICAgICB9XFxuICAgIHt7IH0gLyogd2hpbGUgbG9vcCAqLyB9fVxcbiN9fVxcblxcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byB0cmF2ZXJzZSBvbmUgc3RlcCBpbiB0aGUgbW9kZWwgdHJlZVxcbiAqL1xcbnt7IyMgZGVmLnRyYXZlcnNlVHJlZVN0ZXA6XFxuICAgIGlmICghIChtICYmIG0uaGFzT3duUHJvcGVydHkgJiYge3sjIGRlZi53YXNEZWZpbmVkfX0gKSApXFxuICAgICAgICB0cmVlRG9lc05vdEV4aXN0ID0gdHJ1ZTtcXG4gICAgZWxzZSB7XFxuICAgICAgICBtID0gbXt7IyBkZWYuY3VyclByb3AgfX07XFxuICAgICAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG4gICAge3sgLyogYnJhY2UgZnJvbSBlbHNlIGlzIG5vdCBjbG9zZWQgb24gcHVycG9zZSAtIGFsbCBicmFjZXMgYXJlIGNsb3NlZCBpbiB3aGlsZSBsb29wICovIH19XFxuI319XFxuXCI7XG5cbnZhciBkb3REZWYgPSB7XG4gICAgaW5jbHVkZV9kZWZpbmVzOiBpbmNsdWRlX2RlZmluZXMsXG4gICAgaW5jbHVkZV9jcmVhdGVfdHJlZTogaW5jbHVkZV9jcmVhdGVfdHJlZSxcbiAgICBpbmNsdWRlX3RyYXZlcnNlX3RyZWU6IGluY2x1ZGVfdHJhdmVyc2VfdHJlZSxcbiAgICBnZXRQYXRoTm9kZUtleTogcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5LFxuICAgIG1vZGVsQWNjZXNzUHJlZml4OiAndGhpcy5fbW9kZWwuX2RhdGEnLFxuICAgIG1vZGVsUG9zdE1lc3NhZ2VDb2RlOiAndGhpcy5fbW9kZWwuX2ludGVybmFsTWVzc2VuZ2VyLnBvc3RNZXNzYWdlJyxcbiAgICBtb2RlbFBvc3RCYXRjaENvZGU6ICd0aGlzLl9tb2RlbC5wb3N0TWVzc2FnZVN5bmMnLFxuICAgIGludGVybmFsTWVzc2VuZ2VyOiAndGhpcy5fbW9kZWwuX2ludGVybmFsTWVzc2VuZ2VyJ1xufTtcblxudmFyIG1vZGVsRG90RGVmID0gXyhkb3REZWYpLmNsb25lKCkuZXh0ZW5kKHtcbiAgICBtb2RlbEFjY2Vzc1ByZWZpeDogJ3RoaXMuX2RhdGEnLFxuICAgIG1vZGVsUG9zdE1lc3NhZ2VDb2RlOiAndGhpcy5faW50ZXJuYWxNZXNzZW5nZXIucG9zdE1lc3NhZ2UnLFxuICAgIG1vZGVsUG9zdEJhdGNoQ29kZTogJ3RoaXMucG9zdE1lc3NhZ2VTeW5jJyxcbiAgICBpbnRlcm5hbE1lc3NlbmdlcjogJ3RoaXMuX2ludGVybmFsTWVzc2VuZ2VyJ1xufSkuXygpO1xuXG5cbnZhciBkb3RTZXR0aW5ncyA9IF8uY2xvbmUoZG9ULnRlbXBsYXRlU2V0dGluZ3MpO1xuZG90U2V0dGluZ3Muc3RyaXAgPSBmYWxzZTtcblxudmFyIHN5bnRoZXNpemVycyA9IF8ubWFwS2V5cyh0ZW1wbGF0ZXMsIGZ1bmN0aW9uKHRtcGwpIHtcbiAgICByZXR1cm4gZG9ULnRlbXBsYXRlKHRtcGwsIGRvdFNldHRpbmdzLCBkb3REZWYpOyBcbn0pO1xuXG5cbnZhciBtb2RlbFN5bnRoZXNpemVycyA9IF8ubWFwVG9PYmplY3QoWydzZXQnLCAnZGVsJywgJ3NwbGljZSddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIGRvVC50ZW1wbGF0ZSh0ZW1wbGF0ZXNbbWV0aG9kTmFtZV0sIGRvdFNldHRpbmdzLCBtb2RlbERvdERlZik7XG59KTtcblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgc3ludGhlc2l6ZXMgYWNjZXNzb3IgbWV0aG9kcy5cbiAqIEZ1bmN0aW9uIGlzIG1lbW9pemVkIHNvIGFjY2Vzc29ycyBhcmUgY2FjaGVkICh1cCB0byAxMDAwKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBNb2RlbC9Nb2RlbFBhdGggYWNjZXNzIHBhdGhcbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnNlZFBhdGggYXJyYXkgb2YgcGF0aCBub2Rlc1xuICogQHJldHVybiB7T2JqZWN0W0Z1bmN0aW9uXX1cbiAqL1xudmFyIHN5bnRoZXNpemVQYXRoTWV0aG9kcyA9IF8ubWVtb2l6ZShfc3ludGhlc2l6ZVBhdGhNZXRob2RzLCB1bmRlZmluZWQsIDEwMDApO1xuXG5mdW5jdGlvbiBfc3ludGhlc2l6ZVBhdGhNZXRob2RzKHBhdGgsIHBhcnNlZFBhdGgpIHtcbiAgICB2YXIgbWV0aG9kcyA9IF8ubWFwS2V5cyhzeW50aGVzaXplcnMsIGZ1bmN0aW9uKHN5bnRoc3pyKSB7XG4gICAgICAgIHJldHVybiBfc3ludGhlc2l6ZShzeW50aHN6ciwgcGF0aCwgcGFyc2VkUGF0aCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1ldGhvZHM7XG59XG5cblxudmFyIG5vcm1hbGl6ZVNwbGljZUluZGV4ID0gbW9kZWxVdGlscy5ub3JtYWxpemVTcGxpY2VJbmRleDsgLy8gdXNlZCBpbiBzcGxpY2UuZG90LmpzXG5cblxuZnVuY3Rpb24gX3N5bnRoZXNpemUoc3ludGhlc2l6ZXIsIHBhdGgsIHBhcnNlZFBhdGgpIHtcbiAgICB2YXIgbWV0aG9kXG4gICAgICAgICwgbWV0aG9kQ29kZSA9IHN5bnRoZXNpemVyKHtcbiAgICAgICAgICAgIHBhcnNlZFBhdGg6IHBhcnNlZFBhdGgsXG4gICAgICAgICAgICBnZXRQYXRoTm9kZUtleTogcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5XG4gICAgICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgZXZhbChtZXRob2RDb2RlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IE1vZGVsRXJyb3IoJ01vZGVsUGF0aCBtZXRob2QgY29tcGlsYXRpb24gZXJyb3I7IHBhdGg6ICcgKyBwYXRoICsgJywgY29kZTogJyArIG1ldGhvZENvZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRob2Q7XG5cblxuICAgIC8vIGZ1bmN0aW9ucyB1c2VkIGJ5IG1ldGhvZHMgYHNldGAsIGBkZWxldGVgIGFuZCBgc3BsaWNlYCAoc3ludGhlc2l6ZWQgYnkgdGVtcGxhdGUpXG4gICAgZnVuY3Rpb24gYWRkQ2hhbmdlTWVzc2FnZShtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCBtc2cpIHtcbiAgICAgICAgbWVzc2FnZXMucHVzaChtc2cpO1xuICAgICAgICBtZXNzYWdlc0hhc2hbbXNnLnBhdGhdID0gbXNnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRyZWVDaGFuZ2VzTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICB2YXIgb2xkSXNUcmVlID0gdmFsdWVJc1RyZWUob2xkVmFsdWUpXG4gICAgICAgICAgICAsIG5ld0lzVHJlZSA9IHZhbHVlSXNUcmVlKG5ld1ZhbHVlKTtcblxuICAgICAgICBpZiAobmV3SXNUcmVlKVxuICAgICAgICAgICAgYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG5ld1ZhbHVlLCAnYWRkZWQnLCAnbmV3VmFsdWUnKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChvbGRJc1RyZWUpXG4gICAgICAgICAgICBhZGRNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCByb290UGF0aCwgb2xkVmFsdWUsICdyZW1vdmVkJywgJ29sZFZhbHVlJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG9iaiwgbXNnVHlwZSwgdmFsdWVQcm9wKSB7XG4gICAgICAgIF9hZGRNZXNzYWdlcyhyb290UGF0aCwgb2JqKTtcblxuXG4gICAgICAgIGZ1bmN0aW9uIF9hZGRNZXNzYWdlcyhyb290UGF0aCwgb2JqKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhdGhTeW50YXggPSByb290UGF0aCArICdbJCRdJztcbiAgICAgICAgICAgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSh2YWx1ZSwgaW5kZXgsIHBhdGhTeW50YXgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcGF0aFN5bnRheCA9IHJvb3RQYXRoICsgJy4kJCc7XG4gICAgICAgICAgICAgICAgXy5lYWNoS2V5KG9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRNZXNzYWdlKHZhbHVlLCBrZXksIHBhdGhTeW50YXgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYWRkTWVzc2FnZSh2YWx1ZSwga2V5LCBwYXRoU3ludGF4KSB7XG4gICAgICAgICAgICB2YXIgcGF0aCA9IHBhdGhTeW50YXgucmVwbGFjZSgnJCQnLCBrZXkpXG4gICAgICAgICAgICAgICAgLCBleGlzdGluZ01zZyA9IG1lc3NhZ2VzSGFzaFtwYXRoXTtcblxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nTXNnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nTXNnLnR5cGUgPT0gbXNnVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdzZXR0ZXIgZXJyb3I6IHNhbWUgbWVzc2FnZSB0eXBlIHBvc3RlZCBvbiB0aGUgc2FtZSBwYXRoJyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTXNnLnR5cGUgPSAnY2hhbmdlZCc7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTXNnW3ZhbHVlUHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBtc2cgPSB7IHBhdGg6IHBhdGgsIHR5cGU6IG1zZ1R5cGUgfTtcbiAgICAgICAgICAgICAgICBtc2dbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGFkZENoYW5nZU1lc3NhZ2UobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgbXNnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlSXNUcmVlKHZhbHVlKSlcbiAgICAgICAgICAgICAgICBfYWRkTWVzc2FnZXMocGF0aCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmVUcmVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUlzTm9ybWFsT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICAgID8gXy5kZWVwQ2xvbmUodmFsdWUpXG4gICAgICAgICAgICAgICAgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm90ZWN0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICEgdmFsdWVJc05vcm1hbE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICAgICAgOiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgOiBPYmplY3QuY3JlYXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWx1ZUlzVHJlZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWVJc05vcm1hbE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlSXNOb3JtYWxPYmplY3QodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGxcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICYmICEgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSlcbiAgICAgICAgICAgICAgICAmJiAhICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkQmF0Y2hJZHNUb01lc3NhZ2UobXNnLCBiYXRjaElkLCBtc2dJZCkge1xuICAgICAgICBfLmRlZmluZVByb3BlcnRpZXMobXNnLCB7XG4gICAgICAgICAgICBfX2JhdGNoX2lkOiBiYXRjaElkLFxuICAgICAgICAgICAgX19tc2dfaWQ6IG1zZ0lkXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEV4cG9ydHMgYHN5bnRoZXNpemVgIGZ1bmN0aW9uIHdpdGggdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAtIC5tb2RlbE1ldGhvZHMuc2V0IC0gYHNldGAgbWV0aG9kIGZvciBNb2RlbFxuICogLSAubW9kZWxNZXRob2RzLmRlbCAtIGBkZWxgIG1ldGhvZCBmb3IgTW9kZWxcbiAqIC0gLm1vZGVsTWV0aG9kcy5zcGxpY2UgLSBgc3BsaWNlYCBtZXRob2QgZm9yIE1vZGVsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gc3ludGhlc2l6ZVBhdGhNZXRob2RzO1xuXG52YXIgbW9kZWxNZXRob2RzID0gXy5tYXBLZXlzKG1vZGVsU3ludGhlc2l6ZXJzLCBmdW5jdGlvbihzeW50aGVzaXplcikge1xuICAgIHJldHVybiBfc3ludGhlc2l6ZShzeW50aGVzaXplciwgJycsIFtdKTtcbn0pO1xuXG5zeW50aGVzaXplUGF0aE1ldGhvZHMubW9kZWxNZXRob2RzID0gbW9kZWxNZXRob2RzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLnV0aWxzLmNoZWNrYFxuICpcbiAqIENoZWNrIGlzIGEgbW9kdWxlIGZvciBwYXJhbWV0ZXJzIGNoZWNraW5nIGV4dHJhY3RlZCBmcm9tIFtNZXRlb3JdKGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vKSBmcmFtZXdvcmsuXG4gKlxuICogSXQgYWxsb3dzIHRvIGJvdGggZG9jdW1lbnQgYW5kIHRvIGNoZWNrIHBhcmFtZXRlciB0eXBlcyBpbiB5b3VyIGZ1bmN0aW9uXG4gKiBtYWtpbmcgY29kZSBib3RoIHJlYWRhYmxlIGFuZCBzdGFibGUuXG4gKlxuICpcbiAqICMjIyBVc2FnZVxuICpgYGBcbiAqIHZhciBjaGVjayA9IG1pbG8uY2hlY2tcbiAqICAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG4gKlxuICogZnVuY3Rpb24gTXkobmFtZSwgb2JqLCBjYikge1xuICogICAgIC8vIGlmIGFueSBvZiBjaGVja3MgZmFpbCBhbiBlcnJvciB3aWxsIGJlIHRocm93blxuICogICAgIGNoZWNrKG5hbWUsIFN0cmluZyk7XG4gKiAgICAgY2hlY2sob2JqLCBNYXRjaC5PYmplY3RJbmNsdWRpbmcoeyBvcHRpb25zOiBPYmplY3QgfSkpO1xuICogICAgIGNoZWNrKGNiLCBGdW5jdGlvbik7XG4gKlxuICogICAgIC8vIC4uLiB5b3VyIGNvZGVcbiAqIH1cbiAqYGBgXG4gKiBTZWUgW01ldGVvciBkb2NzXShodHRwOi8vZG9jcy5tZXRlb3IuY29tLyNtYXRjaCkgdG8gc2VlIGhvdyBpdCB3b3Jrc1xuICpcbiAqXG4gKiAjIyMgUGF0dGVybnNcbiAqXG4gKiBBbGwgcGF0dGVybnMgYW5kIGZ1bmN0aW9ucyBkZXNjcmliZWQgaW4gTWV0ZW9yIGRvY3Mgd29yay5cbiAqXG4gKiBVbmxpa2UgaW4gTWV0ZW9yLCBPYmplY3QgcGF0dGVybiBtYXRjaGVzIGluc3RhbmNlIG9mIGFueSBjbGFzcyxcbiAqIG5vdCBvbmx5IHBsYWluIG9iamVjdC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBwYXR0ZXJucyBkZXNjcmliZWQgaW4gTWV0ZW9yIGRvY3MgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgaW1wbGVtZW50ZWRcbiAqXG4gKiAqIE1hdGNoLl9fT2JqZWN0SGFzaF9fKF9wYXR0ZXJuXylcbiAqXG4gKiAgIE1hdGNoZXMgYW4gb2JqZWN0IHdoZXJlIGFsbCBwcm9wZXJ0aWVzIG1hdGNoIGEgZ2l2ZW4gcGF0dGVyblxuICpcbiAqICogTWF0Y2guX19TdWJjbGFzc19fKF9jb25zdHJ1Y3Rvcl8gWywgX21hdGNoVGhpc0NsYXNzVG9vX10pXG4gKlxuICogICBNYXRjaGVzIGEgY2xhc3MgdGhhdCBpcyBhIHN1YmNsYXNzIG9mIGEgZ2l2ZW4gY2xhc3MuIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gKiAgIGlzIHRydWUsIGl0IHdpbGwgYWxzbyBtYXRjaCB0aGUgY2xhc3MgaXRzZWxmLlxuICpcbiAqICAgV2l0aG91dCB0aGlzIHBhdHRlcm4gdG8gY2hlY2sgaWYgX015U3ViY2xhc3NfIGlzIGEgc3ViY2xhc3Mgb2YgX015Q2xhc3NfXG4gKiAgIHlvdSB3b3VsZCBoYXZlIHRvIHVzZVxuICpcbiAqICAgICAgIGNoZWNrKE15U3ViY2xhc3MsIE1hdGNoLldoZXJlKGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgIHJldHVybiBNeVN1YmNsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIE15Q2xhc3M7XG4gKiAgICAgICB9KTtcbiAqXG4gKlxuICogVGhpbmdzIHdlIGV4cGxpY2l0bHkgZG8gTk9UIHN1cHBvcnQ6XG4gKiAgICAtIGhldGVyb2dlbm91cyBhcnJheXNcbioqL1xuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxudmFyIGNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgaWYgKGNvbmZpZy5jaGVjayA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybjtcblxuICAgIC8vIFJlY29yZCB0aGF0IGNoZWNrIGdvdCBjYWxsZWQsIGlmIHNvbWVib2R5IGNhcmVkLlxuICAgIHRyeSB7XG4gICAgICAgIGNoZWNrU3VidHJlZSh2YWx1ZSwgcGF0dGVybik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICgoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpICYmIGVyci5wYXRoKVxuICAgICAgICAgICAgZXJyLm1lc3NhZ2UgKz0gXCIgaW4gZmllbGQgXCIgKyBlcnIucGF0aDtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2s7XG5cbnZhciBNYXRjaCA9IGNoZWNrLk1hdGNoID0ge1xuICAgIE9wdGlvbmFsOiBmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICByZXR1cm4gbmV3IE9wdGlvbmFsKHBhdHRlcm4pO1xuICAgIH0sXG4gICAgT25lT2Y6IGZ1bmN0aW9uICgvKiBhcmd1bWVudHMgKi8pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbmVPZihhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgQW55OiBbJ19fYW55X18nXSxcbiAgICBXaGVyZTogZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFdoZXJlKGNvbmRpdGlvbik7XG4gICAgfSxcbiAgICBPYmplY3RJbmNsdWRpbmc6IGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0SW5jbHVkaW5nKHBhdHRlcm4pO1xuICAgIH0sXG4gICAgLy8gTWF0Y2hlcyBvbmx5IHNpZ25lZCAzMi1iaXQgaW50ZWdlcnNcbiAgICBJbnRlZ2VyOiBbJ19faW50ZWdlcl9fJ10sXG5cbiAgICAvLyBNYXRjaGVzIHN0cmluZyB0aGF0IGlzIGEgdmFsaWQgaWRlbnRpZmllciwgd2lsbCBub3QgYWxsb3cgamF2YXNjcmlwdCByZXNlcnZlZCB3b3Jkc1xuICAgIElkZW50aWZpZXJTdHJpbmc6IC9eW2Etel8kXVswLTlhLXpfJF0qJC9pLFxuXG4gICAgLy8gTWF0Y2hlcyBoYXNoIChvYmplY3QpIHdpdGggdmFsdWVzIG1hdGNoaW5nIHBhdHRlcm5cbiAgICBPYmplY3RIYXNoOiBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0SGFzaChwYXR0ZXJuKTtcbiAgICB9LFxuXG4gICAgU3ViY2xhc3M6IGZ1bmN0aW9uKFN1cGVyY2xhc3MsIG1hdGNoU3VwZXJjbGFzc1Rvbykge1xuICAgICAgICByZXR1cm4gbmV3IFN1YmNsYXNzKFN1cGVyY2xhc3MsIG1hdGNoU3VwZXJjbGFzc1Rvbyk7XG4gICAgfSxcblxuICAgIC8vIFhYWCBtYXRjaGVycyBzaG91bGQga25vdyBob3cgdG8gZGVzY3JpYmUgdGhlbXNlbHZlcyBmb3IgZXJyb3JzXG4gICAgRXJyb3I6IFR5cGVFcnJvcixcblxuICAgIC8vIE1ldGVvci5tYWtlRXJyb3JUeXBlKFwiTWF0Y2guRXJyb3JcIiwgZnVuY3Rpb24gKG1zZykge1xuICAgICAgICAvLyB0aGlzLm1lc3NhZ2UgPSBcIk1hdGNoIGVycm9yOiBcIiArIG1zZztcbiAgICAgICAgLy8gVGhlIHBhdGggb2YgdGhlIHZhbHVlIHRoYXQgZmFpbGVkIHRvIG1hdGNoLiBJbml0aWFsbHkgZW1wdHksIHRoaXMgZ2V0c1xuICAgICAgICAvLyBwb3B1bGF0ZWQgYnkgY2F0Y2hpbmcgYW5kIHJldGhyb3dpbmcgdGhlIGV4Y2VwdGlvbiBhcyBpdCBnb2VzIGJhY2sgdXAgdGhlXG4gICAgICAgIC8vIHN0YWNrLlxuICAgICAgICAvLyBFLmcuOiBcInZhbHNbM10uZW50aXR5LmNyZWF0ZWRcIlxuICAgICAgICAvLyB0aGlzLnBhdGggPSBcIlwiO1xuICAgICAgICAvLyBJZiB0aGlzIGdldHMgc2VudCBvdmVyIEREUCwgZG9uJ3QgZ2l2ZSBmdWxsIGludGVybmFsIGRldGFpbHMgYnV0IGF0IGxlYXN0XG4gICAgICAgIC8vIHByb3ZpZGUgc29tZXRoaW5nIGJldHRlciB0aGFuIDUwMCBJbnRlcm5hbCBzZXJ2ZXIgZXJyb3IuXG4gICAgLy8gICAgIHRoaXMuc2FuaXRpemVkRXJyb3IgPSBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgXCJNYXRjaCBmYWlsZWRcIik7XG4gICAgLy8gfSksXG5cbiAgICAvLyBUZXN0cyB0byBzZWUgaWYgdmFsdWUgbWF0Y2hlcyBwYXR0ZXJuLiBVbmxpa2UgY2hlY2ssIGl0IG1lcmVseSByZXR1cm5zIHRydWVcbiAgICAvLyBvciBmYWxzZSAodW5sZXNzIGFuIGVycm9yIG90aGVyIHRoYW4gTWF0Y2guRXJyb3Igd2FzIHRocm93bikuXG4gICAgdGVzdDogZnVuY3Rpb24gKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgLy8gUmV0aHJvdyBvdGhlciBlcnJvcnMuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZnVuY3Rpb24gT3B0aW9uYWwocGF0dGVybikge1xuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47XG59O1xuXG5mdW5jdGlvbiBPbmVPZihjaG9pY2VzKSB7XG4gICAgaWYgKGNob2ljZXMubGVuZ3RoID09IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgY2hvaWNlIHRvIE1hdGNoLk9uZU9mXCIpO1xuICAgIHRoaXMuY2hvaWNlcyA9IGNob2ljZXM7XG59O1xuXG5mdW5jdGlvbiBXaGVyZShjb25kaXRpb24pIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbn07XG5cbmZ1bmN0aW9uIE9iamVjdEluY2x1ZGluZyhwYXR0ZXJuKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbn07XG5cbmZ1bmN0aW9uIE9iamVjdEhhc2gocGF0dGVybikge1xuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47XG59O1xuXG5mdW5jdGlvbiBTdWJjbGFzcyhTdXBlcmNsYXNzLCBtYXRjaFN1cGVyY2xhc3NUb28pIHtcbiAgICB0aGlzLlN1cGVyY2xhc3MgPSBTdXBlcmNsYXNzO1xuICAgIHRoaXMubWF0Y2hTdXBlcmNsYXNzID0gbWF0Y2hTdXBlcmNsYXNzVG9vO1xufTtcblxudmFyIHR5cGVvZkNoZWNrcyA9IFtcbiAgICBbU3RyaW5nLCBcInN0cmluZ1wiXSxcbiAgICBbTnVtYmVyLCBcIm51bWJlclwiXSxcbiAgICBbQm9vbGVhbiwgXCJib29sZWFuXCJdLFxuICAgIFtGdW5jdGlvbiwgXCJmdW5jdGlvblwiXSxcbiAgICAvLyBXaGlsZSB3ZSBkb24ndCBhbGxvdyB1bmRlZmluZWQgaW4gSlNPTiwgdGhpcyBpcyBnb29kIGZvciBvcHRpb25hbFxuICAgIC8vIGFyZ3VtZW50cyB3aXRoIE9uZU9mLlxuICAgIFt1bmRlZmluZWQsIFwidW5kZWZpbmVkXCJdXG5dO1xuXG5mdW5jdGlvbiBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4pIHtcbiAgICAvLyBNYXRjaCBhbnl0aGluZyFcbiAgICBpZiAocGF0dGVybiA9PT0gTWF0Y2guQW55KVxuICAgICAgICByZXR1cm47XG5cbiAgICAvLyBCYXNpYyBhdG9taWMgdHlwZXMuXG4gICAgLy8gRG8gbm90IG1hdGNoIGJveGVkIG9iamVjdHMgKGUuZy4gU3RyaW5nLCBCb29sZWFuKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZW9mQ2hlY2tzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuID09PSB0eXBlb2ZDaGVja3NbaV1bMF0pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IHR5cGVvZkNoZWNrc1tpXVsxXSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHR5cGVvZkNoZWNrc1tpXVsxXSArIFwiLCBnb3QgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXR0ZXJuID09PSBudWxsKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgbnVsbCwgZ290IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBNYXRjaC5JbnRlZ2VyIGlzIHNwZWNpYWwgdHlwZSBlbmNvZGVkIHdpdGggYXJyYXlcbiAgICBpZiAocGF0dGVybiA9PT0gTWF0Y2guSW50ZWdlcikge1xuICAgICAgICAvLyBUaGVyZSBpcyBubyBjb25zaXN0ZW50IGFuZCByZWxpYWJsZSB3YXkgdG8gY2hlY2sgaWYgdmFyaWFibGUgaXMgYSA2NC1iaXRcbiAgICAgICAgLy8gaW50ZWdlci4gT25lIG9mIHRoZSBwb3B1bGFyIHNvbHV0aW9ucyBpcyB0byBnZXQgcmVtaW5kZXIgb2YgZGl2aXNpb24gYnkgMVxuICAgICAgICAvLyBidXQgdGhpcyBtZXRob2QgZmFpbHMgb24gcmVhbGx5IGxhcmdlIGZsb2F0cyB3aXRoIGJpZyBwcmVjaXNpb24uXG4gICAgICAgIC8vIEUuZy46IDEuMzQ4MTkyMzA4NDkxODI0ZSsyMyAlIDEgPT09IDAgaW4gVjhcbiAgICAgICAgLy8gQml0d2lzZSBvcGVyYXRvcnMgd29yayBjb25zaXN0YW50bHkgYnV0IGFsd2F5cyBjYXN0IHZhcmlhYmxlIHRvIDMyLWJpdFxuICAgICAgICAvLyBzaWduZWQgaW50ZWdlciBhY2NvcmRpbmcgdG8gSmF2YVNjcmlwdCBzcGVjcy5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgKHZhbHVlIHwgMCkgPT09IHZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcignRXhwZWN0ZWQgSW50ZWdlciwgZ290ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiB2YWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuID09PSBNYXRjaC5JZGVudGlmaWVyU3RyaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIE1hdGNoLklkZW50aWZpZXJTdHJpbmcudGVzdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAmJiBfanNLZXl3b3Jkcy5pbmRleE9mKGtleSkgPT0gLTEpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcignRXhwZWN0ZWQgaWRlbnRpZmllciBzdHJpbmcsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogdmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBcIk9iamVjdFwiIGlzIHNob3J0aGFuZCBmb3IgTWF0Y2guT2JqZWN0SW5jbHVkaW5nKHt9KTtcbiAgICBpZiAocGF0dGVybiA9PT0gT2JqZWN0KVxuICAgICAgICBwYXR0ZXJuID0gTWF0Y2guT2JqZWN0SW5jbHVkaW5nKHt9KTtcblxuICAgIC8vIEFycmF5IChjaGVja2VkIEFGVEVSIEFueSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYXMgYW4gQXJyYXkpLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4ubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJCYWQgcGF0dGVybjogYXJyYXlzIG11c3QgaGF2ZSBvbmUgdHlwZSBlbGVtZW50XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocGF0dGVybikpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBhcnJheSwgZ290IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlRWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2hlY2tTdWJ0cmVlKHZhbHVlRWxlbWVudCwgcGF0dGVyblswXSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyLnBhdGggPSBfcHJlcGVuZFBhdGgoaW5kZXgsIGVyci5wYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFyYml0cmFyeSB2YWxpZGF0aW9uIGNoZWNrcy4gVGhlIGNvbmRpdGlvbiBjYW4gcmV0dXJuIGZhbHNlIG9yIHRocm93IGFcbiAgICAvLyBNYXRjaC5FcnJvciAoaWUsIGl0IGNhbiBpbnRlcm5hbGx5IHVzZSBjaGVjaygpKSB0byBmYWlsLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgV2hlcmUpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4uY29uZGl0aW9uKHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gWFhYIHRoaXMgZXJyb3IgaXMgdGVycmlibGVcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRmFpbGVkIE1hdGNoLldoZXJlIHZhbGlkYXRpb25cIik7XG4gICAgfVxuXG5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIE9wdGlvbmFsKVxuICAgICAgICBwYXR0ZXJuID0gTWF0Y2guT25lT2YodW5kZWZpbmVkLCBwYXR0ZXJuLnBhdHRlcm4pO1xuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPbmVPZikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdHRlcm4uY2hvaWNlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4uY2hvaWNlc1tpXSk7XG4gICAgICAgICAgICAgICAgLy8gTm8gZXJyb3I/IFlheSwgcmV0dXJuLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyIGVycm9ycyBzaG91bGQgYmUgdGhyb3duLiBNYXRjaCBlcnJvcnMganVzdCBtZWFuIHRyeSBhbm90aGVyXG4gICAgICAgICAgICAgICAgLy8gY2hvaWNlLlxuICAgICAgICAgICAgICAgIGlmICghKGVyciBpbnN0YW5jZW9mIE1hdGNoLkVycm9yKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFhYWCB0aGlzIGVycm9yIGlzIHRlcnJpYmxlXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkZhaWxlZCBNYXRjaC5PbmVPZiBvciBNYXRjaC5PcHRpb25hbCB2YWxpZGF0aW9uXCIpO1xuICAgIH1cblxuICAgIC8vIEEgZnVuY3Rpb24gdGhhdCBpc24ndCBzb21ldGhpbmcgd2Ugc3BlY2lhbC1jYXNlIGlzIGFzc3VtZWQgdG8gYmUgYVxuICAgIC8vIGNvbnN0cnVjdG9yLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgcGF0dGVybilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gWFhYIHdoYXQgaWYgLm5hbWUgaXNuJ3QgZGVmaW5lZFxuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25LZXlzQWxsb3dlZCA9IGZhbHNlO1xuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgT2JqZWN0SW5jbHVkaW5nKSB7XG4gICAgICAgIHVua25vd25LZXlzQWxsb3dlZCA9IHRydWU7XG4gICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnBhdHRlcm47XG4gICAgfVxuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPYmplY3RIYXNoKSB7XG4gICAgICAgIHZhciBrZXlQYXR0ZXJuID0gcGF0dGVybi5wYXR0ZXJuO1xuICAgICAgICB2YXIgZW1wdHlIYXNoID0gdHJ1ZTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICBlbXB0eUhhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgIGNoZWNrKHZhbHVlW2tleV0sIGtleVBhdHRlcm4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbXB0eUhhc2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIFN1YmNsYXNzKSB7XG4gICAgICAgIHZhciBTdXBlcmNsYXNzID0gcGF0dGVybi5TdXBlcmNsYXNzO1xuICAgICAgICBpZiAocGF0dGVybi5tYXRjaFN1cGVyY2xhc3MgJiYgdmFsdWUgPT0gU3VwZXJjbGFzcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKCEgKHZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIFN1cGVyY2xhc3MpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgXCIgKyBwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgKyBcIiBvZiBcIiArIFN1cGVyY2xhc3MubmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09IFwib2JqZWN0XCIpXG4gICAgICAgIHRocm93IEVycm9yKFwiQmFkIHBhdHRlcm46IHVua25vd24gcGF0dGVybiB0eXBlXCIpO1xuXG4gICAgLy8gQW4gb2JqZWN0LCB3aXRoIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBrZXlzLiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBkb1xuICAgIC8vIHN0cnVjdHVyYWwgbWF0Y2hlcyBhZ2FpbnN0IG9iamVjdHMgb2Ygc3BlY2lhbCB0eXBlcyB0aGF0IGhhcHBlbiB0byBtYXRjaFxuICAgIC8vIHRoZSBwYXR0ZXJuOiB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSBhIHBsYWluIG9sZCB7T2JqZWN0fSFcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgb2JqZWN0LCBnb3QgXCIgKyB0eXBlb2YgdmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgb2JqZWN0LCBnb3QgbnVsbFwiKTtcblxuICAgIHZhciByZXF1aXJlZFBhdHRlcm5zID0ge307XG4gICAgdmFyIG9wdGlvbmFsUGF0dGVybnMgPSB7fTtcblxuICAgIF8uZWFjaEtleShwYXR0ZXJuLCBmdW5jdGlvbihzdWJQYXR0ZXJuLCBrZXkpIHtcbiAgICAgICAgaWYgKHBhdHRlcm5ba2V5XSBpbnN0YW5jZW9mIE9wdGlvbmFsKVxuICAgICAgICAgICAgb3B0aW9uYWxQYXR0ZXJuc1trZXldID0gcGF0dGVybltrZXldLnBhdHRlcm47XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlcXVpcmVkUGF0dGVybnNba2V5XSA9IHBhdHRlcm5ba2V5XTtcbiAgICB9LCB0aGlzLCB0cnVlKTtcblxuICAgIF8uZWFjaEtleSh2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICB2YXIgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkUGF0dGVybnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNoZWNrU3VidHJlZShzdWJWYWx1ZSwgcmVxdWlyZWRQYXR0ZXJuc1trZXldKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVxdWlyZWRQYXR0ZXJuc1trZXldO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbFBhdHRlcm5zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjaGVja1N1YnRyZWUoc3ViVmFsdWUsIG9wdGlvbmFsUGF0dGVybnNba2V5XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghdW5rbm93bktleXNBbGxvd2VkKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJVbmtub3duIGtleVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpXG4gICAgICAgICAgICAgICAgZXJyLnBhdGggPSBfcHJlcGVuZFBhdGgoa2V5LCBlcnIucGF0aCk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9LCB0aGlzLCB0cnVlKTtcblxuICAgIF8uZWFjaEtleShyZXF1aXJlZFBhdHRlcm5zLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIk1pc3Npbmcga2V5ICdcIiArIGtleSArIFwiJ1wiKTtcbiAgICB9LCB0aGlzLCB0cnVlKTtcbn07XG5cblxudmFyIF9qc0tleXdvcmRzID0gW1wiZG9cIiwgXCJpZlwiLCBcImluXCIsIFwiZm9yXCIsIFwibGV0XCIsIFwibmV3XCIsIFwidHJ5XCIsIFwidmFyXCIsIFwiY2FzZVwiLFxuICAgIFwiZWxzZVwiLCBcImVudW1cIiwgXCJldmFsXCIsIFwiZmFsc2VcIiwgXCJudWxsXCIsIFwidGhpc1wiLCBcInRydWVcIiwgXCJ2b2lkXCIsIFwid2l0aFwiLFxuICAgIFwiYnJlYWtcIiwgXCJjYXRjaFwiLCBcImNsYXNzXCIsIFwiY29uc3RcIiwgXCJzdXBlclwiLCBcInRocm93XCIsIFwid2hpbGVcIiwgXCJ5aWVsZFwiLFxuICAgIFwiZGVsZXRlXCIsIFwiZXhwb3J0XCIsIFwiaW1wb3J0XCIsIFwicHVibGljXCIsIFwicmV0dXJuXCIsIFwic3RhdGljXCIsIFwic3dpdGNoXCIsXG4gICAgXCJ0eXBlb2ZcIiwgXCJkZWZhdWx0XCIsIFwiZXh0ZW5kc1wiLCBcImZpbmFsbHlcIiwgXCJwYWNrYWdlXCIsIFwicHJpdmF0ZVwiLCBcImNvbnRpbnVlXCIsXG4gICAgXCJkZWJ1Z2dlclwiLCBcImZ1bmN0aW9uXCIsIFwiYXJndW1lbnRzXCIsIFwiaW50ZXJmYWNlXCIsIFwicHJvdGVjdGVkXCIsIFwiaW1wbGVtZW50c1wiLFxuICAgIFwiaW5zdGFuY2VvZlwiXTtcblxuLy8gQXNzdW1lcyB0aGUgYmFzZSBvZiBwYXRoIGlzIGFscmVhZHkgZXNjYXBlZCBwcm9wZXJseVxuLy8gcmV0dXJucyBrZXkgKyBiYXNlXG5mdW5jdGlvbiBfcHJlcGVuZFBhdGgoa2V5LCBiYXNlKSB7XG4gICAgaWYgKCh0eXBlb2Yga2V5KSA9PT0gXCJudW1iZXJcIiB8fCBrZXkubWF0Y2goL15bMC05XSskLykpXG4gICAgICAgIGtleSA9IFwiW1wiICsga2V5ICsgXCJdXCI7XG4gICAgZWxzZSBpZiAoIWtleS5tYXRjaChNYXRjaC5JZGVudGlmaWVyU3RyaW5nKSB8fCBfanNLZXl3b3Jkcy5pbmRleE9mKGtleSkgIT0gLTEpXG4gICAgICAgIGtleSA9IEpTT04uc3RyaW5naWZ5KFtrZXldKTtcblxuICAgIGlmIChiYXNlICYmIGJhc2VbMF0gIT09IFwiW1wiKVxuICAgICAgICByZXR1cm4ga2V5ICsgJy4nICsgYmFzZTtcbiAgICByZXR1cm4ga2V5ICsgYmFzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYG1pbG8udXRpbGBcbiAqL1xudmFyIHV0aWwgPSB7XG4gICAgbG9nZ2VyOiByZXF1aXJlKCcuL2xvZ2dlcicpLFxuICAgIGNoZWNrOiByZXF1aXJlKCcuL2NoZWNrJyksXG4gICAgZG9UOiByZXF1aXJlKCdkb3QnKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB1dGlsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwidXRpbHMtbG9nZ2VyXCI+PC9hPlxuLy8gbWlsby51dGlscy5sb2dnZXJcbi8vIC0tLS0tLS0tLS0tXG5cbi8vIEFwcGxpY2F0aW9uIGxvZ2dlciB0aGF0IGhhcyBlcnJvciwgd2FybiwgaW5mbyBhbmQgZGVidWdcbi8vIG1ldGhvZHMsIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQgYnkgc2V0dGluZyBsb2cgbGV2ZWwuXG5cbi8vIFByb3BlcnRpZXM6XG5cbi8vIC0gbGV2ZWxcblxuLy8gICAtIDAgLSBlcnJvclxuLy8gICAtIDEgLSB3YXJuXG4vLyAgIC0gMiAtIGluZm9cbi8vICAgLSAzIC0gZGVidWcgKGRlZmF1bHQpXG5cbi8vIC0gZW5hYmxlZFxuXG4vLyAgIHRydWUgYnkgZGVmYXVsdC4gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgYWxsIGxvZ2dpbmcgaW4gYnJvd3NlciBjb25zb2xlLlxuXG5cbnZhciBMb2dnZXIgPSByZXF1aXJlKCcuL2xvZ2dlcl9jbGFzcycpO1xuXG52YXIgbG9nZ2VyID0gbmV3IExvZ2dlcih7IGxldmVsOiAzIH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZ2dlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gIyMjIExvZ2dlciBDbGFzc1xuXG4vLyBQcm9wZXJ0aWVzOlxuXG4vLyAtIGxldmVsXG5cbi8vICAgLSAwIC0gZXJyb3Jcbi8vICAgLSAxIC0gd2FyblxuLy8gICAtIDIgLSBpbmZvXG4vLyAgIC0gMyAtIGRlYnVnIChkZWZhdWx0KVxuXG4vLyAtIGVuYWJsZWRcblxuLy8gICB0cnVlIGJ5IGRlZmF1bHQuIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nIGluIGJyb3dzZXIgY29uc29sZS5cblxuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogTG9nIGxldmVscy5cbiAqL1xuXG52YXIgbGV2ZWxzID0gW1xuICAgICdlcnJvcicsXG4gICAgJ3dhcm4nLFxuICAgICdpbmZvJyxcbiAgICAnZGVidWcnXG5dO1xuXG52YXIgbWF4TGV2ZWxMZW5ndGggPSBNYXRoLm1heC5hcHBseShNYXRoLCBsZXZlbHMubWFwKGZ1bmN0aW9uKGxldmVsKSB7IHJldHVybiBsZXZlbC5sZW5ndGg7IH0pKTtcblxuLyoqXG4gKiBDb2xvcnMgZm9yIGxvZyBsZXZlbHMuXG4gKi9cblxudmFyIGNvbG9ycyA9IFtcbiAgICAzMSxcbiAgICAzMyxcbiAgICAzNixcbiAgICA5MFxuXTtcblxuLyoqXG4gKiBQYWRzIHRoZSBuaWNlIG91dHB1dCB0byB0aGUgbG9uZ2VzdCBsb2cgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIHBhZChzdHIpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA8IG1heExldmVsTGVuZ3RoKVxuICAgICAgICByZXR1cm4gc3RyICsgbmV3IEFycmF5KG1heExldmVsTGVuZ3RoIC0gc3RyLmxlbmd0aCArIDEpLmpvaW4oJyAnKTtcblxuICAgIHJldHVybiBzdHI7XG59O1xuXG5cbmZ1bmN0aW9uIGNvbG9yZWQoc3RyLCBjb2xvcikge1xuICAgIHJldHVybiAnXFx4MUJbJyArIGNvbG9yICsgJ20nICsgc3RyICsgJyAtXFx4MUJbMzltJztcbn1cblxuXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICAgIGxldmVsOiAzLFxuICAgIHRocm93TGV2ZWw6IC0xLCAvLyBuZXZlciB0aHJvd1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgbG9nUHJlZml4OiAnJ1xufVxuXG5cbi8qKlxuICogTG9nZ2VyIChjb25zb2xlKS5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG52YXIgTG9nZ2VyID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICBfLmV4dGVuZCh0aGlzLCBERUZBVUxUX09QVElPTlMpO1xuICAgIF8uZXh0ZW5kKHRoaXMsIG9wdHMgfHwge30pO1xufTtcblxuXG4vKipcbiAqIExvZyBtZXRob2QuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Mb2dnZXIucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgdmFyIGluZGV4ID0gbGV2ZWxzLmluZGV4T2YodHlwZSk7XG5cbiAgICBpZiAoISB0aGlzLmVuYWJsZWQgfHwgaW5kZXggPiB0aGlzLmxldmVsKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgIHZhciBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuXG4gICAgaWYgKGluZGV4IDw9IHRoaXMudGhyb3dMZXZlbClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFt0aGlzLmxvZ1ByZWZpeCwgdHlwZSArICc6J10uY29uY2F0KGFyZ3MpLmpvaW4oJyAnKSk7XG5cbiAgICBjb25zb2xlLmxvZy5hcHBseShcbiAgICAgICAgICBjb25zb2xlXG4gICAgICAgICwgWyB0aGlzLmxvZ1ByZWZpeENvbG9yXG4gICAgICAgICAgICAgID8gJyAgICcgKyBjb2xvcmVkKHRoaXMubG9nUHJlZml4LCB0aGlzLmxvZ1ByZWZpeENvbG9yKVxuICAgICAgICAgICAgICA6IHRoaXMubG9nUHJlZml4LFxuICAgICAgICAgICAgKHRoaXMuY29sb3JzXG4gICAgICAgICAgICAgID8gJyAnICsgY29sb3JlZChwYWQodHlwZSksIGNvbG9yc1tpbmRleF0pXG4gICAgICAgICAgICAgIDogdHlwZSkgKyAnOidcbiAgICAgICAgICBdLmNvbmNhdChhcmdzKVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgbWV0aG9kcy5cbiAqL1xuXG5sZXZlbHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIExvZ2dlci5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubG9nLmFwcGx5KHRoaXMsIFtuYW1lXS5jb25jYXQoXy50b0FycmF5KGFyZ3VtZW50cykpKTtcbiAgICB9O1xufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBMb2dnZXI7XG4iLCIvLyBkb1QuanNcbi8vIDIwMTEtMjAxNCwgTGF1cmEgRG9rdG9yb3ZhLCBodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbihmdW5jdGlvbigpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0dmFyIGRvVCA9IHtcblx0XHR2ZXJzaW9uOiBcIjEuMC4zXCIsXG5cdFx0dGVtcGxhdGVTZXR0aW5nczoge1xuXHRcdFx0ZXZhbHVhdGU6ICAgIC9cXHtcXHsoW1xcc1xcU10rPyhcXH0/KSspXFx9XFx9L2csXG5cdFx0XHRpbnRlcnBvbGF0ZTogL1xce1xcez0oW1xcc1xcU10rPylcXH1cXH0vZyxcblx0XHRcdGVuY29kZTogICAgICAvXFx7XFx7IShbXFxzXFxTXSs/KVxcfVxcfS9nLFxuXHRcdFx0dXNlOiAgICAgICAgIC9cXHtcXHsjKFtcXHNcXFNdKz8pXFx9XFx9L2csXG5cdFx0XHR1c2VQYXJhbXM6ICAgLyhefFteXFx3JF0pZGVmKD86XFwufFxcW1tcXCdcXFwiXSkoW1xcdyRcXC5dKykoPzpbXFwnXFxcIl1cXF0pP1xccypcXDpcXHMqKFtcXHckXFwuXSt8XFxcIlteXFxcIl0rXFxcInxcXCdbXlxcJ10rXFwnfFxce1teXFx9XStcXH0pL2csXG5cdFx0XHRkZWZpbmU6ICAgICAgL1xce1xceyMjXFxzKihbXFx3XFwuJF0rKVxccyooXFw6fD0pKFtcXHNcXFNdKz8pI1xcfVxcfS9nLFxuXHRcdFx0ZGVmaW5lUGFyYW1zOi9eXFxzKihbXFx3JF0rKTooW1xcc1xcU10rKS8sXG5cdFx0XHRjb25kaXRpb25hbDogL1xce1xce1xcPyhcXD8pP1xccyooW1xcc1xcU10qPylcXHMqXFx9XFx9L2csXG5cdFx0XHRpdGVyYXRlOiAgICAgL1xce1xce35cXHMqKD86XFx9XFx9fChbXFxzXFxTXSs/KVxccypcXDpcXHMqKFtcXHckXSspXFxzKig/OlxcOlxccyooW1xcdyRdKykpP1xccypcXH1cXH0pL2csXG5cdFx0XHR2YXJuYW1lOlx0XCJpdFwiLFxuXHRcdFx0c3RyaXA6XHRcdHRydWUsXG5cdFx0XHRhcHBlbmQ6XHRcdHRydWUsXG5cdFx0XHRzZWxmY29udGFpbmVkOiBmYWxzZSxcblx0XHRcdGRvTm90U2tpcEVuY29kZWQ6IGZhbHNlXG5cdFx0fSxcblx0XHR0ZW1wbGF0ZTogdW5kZWZpbmVkLCAvL2ZuLCBjb21waWxlIHRlbXBsYXRlXG5cdFx0Y29tcGlsZTogIHVuZGVmaW5lZCAgLy9mbiwgZm9yIGV4cHJlc3Ncblx0fSwgX2dsb2JhbHM7XG5cblx0ZG9ULmVuY29kZUhUTUxTb3VyY2UgPSBmdW5jdGlvbihkb05vdFNraXBFbmNvZGVkKSB7XG5cdFx0dmFyIGVuY29kZUhUTUxSdWxlcyA9IHsgXCImXCI6IFwiJiMzODtcIiwgXCI8XCI6IFwiJiM2MDtcIiwgXCI+XCI6IFwiJiM2MjtcIiwgJ1wiJzogXCImIzM0O1wiLCBcIidcIjogXCImIzM5O1wiLCBcIi9cIjogXCImIzQ3O1wiIH0sXG5cdFx0XHRtYXRjaEhUTUwgPSBkb05vdFNraXBFbmNvZGVkID8gL1smPD5cIidcXC9dL2cgOiAvJig/ISM/XFx3KzspfDx8PnxcInwnfFxcLy9nO1xuXHRcdHJldHVybiBmdW5jdGlvbihjb2RlKSB7XG5cdFx0XHRyZXR1cm4gY29kZSA/IGNvZGUudG9TdHJpbmcoKS5yZXBsYWNlKG1hdGNoSFRNTCwgZnVuY3Rpb24obSkge3JldHVybiBlbmNvZGVIVE1MUnVsZXNbbV0gfHwgbTt9KSA6IFwiXCI7XG5cdFx0fTtcblx0fTtcblxuXHRfZ2xvYmFscyA9IChmdW5jdGlvbigpeyByZXR1cm4gdGhpcyB8fCAoMCxldmFsKShcInRoaXNcIik7IH0oKSk7XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGRvVDtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShmdW5jdGlvbigpe3JldHVybiBkb1Q7fSk7XG5cdH0gZWxzZSB7XG5cdFx0X2dsb2JhbHMuZG9UID0gZG9UO1xuXHR9XG5cblx0dmFyIHN0YXJ0ZW5kID0ge1xuXHRcdGFwcGVuZDogeyBzdGFydDogXCInKyhcIiwgICAgICBlbmQ6IFwiKSsnXCIsICAgICAgc3RhcnRlbmNvZGU6IFwiJytlbmNvZGVIVE1MKFwiIH0sXG5cdFx0c3BsaXQ6ICB7IHN0YXJ0OiBcIic7b3V0Kz0oXCIsIGVuZDogXCIpO291dCs9J1wiLCBzdGFydGVuY29kZTogXCInO291dCs9ZW5jb2RlSFRNTChcIiB9XG5cdH0sIHNraXAgPSAvJF4vO1xuXG5cdGZ1bmN0aW9uIHJlc29sdmVEZWZzKGMsIGJsb2NrLCBkZWYpIHtcblx0XHRyZXR1cm4gKCh0eXBlb2YgYmxvY2sgPT09IFwic3RyaW5nXCIpID8gYmxvY2sgOiBibG9jay50b1N0cmluZygpKVxuXHRcdC5yZXBsYWNlKGMuZGVmaW5lIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGNvZGUsIGFzc2lnbiwgdmFsdWUpIHtcblx0XHRcdGlmIChjb2RlLmluZGV4T2YoXCJkZWYuXCIpID09PSAwKSB7XG5cdFx0XHRcdGNvZGUgPSBjb2RlLnN1YnN0cmluZyg0KTtcblx0XHRcdH1cblx0XHRcdGlmICghKGNvZGUgaW4gZGVmKSkge1xuXHRcdFx0XHRpZiAoYXNzaWduID09PSBcIjpcIikge1xuXHRcdFx0XHRcdGlmIChjLmRlZmluZVBhcmFtcykgdmFsdWUucmVwbGFjZShjLmRlZmluZVBhcmFtcywgZnVuY3Rpb24obSwgcGFyYW0sIHYpIHtcblx0XHRcdFx0XHRcdGRlZltjb2RlXSA9IHthcmc6IHBhcmFtLCB0ZXh0OiB2fTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoIShjb2RlIGluIGRlZikpIGRlZltjb2RlXT0gdmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bmV3IEZ1bmN0aW9uKFwiZGVmXCIsIFwiZGVmWydcIitjb2RlK1wiJ109XCIgKyB2YWx1ZSkoZGVmKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSlcblx0XHQucmVwbGFjZShjLnVzZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRpZiAoYy51c2VQYXJhbXMpIGNvZGUgPSBjb2RlLnJlcGxhY2UoYy51c2VQYXJhbXMsIGZ1bmN0aW9uKG0sIHMsIGQsIHBhcmFtKSB7XG5cdFx0XHRcdGlmIChkZWZbZF0gJiYgZGVmW2RdLmFyZyAmJiBwYXJhbSkge1xuXHRcdFx0XHRcdHZhciBydyA9IChkK1wiOlwiK3BhcmFtKS5yZXBsYWNlKC8nfFxcXFwvZywgXCJfXCIpO1xuXHRcdFx0XHRcdGRlZi5fX2V4cCA9IGRlZi5fX2V4cCB8fCB7fTtcblx0XHRcdFx0XHRkZWYuX19leHBbcnddID0gZGVmW2RdLnRleHQucmVwbGFjZShuZXcgUmVnRXhwKFwiKF58W15cXFxcdyRdKVwiICsgZGVmW2RdLmFyZyArIFwiKFteXFxcXHckXSlcIiwgXCJnXCIpLCBcIiQxXCIgKyBwYXJhbSArIFwiJDJcIik7XG5cdFx0XHRcdFx0cmV0dXJuIHMgKyBcImRlZi5fX2V4cFsnXCIrcncrXCInXVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHZhciB2ID0gbmV3IEZ1bmN0aW9uKFwiZGVmXCIsIFwicmV0dXJuIFwiICsgY29kZSkoZGVmKTtcblx0XHRcdHJldHVybiB2ID8gcmVzb2x2ZURlZnMoYywgdiwgZGVmKSA6IHY7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiB1bmVzY2FwZShjb2RlKSB7XG5cdFx0cmV0dXJuIGNvZGUucmVwbGFjZSgvXFxcXCgnfFxcXFwpL2csIFwiJDFcIikucmVwbGFjZSgvW1xcclxcdFxcbl0vZywgXCIgXCIpO1xuXHR9XG5cblx0ZG9ULnRlbXBsYXRlID0gZnVuY3Rpb24odG1wbCwgYywgZGVmKSB7XG5cdFx0YyA9IGMgfHwgZG9ULnRlbXBsYXRlU2V0dGluZ3M7XG5cdFx0dmFyIGNzZSA9IGMuYXBwZW5kID8gc3RhcnRlbmQuYXBwZW5kIDogc3RhcnRlbmQuc3BsaXQsIG5lZWRodG1sZW5jb2RlLCBzaWQgPSAwLCBpbmR2LFxuXHRcdFx0c3RyICA9IChjLnVzZSB8fCBjLmRlZmluZSkgPyByZXNvbHZlRGVmcyhjLCB0bXBsLCBkZWYgfHwge30pIDogdG1wbDtcblxuXHRcdHN0ciA9IChcInZhciBvdXQ9J1wiICsgKGMuc3RyaXAgPyBzdHIucmVwbGFjZSgvKF58XFxyfFxcbilcXHQqICt8ICtcXHQqKFxccnxcXG58JCkvZyxcIiBcIilcblx0XHRcdFx0XHQucmVwbGFjZSgvXFxyfFxcbnxcXHR8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLFwiXCIpOiBzdHIpXG5cdFx0XHQucmVwbGFjZSgvJ3xcXFxcL2csIFwiXFxcXCQmXCIpXG5cdFx0XHQucmVwbGFjZShjLmludGVycG9sYXRlIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGNvZGUpIHtcblx0XHRcdFx0cmV0dXJuIGNzZS5zdGFydCArIHVuZXNjYXBlKGNvZGUpICsgY3NlLmVuZDtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLmVuY29kZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRcdG5lZWRodG1sZW5jb2RlID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIGNzZS5zdGFydGVuY29kZSArIHVuZXNjYXBlKGNvZGUpICsgY3NlLmVuZDtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLmNvbmRpdGlvbmFsIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGVsc2VjYXNlLCBjb2RlKSB7XG5cdFx0XHRcdHJldHVybiBlbHNlY2FzZSA/XG5cdFx0XHRcdFx0KGNvZGUgPyBcIic7fWVsc2UgaWYoXCIgKyB1bmVzY2FwZShjb2RlKSArIFwiKXtvdXQrPSdcIiA6IFwiJzt9ZWxzZXtvdXQrPSdcIikgOlxuXHRcdFx0XHRcdChjb2RlID8gXCInO2lmKFwiICsgdW5lc2NhcGUoY29kZSkgKyBcIil7b3V0Kz0nXCIgOiBcIic7fW91dCs9J1wiKTtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLml0ZXJhdGUgfHwgc2tpcCwgZnVuY3Rpb24obSwgaXRlcmF0ZSwgdm5hbWUsIGluYW1lKSB7XG5cdFx0XHRcdGlmICghaXRlcmF0ZSkgcmV0dXJuIFwiJzt9IH0gb3V0Kz0nXCI7XG5cdFx0XHRcdHNpZCs9MTsgaW5kdj1pbmFtZSB8fCBcImlcIitzaWQ7IGl0ZXJhdGU9dW5lc2NhcGUoaXRlcmF0ZSk7XG5cdFx0XHRcdHJldHVybiBcIic7dmFyIGFyclwiK3NpZCtcIj1cIitpdGVyYXRlK1wiO2lmKGFyclwiK3NpZCtcIil7dmFyIFwiK3ZuYW1lK1wiLFwiK2luZHYrXCI9LTEsbFwiK3NpZCtcIj1hcnJcIitzaWQrXCIubGVuZ3RoLTE7d2hpbGUoXCIraW5kditcIjxsXCIrc2lkK1wiKXtcIlxuXHRcdFx0XHRcdCt2bmFtZStcIj1hcnJcIitzaWQrXCJbXCIraW5kditcIis9MV07b3V0Kz0nXCI7XG5cdFx0XHR9KVxuXHRcdFx0LnJlcGxhY2UoYy5ldmFsdWF0ZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRcdHJldHVybiBcIic7XCIgKyB1bmVzY2FwZShjb2RlKSArIFwib3V0Kz0nXCI7XG5cdFx0XHR9KVxuXHRcdFx0KyBcIic7cmV0dXJuIG91dDtcIilcblx0XHRcdC5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKS5yZXBsYWNlKC9cXHQvZywgJ1xcXFx0JykucmVwbGFjZSgvXFxyL2csIFwiXFxcXHJcIilcblx0XHRcdC5yZXBsYWNlKC8oXFxzfDt8XFx9fF58XFx7KW91dFxcKz0nJzsvZywgJyQxJykucmVwbGFjZSgvXFwrJycvZywgXCJcIik7XG5cdFx0XHQvLy5yZXBsYWNlKC8oXFxzfDt8XFx9fF58XFx7KW91dFxcKz0nJ1xcKy9nLCckMW91dCs9Jyk7XG5cblx0XHRpZiAobmVlZGh0bWxlbmNvZGUpIHtcblx0XHRcdGlmICghYy5zZWxmY29udGFpbmVkICYmIF9nbG9iYWxzICYmICFfZ2xvYmFscy5fZW5jb2RlSFRNTCkgX2dsb2JhbHMuX2VuY29kZUhUTUwgPSBkb1QuZW5jb2RlSFRNTFNvdXJjZShjLmRvTm90U2tpcEVuY29kZWQpO1xuXHRcdFx0c3RyID0gXCJ2YXIgZW5jb2RlSFRNTCA9IHR5cGVvZiBfZW5jb2RlSFRNTCAhPT0gJ3VuZGVmaW5lZCcgPyBfZW5jb2RlSFRNTCA6IChcIlxuXHRcdFx0XHQrIGRvVC5lbmNvZGVIVE1MU291cmNlLnRvU3RyaW5nKCkgKyBcIihcIiArIChjLmRvTm90U2tpcEVuY29kZWQgfHwgJycpICsgXCIpKTtcIlxuXHRcdFx0XHQrIHN0cjtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBuZXcgRnVuY3Rpb24oYy52YXJuYW1lLCBzdHIpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIikgY29uc29sZS5sb2coXCJDb3VsZCBub3QgY3JlYXRlIGEgdGVtcGxhdGUgZnVuY3Rpb246IFwiICsgc3RyKTtcblx0XHRcdHRocm93IGU7XG5cdFx0fVxuXHR9O1xuXG5cdGRvVC5jb21waWxlID0gZnVuY3Rpb24odG1wbCwgZGVmKSB7XG5cdFx0cmV0dXJuIGRvVC50ZW1wbGF0ZSh0bXBsLCBudWxsLCBkZWYpO1xuXHR9O1xufSgpKTtcbiIsIi8qIGRvVCArIGF1dG8tY29tcGlsYXRpb24gb2YgZG9UIHRlbXBsYXRlc1xuICpcbiAqIDIwMTIsIExhdXJhIERva3Rvcm92YSwgaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVFxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKlxuICogQ29tcGlsZXMgLmRlZiwgLmRvdCwgLmpzdCBmaWxlcyBmb3VuZCB1bmRlciB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKiBJdCBpZ25vcmVzIHN1Yi1kaXJlY3Rvcmllcy5cbiAqIFRlbXBsYXRlIGZpbGVzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuc2lvbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAqIEZpbGVzIHdpdGggLmRlZiBleHRlbnNpb24gY2FuIGJlIGluY2x1ZGVkIGluIG90aGVyIGZpbGVzIHZpYSB7eyNkZWYubmFtZX19XG4gKiBGaWxlcyB3aXRoIC5kb3QgZXh0ZW5zaW9uIGFyZSBjb21waWxlZCBpbnRvIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kXG4gKiBjYW4gYmUgYWNjZXNzZWQgYXMgcmVuZGVyZXIuZmlsZW5hbWVcbiAqIEZpbGVzIHdpdGggLmpzdCBleHRlbnNpb24gYXJlIGNvbXBpbGVkIGludG8gLmpzIGZpbGVzLiBQcm9kdWNlZCAuanMgZmlsZSBjYW4gYmVcbiAqIGxvYWRlZCBhcyBhIGNvbW1vbkpTLCBBTUQgbW9kdWxlLCBvciBqdXN0IGluc3RhbGxlZCBpbnRvIGEgZ2xvYmFsIHZhcmlhYmxlXG4gKiAoZGVmYXVsdCBpcyBzZXQgdG8gd2luZG93LnJlbmRlcikuXG4gKiBBbGwgaW5saW5lIGRlZmluZXMgZGVmaW5lZCBpbiB0aGUgLmpzdCBmaWxlIGFyZVxuICogY29tcGlsZWQgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMgYW5kIGFyZSBhdmFpbGFibGUgdmlhIF9yZW5kZXIuZmlsZW5hbWUuZGVmaW5lbmFtZVxuICpcbiAqIEJhc2ljIHVzYWdlOlxuICogdmFyIGRvdHMgPSByZXF1aXJlKFwiZG90XCIpLnByb2Nlc3Moe3BhdGg6IFwiLi92aWV3c1wifSk7XG4gKiBkb3RzLm15dGVtcGxhdGUoe2ZvbzpcImhlbGxvIHdvcmxkXCJ9KTtcbiAqXG4gKiBUaGUgYWJvdmUgc25pcHBldCB3aWxsOlxuICogMS4gQ29tcGlsZSBhbGwgdGVtcGxhdGVzIGluIHZpZXdzIGZvbGRlciAoLmRvdCwgLmRlZiwgLmpzdClcbiAqIDIuIFBsYWNlIC5qcyBmaWxlcyBjb21waWxlZCBmcm9tIC5qc3QgdGVtcGxhdGVzIGludG8gdGhlIHNhbWUgZm9sZGVyLlxuICogICAgVGhlc2UgZmlsZXMgY2FuIGJlIHVzZWQgd2l0aCByZXF1aXJlLCBpLmUuIHJlcXVpcmUoXCIuL3ZpZXdzL215dGVtcGxhdGVcIikuXG4gKiAzLiBSZXR1cm4gYW4gb2JqZWN0IHdpdGggZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gLmRvdCB0ZW1wbGF0ZXMgYXMgaXRzIHByb3BlcnRpZXMuXG4gKiA0LiBSZW5kZXIgbXl0ZW1wbGF0ZSB0ZW1wbGF0ZS5cbiAqL1xuXG52YXIgZnMgPSByZXF1aXJlKFwiZnNcIiksXG5cdGRvVCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vZG9UXCIpO1xuXG5kb1QucHJvY2VzcyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0Ly9wYXRoLCBkZXN0aW5hdGlvbiwgZ2xvYmFsLCByZW5kZXJtb2R1bGUsIHRlbXBsYXRlU2V0dGluZ3Ncblx0cmV0dXJuIG5ldyBJbnN0YWxsRG90cyhvcHRpb25zKS5jb21waWxlQWxsKCk7XG59O1xuXG5mdW5jdGlvbiBJbnN0YWxsRG90cyhvKSB7XG5cdHRoaXMuX19wYXRoIFx0XHQ9IG8ucGF0aCB8fCBcIi4vXCI7XG5cdGlmICh0aGlzLl9fcGF0aFt0aGlzLl9fcGF0aC5sZW5ndGgtMV0gIT09ICcvJykgdGhpcy5fX3BhdGggKz0gJy8nO1xuXHR0aGlzLl9fZGVzdGluYXRpb25cdD0gby5kZXN0aW5hdGlvbiB8fCB0aGlzLl9fcGF0aDtcblx0aWYgKHRoaXMuX19kZXN0aW5hdGlvblt0aGlzLl9fZGVzdGluYXRpb24ubGVuZ3RoLTFdICE9PSAnLycpIHRoaXMuX19kZXN0aW5hdGlvbiArPSAnLyc7XG5cdHRoaXMuX19nbG9iYWxcdFx0PSBvLmdsb2JhbCB8fCBcIndpbmRvdy5yZW5kZXJcIjtcblx0dGhpcy5fX3JlbmRlcm1vZHVsZVx0PSBvLnJlbmRlcm1vZHVsZSB8fCB7fTtcblx0dGhpcy5fX3NldHRpbmdzIFx0PSBvLnRlbXBsYXRlU2V0dGluZ3MgPyBjb3B5KG8udGVtcGxhdGVTZXR0aW5ncywgY29weShkb1QudGVtcGxhdGVTZXR0aW5ncykpIDogdW5kZWZpbmVkO1xuXHR0aGlzLl9faW5jbHVkZXNcdFx0PSB7fTtcbn1cblxuSW5zdGFsbERvdHMucHJvdG90eXBlLmNvbXBpbGVUb0ZpbGUgPSBmdW5jdGlvbihwYXRoLCB0ZW1wbGF0ZSwgZGVmKSB7XG5cdGRlZiA9IGRlZiB8fCB7fTtcblx0dmFyIG1vZHVsZW5hbWUgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSsxLCBwYXRoLmxhc3RJbmRleE9mKFwiLlwiKSlcblx0XHQsIGRlZnMgPSBjb3B5KHRoaXMuX19pbmNsdWRlcywgY29weShkZWYpKVxuXHRcdCwgc2V0dGluZ3MgPSB0aGlzLl9fc2V0dGluZ3MgfHwgZG9ULnRlbXBsYXRlU2V0dGluZ3Ncblx0XHQsIGNvbXBpbGVvcHRpb25zID0gY29weShzZXR0aW5ncylcblx0XHQsIGRlZmF1bHRjb21waWxlZCA9IGRvVC50ZW1wbGF0ZSh0ZW1wbGF0ZSwgc2V0dGluZ3MsIGRlZnMpXG5cdFx0LCBleHBvcnRzID0gW11cblx0XHQsIGNvbXBpbGVkID0gXCJcIlxuXHRcdCwgZm47XG5cblx0Zm9yICh2YXIgcHJvcGVydHkgaW4gZGVmcykge1xuXHRcdGlmIChkZWZzW3Byb3BlcnR5XSAhPT0gZGVmW3Byb3BlcnR5XSAmJiBkZWZzW3Byb3BlcnR5XSAhPT0gdGhpcy5fX2luY2x1ZGVzW3Byb3BlcnR5XSkge1xuXHRcdFx0Zm4gPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodHlwZW9mIGRlZnNbcHJvcGVydHldID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRmbiA9IGRvVC50ZW1wbGF0ZShkZWZzW3Byb3BlcnR5XSwgc2V0dGluZ3MsIGRlZnMpO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgZGVmc1twcm9wZXJ0eV0gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0Zm4gPSBkZWZzW3Byb3BlcnR5XTtcblx0XHRcdH0gZWxzZSBpZiAoZGVmc1twcm9wZXJ0eV0uYXJnKSB7XG5cdFx0XHRcdGNvbXBpbGVvcHRpb25zLnZhcm5hbWUgPSBkZWZzW3Byb3BlcnR5XS5hcmc7XG5cdFx0XHRcdGZuID0gZG9ULnRlbXBsYXRlKGRlZnNbcHJvcGVydHldLnRleHQsIGNvbXBpbGVvcHRpb25zLCBkZWZzKTtcblx0XHRcdH1cblx0XHRcdGlmIChmbikge1xuXHRcdFx0XHRjb21waWxlZCArPSBmbi50b1N0cmluZygpLnJlcGxhY2UoJ2Fub255bW91cycsIHByb3BlcnR5KTtcblx0XHRcdFx0ZXhwb3J0cy5wdXNoKHByb3BlcnR5KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Y29tcGlsZWQgKz0gZGVmYXVsdGNvbXBpbGVkLnRvU3RyaW5nKCkucmVwbGFjZSgnYW5vbnltb3VzJywgbW9kdWxlbmFtZSk7XG5cdGZzLndyaXRlRmlsZVN5bmMocGF0aCwgXCIoZnVuY3Rpb24oKXtcIiArIGNvbXBpbGVkXG5cdFx0KyBcInZhciBpdHNlbGY9XCIgKyBtb2R1bGVuYW1lICsgXCIsIF9lbmNvZGVIVE1MPShcIiArIGRvVC5lbmNvZGVIVE1MU291cmNlLnRvU3RyaW5nKCkgKyBcIihcIiArIChzZXR0aW5ncy5kb05vdFNraXBFbmNvZGVkIHx8ICcnKSArIFwiKSk7XCJcblx0XHQrIGFkZGV4cG9ydHMoZXhwb3J0cylcblx0XHQrIFwiaWYodHlwZW9mIG1vZHVsZSE9PSd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cz1pdHNlbGY7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09J2Z1bmN0aW9uJylkZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gaXRzZWxmO30pO2Vsc2Uge1wiXG5cdFx0KyB0aGlzLl9fZ2xvYmFsICsgXCI9XCIgKyB0aGlzLl9fZ2xvYmFsICsgXCJ8fHt9O1wiICsgdGhpcy5fX2dsb2JhbCArIFwiWydcIiArIG1vZHVsZW5hbWUgKyBcIiddPWl0c2VsZjt9fSgpKTtcIik7XG59O1xuXG5mdW5jdGlvbiBhZGRleHBvcnRzKGV4cG9ydHMpIHtcblx0Zm9yICh2YXIgcmV0ID0nJywgaT0wOyBpPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0cmV0ICs9IFwiaXRzZWxmLlwiICsgZXhwb3J0c1tpXSsgXCI9XCIgKyBleHBvcnRzW2ldK1wiO1wiO1xuXHR9XG5cdHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNvcHkobywgdG8pIHtcblx0dG8gPSB0byB8fCB7fTtcblx0Zm9yICh2YXIgcHJvcGVydHkgaW4gbykge1xuXHRcdHRvW3Byb3BlcnR5XSA9IG9bcHJvcGVydHldO1xuXHR9XG5cdHJldHVybiB0bztcbn1cblxuZnVuY3Rpb24gcmVhZGRhdGEocGF0aCkge1xuXHR2YXIgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoKTtcblx0aWYgKGRhdGEpIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG5cdGNvbnNvbGUubG9nKFwicHJvYmxlbXMgd2l0aCBcIiArIHBhdGgpO1xufVxuXG5JbnN0YWxsRG90cy5wcm90b3R5cGUuY29tcGlsZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7XG5cdHZhciBkYXRhID0gcmVhZGRhdGEocGF0aCk7XG5cdGlmIChkYXRhKSB7XG5cdFx0cmV0dXJuIGRvVC50ZW1wbGF0ZShkYXRhLFxuXHRcdFx0XHRcdHRoaXMuX19zZXR0aW5ncyB8fCBkb1QudGVtcGxhdGVTZXR0aW5ncyxcblx0XHRcdFx0XHRjb3B5KHRoaXMuX19pbmNsdWRlcykpO1xuXHR9XG59O1xuXG5JbnN0YWxsRG90cy5wcm90b3R5cGUuY29tcGlsZUFsbCA9IGZ1bmN0aW9uKCkge1xuXHRjb25zb2xlLmxvZyhcIkNvbXBpbGluZyBhbGwgZG9UIHRlbXBsYXRlcy4uLlwiKTtcblxuXHR2YXIgZGVmRm9sZGVyID0gdGhpcy5fX3BhdGgsXG5cdFx0c291cmNlcyA9IGZzLnJlYWRkaXJTeW5jKGRlZkZvbGRlciksXG5cdFx0aywgbCwgbmFtZTtcblxuXHRmb3IoIGsgPSAwLCBsID0gc291cmNlcy5sZW5ndGg7IGsgPCBsOyBrKyspIHtcblx0XHRuYW1lID0gc291cmNlc1trXTtcblx0XHRpZiAoL1xcLmRlZihcXC5kb3R8XFwuanN0KT8kLy50ZXN0KG5hbWUpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkxvYWRlZCBkZWYgXCIgKyBuYW1lKTtcblx0XHRcdHRoaXMuX19pbmNsdWRlc1tuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoJy4nKSldID0gcmVhZGRhdGEoZGVmRm9sZGVyICsgbmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0Zm9yKCBrID0gMCwgbCA9IHNvdXJjZXMubGVuZ3RoOyBrIDwgbDsgaysrKSB7XG5cdFx0bmFtZSA9IHNvdXJjZXNba107XG5cdFx0aWYgKC9cXC5kb3QoXFwuZGVmfFxcLmpzdCk/JC8udGVzdChuYW1lKSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJDb21waWxpbmcgXCIgKyBuYW1lICsgXCIgdG8gZnVuY3Rpb25cIik7XG5cdFx0XHR0aGlzLl9fcmVuZGVybW9kdWxlW25hbWUuc3Vic3RyaW5nKDAsIG5hbWUuaW5kZXhPZignLicpKV0gPSB0aGlzLmNvbXBpbGVQYXRoKGRlZkZvbGRlciArIG5hbWUpO1xuXHRcdH1cblx0XHRpZiAoL1xcLmpzdChcXC5kb3R8XFwuZGVmKT8kLy50ZXN0KG5hbWUpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkNvbXBpbGluZyBcIiArIG5hbWUgKyBcIiB0byBmaWxlXCIpO1xuXHRcdFx0dGhpcy5jb21waWxlVG9GaWxlKHRoaXMuX19kZXN0aW5hdGlvbiArIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUuaW5kZXhPZignLicpKSArICcuanMnLFxuXHRcdFx0XHRcdHJlYWRkYXRhKGRlZkZvbGRlciArIG5hbWUpKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRoaXMuX19yZW5kZXJtb2R1bGU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cblxuLyoqXG4gKiBbX19Qcm90b3R5cGUgZnVuY3Rpb25zX19dKHByb3RvX3Byb3RvdHlwZS5qcy5odG1sKVxuICpcbiAqIC0gW2V4dGVuZFByb3RvXShwcm90b19wcm90b3R5cGUuanMuaHRtbCNleHRlbmRQcm90bylcbiAqIC0gW2NyZWF0ZVN1YmNsYXNzXShwcm90b19wcm90b3R5cGUuanMuaHRtbCNjcmVhdGVTdWJjbGFzcylcbiAqIC0gW21ha2VTdWJjbGFzc10ocHJvdG9fcHJvdG90eXBlLmpzLmh0bWwjbWFrZVN1YmNsYXNzKVxuICogLSBbbmV3QXBwbHldKHByb3RvX3Byb3RvdHlwZS5qcy5odG1sI25ld0FwcGx5KVxuICovXG52YXIgcHJvdG90eXBlTWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fcHJvdG90eXBlJyk7XG5cblxuLyoqXG4gKiBbX19PYmplY3QgZnVuY3Rpb25zX19dKHByb3RvX29iamVjdC5qcy5odG1sKVxuICpcbiAqIC0gW2V4dGVuZF0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZXh0ZW5kKVxuICogLSBbY2xvbmVdKHByb3RvX29iamVjdC5qcy5odG1sI2Nsb25lKVxuICogLSBbZGVmaW5lUHJvcGVydHldKHByb3RvX29iamVjdC5qcy5odG1sI2RlZmluZVByb3BlcnR5KVxuICogLSBbZGVmaW5lUHJvcGVydGllc10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZGVmaW5lUHJvcGVydGllcylcbiAqIC0gW2RlZXBFeHRlbmRdKHByb3RvX29iamVjdC5qcy5odG1sI2RlZXBFeHRlbmQpXG4gKiAtIFtkZWVwQ2xvbmVdKHByb3RvX29iamVjdC5qcy5odG1sI2RlZXBDbG9uZSlcbiAqIC0gW2tleXNdKHByb3RvX29iamVjdC5qcy5odG1sI2tleXMpXG4gKiAtIFthbGxLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNhbGxLZXlzKVxuICogLSBbdmFsdWVzXShwcm90b19vYmplY3QuanMuaHRtbCN2YWx1ZXMpXG4gKiAtIFtrZXlPZl0ocHJvdG9fb2JqZWN0LmpzLmh0bWwja2V5T2YpXG4gKiAtIFthbGxLZXlzT2ZdKHByb3RvX29iamVjdC5qcy5odG1sI2FsbEtleXNPZilcbiAqIC0gW2VhY2hLZXldKHByb3RvX29iamVjdC5qcy5odG1sI2VhY2hLZXkpXG4gKiAtIFttYXBLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNtYXBLZXlzKVxuICogLSBbcmVkdWNlS2V5c10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjcmVkdWNlS2V5cylcbiAqIC0gW2ZpbHRlcktleXNdKHByb3RvX29iamVjdC5qcy5odG1sI2ZpbHRlcktleXMpXG4gKiAtIFtzb21lS2V5XShwcm90b19vYmplY3QuanMuaHRtbCNzb21lS2V5KVxuICogLSBbZXZlcnlLZXldKHByb3RvX29iamVjdC5qcy5odG1sI2V2ZXJ5S2V5KVxuICogLSBbZmluZFZhbHVlXShwcm90b19vYmplY3QuanMuaHRtbCNmaW5kVmFsdWUpXG4gKiAtIFtmaW5kS2V5XShwcm90b19vYmplY3QuanMuaHRtbCNmaW5kS2V5KVxuICogLSBbcGlja0tleXNdKHByb3RvX29iamVjdC5qcy5odG1sI3BpY2tLZXlzKVxuICogLSBbb21pdEtleXNdKHByb3RvX29iamVjdC5qcy5odG1sI29taXRLZXlzKVxuICogLSBbaXNFcXVhbF0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjaXNFcXVhbClcbiAqIC0gW2lzTm90XShwcm90b19vYmplY3QuanMuaHRtbCNpc05vdClcbiAqL1xudmFyIG9iamVjdE1ldGhvZHMgPSByZXF1aXJlKCcuL3Byb3RvX29iamVjdCcpO1xuXG5cbi8qKlxuICogW19fQXJyYXkgZnVuY3Rpb25zX19dKHByb3RvX2FycmF5LmpzLmh0bWwpXG4gKlxuICogLSBbZmluZF0ocHJvdG9fYXJyYXkuanMuaHRtbCNmaW5kKVxuICogLSBbZmluZEluZGV4XShwcm90b19hcnJheS5qcy5odG1sI2ZpbmRJbmRleClcbiAqIC0gW2FwcGVuZEFycmF5XShwcm90b19hcnJheS5qcy5odG1sI2FwcGVuZEFycmF5KVxuICogLSBbcHJlcGVuZEFycmF5XShwcm90b19hcnJheS5qcy5odG1sI3ByZXBlbmRBcnJheSlcbiAqIC0gW3NwbGljZUl0ZW1dKHByb3RvX2FycmF5LmpzLmh0bWwjc3BsaWNlSXRlbSlcbiAqIC0gW3RvQXJyYXldKHByb3RvX2FycmF5LmpzLmh0bWwjdG9BcnJheSlcbiAqIC0gW29iamVjdF0ocHJvdG9fYXJyYXkuanMuaHRtbCNvYmplY3QpXG4gKiAtIFttYXBUb09iamVjdF0ocHJvdG9fYXJyYXkuanMuaHRtbCNtYXBUb09iamVjdClcbiAqIC0gW3VuaXF1ZV0ocHJvdG9fYXJyYXkuanMuaHRtbCN1bmlxdWUpXG4gKiAtIFtkZWVwRm9yRWFjaF0ocHJvdG9fYXJyYXkuanMuaHRtbCNkZWVwRm9yRWFjaClcbiAqXG4gKiBGdW5jdGlvbnMgdGhhdCBBcnJheSBbaW1wbGVtZW50cyBuYXRpdmVseV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcHJvdG90eXBlI01ldGhvZHMpIGFyZSBhbHNvIGFkZGVkIC0gdGhleSBjYW4gYmUgdXNlZCB3aXRoIGFycmF5LWxpa2Ugb2JqZWN0cyBhbmQgZm9yIGNoYWluaW5nIChuYXRpdmUgZnVuY3Rpb25zIGFyZSBhbHdheXMgY2FsbGVkKS5cbiAqL1xudmFyIGFycmF5TWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fYXJyYXknKTtcblxuXG4vKipcbiAqIFtfX0Z1bmN0aW9uIGZ1bmN0aW9uc19fXShwcm90b19mdW5jdGlvbi5qcy5odG1sKVxuICpcbiAqIC0gW21ha2VGdW5jdGlvbl0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNtYWtlRnVuY3Rpb24pXG4gKiAtIFtwYXJ0aWFsXShwcm90b19mdW5jdGlvbi5qcy5odG1sI3BhcnRpYWwpXG4gKiAtIFtwYXJ0aWFsUmlnaHRdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjcGFydGlhbFJpZ2h0KVxuICogLSBbbWVtb2l6ZV0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNtZW1vaXplKVxuICogLSBbZGVsYXldKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXkpXG4gKiAtIFtkZWZlcl0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlcilcbiAqIC0gW2RlbGF5ZWRdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXllZClcbiAqIC0gW2RlZmVycmVkXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlZmVycmVkKVxuICogLSBbZGVmZXJUaWNrc10ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlclRpY2tzKVxuICogLSBbZGVsYXlNZXRob2RdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXlNZXRob2QpXG4gKiAtIFtkZWZlck1ldGhvZF0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlck1ldGhvZClcbiAqIC0gW2RlYm91bmNlXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlYm91bmNlKVxuICogLSBbdGhyb3R0bGVdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjdGhyb3R0bGUpXG4gKiAtIFtvbmNlXShwcm90b19mdW5jdGlvbi5qcy5odG1sI29uY2UpXG4gKiAtIFt3YWl0Rm9yXShwcm90b19mdW5jdGlvbi5qcy5odG1sI3dhaXRGb3IpXG4qL1xudmFyIGZ1bmN0aW9uTWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fZnVuY3Rpb24nKTtcblxuXG4vKipcbiAqIFtfX1N0cmluZyBmdW5jdGlvbnNfX10ocHJvdG9fc3RyaW5nLmpzLmh0bWwpXG4gKlxuICogLSBbZmlyc3RVcHBlckNhc2VdKHByb3RvX3N0cmluZy5qcy5odG1sI2ZpcnN0VXBwZXJDYXNlKVxuICogLSBbZmlyc3RMb3dlckNhc2VdKHByb3RvX3N0cmluZy5qcy5odG1sI2ZpcnN0TG93ZXJDYXNlKVxuICogLSBbdG9SZWdFeHBdKHByb3RvX3N0cmluZy5qcy5odG1sI3RvUmVnRXhwKVxuICogLSBbdG9GdW5jdGlvbl0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9GdW5jdGlvbilcbiAqIC0gW3RvRGF0ZV0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9EYXRlKVxuICogLSBbdG9RdWVyeVN0cmluZ10ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9RdWVyeVN0cmluZylcbiAqIC0gW2Zyb21RdWVyeVN0cmluZ10ocHJvdG9fc3RyaW5nLmpzLmh0bWwjZnJvbVF1ZXJ5U3RyaW5nKVxuICogLSBbanNvblBhcnNlXShwcm90b19zdHJpbmcuanMuaHRtbCNqc29uUGFyc2UpXG4gKiAtIFtoYXNoQ29kZV0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjaGFzaENvZGUpXG4gKiAtIFt1blByZWZpeF0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdW5QcmVmaXgpXG4gKi9cbnZhciBzdHJpbmdNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19zdHJpbmcnKTtcblxuXG4vKipcbiAqIFtfX051bWJlciBmdW5jdGlvbnNfX10ocHJvdG9fbnVtYmVyLmpzLmh0bWwpXG4gKlxuICogLSBbaXNOdW1lcmljXShwcm90b19udW1iZXIuanMuaHRtbCNpc051bWVyaWMpXG4gKi9cbnZhciBudW1iZXJNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19udW1iZXInKTtcblxuXG4vKipcbiAqIFtfX1V0aWxpdHkgZnVuY3Rpb25zX19dKHByb3RvX3V0aWwuanMuaHRtbClcbiAqXG4gKiAtIFt0aW1lc10ocHJvdG9fdXRpbC5qcy5odG1sI3RpbWVzKVxuICogLSBbcmVwZWF0XShwcm90b191dGlsLmpzLmh0bWwjcmVwZWF0KVxuICogLSBbdGFwXShwcm90b191dGlsLmpzLmh0bWwjdGFwKVxuICogLSBbcmVzdWx0XShwcm90b191dGlsLmpzLmh0bWwjcmVzdWx0KVxuICogLSBbaWRlbnRpdHldKHByb3RvX3V0aWwuanMuaHRtbCNpZGVudGl0eSlcbiAqIC0gW3Byb3BlcnR5XShwcm90b191dGlsLmpzLmh0bWwjcHJvcGVydHkpXG4gKiAtIFtjb21wYXJlUHJvcGVydHldKHByb3RvX3V0aWwuanMuaHRtbCNjb21wYXJlUHJvcGVydHkpXG4gKiAtIFtub29wXShwcm90b191dGlsLmpzLmh0bWwjbm9vcClcbiAqL1xudmFyIHV0aWxNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b191dGlsJyk7XG5cblxuLyoqXG4gKiBDaGFpbmluZ1xuICogPT09PT09PT1cbiAqXG4gKiBgX2AgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgd3JhcHBlZCB2YWx1ZSAob2JqZWN0LCBmdW5jdGlvbiwgYXJyYXksIGV0Yy4pIHRvIGFsbG93IGNoYWluaW5nIG9mIFByb3RvIGZ1bmN0aW9ucy5cbiAqIFRvIHVud3JhcCwgYF9gIG1ldGhvZCBvZiBhIHdyYXBwZWQgdmFsdWUgc2hvdWxkIGJlIHVzZWQuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogdmFyIGFyciA9IF8oeyAwOiAzLCAxOiA0LCAyOiA1LCBsZW5ndGg6IDN9KVxuICogICAgICAgICAgICAgIC50b0FycmF5KClcbiAqICAgICAgICAgICAgICAucHJlcGVuZEFycmF5KFsxLCAyXSlcbiAqICAgICAgICAgICAgICAuYXBwZW5kQXJyYXkoWzYsIDcsIDhdKVxuICogICAgICAgICAgICAgIC5fKCk7XG4gKiBgYGBcbiAqIEEgd3JhcHBlZCBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYF9gIChgUHJvdG9gIGNsYXNzKS5cbiAqXG4gKiBDaGFpbmluZyBpcyBpbXBsZW1lbnRlZCBmb3IgZGV2ZWxvcG1lbnQgY29udmVuaWVuY2UsIGJ1dCBpdCBoYXMgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsIG5vdCBvbmx5IHRvIHdyYXAgYW5kIHVud3JhcCB2YWx1ZXMgYnV0IGluIGVhY2ggZnVuY3Rpb24gY2FsbC5cbiAqIEFsdGhvdWdoIGFsbCBQcm90byBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGFzIG1ldGhvZHMgb3BlcmF0aW5nIG9uIHRoaXMgYW5kIHRoZSBvdmVyaGVhZCB0byByZWRlZmluZSB0aGVtIGFzIGZ1bmN0aW9ucyBpcyB2ZXJ5IHNtYWxsLCB0aGUgb3ZlcmhlYWQgdG8gcmVkZWZpbmUgdGhlbSBhcyBtZXRob2RzIG9mIHdyYXBwZWQgdmFsdWUgaXMgc2xpZ2h0bHkgaGlnaGVyIC0gY2hhaW5pbmcgaXMgMTUtMjUlIHNsb3dlciB0aGFuIHVzaW5nIGZ1bmN0aW9ucyAocHJvcGVydGllcyBvZiBfIHRoYXQgdGFrZSB0aGUgZmlyc3QgcGFyYW1ldGVyKS5cbiAqIEluIGNhc2VzIHdoZW4gcGVyZm9ybWFuY2UgaXMgY3JpdGljYWwsIHlvdSBtYXkgd2FudCB0byBhdm9pZCB1c2luZyBjaGFpbmluZy5cbiAqXG4gKiBAcGFyYW0ge0FueX0gc2VsZiBBIHZhbHVlIHRvIGJlIHdyYXBwZWRcbiAqIEByZXR1cm4ge1Byb3RvfVxuICovXG5mdW5jdGlvbiBQcm90byhzZWxmKSB7XG4gICAgLy8gd3JhcCBwYXNzZWQgcGFyYW1ldGVyIGluIF8gb2JqZWN0XG4gICAgdmFyIHdyYXBwZWQgPSBPYmplY3QuY3JlYXRlKFByb3RvLnByb3RvdHlwZSk7XG4gICAgd3JhcHBlZC5zZWxmID0gc2VsZjtcbiAgICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbnZhciBfID0gUHJvdG87XG5cblxuLy8gc3RvcmUgcmF3IG1ldGhvZHMgZnJvbSBkaWZmZXJlbnQgbW9kdWxlcyBpbiBfXyBvYmplY3QgKGRvdWJsZSBcIl9cIilcbnZhciBfXyA9IHt9O1xuXG5vYmplY3RNZXRob2RzLmV4dGVuZC5jYWxsKF9fLCBvYmplY3RNZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCBwcm90b3R5cGVNZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCBhcnJheU1ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIHN0cmluZ01ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIG51bWJlck1ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIGZ1bmN0aW9uTWV0aG9kcyk7XG5fXy5leHRlbmQuY2FsbChfXywgdXRpbE1ldGhvZHMpO1xuXG5cbi8vIGFkZCBfXyBhcyBwcm9wZXJ0eSBvZiBQcm90bywgc28gdGhleSBjYW4gYmUgdXNlZCBhcyBtaXhpbnMgaW4gb3RoZXIgY2xhc3Nlc1xuX18uZGVmaW5lUHJvcGVydHkoUHJvdG8sICdfXycsIF9fKTtcblxuXG4vLyBhZGQgXyBtZXRob2QgdG8gdW53cmFwIHdyYXBwZWQgdmFsdWUgKFByb3RvIGluc3RhbmNlKVxuZnVuY3Rpb24gdW53cmFwUHJvdG8oKSB7IHJldHVybiB0aGlzLnNlbGY7IH1cbl9fLmV4dGVuZFByb3RvLmNhbGwoUHJvdG8sIHsgXzogdW53cmFwUHJvdG8gfSk7XG5cbi8vIGFkZCBjb25zdGFudHMgKGZ1bmN0aW9ucyB3aWxsIGJlIG92ZXJ3cml0dGVuKVxuX18uZXh0ZW5kLmNhbGwoUHJvdG8sIG9iamVjdE1ldGhvZHMuX2NvbnN0YW50cyk7XG5cbi8vIGFkZCBmdW5jdGlvbnMgdGhhdCB0YWtlIGZpcnN0IHBhcmFtZXRlciBpbnN0ZWFkIG9mIFwidGhpc1wiIHRvIFByb3RvXG52YXIgcHJvdG9GdW5jcyA9IF9fLm1hcEtleXMuY2FsbChfXywgdXRpbHMubWFrZVByb3RvRnVuY3Rpb24sIHRydWUpO1xuX18uZXh0ZW5kLmNhbGwoUHJvdG8sIHByb3RvRnVuY3MpO1xuXG4vLyBhZGQgUHJvdG8gd3JhcHBlZCB2YWx1ZSBpbnN0YW5jZSBtZXRob2RzIHRvIFByb3RvIHByb3RvdHlwZVxudmFyIHByb3RvSW5zdGFuY2VNZXRob2RzID0gX18ubWFwS2V5cy5jYWxsKF9fLCB1dGlscy5tYWtlUHJvdG9JbnN0YW5jZU1ldGhvZCwgdHJ1ZSk7XG5fXy5leHRlbmRQcm90by5jYWxsKFByb3RvLCBwcm90b0luc3RhbmNlTWV0aG9kcyk7XG5cblxuLyoqXG4gKiBJbiB3aW5kb3dzIGVudmlyb25tZW50LCBhIGdsb2JhbCBgX2AgdmFsdWUgaXMgcHJlc2VydmVkIGluIGBfLnVuZGVyc2NvcmVgXG4gKi9cbmlmICh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnKSB7XG4gICAgLy8gcHJlc2VydmUgZXhpc3RpbmcgXyBvYmplY3RcbiAgICBpZiAod2luZG93Ll8pXG4gICAgICAgIFByb3RvLnVuZGVyc2NvcmUgPSB3aW5kb3cuX1xuXG4gICAgLy8gZXhwb3NlIGdsb2JhbCBfIGFuZCBQcm90b1xuICAgIHdpbmRvdy5fID0gUHJvdG87XG59XG5cbmlmICh0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKVxuICAgIC8vIGV4cG9ydCBmb3Igbm9kZS9icm93c2VyaWZ5XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBQcm90bztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9fID0gcmVxdWlyZSgnLi9wcm90b19vYmplY3QnKVxuICAgICwgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cblxuLyoqXG4gKiAtIFtmaW5kXSgjZmluZClcbiAqIC0gW2ZpbmRJbmRleF0oI2ZpbmRJbmRleClcbiAqIC0gW2FwcGVuZEFycmF5XSgjYXBwZW5kQXJyYXkpXG4gKiAtIFtwcmVwZW5kQXJyYXldKCNwcmVwZW5kQXJyYXkpXG4gKiAtIFtzcGxpY2VJdGVtXSgjc3BsaWNlSXRlbSlcbiAqIC0gW3RvQXJyYXldKCN0b0FycmF5KVxuICogLSBbb2JqZWN0XSgjb2JqZWN0KVxuICogLSBbbWFwVG9PYmplY3RdKCNtYXBUb09iamVjdClcbiAqIC0gW3VuaXF1ZV0oI3VuaXF1ZSlcbiAqIC0gW2RlZXBGb3JFYWNoXSgjZGVlcEZvckVhY2gpXG4gKlxuICogVGhlc2UgbWV0aG9kcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwjUHJvdG8pLlxuICovXG52YXIgYXJyYXlNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgLy8gZmluZDogc2VlIGJlbG93XG4gICAgLy8gZmluZEluZGV4OiBzZWUgYmVsb3dcbiAgICBhcHBlbmRBcnJheTogYXBwZW5kQXJyYXksXG4gICAgcHJlcGVuZEFycmF5OiBwcmVwZW5kQXJyYXksXG4gICAgdG9BcnJheTogdG9BcnJheSxcbiAgICBvYmplY3Q6IG9iamVjdCxcbiAgICBtYXBUb09iamVjdDogbWFwVG9PYmplY3QsXG4gICAgdW5pcXVlOiB1bmlxdWUsXG4gICAgZGVlcEZvckVhY2g6IGRlZXBGb3JFYWNoLFxuICAgIHNwbGljZUl0ZW06IHNwbGljZUl0ZW1cbn07XG5cblxuLyoqXG4gKiBGdW5jdGlvbnMgdGhhdCBBcnJheSBbaW1wbGVtZW50cyBuYXRpdmVseV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcHJvdG90eXBlI01ldGhvZHMpIGFyZSBhbHNvIGluY2x1ZGVkIGZvciBjb252ZW5pZW5jZSAtIHRoZXkgY2FuIGJlIHVzZWQgd2l0aCBhcnJheS1saWtlIG9iamVjdHMgYW5kIGZvciBjaGFpbmluZyAobmF0aXZlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGNhbGxlZCkuXG4gKiBUaGVzZSBtZXRob2RzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCNQcm90bykgdG9vLlxuICovXG52YXIgbmF0aXZlQXJyYXlNZXRob2RzTmFtZXMgPSBbICdqb2luJywgJ3BvcCcsICdwdXNoJywgJ2NvbmNhdCcsXG4gICAgJ3JldmVyc2UnLCAnc2hpZnQnLCAndW5zaGlmdCcsICdzbGljZScsICdzcGxpY2UnLFxuICAgICdzb3J0JywgJ2ZpbHRlcicsICdmb3JFYWNoJywgJ3NvbWUnLCAnZXZlcnknLFxuICAgICdtYXAnLCAnaW5kZXhPZicsICdsYXN0SW5kZXhPZicsICdyZWR1Y2UnLCAncmVkdWNlUmlnaHQnXTtcblxudmFyIG5hdGl2ZUFycmF5TWV0aG9kcyA9IG1hcFRvT2JqZWN0LmNhbGwobmF0aXZlQXJyYXlNZXRob2RzTmFtZXMsXG4gICAgICAgIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG4gICAgICAgIH0pO1xuXG5fXy5leHRlbmQuY2FsbChhcnJheU1ldGhvZHMsIG5hdGl2ZUFycmF5TWV0aG9kcyk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBFUzYgW0FycmF5IF9fZmluZF9fIG1ldGhvZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmluZCkgKG5hdGl2ZSBtZXRob2QgaXMgdXNlZCBpZiBhdmFpbGFibGUpLlxuICogUmV0dXJucyBhcnJheSBlbGVtZW50IHRoYXQgcGFzc2VzIGNhbGxiYWNrIHRlc3QuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBhcnJheSB0byBzZWFyY2ggaW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYHRydWVgIGZvciBpdGVtIHRvIHBhc3MgdGhlIHRlc3QsIHBhc3NlZCBgdmFsdWVgLCBgaW5kZXhgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmFycmF5TWV0aG9kcy5maW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmRcbiAgICB8fCB1dGlscy5tYWtlRmluZE1ldGhvZChhcnJheU1ldGhvZHMuZm9yRWFjaCwgJ3ZhbHVlJyk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBFUzYgW0FycmF5IF9fZmluZEluZGV4X18gbWV0aG9kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maW5kSW5kZXgpIChuYXRpdmUgbWV0aG9kIGlzIHVzZWQgaWYgYXZhaWxhYmxlKS5cbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIGFycmF5IGVsZW1lbnQgdGhhdCBwYXNzZXMgY2FsbGJhY2sgdGVzdC4gUmV0dXJucyBgLTFgIGlmIG5vdCBmb3VuZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIGFycmF5IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBpbmRleGAgYW5kIGBzZWxmYCBhcyBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBvcHRpb25hbCBjb250ZXh0IChgdGhpc2ApIG9mIGNhbGxiYWNrIGNhbGxcbiAqIEByZXR1cm4ge0ludGVnZXJ9XG4gKi9cbmFycmF5TWV0aG9kcy5maW5kSW5kZXggPSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4XG4gICAgfHwgdXRpbHMubWFrZUZpbmRNZXRob2QoYXJyYXlNZXRob2RzLmZvckVhY2gsICdpbmRleCcpO1xuXG5cbi8qKlxuICogQXBwZW5kcyBgYXJyYXlUb0FwcGVuZGAgdG8gdGhlIGVuZCBvZiBhcnJheSBgc2VsZmAgaW4gcGxhY2UgKGNhbiBiZSBhbiBpbnN0YW5jZSBvZiBBcnJheSBvciBhcnJheS1saWtlIG9iamVjdCkuXG4gKiBDaGFuZ2VzIHRoZSB2YWx1ZSBvZiBgc2VsZmAgKGl0IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgKSBhbmQgcmV0dXJucyBgc2VsZmAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBBbiBhcnJheSB0aGF0IHdpbGwgYmUgbW9kaWZpZWRcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gYXJyYXlUb0FwcGVuZCBBbiBhcnJheSB0aGF0IHdpbGwgYmUgYXBwZW5kZWRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBhcHBlbmRBcnJheShhcnJheVRvQXBwZW5kKSB7XG4gICAgaWYgKCEgYXJyYXlUb0FwcGVuZC5sZW5ndGgpIHJldHVybiB0aGlzO1xuICAgIGlmICghIEFycmF5LmlzQXJyYXkoYXJyYXlUb0FwcGVuZCkpXG4gICAgICAgIGFycmF5VG9BcHBlbmQgPSB0b0FycmF5LmNhbGwoYXJyYXlUb0FwcGVuZCk7XG4gICAgXG4gICAgdmFyIGFyZ3MgPSBbdGhpcy5sZW5ndGgsIDBdLmNvbmNhdChhcnJheVRvQXBwZW5kKTtcbiAgICBhcnJheU1ldGhvZHMuc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBQcmVwZW5kcyBgYXJyYXlUb1ByZXBlbmRgIHRvIHRoZSBiZWdpbm5pZyBvZiBhcnJheSBgc2VsZmAgaW4gcGxhY2UgKGNhbiBiZSBhbiBpbnN0YW5jZSBvZiBBcnJheSBvciBhcnJheS1saWtlIG9iamVjdCkuXG4gKiBDaGFuZ2VzIHRoZSB2YWx1ZSBvZiBgc2VsZmAgKGl0IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgKSBhbmQgcmV0dXJucyBgc2VsZmAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBBbiBhcnJheSB0aGF0IHdpbGwgYmUgbW9kaWZpZWRcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gYXJyYXlUb0FwcGVuZCBBbiBhcnJheSB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gcHJlcGVuZEFycmF5KGFycmF5VG9QcmVwZW5kKSB7XG4gICAgaWYgKCEgYXJyYXlUb1ByZXBlbmQubGVuZ3RoKSByZXR1cm4gdGhpcztcbiAgICBpZiAoISBBcnJheS5pc0FycmF5KGFycmF5VG9QcmVwZW5kKSlcbiAgICAgICAgYXJyYXlUb1ByZXBlbmQgPSB0b0FycmF5LmNhbGwoYXJyYXlUb1ByZXBlbmQpO1xuXG4gICAgdmFyIGFyZ3MgPSBbMCwgMF0uY29uY2F0KGFycmF5VG9QcmVwZW5kKTtcbiAgICBhcnJheU1ldGhvZHMuc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGl0ZW0gZnJvbSBhcnJheSB0aGF0IGlzIGZvdW5kIHVzaW5nIGluZGV4T2YgKGkuZS4gJz09PScpXG4gKiBNb2RpZmllcyBvcmlnaW5hbCBhcnJheSBhbmQgcmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIGl0LlxuICogXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIEFuIGFycmF5IHRoYXQgd2lsbCBiZSBtb2RpZmllZFxuICogQHBhcmFtICB7QW55fSBpdGVtIGl0ZW0gdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHNwbGljZUl0ZW0oaXRlbSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPj0gMCkgdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBuZXcgYXJyYXkgY3JlYXRlZCBmcm9tIGFycmF5LWxpa2Ugb2JqZWN0IChlLmcuLCBgYXJndW1lbnRzYCBwc2V1ZG8tYXJyYXkpLlxuICpcbiAqIEBwYXJhbSB7QXJyYXktbGlrZX0gc2VsZiBPYmplY3Qgd2l0aCBudW1lcmljIHByb3BlcnR5IGxlbmd0aFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIGFycmF5TWV0aG9kcy5zbGljZS5jYWxsKHRoaXMpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBhcnJheSBvZiBga2V5c2AgYW5kIG9wdGlvbmFsIGFycmF5IG9mIGB2YWx1ZXNgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgQXJyYXkgb2Yga2V5c1xuICogQHBhcmFtIHtBcnJheXxhbnl9IHZhbHVlcyBPcHRpb25hbCBhcnJheSBvZiB2YWx1ZXMgb3IgdGhlIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGVhY2ggcHJvcGVydHkuXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG9iamVjdCh2YWx1ZXMpIHtcbiAgICB2YXIgb2JqID0ge31cbiAgICAgICAgLCB2YWx1ZXNJc0FycmF5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpO1xuICAgIGFycmF5TWV0aG9kcy5mb3JFYWNoLmNhbGwodGhpcywgZnVuY3Rpb24oa2V5LCBpbmRleCkge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlc0lzQXJyYXkgPyB2YWx1ZXNbaW5kZXhdIDogdmFsdWVzO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbn1cblxuXG4vKipcbiAqIE1hcHMgYXJyYXkgdG8gb2JqZWN0LlxuICogQXJyYXkgZWxlbWVudHMgYmVjb21lIGtleXMsIHZhbHVlIGFyZSB0YWtlbiBmcm9tIGBjYWxsYmFja2AuXG4gKiBcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgQW4gYXJyYXkgd2hpY2ggdmFsdWVzIHdpbGwgYmVjb21lIGtleXMgb2YgdGhlIHJlc3VsdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBpbmRleGAgYW5kIGBzZWxmYCBhbmQgc2hvdWxkIHJldHVybiB2YWx1ZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBtYXBUb09iamVjdChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICByZXN1bHRbdmFsdWVdID0gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaW5kZXgsIHRoaXMpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IHdpdGhvdXQgZHVwbGljYXRlcy4gRG9lcyBub3QgbW9kaWZ5IG9yaWdpbmFsIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgb3JpZ2luYWwgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNvbXBhcmlzb24gZnVuY3Rpb24sIHNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgZXF1YWwgaXRlbXMsIFwiPT09XCIgaXMgdXNlZCBpZiBub3QgcGFzc2VkLlxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZShjYWxsYmFjaykge1xuICAgIHZhciBmaWx0ZXJlZCA9IFtdO1xuICAgIGlmICghIGNhbGxiYWNrKVxuICAgICAgICBpdGVtSW5kZXggPSBpdGVtSW5kZXhPZjtcblxuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGl0ZW1JbmRleChpdGVtKTtcbiAgICAgICAgaWYgKGluZGV4ID09IC0xKVxuICAgICAgICAgICAgZmlsdGVyZWQucHVzaChpdGVtKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWx0ZXJlZDtcblxuXG4gICAgZnVuY3Rpb24gaXRlbUluZGV4KGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWV0aG9kcy5maW5kSW5kZXguY2FsbChmaWx0ZXJlZCwgZnVuY3Rpb24oaXQpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhpdGVtLCBpdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGl0ZW1JbmRleE9mKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkLmluZGV4T2YoaXRlbSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogSXRlcmF0ZXMgYXJyYXkgYW5kIGVsZW1lbnRzIHRoYXQgYXJlIGFycmF5cyBjYWxsaW5nIGNhbGxiYWNrIHdpdGggZWFjaCBlbGVtZW50IHRoYXQgaXMgbm90IGFuIGFycmF5LiBDYW4gYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgYXJndW1lbnRzIGxpc3QgdG8gYXZvaWQgY2hlY2tpbmcgd2hldGhlciBhcnJheSBvciBsaXN0IG9mIHBhcmFtZXRlcnMgaXMgcGFzc2VkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gc2VsZiBhcnJheSBvZiBlbGVtZW50cyBhbmQgYXJyYXlzdG8gaXRlcmF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNhbGxlZCBmb3IgZWFjaCBpdGVtIHRoYXQgaXMgbm90IGFuIGFycmF5LiBDYWxsYmFjayBpcyBwYXNzZWQgaXRlbSwgaW5kZXggYW5kIG9yaWdpbmFsIGFycmF5IGFzIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge0FueX0gdGhpc0FyZyBvcHRpb25hbCBjYWxsYmFjayBlbnZvY2F0aW9uIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gZGVlcEZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB2YXIgaW5kZXggPSAwLCBhcnIgPSB0aGlzO1xuICAgIF9kZWVwRm9yRWFjaC5jYWxsKHRoaXMpO1xuXG4gICAgZnVuY3Rpb24gX2RlZXBGb3JFYWNoKCkge1xuICAgICAgICBhcnJheU1ldGhvZHMuZm9yRWFjaC5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgX2RlZXBGb3JFYWNoLmNhbGwodmFsdWUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWUsIGluZGV4KyssIGFycik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWFrZVByb3RvRnVuY3Rpb24gPSByZXF1aXJlKCcuL3V0aWxzJykubWFrZVByb3RvRnVuY3Rpb25cbiAgICAsIHJlcGVhdCA9IHJlcXVpcmUoJy4vcHJvdG9fdXRpbCcpLnJlcGVhdDtcblxuXG4vKipcbiAqIC0gW21ha2VGdW5jdGlvbl0oI21ha2VGdW5jdGlvbilcbiAqIC0gW3BhcnRpYWxdKCNwYXJ0aWFsKVxuICogLSBbcGFydGlhbFJpZ2h0XSgjcGFydGlhbFJpZ2h0KVxuICogLSBbbWVtb2l6ZV0oI21lbW9pemUpXG4gKiAtIFtkZWxheV0oI2RlbGF5KVxuICogLSBbZGVmZXJdKCNkZWZlcilcbiAqIC0gW2RlbGF5ZWRdKCNkZWxheWVkKVxuICogLSBbZGVmZXJyZWRdKCNkZWZlcnJlZClcbiAqIC0gW2RlZmVyVGlja3NdKCNkZWZlclRpY2tzKVxuICogLSBbZGVsYXlNZXRob2RdKCNkZWxheU1ldGhvZClcbiAqIC0gW2RlZmVyTWV0aG9kXSgjZGVmZXJNZXRob2QpXG4gKiAtIFtkZWJvdW5jZV0oI2RlYm91bmNlKVxuICogLSBbdGhyb3R0bGVdKCN0aHJvdHRsZSlcbiAqIC0gW29uY2VdKCNvbmNlKVxuICogLSBbd2FpdEZvcl0oI3dhaXRGb3IpXG4gKiAtIFtub3RdKCNub3QpXG4gKlxuICogVGhlc2UgbWV0aG9kcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwjUHJvdG8pXG4gKi9cbnZhciBmdW5jdGlvbk1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBtYWtlRnVuY3Rpb246IG1ha2VGdW5jdGlvbixcbiAgICBwYXJ0aWFsOiBwYXJ0aWFsLFxuICAgIHBhcnRpYWxSaWdodDogcGFydGlhbFJpZ2h0LFxuICAgIG1lbW9pemU6IG1lbW9pemUsXG4gICAgZGVsYXk6IGRlbGF5LFxuICAgIGRlZmVyOiBkZWZlcixcbiAgICBkZWxheWVkOiBkZWxheWVkLFxuICAgIGRlZmVycmVkOiBkZWZlcnJlZCxcbiAgICBkZWZlclRpY2tzOiBkZWZlclRpY2tzLFxuICAgIGRlbGF5TWV0aG9kOiBkZWxheU1ldGhvZCxcbiAgICBkZWZlck1ldGhvZDogZGVmZXJNZXRob2QsXG4gICAgZGVib3VuY2U6IGRlYm91bmNlLFxuICAgIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgICBvbmNlOiBvbmNlLFxuICAgIHdhaXRGb3I6IHdhaXRGb3IsXG4gICAgbm90OiBub3Rcbn07XG5cblxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG5cbi8qKlxuICogU2ltaWxhcmx5IHRvIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBmdW5jdGlvbiBmcm9tIGNvZGUuXG4gKiBVbmxpa2UgRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uIG5hbWVcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBuZXcgZnVuY3Rpb24gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGFyZzEsIGFyZzIsIC4uLiB0aGUgbmFtZXMgb2YgZnVuY3Rpb24gcGFyYW1ldGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IGZ1bmNCb2R5IGZ1bmN0aW9uIGJvZHlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBtYWtlRnVuY3Rpb24oYXJnMSwgYXJnMiwgZnVuY0JvZHkpIHtcbiAgICB2YXIgbmFtZSA9IHRoaXNcbiAgICAgICAgLCBjb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxXG4gICAgICAgICwgZnVuY0JvZHkgPSBhcmd1bWVudHNbY291bnRdXG4gICAgICAgICwgZnVuY1xuICAgICAgICAsIGNvZGUgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspXG4gICAgICAgIGNvZGUgKz0gJywgJyArIGFyZ3VtZW50c1tpXTtcbiAgICBjb2RlID0gWydmdW5jID0gZnVuY3Rpb24gJywgbmFtZSwgJygnLCBjb2RlLnNsaWNlKDIpLCAnKSB7XFxuJ1xuICAgICAgICAgICAgICAgICwgZnVuY0JvZHksICdcXG59J10uam9pbignJyk7XG4gICAgZXZhbChjb2RlKTtcbiAgICByZXR1cm4gZnVuYztcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBhcyBhIHJlc3VsdCBvZiBwYXJ0aWFsIGZ1bmN0aW9uIGFwcGxpY2F0aW9uIHdpdGggdGhlIHBhc3NlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgRnVuY3Rpb24gdG8gYmUgYXBwbGllZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgQXJndW1lbnRzIGFmdGVyIHNlbGYgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGNhbGwgd2hlbiB0aGUgcGFydGlhbCBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcGFydGlhbCgpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGZ1bmMgPSB0aGlzO1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBhcyBhIHJlc3VsdCBvZiBwYXJ0aWFsIGZ1bmN0aW9uIGFwcGxpY2F0aW9uIHdpdGggdGhlIHBhc3NlZCBwYXJhbWV0ZXJzLCBidXQgcGFyYW1ldGVycyBhcmUgYXBwZW5kZWQgb24gdGhlIHJpZ2h0LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgRnVuY3Rpb24gdG8gYmUgYXBwbGllZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgQXJndW1lbnRzIGFmdGVyIHNlbGYgd2lsbCBiZSBhcHBlbmRlZCBvbiB0aGUgcmlnaHQgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGNhbGwgd2hlbiB0aGUgcGFydGlhbCBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcGFydGlhbFJpZ2h0KCkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cykuY29uY2F0KGFyZ3MpKTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhIG1lbW9pemVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHVzaW5nIHN1cHBsaWVkIGhhc2ggZnVuY3Rpb24gYXMga2V5LiBJZiB0aGUgaGFzaCBpcyBub3Qgc3VwcGxpZWQsIHVzZXMgaXRzIGZpcnN0IHBhcmFtZXRlciBhcyB0aGUgaGFzaC5cbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0byBiZSBtZW1vaXplZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzaEZ1bmMgb3B0aW9uYWwgaGFzaCBmdW5jdGlvbiB0aGF0IGlzIHBhc3NlZCBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCBzaG91bGQgcmV0dXJuIGNhY2hlIGtleS5cbiAqIEBwYXJhbSB7SW50ZWdlcn0gbGltaXQgb3B0aW9uYWwgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byBiZSBzdG9yZWQgaW4gdGhlIGNhY2hlLiAxMDAwIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gbWVtb2l6ZWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShoYXNoRnVuYywgbGltaXQpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgdmFyIGNhY2hlID0ge30sIGtleXNMaXN0ID0gW107XG4gICAgbGltaXQgPSBsaW1pdCB8fCAxMDAwO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIga2V5ID0gaGFzaEZ1bmMgPyBoYXNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAoY2FjaGUuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtrZXldO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSBjYWNoZVtrZXldID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBrZXlzTGlzdC5wdXNoKGtleSk7XG5cbiAgICAgICAgaWYgKGtleXNMaXN0Lmxlbmd0aCA+IGxpbWl0KVxuICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tleXNMaXN0LnNoaWZ0KCldO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIERlbGF5cyBmdW5jdGlvbiBleGVjdXRpb24gYnkgYSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcy5cbiAqIFRoZSBjb250ZXh0IGluIGZ1bmN0aW9uIHdoZW4gaXQgaXMgZXhlY3V0ZWQgaXMgc2V0IHRvIGBudWxsYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRoYXQgZXhlY3V0aW9uIGhhcyB0byBiZSBkZWxheWVkXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdCBhcHByb3hpbWF0ZSBkYWxheSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KHdhaXQpIHsgLy8gLCBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gX2RlbGF5KHRoaXMsIHdhaXQsIGFyZ3MpO1xufVxuIFxuXG4vKipcbiAqIERlZmVycyBmdW5jdGlvbiBleGVjdXRpb24gKGV4ZWN1dGVzIGFzIHNvb24gYXMgZXhlY3V0aW9uIGxvb3AgYmVjb21lcyBmcmVlKVxuICogVGhlIGNvbnRleHQgaW4gZnVuY3Rpb24gd2hlbiBpdCBpcyBleGVjdXRlZCBpcyBzZXQgdG8gYG51bGxgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdGhhdCBleGVjdXRpb24gaGFzIHRvIGJlIGRlbGF5ZWRcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIG9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBkZWZlcigpIHsgLy8gLCBhcmd1bWVudHNcbiAgICByZXR1cm4gX2RlbGF5KHRoaXMsIDEsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9kZWxheShmdW5jLCB3YWl0LCBhcmdzLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuYy5hcHBseS5iaW5kKGZ1bmMsIGNvbnRleHQgfHwgbnVsbCwgYXJncyksIHdhaXQpO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgXy5kZWZlciwgdGFrZXMgZmlyc3QgYXJndW1lbnQgYXMgdGhlIGZ1bmN0aW9uIHRvIGJlIGRlZmVycmVkXG4gKi9cbnZhciBkZWZlckZ1bmMgPSBtYWtlUHJvdG9GdW5jdGlvbihkZWZlcik7XG5cbi8qKlxuICogRGVmZXJzIGZ1bmN0aW9uIGV4ZWN1dGlvbiBmb3IgYHRpbWVzYCB0aWNrcyAoZXhlY3V0ZXMgYWZ0ZXIgZXhlY3V0aW9uIGxvb3AgYmVjb21lcyBmcmVlIGB0aW1lc2AgdGltZXMpXG4gKiBUaGUgY29udGV4dCBpbiBmdW5jdGlvbiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGlzIHNldCB0byBgbnVsbGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0aGF0IGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVsYXllZFxuICogQHBhcmFtIHtJbnRlZ2VyfSB0aWNrcyBudW1iZXIgb2YgdGltZXMgdG8gZGVmZXIgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZGVmZXJUaWNrcyh0aWNrcykgeyAvLyAsIGFyZ3VtZW50c1xuICAgIGlmICh0aWNrcyA8IDIpIHJldHVybiBkZWZlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBhcmdzID0gcmVwZWF0LmNhbGwoZGVmZXJGdW5jLCB0aWNrcyAtIDEpO1xuICAgIGFyZ3MgPSBhcmdzLmNvbmNhdCh0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyBcbiAgICByZXR1cm4gZGVmZXJGdW5jLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuXG5cbi8qKlxuICogV29ya3MgbGlrZSBfLmRlbGF5IGJ1dCBhbGxvd3MgdG8gZGVmZXIgbWV0aG9kIGNhbGwgb2YgYHNlbGZgIHdoaWNoIHdpbGwgYmUgdGhlIGZpcnN0IF8uZGVsYXlNZXRob2QgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIGRlbGF5IG1ldGhvZCBjYWxsIG9mXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gZnVuY09yTWV0aG9kTmFtZSBmdW5jdGlvbiBvciBuYW1lIG9mIG1ldGhvZFxuICogQHBhcmFtIHtOdW1iZXJ9IHdhaXQgYXBwcm94aW1hdGUgZGFsYXkgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGFyZ3VtZW50cyB0byBwYXNzIHRvIG1ldGhvZFxuICovXG5mdW5jdGlvbiBkZWxheU1ldGhvZChmdW5jT3JNZXRob2ROYW1lLCB3YWl0KSB7IC8vICwgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHJldHVybiBfZGVsYXlNZXRob2QodGhpcywgZnVuY09yTWV0aG9kTmFtZSwgd2FpdCwgYXJncyk7XG59XG5cblxuLyoqXG4gKiBXb3JrcyBsaWtlIF8uZGVmZXIgYnV0IGFsbG93cyB0byBkZWZlciBtZXRob2QgY2FsbCBvZiBgc2VsZmAgd2hpY2ggd2lsbCBiZSB0aGUgZmlyc3QgXy5kZWZlck1ldGhvZCBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gZGVmZXIgbWV0aG9kIGNhbGwgb2ZcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBmdW5jT3JNZXRob2ROYW1lIGZ1bmN0aW9uIG9yIG5hbWUgb2YgbWV0aG9kXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhcmd1bWVudHMgdG8gcGFzcyB0byBtZXRob2RcbiAqL1xuZnVuY3Rpb24gZGVmZXJNZXRob2QoZnVuY09yTWV0aG9kTmFtZSkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gX2RlbGF5TWV0aG9kKHRoaXMsIGZ1bmNPck1ldGhvZE5hbWUsIDEsIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBfZGVsYXlNZXRob2Qob2JqZWN0LCBmdW5jT3JNZXRob2ROYW1lLCB3YWl0LCBhcmdzKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmdW5jID0gdHlwZW9mIGZ1bmNPck1ldGhvZE5hbWUgPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyBvYmplY3RbZnVuY09yTWV0aG9kTmFtZV1cbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jT3JNZXRob2ROYW1lO1xuICAgICAgICBmdW5jLmFwcGx5KG9iamVjdCwgYXJncyk7XG4gICAgfSwgd2FpdCk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBgd2FpdGAgbXMgYWZ0ZXIgaXQgaGFzIGJlZW4gY2FsbGVkXG4gKiBUaGUgY29udGV4dCBpbiBmdW5jdGlvbiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGlzIHNldCB0byBgbnVsbGAuXG4gKiBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gZGVsYXllZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVmZXJyZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IGFwcHJveGltYXRlIGRhbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBkZWxheWVkKHdhaXQpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZnVuYyA9IHRoaXNcbiAgICAgICAgLCBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHsgLy8gLi4uIGFyZ3VtZW50c1xuICAgICAgICB2YXIgcGFzc0FyZ3MgPSBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgICAgICByZXR1cm4gX2RlbGF5KGZ1bmMsIHdhaXQsIHBhc3NBcmdzLCB0aGlzKTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBmdW5jdGlvbiB0aGF0IHdpbGwgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb24gdGhlIG5leHQgdGljayBvbmNlIGl0IGhhcyBiZWVuIGNhbGxlZFxuICogVGhlIGNvbnRleHQgaW4gZnVuY3Rpb24gd2hlbiBpdCBpcyBleGVjdXRlZCBpcyBzZXQgdG8gYG51bGxgLlxuICogQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGRlZmVycmVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gd2hpY2ggZXhlY3V0aW9uIGhhcyB0byBiZSBkZWZlcnJlZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gZGVmZXJyZWQoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGZ1bmMgPSB0aGlzXG4gICAgICAgICwgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IC8vIC4uLiBhcmd1bWVudHNcbiAgICAgICAgdmFyIHBhc3NBcmdzID0gYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICAgICAgcmV0dXJuIF9kZWxheShmdW5jLCAxLCBwYXNzQXJncywgdGhpcyk7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2FsbCBvcmlnaW5hbCBmdW5jdGlvbiBvbmNlIGl0IGhhcyBub3QgYmVlbiBjYWxsZWQgZm9yIGEgc3BlY2lmaWVkIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRoYXQgZXhlY3V0aW9uIGhhcyB0byBiZSBkZWxheWVkXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdCBhcHByb3hpbWF0ZSBkYWxheSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHtCb29sZWFufSBpbW1lZGlhdGUgdHJ1ZSB0byBpbnZva2UgZnVuY2l0b24gaW1tZWRpYXRlbHkgYW5kIHRoZW4gaWdub3JlIGZvbGxvd2luZyBjYWxscyBmb3Igd2FpdCBtaWxsaXNlY29uZHNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBkZWJvdW5jZSh3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7IC8vIGZpcnN0IHBhcmFtZXRlciBvZiBfLmRlYm91bmNlXG4gICAgdmFyIHRpbWVvdXQsIGFyZ3MsIGNvbnRleHQsIHRpbWVzdGFtcCwgcmVzdWx0O1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7IC8vIHN0b3JlIG9yaWdpbmFsIGNvbnRleHRcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdmFyIGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgISB0aW1lb3V0O1xuICAgICAgICBpZiAoISB0aW1lb3V0KVxuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICBpZiAoY2FsbE5vdylcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgZnVuY3Rpb24gbGF0ZXIoKSB7XG4gICAgICAgICAgICB2YXIgbGFzdCA9IERhdGUubm93KCkgLSB0aW1lc3RhbXA7XG4gICAgICAgICAgICBpZiAobGFzdCA8IHdhaXQpXG4gICAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQgLSBsYXN0KTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghIGltbWVkaWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIHdoZW4gaW52b2tlZCwgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBhdCBtb3N0IG9uY2UgZHVyaW5nIGEgZ2l2ZW4gd2luZG93IG9mIHRpbWUuIFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdGhhdCBleGVjdXRpb24gaGFzIHRvIGJlIGRlbGF5ZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IGFwcHJveGltYXRlIGRlbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBge2xlYWRpbmc6IGZhbHNlfWAgdG8gZGlzYWJsZSB0aGUgZXhlY3V0aW9uIG9uIHRoZSBsZWFkaW5nIGVkZ2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiB0aHJvdHRsZSh3YWl0LCBvcHRpb25zKSB7XG4gICAgdmFyIGZ1bmMgPSB0aGlzOyAvLyBmaXJzdCBwYXJhbWV0ZXIgb2YgXy50aHJvdHRsZVxuICAgIHZhciBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gICAgdmFyIHRpbWVvdXQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91cyA9IDA7XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgICAgIHZhciByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKTtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRpbWVvdXQgJiYgb3B0aW9ucy50cmFpbGluZyAhPT0gZmFsc2UpXG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsYXRlcigpIHtcbiAgICAgICAgcHJldmlvdXMgPSBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlID8gMCA6IERhdGUubm93KCk7XG4gICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIENhbGwgcGFzc2VkIGZ1bmN0aW9uIG9ubHkgb25jZVxuICogQHJldHVybiB7RnVuY3Rpb259IHNlbGZcbiAqL1xuZnVuY3Rpb24gb25jZSgpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXNcbiAgICAgICAgLCByYW4gPSBmYWxzZVxuICAgICAgICAsIG1lbW87XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAocmFuKSByZXR1cm4gbWVtbztcbiAgICAgICAgcmFuID0gdHJ1ZTtcbiAgICAgICAgbWVtbyA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgZnVuYyA9IG51bGw7XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBFeGVjdXRlIGEgZnVuY3Rpb24gd2hlbiB0aGUgY29uZGl0aW9uIGZ1bmN0aW9uIHJldHVybnMgYSB0cnV0aHkgdmFsdWVcbiAqIGl0IHJ1bnMgdGhlIGNvbmRpdGlvbiBmdW5jdGlvbiBldmVyeSBgY2hlY2tJbnRlcnZhbGAgbWlsbGlzZWNvbmRzIChkZWZhdWx0IDUwKVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb246IGlmIGl0IHJldHVybnMgdHJ1ZSB0aGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHJ1bnMgd2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWVcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhUaW1lb3V0IHRpbWVvdXQgYmVmb3JlIGdpdmluZyB1cCAodGltZSBpbiBtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lZE91dEZ1bmMgYSBmdW5jdGlvbiBjYWxsZWQgaWYgdGltZW91dCBpcyByZWFjaGVkXG4gKiBAcGFyYW0ge051bWJlcn0gY2hlY2tJbnRlcnZhbCB0aW1lIGludGVydmFsIHdoZW4geW91IHJ1biB0aGUgY29uZGl0aW9uIGZ1bmN0aW9uICh0aW1lIGluIG1pbGxpc2Vjb25kcyksIGRlZmF1bHQgNTAgbXNcbiAqL1xuZnVuY3Rpb24gd2FpdEZvcihjYWxsYmFjaywgbWF4VGltZW91dCwgdGltZWRPdXRGdW5jLCBjaGVja0ludGVydmFsKXtcbiAgICB2YXIgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHZhciBjb25kaXRpb24gPSB0aGlzO1xuICAgIGNoZWNrSW50ZXJ2YWwgPSBjaGVja0ludGVydmFsIHx8IDUwO1xuICAgIHZhciBpbnRlcnZhbCA9IHNldEludGVydmFsKHRlc3RDb25kaXRpb24sIGNoZWNrSW50ZXJ2YWwpO1xuXG4gICAgZnVuY3Rpb24gdGVzdENvbmRpdGlvbigpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbigpKSBjYWxsYmFjaygpO1xuICAgICAgICBlbHNlIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPj0gbWF4VGltZW91dClcbiAgICAgICAgICAgIHRpbWVkT3V0RnVuYyAmJiB0aW1lZE91dEZ1bmMoKTtcbiAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiByZXR1cm5zIHRoZSBmdW5jdGlvbiB0aGF0IG5lZ2F0ZXMgKCEgb3BlcmF0b3IpIHRoZSByZXN1bHQgb2YgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRvIG5lZ2F0ZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG5vdCgpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gIWZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIC0gW2lzTnVtZXJpY10oI2lzTnVtZXJpYylcbiAqL1xudmFyIG51bWJlck1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpc051bWVyaWM6IGlzTnVtZXJpY1xufTtcblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHRlc3QgaWYgYSB2YWx1ZSBpcyBudW1lcmljXG4gKlxuICogQHBhcmFtIHtBbnl9IHNlbGYgdmFsdWUgdG8gYmUgdGVzdGVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGEgbnVtZXJpYyB2YWx1ZVxuICovXG5mdW5jdGlvbiBpc051bWVyaWMoKSB7XG4gICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHRoaXMpKSAmJiBpc0Zpbml0ZSh0aGlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5cbi8qKlxuICogLSBbZXh0ZW5kXSgjZXh0ZW5kKVxuICogLSBbY2xvbmVdKCNjbG9uZSlcbiAqIC0gW2RlZmluZVByb3BlcnR5XSgjZGVmaW5lUHJvcGVydHkpXG4gKiAtIFtkZWZpbmVQcm9wZXJ0aWVzXSgjZGVmaW5lUHJvcGVydGllcylcbiAqIC0gW2RlZXBFeHRlbmRdKCNkZWVwRXh0ZW5kKVxuICogLSBbZGVlcENsb25lXSgjZGVlcENsb25lKVxuICogLSBba2V5c10oI2tleXMpXG4gKiAtIFthbGxLZXlzXSgjYWxsS2V5cylcbiAqIC0gW3ZhbHVlc10oI3ZhbHVlcylcbiAqIC0gW2tleU9mXSgja2V5T2YpXG4gKiAtIFthbGxLZXlzT2ZdKCNhbGxLZXlzT2YpXG4gKiAtIFtlYWNoS2V5XSgjZWFjaEtleSlcbiAqIC0gW21hcEtleXNdKCNtYXBLZXlzKVxuICogLSBbcmVkdWNlS2V5c10oI3JlZHVjZUtleXMpXG4gKiAtIFtmaWx0ZXJLZXlzXSgjZmlsdGVyS2V5cylcbiAqIC0gW3NvbWVLZXldKCNzb21lS2V5KVxuICogLSBbZXZlcnlLZXldKCNldmVyeUtleSlcbiAqIC0gW2ZpbmRWYWx1ZV0oI2ZpbmRWYWx1ZSlcbiAqIC0gW2ZpbmRLZXldKCNmaW5kS2V5KVxuICogLSBbcGlja0tleXNdKCNwaWNrS2V5cylcbiAqIC0gW29taXRLZXlzXSgjb21pdEtleXMpXG4gKiAtIFtpc0VxdWFsXSgjaXNFcXVhbClcbiAqIC0gW2lzTm90XSgjaXNOb3QpXG4gKlxuICogQWxsIHRoZXNlIG1ldGhvZHMgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sI1Byb3RvKVxuICovXG52YXIgb2JqZWN0TWV0aG9kcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIGNsb25lOiBjbG9uZSxcbiAgICBkZWZpbmVQcm9wZXJ0eTogZGVmaW5lUHJvcGVydHksXG4gICAgZGVmaW5lUHJvcGVydGllczogZGVmaW5lUHJvcGVydGllcyxcbiAgICBkZWVwRXh0ZW5kOiBkZWVwRXh0ZW5kLFxuICAgIGRlZXBDbG9uZTogZGVlcENsb25lLFxuICAgIGtleXM6IGtleXMsXG4gICAgYWxsS2V5czogYWxsS2V5cyxcbiAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICBrZXlPZjoga2V5T2YsXG4gICAgYWxsS2V5c09mOiBhbGxLZXlzT2YsXG4gICAgZWFjaEtleTogZWFjaEtleSxcbiAgICBtYXBLZXlzOiBtYXBLZXlzLFxuICAgIHJlZHVjZUtleXM6IHJlZHVjZUtleXMsXG4gICAgZmlsdGVyS2V5czogZmlsdGVyS2V5cyxcbiAgICBzb21lS2V5OiBzb21lS2V5LFxuICAgIGV2ZXJ5S2V5OiBldmVyeUtleSxcbiAgICBwaWNrS2V5czogcGlja0tleXMsXG4gICAgb21pdEtleXM6IG9taXRLZXlzLFxuICAgIGlzRXF1YWw6IGlzRXF1YWwsXG4gICAgaXNOb3Q6IGlzTm90XG59O1xuXG5cbi8qKlxuICogIyMjI1Byb3BlcnR5IGRlc2NyaXB0b3IgY29uc3RhbnRzIyMjI1xuICogVGhlIHN1bSBvZiB0aGVzZSBjb25zdGFudHMgY2FuIGJlIHVzZWQgYXMgbGFzdCBwYXJhbWV0ZXIgb2YgZGVmaW5lUHJvcGVydHkgYW5kIGRlZmluZVByb3BlcnRpZXMgdG8gZGV0ZXJtaW5lIHR5cGVzIG9mIHByb3BlcnRpZXMuXG4gKi9cbnZhciBjb25zdGFudHMgPSB7XG4gICAgRU5VTUVSQUJMRTogMSxcbiAgICBFTlVNOiAxLFxuICAgIENPTkZJR1VSQUJMRTogMixcbiAgICBDT05GOiAyLFxuICAgIFdSSVRBQkxFOiA0LFxuICAgIFdSSVQ6IDRcbn07XG5cbmRlZmluZVByb3BlcnR5LmNhbGwob2JqZWN0TWV0aG9kcywgJ19jb25zdGFudHMnLCBjb25zdGFudHMpO1xuXG5cbi8qKlxuICogQW5hbG9ndWUgb2YgRVM2IFtBcnJheSBfX2ZpbmRfXyBtZXRob2RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbmQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2Ygb2JqZWN0IHByb3BlcnR5IHRoYXQgcGFzc2VzIGNhbGxiYWNrIHRlc3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7QW55fVxuICovXG5vYmplY3RNZXRob2RzLmZpbmRWYWx1ZSA9IHV0aWxzLm1ha2VGaW5kTWV0aG9kKGVhY2hLZXksICd2YWx1ZScpO1xuXG5cbi8qKlxuICogQW5hbG9ndWUgb2YgRVM2IFtBcnJheSBfX2ZpbmRJbmRleF9fIG1ldGhvZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmluZEluZGV4KS5cbiAqIFJldHVybnMgdGhlIGtleSBvZiBvYmplY3QgcHJvcGVydHkgdGhhdCBwYXNzZXMgY2FsbGJhY2sgdGVzdC4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQgKHVubGlrZSBgZmluZEluZGV4YCwgdGhhdCByZXR1cm5zIC0xIGluIHRoaXMgY2FzZSkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7SW50ZWdlcn1cbiAqL1xub2JqZWN0TWV0aG9kcy5maW5kS2V5ID0gdXRpbHMubWFrZUZpbmRNZXRob2QoZWFjaEtleSwgJ2tleScpO1xuXG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYHNlbGZgIHdpdGggdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBgb2JqYCBjb3B5aW5nIGFsbCBvd24gcHJvcGVydGllcyAobm90IHRob3NlIGluaGVyaXRlZCB2aWEgcHJvdG90eXBlIGNoYWluKSwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgKHVubGVzcyBgb25seUVudW1lcmFibGVgIGlzIHRydXRoeSkuXG4gKiBDcmVhdGVkIHByb3BlcnRpZXMgd2lsbCBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3JzIGFzIHRoZSBwcm9wZXJ0aXMgb2YgYG9iamAuXG4gKiBSZXR1cm5zIGBzZWxmYCB0byBhbGxvdyBjaGFpbmluZyB3aXRoIG90aGVyIGZ1bmN0aW9ucy5cbiAqIENhbiBiZSB1c2VkIHdpdGggZnVuY3Rpb25zLCB0byBjb3B5IGNsYXNzIG1ldGhvZHMsIGUuZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgdG8gc2VsZlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBPcHRpb25hbCBmbGFnIHRvIHByZXZlbnQgY29weWluZyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzLCBgZmFsc2VgIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZXh0ZW5kKG9iaiwgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcblxuICAgIGVhY2hLZXkuY2FsbChvYmosIGZ1bmN0aW9uKHZhbHVlLCBwcm9wKSB7XG4gICAgICAgIGRlc2NyaXB0b3JzW3Byb3BdID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xuICAgIH0sIHRoaXMsIG9ubHlFbnVtZXJhYmxlKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGRlc2NyaXB0b3JzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIG9iamVjdCBgb2JqYCBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzczsgdGhlIHByb3BlcnRpZXMgd2lsbCBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3JzLlxuICogVG8gY2xvbmUgYW4gYXJyYXkgdXNlXG4gKiBgYGBcbiAqIHZhciBjbG9uZWRBcnJheSA9IFtdLmNvbmNhdChhcnIpO1xuICogYGBgXG4gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCB0byBjbG9uZSBhbiBhcnJheSwgYmVjYXVzZSBpdCBpcyBpbmVmZmljaWVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgY2xvbmVkXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNsb25lKCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMpKSByZXR1cm4gdGhpcy5zbGljZSgpO1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIG5ldyBEYXRlKHRoaXMpO1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gbmV3IFJlZ0V4cCh0aGlzKTtcbiAgICB2YXIgY2xvbmVkT2JqZWN0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG4gICAgZXh0ZW5kLmNhbGwoY2xvbmVkT2JqZWN0LCB0aGlzKTtcbiAgICByZXR1cm4gY2xvbmVkT2JqZWN0O1xufVxuXG5cbi8qKlxuICogU3ludGF4IHN1Z2FyIHRvIHNob3J0ZW4gdXNhZ2Ugb2YgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAuXG4gKiBUaGUgc2ltcGxlc3QgdXNhZ2UgKHRvIGFkZCBub24tZW51bWVyYWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnR5KTpcbiAqIGBgYFxuICogXy5kZWZpbmVQcm9wZXJ0eShvYmosICdrZXknLCB2YWx1ZSk7XG4gKiBgYGBcbiAqXG4gKiBUbyBkZWZpbmUgc29tZSBvdGhlciBwcm9wZXJ0aWVzIHVzZSBzdW0gb2YgdGhlIGZsYWdzIGBfLkVOVU1FUkFCTEVgIChvciBgXy5FTlVNYCksIGBfLkNPTkZJR1VSQUJMRWAgKG9yIGBfLkNPTkZgKSBhbmQgYF8uV1JJVEFCTEVgIChvciBgXy5XUklUYCk6XG4gKiBgYGBcbiAqIF8uZGVmaW5lUHJvcGVydHkob2JqLCAna2V5JywgdmFsdWUsIF8uRU5VTSArIF8uV1JJVCk7XG4gKiBgYGBcbiAqIFJldHVybnMgYHNlbGZgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBhZGQgYSBwcm9wZXJ0eSB0b1xuICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFkZGVkXG4gKiBAcGFyYW0ge0FueX0gdmFsdWUgdGhlIHZhbHVlIG9mIGFkZGVkIHByb3BlcnR5XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGRlY3JpcHRvckZsYWdzIGJpdCBtYXNrIG9mIHByb3BlcnR5IGRlc2NyaXB0b3IgcHJvcGVydGllcyBjb21wb3NlZCBmcm9tIGBfLkVOVU1FUkFCTEVgIChvciBgXy5FTlVNYCksIGBfLkNPTkZJR1VSQUJMRWAgKG9yIGBfLkNPTkZgKSBhbmQgYF8uV1JJVEFCTEVgIChvciBgXy5XUklUYClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlOYW1lLFxuICAgICAgICBfZ2V0RGVzY3JpcHRvcih2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG5mdW5jdGlvbiBfZ2V0RGVzY3JpcHRvcih2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHsgdmFsdWU6IHZhbHVlIH07XG4gICAgaWYgKGRlY3JpcHRvckZsYWdzKVxuICAgICAgICBleHRlbmQuY2FsbChkZXNjcmlwdG9yLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiAhISAoZGVjcmlwdG9yRmxhZ3MgJiBjb25zdGFudHMuRU5VTUVSQUJMRSksXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEhIChkZWNyaXB0b3JGbGFncyAmIGNvbnN0YW50cy5DT05GSUdVUkFCTEUpLFxuICAgICAgICAgICAgd3JpdGFibGU6ICEhIChkZWNyaXB0b3JGbGFncyAmIGNvbnN0YW50cy5XUklUQUJMRSlcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cblxuXG4vKipcbiAqIFN5bnRheCBzdWdhciB0byBzaG9ydGVuIHVzYWdlIG9mIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AuXG4gKiBUaGUgc2ltcGxlc3QgdXNhZ2UgKHRvIGFkZCBub24tZW51bWVyYWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnRpZXMpOlxuICogYGBgXG4gKiBfLmRlZmluZVByb3BlcnRpZXMob2JqLCB7XG4gKiAgICAga2V5MTogdmFsdWUxLFxuICogICAgIGtleTI6IHZhbHVlMlxuICogfSk7XG4gKiBgYGBcbiAqIFRvIGRlZmluZSBzb21lIG90aGVyIHByb3BlcnRpZXMgdXNlIHN1bSBvZiB0aGUgZmxhZ3MgYF8uRU5VTUVSQUJMRWAgKG9yIGBfLkVOVU1gKSwgYF8uQ09ORklHVVJBQkxFYCAob3IgYF8uQ09ORmApIGFuZCBgXy5XUklUQUJMRWAgKG9yIGBfLldSSVRgKTpcbiAqIGBgYFxuICogXy5kZWZpbmVQcm9wZXJ0aWVzKG9iaiwge1xuICogICAgIGtleTE6IHZhbHVlMSxcbiAqICAgICBrZXkyOiB2YWx1ZTJcbiAqIH0sIF8uRU5VTSArIF8uV1JJVCk7XG4gKiBgYGBcbiAqIFJldHVybnMgYHNlbGZgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBhZGQgYSBwcm9wZXJ0eSB0b1xuICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnR5VmFsdWVzIEEgbWFwIG9mIGtleXMgYW5kIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHRoYXR3aWxsIGJlIGFkZGVkLiBUaGUgZGVzY3JpcHRvcnMgb2YgcHJvcGVydGllcyB3aWxsIGJlIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtJbnRlZ2VyfSBkZWNyaXB0b3JGbGFncyBiaXQgbWFzayBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9yIHByb3BlcnRpZXMgY29tcG9zZWQgZnJvbSBgXy5FTlVNRVJBQkxFYCAob3IgYF8uRU5VTWApLCBgXy5DT05GSUdVUkFCTEVgIChvciBgXy5DT05GYCkgYW5kIGBfLldSSVRBQkxFYCAob3IgYF8uV1JJVGApXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMocHJvcGVydHlWYWx1ZXMsIGRlY3JpcHRvckZsYWdzKSB7XG4gICAgdmFyIGRlc2NyaXB0b3JzID0gbWFwS2V5cy5jYWxsKHByb3BlcnR5VmFsdWVzLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX2dldERlc2NyaXB0b3IodmFsdWUsIGRlY3JpcHRvckZsYWdzKTtcbiAgICB9LCB0cnVlKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkZXNjcmlwdG9ycyk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBgc2VsZmAgd2l0aCBwcm9wZXJ0aWVzIG9mIGBvYmpgIHRvIGFueSBkZXB0aCwgd2l0aG91dCBvdmVyd3J0aXRpbmcgZXhpc3Rpbmcgb2JqZWN0IHByb3BlcnRpZXMgb2YgYHNlbGZgIHdpdGggb2JqZWN0IHByb3BlcnRpZXMgb2YgYG9iamAuXG4gKiBTY2FsYXIgcHJvcGVydGllcyBvZiBgb2JqYCB3aWxsIG92ZXJ3cml0ZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC4gU2NhbGFyIHBvcnBlcnRpZXMgb2YgYHNlbGZgIHdpbGwgYWxzbyBiZSBvdmVyd3JpdHRlbi5cbiAqIENvcnJlY3RseSB3b3JrcyB3aXRoIHJlY3Vyc2l2ZSBvYmplY3RzLlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIHZhciBvYmogPSB7XG4gKiAgICAgaW5uZXI6IHtcbiAqICAgICAgICAgYTogMVxuICogICAgIH1cbiAqIH07XG4gKlxuICogXy5kZWVwRXh0ZW5kKG9iaiwge1xuICogICAgIGlubmVyOiB7XG4gKiAgICAgICAgIGI6IDJcbiAqICAgICB9XG4gKiB9KTtcbiAqXG4gKiBhc3NlcnQuZGVlcEVxdWFsKG9iaiwge1xuICogICAgIGlubmVyOiB7XG4gKiAgICAgICAgIGE6IDEsXG4gKiAgICAgICAgIGI6IDJcbiAqICAgICB9XG4gKiB9KTsgLy8gYXNzZXJ0IHBhc3Nlc1xuICogYGBgXG4gKiBSZXR1cm5zIGBzZWxmYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogQW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyB0byBjb3B5IHRvXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIE9wdGlvbmFsIGB0cnVlYCB0byB1c2Ugb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVlcEV4dGVuZChvYmosIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIF9leHRlbmRUcmVlKHRoaXMsIG9iaiwgb25seUVudW1lcmFibGUsIFtdKTtcbn1cblxuXG5mdW5jdGlvbiBfZXh0ZW5kVHJlZShzZWxmTm9kZSwgb2JqTm9kZSwgb25seUVudW1lcmFibGUsIG9ialRyYXZlcnNlZCkge1xuICAgIGlmIChvYmpUcmF2ZXJzZWQuaW5kZXhPZihvYmpOb2RlKSA+PSAwKSByZXR1cm47IC8vIG5vZGUgYWxyZWFkeSB0cmF2ZXJzZWQsIG9iaiBoYXMgcmVjdXJzaW9uXG5cbiAgICAvLyBzdG9yZSBub2RlIHRvIHJlY29nbmlzZSByZWN1cnNpb25cbiAgICBvYmpUcmF2ZXJzZWQucHVzaChvYmpOb2RlKTtcblxuICAgIHZhciBsb29wID0gQXJyYXkuaXNBcnJheShvYmpOb2RlKSA/IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoIDogZWFjaEtleTtcblxuICAgIGxvb3AuY2FsbChvYmpOb2RlLCBmdW5jdGlvbih2YWx1ZSwgcHJvcCkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqTm9kZSwgcHJvcCk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbFxuICAgICAgICAgICAgICAgICYmICEgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSAmJiAhICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICBpZiAoISAoc2VsZk5vZGUuaGFzT3duUHJvcGVydHkocHJvcClcbiAgICAgICAgICAgICAgICAgICAgJiYgdHlwZW9mIHNlbGZOb2RlW3Byb3BdID09ICdvYmplY3QnICYmIHNlbGZOb2RlW3Byb3BdICE9IG51bGwpKVxuICAgICAgICAgICAgICAgIHNlbGZOb2RlW3Byb3BdID0gKEFycmF5LmlzQXJyYXkodmFsdWUpKSA/IFtdIDoge307XG4gICAgICAgICAgICBfZXh0ZW5kVHJlZShzZWxmTm9kZVtwcm9wXSwgdmFsdWUsIG9ubHlFbnVtZXJhYmxlLCBvYmpUcmF2ZXJzZWQpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmTm9kZSwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgfSwgdGhpcywgb25seUVudW1lcmFibGUpO1xuXG4gICAgcmV0dXJuIHNlbGZOb2RlO1xufVxuXG5cbi8qKlxuICogQ2xvbmVzIGFsbCBvYmplY3QgdHJlZS4gQ2xhc3Mgb2Ygb3JpZ2luYWwgb2JqZWN0IGlzIG5vdCBwcmVzZXJ2ZWQuIFJldHVybnMgYHNlbGZgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIE9wdGlvbmFsIGB0cnVlYCB0byB1c2Ugb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVlcENsb25lKG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IERhdGUodGhpcyk7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBSZWdFeHApIHJldHVybiBuZXcgUmVnRXhwKHRoaXMpO1xuICAgIHZhciBjbG9uZWRPYmplY3QgPSBBcnJheS5pc0FycmF5KHRoaXMpID8gW10gOiB7fTtcbiAgICBkZWVwRXh0ZW5kLmNhbGwoY2xvbmVkT2JqZWN0LCB0aGlzLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgcmV0dXJuIGNsb25lZE9iamVjdDtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gcmV0dXJuIGtleXMgb2ZcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBrZXlzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgdmFsdWVzIG9mIHRoZSBvYmplY3QncyBrZXlzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHJldHVybiB2YWx1ZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gb25seUVudW1lcmFibGVcbiAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgOiBhbGxLZXlzLmNhbGwodGhpcyk7XG5cbiAgICByZXR1cm4gcHJvcGVydGllcy5tYXAoZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gdGhpc1twcm9wXTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgYWxsIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdCBgc2VsZmAgKGluY2x1ZGluZyBub24tZW51bWVyYmFsZSkuXG4gKiBUbyBnZXQgb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXMsIHVzZSBgT2JqZWN0LmtleXMoKWAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGdldCBhbGwgcHJvcGVydGllcyBvZi5cbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG4gZnVuY3Rpb24gYWxsS2V5cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcyk7XG4gfVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgYGluZGV4T2ZgIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBSZXR1cm5zIHRoZSBga2V5YCBvZiBgc2VhcmNoRWxlbWVudGAgaW4gdGhlIG9iamVjdCBgc2VsZmAuXG4gKiBBcyBvYmplY3Qga2V5cyBhcmUgdW5zb3J0ZWQsIGlmIHRoZXJlIGFyZSBzZXZlcmFsIGtleXMgdGhhdCBob2xkIGBzZWFyY2hFbGVtZW50YCBhbnkgb2YgdGhlbSBjYW4gYmUgcmV0dXJuZWQuIFVzZSBgYWxsS2V5c09mYCB0byByZXR1cm4gYWxsIGtleXMuXG4gKiBBbGwgb3duIHByb3BlcnRpZXMgYXJlIHNlYXJjaGVkIChub3QgdGhvc2UgaW5oZXJpdGVkIHZpYSBwcm90b3R5cGUgY2hhaW4pLCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyAodW5sZXNzIGBvbmx5RW51bWVyYWJsZWAgaXMgdHJ1dGh5KS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gc2VhcmNoIGEgdmFsdWUgaW5cbiAqIEBwYXJhbSB7QW55fSBzZWFyY2hFbGVtZW50IEFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHNlYXJjaGVkLiBBbiBleGFjdCBlcXVhbGl0eSBpcyB0ZXN0ZWQsIHNvIGAwYCBpcyBub3QgdGhlIHNhbWUgYXMgYCcwJ2AuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIHRydWUgdG8gc2VhcmNoIGFtb25nIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBrZXlPZihzZWFyY2hFbGVtZW50LCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gb25seUVudW1lcmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gT2JqZWN0LmtleXModGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYWxsS2V5cy5jYWxsKHRoaXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoc2VhcmNoRWxlbWVudCA9PT0gdGhpc1twcm9wZXJ0aWVzW2ldXSlcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzW2ldO1xuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIFdvcmtzIHNpbWlsYXJseSB0byB0aGUgcHJldmlvdXMgZnVuY3Rpb24sIGJ1dCByZXR1cm5zIHRoZSBhcnJheSBvZiBrZXlzIGhvbGRpbmcgYHNlYXJjaEVsZW1lbnRgIGFzIHRoZWlyIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBzZWFyY2ggYSB2YWx1ZSBpblxuICogQHBhcmFtIHtBbnl9IHNlYXJjaEVsZW1lbnQgQW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgc2VhcmNoZWQuIEFuIGV4YWN0IGVxdWFsaXR5IGlzIHRlc3RlZCwgc28gYDBgIGlzIG5vdCB0aGUgc2FtZSBhcyBgJzAnYC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgdHJ1ZSB0byBzZWFyY2ggYW1vbmcgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtBcnJheVtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBhbGxLZXlzT2Yoc2VhcmNoRWxlbWVudCwgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHZhciBrZXlzID0gcHJvcGVydGllcy5maWx0ZXIoZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gc2VhcmNoRWxlbWVudCA9PT0gdGhpc1twcm9wXTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHJldHVybiBrZXlzO1xufVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgW2ZvckVhY2hdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2gpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBJdGVyYXRlcyBhbGwgb3duIHByb3BlcnRpZXMgb2YgYHNlbGZgIChvciBvbmx5IGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgaWYgYG9ubHlFbnVtZXJhYmxlYCBpcyB0cnV0aHkpIGNhbGxpbmcgY2FsbGJhY2sgZm9yIGVhY2gga2V5LlxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggYXJyYXlzLCBpdCB3aWxsIGluY2x1ZGUgYGxlbmd0aGAgcHJvcGVydHkgaW4gaXRlcmF0aW9uLlxuICogVG8gaXRlcmF0ZSBhcnJheS1saWtlIG9iamVjdHMgKGUuZy4sIGBhcmd1bWVudHNgIHBzZXVkby1hcnJheSkgdXNlOlxuICogYGBgXG4gKiBfLmZvckVhY2goYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqIEZ1bmN0aW9uIHJldHVybnMgYHNlbGZgIHRvIGFsbG93IFtjaGFpbmluZ10ocHJvdG8uanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYCwgaXRzIHJldHVybiB2YWx1ZSBpcyBub3QgdXNlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqL1xuZnVuY3Rpb24gZWFjaEtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpc1twcm9wXSwgcHJvcCwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFttYXBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L21hcCkgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqIFJldHVybnMgdGhlIG9iamVjdCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgdGhlIGFwcGxpY2F0aW9uIG9mIGNhbGxiYWNrIHRvIHZhbHVlcyBpbiBhbGwgb3duIHByb3BlcnRpZXMgb2YgYHNlbGZgIChvciBvbmx5IGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgaWYgYG9ubHlFbnVtZXJhYmxlYCBpcyB0cnV0aHkpLlxuICogVGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlIHRoZSBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzcyBhcyBgc2VsZmAuXG4gKiBQcm9wZXJ0eSBkZXNjcmlwdG9ycyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgaGF2ZSB0aGUgc2FtZSBgZW51bWVyYWJsZWAsIGBjb25maWd1cmFibGVgIGFuZCBgd3JpdGFibGVgIHNldHRpbmdzIGFzIHRoZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC5cbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGFycmF5cywgaXQgd2lsbCBpbmNsdWRlIGBsZW5ndGhgIHByb3BlcnR5IGluIGl0ZXJhdGlvbi5cbiAqIFRvIG1hcCBhcnJheS1saWtlIG9iamVjdHMgdXNlOlxuICogYGBgXG4gKiB2YXIgcmVzdWx0ID0gXy5tYXAoYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYCBhbmQgc2hvdWxkIHJldHVybiB2YWx1ZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG1hcC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbWFwS2V5cyhjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcbiAgICBlYWNoS2V5LmNhbGwodGhpcywgbWFwUHJvcGVydHksIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZGVzY3JpcHRvcnMpO1xuXG4gICAgZnVuY3Rpb24gbWFwUHJvcGVydHkodmFsdWUsIGtleSwgc2VsZikge1xuICAgICAgICBkZXNjcmlwdG9yc1trZXldID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZWxmLCBrZXkpO1xuICAgICAgICBkZXNjcmlwdG9yc1trZXldLnZhbHVlID0gY2FsbGJhY2suY2FsbCh0aGlzLCB2YWx1ZSwga2V5LCBzZWxmKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBBbiBhbmFsb2d1ZSBvZiBbcmVkdWNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9SZWR1Y2UpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBUaGlzIG1ldGhvZCByZWR1Y2VzIHRoZSBvYmplY3QgdG8gYSBzaW5nbGUgdmFsdWUuIEl0ZXJhdGlvbiBvcmRlciBpcyBpbXBvc3NpYmxlIHRvIGNvbnRyb2wgd2l0aCBvYmplY3QuXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBhcnJheXMsIGl0IHdpbGwgaW5jbHVkZSBgbGVuZ3RoYCBwcm9wZXJ0eSBpbiBpdGVyYXRpb24uXG4gKiBUbyByZWR1Y2UgYXJyYXktbGlrZSBvYmplY3RzIHVzZTpcbiAqIGBgYFxuICogdmFyIHJlc3VsdCA9IF8ucmVkdWNlKGFyZ3VtZW50cywgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHByZXZpb3VzVmFsdWVgLCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgIGFuZCBzaG91bGQgcmV0dXJuIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBgcHJldmlvdXNWYWx1ZWAgZm9yIHRoZSBuZXh0IGBjYWxsYmFja2AgY2FsbC5cbiAqIEBwYXJhbSB7QW55fSBpbml0aWFsVmFsdWUgVGhlIGluaXRpYWwgdmFsdWUgcGFzc2VkIHRvIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgb24gdGhlIGZpcnN0IGNhbGwuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUtleXMoY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHZhciBtZW1vID0gaW5pdGlhbFZhbHVlO1xuXG4gICAgcHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgbWVtbyA9IGNhbGxiYWNrLmNhbGwodGhpc0FyZywgbWVtbywgdGhpc1twcm9wXSwgcHJvcCwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbWVtbztcbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtmaWx0ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbHRlcikgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqIFJldHVybnMgdGhlIG5ldyBvYmplY3Qgd2l0aCBrZXlzIGZvciB3aGljaCBjYWxsYmFjayByZXR1cm5zIHRydWUuXG4gKiBQcm9wZXJ0eSBkZXNjcmlwdG9ycyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgaGF2ZSB0aGUgc2FtZSBgZW51bWVyYWJsZWAsIGBjb25maWd1cmFibGVgIGFuZCBgd3JpdGFibGVgIHNldHRpbmdzIGFzIHRoZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC5cbiAqIFRvIGZpbHRlciBhcnJheS1saWtlIG9iamVjdHMgdXNlOlxuICogYGBgXG4gKiB2YXIgcmVzdWx0ID0gXy5maWx0ZXIoYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYC4gSWYgaXQgcmV0dXJucyB0cnV0aHkgdmFsdWUsIHRoZSBrZXkvdmFsdWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyS2V5cyhjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcbiAgICBlYWNoS2V5LmNhbGwodGhpcywgZmlsdGVyUHJvcGVydHksIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZGVzY3JpcHRvcnMpOztcblxuICAgIGZ1bmN0aW9uIGZpbHRlclByb3BlcnR5KHZhbHVlLCBrZXksIHNlbGYpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICBkZXNjcmlwdG9yc1trZXldID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZWxmLCBrZXkpO1xuICAgIH1cbn1cblxuXG52YXIgX3Bhc3NlZCA9IHt9XG4gICAgLCBfZGlkTm90UGFzcyA9IHt9O1xuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtzb21lXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zb21lKSBtZXRob2Qgb2YgQXJyYXkgcHJvdG90eXBlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB3aGljaCBwcm9wZXJ0aWVzIHdpbGwgYmUgaXRlcmF0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGlzIHBhc3NlZCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgLiBJZiBpdCByZXR1cm5zIHRydXRoeSB2YWx1ZSwgdGhlIGZ1bmN0aW9uIGltbWVhZGl0ZWx5IHJldHVybnMgYHRydWVgLlxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgQW4gb3B0aW9uYWwgY29udGV4dCBvZiBpdGVyYXRpb24gKHRoZSB2YWx1ZW9mIGB0aGlzYCksIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwYXNzZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gc29tZUtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB0cnkge1xuICAgICAgICBlYWNoS2V5LmNhbGwodGhpcywgdGVzdFByb3BlcnR5LCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgfSBjYXRjaCAodGVzdCkge1xuICAgICAgICBpZiAodGVzdCA9PT0gX3Bhc3NlZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2UgdGhyb3cgdGVzdDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gdGVzdFByb3BlcnR5KHZhbHVlLCBrZXksIHNlbGYpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICB0aHJvdyBfcGFzc2VkO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtldmVyeV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZXZlcnkpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBpdGVyYXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAuIElmIGl0IHJldHVybnMgZmFsc3kgdmFsdWUsIHRoZSBmdW5jdGlvbiBpbW1lYWRpdGVseSByZXR1cm5zIGBmYWxzZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBldmVyeUtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB0cnkge1xuICAgICAgICBlYWNoS2V5LmNhbGwodGhpcywgdGVzdFByb3BlcnR5LCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgfSBjYXRjaCAodGVzdCkge1xuICAgICAgICBpZiAodGVzdCA9PT0gX2RpZE5vdFBhc3MpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZWxzZSB0aHJvdyB0ZXN0O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGZ1bmN0aW9uIHRlc3RQcm9wZXJ0eSh2YWx1ZSwga2V5LCBzZWxmKSB7XG4gICAgICAgIGlmICghIGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICB0aHJvdyBfZGlkTm90UGFzcztcbiAgICB9XG59XG5cblxudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGVcbiAgICAsIGNvbmNhdCA9IEFycmF5UHJvdG8uY29uY2F0O1xuLyoqXG4gKiBSZXR1cm5zIG9iamVjdCBvZiB0aGUgc2FtZSBjbGFzcyB3aXRoIG9ubHkgc3BlY2lmaWVkIGtleXMsIHRoYXQgYXJlIHBhc3NlZCBhcyBzdHJpbmcgcGFyYW1ldGVycyBvciBhcnJheShzKSBvZiBrZXlzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIGFuIG9iamVjdCB0byBwaWNrIGtleXMgZnJvbVxuICogQHBhcmFtIHtMaXN0W1N0cmluZ3xBcnJheV19IGFyZ3VtZW50cyBsaXN0IG9mIGtleXMgKG9yIGFycmF5KHMpIG9mIGtleXMpXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHBpY2tLZXlzKCkgeyAvLyAsIC4uLiBrZXlzXG4gICAgdmFyIGtleXMgPSBjb25jYXQuYXBwbHkoQXJyYXlQcm90bywgYXJndW1lbnRzKVxuICAgICAgICAsIG9iaiA9IE9iamVjdC5jcmVhdGUodGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgIG9ialtrZXldID0gdGhpc1trZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBvYmo7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIG9iamVjdCBvZiB0aGUgc2FtZSBjbGFzcyB3aXRob3V0IHNwZWNpZmllZCBrZXlzLCB0aGF0IGFyZSBwYXNzZWQgYXMgc3RyaW5nIHBhcmFtZXRlcnMgb3IgYXJyYXkocykgb2Yga2V5cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBhbiBvYmplY3QgdG8gb21pdCBrZXlzIGluXG4gKiBAcGFyYW0ge0xpc3RbU3RyaW5nfEFycmF5XX0gYXJndW1lbnRzIGxpc3Qgb2Yga2V5cyAob3IgYXJyYXkocykgb2Yga2V5cylcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gb21pdEtleXMoKSB7IC8vICwgLi4uIGtleXNcbiAgICB2YXIga2V5cyA9IGNvbmNhdC5hcHBseShBcnJheVByb3RvLCBhcmd1bWVudHMpXG4gICAgICAgICwgb2JqID0gY2xvbmUuY2FsbCh0aGlzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KXtcbiAgICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBvYmo7XG59XG5cblxuLyoqXG4gKiBQZXJmb3JtcyBkZWVwIGVxdWFsaXR5IHRlc3Qgb2YgdGhlIG9iamVjdC4gRG9lcyBub3Qgd29yayB3aXRoIHJlY3Vyc2l2ZSBvYmplY3RzXG4gKiBAcGFyYW0gIHtBbnl9IHNlbGYgb2JqZWN0IHRvIGNvbXBhcmVcbiAqIEBwYXJhbSAge0FueX0gb2JqIG9iamVjdCB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VxdWFsKG9iaikge1xuICAgIGlmICh0aGlzID09PSBvYmopIHJldHVybiB0aGlzICE9PSAwIHx8IDEvdGhpcyA9PSAxL29iajsgLy8gMCBhbmQgLTAgYXJlIGNvbnNpZGVyZWQgbm90IGVxdWFsLCBhbHRob3VnaCAwID09PSAtMCBpcyB0cnVlXG4gICAgaWYgKHRoaXMgPT0gbnVsbCB8fCBvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgaWYgKGNsYXNzTmFtZSAhPSBvYmouY29uc3RydWN0b3IubmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7XG4gICAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBTdHJpbmcob2JqKTtcbiAgICAgICAgY2FzZSAnTnVtYmVyJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzICE9ICt0aGlzID8gb2JqICE9ICtvYmogOiAodGhpcyA9PSAwID8gMS90aGlzID09IDEvb2JqIDogdGhpcyA9PSArb2JqKTtcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgICAgICAgcmV0dXJuICt0aGlzID09ICtvYmo7XG4gICAgICAgIGNhc2UgJ1JlZ0V4cCc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2UgPT0gb2JqLnNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmdsb2JhbCA9PSBvYmouZ2xvYmFsXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubXVsdGlsaW5lID09IG9iai5tdWx0aWxpbmVcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5pZ25vcmVDYXNlID09IG9iai5pZ25vcmVDYXNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMgIT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiAhPSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcykpXG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PSBvYmoubGVuZ3RoXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5ldmVyeShmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNFcXVhbC5jYWxsKGl0ZW0sIG9ialtpbmRleF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gYWxsS2V5cy5jYWxsKHRoaXMpLmxlbmd0aCA9PSBhbGxLZXlzLmNhbGwob2JqKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAmJiBldmVyeUtleS5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRXF1YWwuY2FsbCh2YWx1ZSwgb2JqW2tleV0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFRoZSBvcHBvc2l0ZSBvZiBpc0VxdWFsXG4gKiBAcGFyYW0gIHtBbnl9IHNlbGYgb2JqZWN0IHRvIGNvbXBhcmVcbiAqIEBwYXJhbSAge0FueX0gb2JqIG9iamVjdCB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc05vdChvYmopIHtcbiAgICByZXR1cm4gIWlzRXF1YWwuY2FsbCh0aGlzLCBvYmopO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIC0gW2V4dGVuZFByb3RvXSgjZXh0ZW5kUHJvdG8pXG4gKiAtIFtjcmVhdGVTdWJjbGFzc10oI2NyZWF0ZVN1YmNsYXNzKVxuICogLSBbbWFrZVN1YmNsYXNzXSgjbWFrZVN1YmNsYXNzKVxuICogLSBbbmV3QXBwbHldKCNuZXdBcHBseSlcbiAqXG4gKiBUaGVzZSBtZXRob2RzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCNQcm90bylcbiAqL1xudmFyIHByb3RvdHlwZU1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBleHRlbmRQcm90bzogZXh0ZW5kUHJvdG8sXG4gICAgY3JlYXRlU3ViY2xhc3M6IGNyZWF0ZVN1YmNsYXNzLFxuICAgIG1ha2VTdWJjbGFzczogbWFrZVN1YmNsYXNzLFxuICAgIG5ld0FwcGx5OiBuZXdBcHBseVxufTtcblxuXG52YXIgX18gPSByZXF1aXJlKCcuL3Byb3RvX29iamVjdCcpO1xuXG5fXy5leHRlbmQuY2FsbChfXywgcmVxdWlyZSgnLi9wcm90b19mdW5jdGlvbicpKTtcblxuXG4vKipcbiAqIEFkZHMgbm9uLWVudW1lcmFibGUsIG5vbi1jb25maWd1cmFibGUgYW5kIG5vbi13cml0YWJsZSBwcm9wZXJ0aWVzIHRvIHRoZSBwcm90b3R5cGUgb2YgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogZnVuY3Rpb24gTXlDbGFzcygpIHt9XG4gKiBfLmV4dGVuZFByb3RvKE15Q2xhc3MsIHtcbiAqICAgICBtZXRob2QxOiBmdW5jdGlvbigpIHt9LFxuICogICAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkge31cbiAqIH0pO1xuICogYGBgXG4gKiBUbyBleHRlbmQgY2xhc3MgdmlhIG9iamVjdDpcbiAqIGBgYFxuICogXy5leHRlbmRQcm90byhvYmouY29uc3RydWN0b3IsIG1ldGhvZHMpO1xuICogYGBgXG4gKiBSZXR1cm5zIHBhc3NlZCBjb25zdHJ1Y3Rvciwgc28gZnVuY3Rpb25zIF8uZXh0ZW5kUHJvdG8sIFtfLmV4dGVuZF0ob2JqZWN0LmpzLmh0bWwjZXh0ZW5kKSBhbmQgXy5tYWtlU3ViY2xhc3MgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sKS4gXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IG1ldGhvZHMgYSBtYXAgb2YgZnVuY3Rpb25zLCBrZXlzIHdpbGwgYmUgaW5zdGFuY2UgbWV0aG9kcyAocHJvcGVydGllcyBvZiB0aGUgY29uc3RydWN0b3IgcHJvdG90eXBlKVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGV4dGVuZFByb3RvKG1ldGhvZHMpIHtcbiAgICB2YXIgcHJvcERlc2NyaXB0b3JzID0ge307XG5cbiAgICBfXy5lYWNoS2V5LmNhbGwobWV0aG9kcywgZnVuY3Rpb24obWV0aG9kLCBuYW1lKSB7XG4gICAgICAgIHByb3BEZXNjcmlwdG9yc1tuYW1lXSA9IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBtZXRob2RcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMucHJvdG90eXBlLCBwcm9wRGVzY3JpcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogTWFrZXMgYSBzdWJjbGFzcyBvZiBjbGFzcyBgdGhpc0NsYXNzYC5cbiAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiB3aWxsIGhhdmUgc3BlY2lmaWVkIGBuYW1lYCBpZiBzdXBwbGllZC5cbiAqIFRoZSBjb25zdHJ1Y3RvciBvZiBzdXBlcmNsYXNzIHdpbGwgYmUgY2FsbGVkIGluIHN1YmNsYXNzIGNvbnN0cnVjdG9yIGJ5IGRlZmF1bHQgdW5sZXNzIGBhcHBseUNvbnN0cnVjdG9yID09PSBmYWxzZWAgKG5vdCBqdXN0IGZhbHN5KS5cbiAqIENvcGllcyBgdGhpc0NsYXNzYCBjbGFzcyBtZXRob2RzIHRvIGNyZWF0ZWQgc3ViY2xhc3MuIEZvciB0aGVtIHRvIHdvcmsgY29ycmVjdGx5IHRoZXkgc2hvdWxkIHVzZSBgdGhpc2AgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIHJhdGhlciB0aGFuIGV4cGxpY2l0IHN1cGVyY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyB0byBtYWtlIHN1YmNsYXNzIG9mXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBuYW1lIG9mIHN1YmNsYXNzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5Q29uc3RydWN0b3IgT3B0aW9uYWwgZmFsc2UgdmFsdWUgKG5vdCBmYWxzeSkgdG8gcHJldmVudCBjYWxsIG9mIGluaGVyaXRlZCBjb25zdHJ1Y3RvciBpbiB0aGUgY29uc3RydWN0b3Igb2Ygc3ViY2xhc3NcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBjcmVhdGVTdWJjbGFzcyhuYW1lLCBhcHBseUNvbnN0cnVjdG9yKSB7XG4gICAgdmFyIHRoaXNDbGFzcyA9IHRoaXM7XG4gICAgdmFyIHN1YmNsYXNzO1xuXG4gICAgLy8gbmFtZSBpcyBvcHRpb25hbFxuICAgIG5hbWUgPSBuYW1lIHx8ICcnO1xuXG4gICAgLy8gYXBwbHkgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvclxuICAgIHZhciBjb25zdHJ1Y3RvckNvZGUgPSBhcHBseUNvbnN0cnVjdG9yID09PSBmYWxzZVxuICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgOiAndGhpc0NsYXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7JztcblxuICAgIGV2YWwoJ3N1YmNsYXNzID0gZnVuY3Rpb24gJyArIG5hbWUgKyAnKCl7ICcgKyBjb25zdHJ1Y3RvckNvZGUgKyAnIH0nKTtcblxuICAgIG1ha2VTdWJjbGFzcy5jYWxsKHN1YmNsYXNzLCB0aGlzQ2xhc3MpO1xuXG4gICAgLy8gY29weSBjbGFzcyBtZXRob2RzXG4gICAgLy8gLSBmb3IgdGhlbSB0byB3b3JrIGNvcnJlY3RseSB0aGV5IHNob3VsZCBub3QgZXhwbGljdGx5IHVzZSBzdXBlcmNsYXNzIG5hbWVcbiAgICAvLyBhbmQgdXNlIFwidGhpc1wiIGluc3RlYWRcbiAgICBfXy5kZWVwRXh0ZW5kLmNhbGwoc3ViY2xhc3MsIHRoaXNDbGFzcywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gc3ViY2xhc3M7XG59XG5cblxuLyoqXG4gKiBTZXRzIHVwIHByb3RvdHlwZSBjaGFpbiB0byBjaGFuZ2UgYHRoaXNDbGFzc2AgKGEgY29uc3RydWN0b3IgZnVuY3Rpb24pIHNvIHRoYXQgaXQgYmVjb21lcyBhIHN1YmNsYXNzIG9mIGBTdXBlcmNsYXNzYC5cbiAqIFJldHVybnMgYHRoaXNDbGFzc2Agc28gaXQgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sKSB3aXRoIF8uZXh0ZW5kUHJvdG8gYW5kIFtfLmV4dGVuZF0ob2JqZWN0LmpzLmh0bWwjZXh0ZW5kKS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyB0aGF0IHdpbGwgYmVjb21lIGEgc3ViY2xhc3Mgb2YgU3VwZXJjbGFzc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gU3VwZXJjbGFzcyBBIGNsYXNzIHRoYXQgd2lsbCBiZWNvbWUgYSBzdXBlcmNsYXNzIG9mIHRoaXNDbGFzc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG1ha2VTdWJjbGFzcyhTdXBlcmNsYXNzKSB7XG4gICAgLy8gcHJvdG90eXBlIGNoYWluXG4gICAgdGhpcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyY2xhc3MucHJvdG90eXBlKTtcbiAgICBcbiAgICAvLyBzdWJjbGFzcyBpZGVudGl0eVxuICAgIGV4dGVuZFByb3RvLmNhbGwodGhpcywge1xuICAgICAgICBjb25zdHJ1Y3RvcjogdGhpc1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogQ2FsbHMgY29uc3RydWN0b3IgYHRoaXNgIHdpdGggYXJndW1lbnRzIHBhc3NlZCBhcyBhcnJheVxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IHdpbGwgYmUgY2FsbGVkXG4gKiBAcmV0dXJuIHtBcnJheXxBcnJheS1saWtlfSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIG5ld0FwcGx5KGFyZ3MpIHtcbiAgICBpZiAoISBBcnJheS5pc0FycmF5KGFyZ3MpKVxuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7XG4gICAgLy8gXCJudWxsXCIgaXMgY29udGV4dCB0byBwYXNzIHRvIGNsYXNzIGNvbnN0cnVjdG9yLCBmaXJzdCBwYXJhbWV0ZXIgb2YgYmluZFxuICAgIHZhciBhcmdzID0gW251bGxdLmNvbmNhdChhcmdzKTtcbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseSh0aGlzLCBhcmdzKSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF9fID0gcmVxdWlyZSgnLi9wcm90b19vYmplY3QnKTtcblxuXG4vKipcbiAqIC0gW2ZpcnN0VXBwZXJDYXNlXSgjZmlyc3RVcHBlckNhc2UpXG4gKiAtIFtmaXJzdExvd2VyQ2FzZV0oI2ZpcnN0TG93ZXJDYXNlKVxuICogLSBbdG9SZWdFeHBdKCN0b1JlZ0V4cClcbiAqIC0gW3RvRnVuY3Rpb25dKCN0b0Z1bmN0aW9uKVxuICogLSBbdG9EYXRlXSgjdG9EYXRlKVxuICogLSBbdG9RdWVyeVN0cmluZ10oI3RvUXVlcnlTdHJpbmcpXG4gKiAtIFtmcm9tUXVlcnlTdHJpbmddKCNmcm9tUXVlcnlTdHJpbmcpXG4gKiAtIFtqc29uUGFyc2VdKCNqc29uUGFyc2UpXG4gKiAtIFtoYXNoQ29kZV0oI2hhc2hDb2RlKVxuICogLSBbdW5QcmVmaXhdKCN1blByZWZpeClcbiAqL1xuIHZhciBzdHJpbmdNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZmlyc3RVcHBlckNhc2U6IGZpcnN0VXBwZXJDYXNlLFxuICAgIGZpcnN0TG93ZXJDYXNlOiBmaXJzdExvd2VyQ2FzZSxcbiAgICB0b1JlZ0V4cDogdG9SZWdFeHAsXG4gICAgdG9GdW5jdGlvbjogdG9GdW5jdGlvbixcbiAgICB0b0RhdGU6IHRvRGF0ZSxcbiAgICB0b1F1ZXJ5U3RyaW5nOiB0b1F1ZXJ5U3RyaW5nLFxuICAgIGZyb21RdWVyeVN0cmluZzogZnJvbVF1ZXJ5U3RyaW5nLFxuICAgIGpzb25QYXJzZToganNvblBhcnNlLFxuICAgIGhhc2hDb2RlOiBoYXNoQ29kZSxcbiAgICB1blByZWZpeDogdW5QcmVmaXhcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY2hhbmdlZCB0byB1cHBlciBjYXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIEEgc3RyaW5nIHRoYXQgd2lsbCBoYXZlIGl0cyBmaXJzdCBjaGFyYWN0ZXIgcmVwbGFjZWRcbiAqL1xuZnVuY3Rpb24gZmlyc3RVcHBlckNhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMgPyB0aGlzWzBdLnRvVXBwZXJDYXNlKCkgKyB0aGlzLnNsaWNlKDEpIDogdGhpcztcbn1cblxuXG4vKipcbiAqIFJldHVybnMgc3RyaW5nIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBjaGFuZ2VkIHRvIGxvd2VyIGNhc2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgQSBzdHJpbmcgdGhhdCB3aWxsIGhhdmUgaXRzIGZpcnN0IGNoYXJhY3RlciByZXBsYWNlZFxuICovXG5mdW5jdGlvbiBmaXJzdExvd2VyQ2FzZSgpIHtcbiAgICByZXR1cm4gdGhpcyA/IHRoaXNbMF0udG9Mb3dlckNhc2UoKSArIHRoaXMuc2xpY2UoMSkgOiB0aGlzO1xufVxuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIGNyZWF0ZWQgYnkgYHRvU3RyaW5nYCBtZXRob2Qgb2YgUmVnRXhwIGJhY2sgdG8gUmVnRXhwXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgc3RyaW5nIGNvbnRhaW5pbmcgcmVndWxhciBleHByZXNzaW9uIGluY2x1ZGluZyBlbmNsb3NpbmcgXCIvXCIgc3ltYm9scyBhbmQgZmxhZ3NcbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gdG9SZWdFeHAoKSB7XG4gICAgdmFyIHJ4ID0gdGhpcy5tYXRjaChyZWdleHBTdHJpbmdQYXR0ZXJuKTtcbiAgICBpZiAocngpIHJldHVybiBuZXcgUmVnRXhwKHJ4WzFdLCByeFsyXSk7XG59XG52YXIgcmVnZXhwU3RyaW5nUGF0dGVybiA9IC9eXFwvKC4qKVxcLyhbZ2lteV0qKSQvO1xuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIGNyZWF0ZWQgYnkgYHRvU3RyaW5nYCBtZXRob2Qgb2YgZnVuY3Rpb24gYmFjayB0byBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIHN0cmluZyBjb250YWluaW5nIGZ1bGwgZnVuY3Rpb24gY29kZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRvRnVuY3Rpb24oKSB7XG4gICAgdmFyIGZ1bmM7XG4gICAgdmFyIGNvZGUgPSAnZnVuYyA9ICcgKyB0aGlzICsgJzsnO1xuICAgIHRyeSB7XG4gICAgICAgIGV2YWwoY29kZSk7XG4gICAgICAgIHJldHVybiBmdW5jO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxufVxuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIHRvIGRhdGUgaW4gYSBzYWZlIHdheSBzbyB0aGF0IHRoZSByZXNpdWx0IGlzIHVuZGVmaW5lZCBpZiBkYXRlIGlzIGludmFsaWRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xEYXRlfSBzZWxmIHN0cmluZyBvciBkYXRlIG9iamVjdCB0byBjb252ZXJ0IHRvIFZBTElEIGRhdGVcbiAqIEByZXR1cm4ge1t0eXBlXX0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiB0b0RhdGUoKSB7XG4gICAgaWYgKCEgdGhpcykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUodGhpcyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICBpZiAoZGF0ZSAmJiBkYXRlLmdldFRpbWUgJiYgIWlzTmFOKGRhdGUuZ2V0VGltZSgpKSlcbiAgICAgICAgcmV0dXJuIGRhdGU7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0IHBhcmFtcyBvYmplY3QgdG8gYSB1cmwgc3R5bGUgcXVlcnkgc3RyaW5nICh3aXRob3V0IFwiP1wiKVxuICogXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBUaGUgb2JqZWN0IGhhc2ggdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmNvZGUgb3B0aW9uYWwgZnVuY3Rpb24gdXNlZCB0byBlbmNvZGUgZGF0YSwgZW5jb2RlVVJJQ29tcG9uZW50IGlzIHVzZWQgaWYgbm90IHNwZWNpZmllZFxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0aW5nIHF1ZXJ5IHN0cmluZ1xuICovXG5mdW5jdGlvbiB0b1F1ZXJ5U3RyaW5nKGVuY29kZSkge1xuICAgIHZhciBxcyA9ICcnXG4gICAgICAgICwgcGFyYW1zID0gdGhpcyB8fCB7fVxuICAgICAgICAsIGVuY29kZSA9IGVuY29kZSB8fCBlbmNvZGVVUklDb21wb25lbnQ7XG5cbiAgICBfXy5lYWNoS2V5LmNhbGwocGFyYW1zLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHFzICs9IGtleSArICc9JyArIGVuY29kZSh2YWx1ZSkgKyAnJic7XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHFzLnNsaWNlKDAsIC0xKTtcbn1cblxuXG4vKipcbiAqIENvbnZlcnQgdXJsIHN0eWxlIHF1ZXJ5IHN0cmluZyAod2l0aG91dCBcIj9cIikgaW50byBvYmplY3QgaGFzaFxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGVjb2RlIG9wdGlvbmFsIGRlY29kZSBmdW5jdGlvbiwgZGVjb2RlVVJJQ29tcG9uZW50IHdpbGwgYmUgdXNlZCBpZiBub3Qgc3VwcGxpZWRcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdGluZyBvYmplY3QgaGFzaFxuICovXG5mdW5jdGlvbiBmcm9tUXVlcnlTdHJpbmcoZGVjb2RlKSB7XG4gICAgdmFyIHBhaXJzID0gdGhpcy5zcGxpdCgnJicpXG4gICAgICAgICwgcmVzdWx0cyA9IHt9XG4gICAgICAgICwgZGVjb2RlID0gZGVjb2RlIHx8IGRlY29kZVVSSUNvbXBvbmVudDtcblxuICAgIHBhaXJzLmZvckVhY2goZnVuY3Rpb24ocGFpcikge1xuICAgICAgICB2YXIgc3BsaXRQYWlyID0gcGFpci5zcGxpdCgnPScpO1xuICAgICAgICBpZiAoc3BsaXRQYWlyLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICAgICAgdmFyIGtleSA9IHNwbGl0UGFpclswXVxuICAgICAgICAgICAgLCB2YWx1ZSA9IGRlY29kZShzcGxpdFBhaXJbMV0gfHwgJycpO1xuICAgICAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgICAgICByZXN1bHRzW2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG5cbi8qKlxuICogU2FmZSBKU09OLnBhcnNlLCByZXR1cm5zIHVuZGVmaW5lZCBpZiBKU09OLnBhcnNlIHRocm93cyBhbiBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3RcbiAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGpzb25QYXJzZSgpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzKTtcbiAgICB9IGNhdGNoIChlKSB7fVxufVxuXG5cbi8qKlxuICogRGFuIEJlcm5zdGVpbidzIGFsZ29yeXRobSB0byBjcmVhdGUgaGFzaCBmcm9tIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIHN0cmluZyB0byBjb252ZXJ0IHRvIGhhc2hcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gaGFzaENvZGUoKSB7XG4gICAgdmFyIGhhc2ggPSA1MzgxXG4gICAgICAgICwgc3RyID0gdGhpc1xuICAgICAgICAsIGxlbiA9IHN0ci5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpICsgaGFzaCkgKyBjaGFyOyAvKiBoYXNoICogMzMgKyBjICovXG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBnaXZlbiBwcmVmaXggZnJvbSB0aGUgc3RyaW5nLiBJZiBzdHJpbmcgZG9lcyBub3QgYmVnaW4gZnJvbSB0aGUgcHJlZml4LCByZXR1cm5zIHVuZGVmaW5lZFxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiB1blByZWZpeChzdHIpIHtcbiAgICBpZiAodGhpcy5pbmRleE9mKHN0cikgPT0gMClcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShzdHIsICcnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiAtIFt0aW1lc10oI3RpbWVzKVxuICogLSBbcmVwZWF0XSgjcmVwZWF0KVxuICogLSBbdGFwXSgjdGFwKVxuICogLSBbcmVzdWx0XSgjcmVzdWx0KVxuICogLSBbaWRlbnRpdHldKCNpZGVudGl0eSlcbiAqIC0gW3Byb3BlcnR5XSgjcHJvcGVydHkpXG4gKiAtIFtjb21wYXJlUHJvcGVydHldKCNjb21wYXJlUHJvcGVydHkpXG4gKiAtIFtub29wXSgjbm9vcClcbiAqL1xudmFyIHV0aWxNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgdGltZXM6IHRpbWVzLFxuICAgIHJlcGVhdDogcmVwZWF0LFxuICAgIHRhcDogdGFwLFxuICAgIHJlc3VsdDogcmVzdWx0LFxuICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICBwcm9wZXJ0eTogcHJvcGVydHksXG4gICAgY29tcGFyZVByb3BlcnR5OiBjb21wYXJlUHJvcGVydHksXG4gICAgbm9vcDogbm9vcFxufTtcblxuXG4vKipcbiAqIENhbGxzIGBjYWxsYmFja2AgYHNlbGZgIHRpbWVzIHdpdGggYHRoaXNBcmdgIGFzIGNvbnRleHQuIENhbGxiYWNrIGlzIHBhc3NlZCBpdGVyYXRpb24gaW5kZXggZnJvbSAwIHRvIGBzZWxmLTFgXG4gKiBcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc2VsZlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7QW55fSB0aGlzQXJnXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdGltZXMoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB2YXIgYXJyID0gQXJyYXkoTWF0aC5tYXgoMCwgdGhpcykpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpczsgaSsrKVxuICAgICAgICBhcnJbaV0gPSBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGkpO1xuICAgIHJldHVybiBhcnI7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IHdpdGggdGhlIGZpcnN0IGFyZ3VtZW50IHJlcGVhdGVkIGB0aW1lc2AgdGltZXNcbiAqIEBwYXJhbSAge0FueX0gc2VsZlxuICogQHBhcmFtICB7SW50ZWdlcn0gdGltZXNcbiAqIEByZXR1cm4ge0FycmF5W0FueV19XG4gKi9cbmZ1bmN0aW9uIHJlcGVhdCh0aW1lcykge1xuICAgIHZhciBhcnIgPSBBcnJheShNYXRoLm1heCgwLCB0aW1lcykpOztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbWVzOyBpKyspXG4gICAgICAgIGFycltpXSA9IHRoaXM7XG4gICAgcmV0dXJuIGFycjtcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHRhcCBpbnRvIGNoYWluZWQgbWV0aG9kcyBhbmQgdG8gaW5zcGVjdCBpbnRlcm1lZGlhcnkgcmVzdWx0XG4gKlxuICogQHBhcmFtIHtBbnl9IHNlbGYgdmFsdWUgdGhhdCdzIHBhc3NlZCBiZXR3ZWVuIGNoYWluZWQgbWV0aG9kc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHZhbHVlIChib3RoIGFzIGNvbnRleHQgYW5kIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIpXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHRhcChmdW5jKSB7XG4gICAgZnVuYy5jYWxsKHRoaXMsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuXG4vKipcbiAqIENhbGxzIGZ1bmN0aW9uIGBzZWxmYCAoZmlyc3QgcGFyYW1ldGVyIG9mIF8ucmVzdWx0KSB3aXRoIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEFueX0gc2VsZlxuICogQHBhcmFtIHtBbnl9IHRoaXNBcmcgY29udGV4dFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgZXh0cmEgYXJndW1lbnRzXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHJlc3VsdCh0aGlzQXJnKSB7IC8vLCBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gdGhpcy5hcHBseSh0aGlzQXJnLCBhcmdzKVxuICAgICAgICAgICAgOiB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBzZWxmLiBVc2VmdWwgZm9yIHVzaW5nIGFzIGFuIGl0ZXJhdG9yIGlmIHRoZSBhY3R1YWwgdmFsdWUgbmVlZHMgdG8gYmUgcmV0dXJuZWQuIFVubGlrZSBpbiB1bmRlcnNjb3JlIGFuZCBsb2Rhc2gsIHRoaXMgZnVuY3Rpb24gaXMgTk9UIHVzZWQgYXMgZGVmYXVsdCBpdGVyYXRvci5cbiAqXG4gKiBAcGFyYW0ge0FueX0gc2VsZiBcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgcGlja3MgdGhlIHByb3BlcnR5IGZyb20gdGhlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcHJvcGVydHkoKSB7XG4gICAgdmFyIGtleSA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqW2tleV07XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBpbiBhcnJheSBzb3J0IHRvIHNvcnQgYnkgYSBnaXZlbiBwcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZVByb3BlcnR5KCkge1xuICAgIHZhciBrZXkgPSB0aGlzO1xuICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBhW2tleV0gPCBiW2tleV1cbiAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgIDogYVtrZXldID4gYltrZXldXG4gICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgOiAwO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZ1xuICovXG5mdW5jdGlvbiBub29wKCkge31cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbWFrZVByb3RvSW5zdGFuY2VNZXRob2Q6IG1ha2VQcm90b0luc3RhbmNlTWV0aG9kLFxuICAgIG1ha2VQcm90b0Z1bmN0aW9uOiBtYWtlUHJvdG9GdW5jdGlvbixcbiAgICBtYWtlRmluZE1ldGhvZDogbWFrZUZpbmRNZXRob2Rcbn1cblxuXG5mdW5jdGlvbiBtYWtlUHJvdG9JbnN0YW5jZU1ldGhvZChtZXRob2QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2VsZiA9IG1ldGhvZC5hcHBseSh0aGlzLnNlbGYsIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG59XG5cblxuZnVuY3Rpb24gbWFrZVByb3RvRnVuY3Rpb24obWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyB3aGVuIHRoZSBtZXRob2QgaXMgZXhlY3V0ZWQsIHRoZSB2YWx1ZSBvZiBcInRoaXNcIiB3aWxsIGJlIGFyZ3VtZW50c1swXSxcbiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHN0YXJ0aW5nIGZyb20gIzEgd2lsbCBwYXNzZWQgdG8gbWV0aG9kIGFzIHBhcmFtZXRlcnMuXG4gICAgICAgIHJldHVybiBtZXRob2QuY2FsbC5hcHBseShtZXRob2QsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuXG52YXIgX2Vycm9yID0gbmV3IEVycm9yO1xuXG4vKipcbiAqIFJldHVybnMgYGZpbmRgIG9yIGBmaW5kSW5kZXhgIG1ldGhvZCwgZGVwZW5kaW5nIG9uIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hNZXRob2QgLSBtZXRob2QgdG8gdXNlIGZvciBpdGVyYXRpb24gKGZvckVhY2ggZm9yIGFycmF5IG9yIGVhY2hLZXkgZm9yIG9iamVjdClcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kV2hhdCAndmFsdWUnIC0gcmV0dXJucyBmaW5kIG1ldGhvZCBvZiBBcnJheSAoaW1wbGVtZW50ZWQgaW4gRVM2KSBvciBmaW5kVmFsdWUgbWV0aG9kIG9mIE9iamVjdCwgYW55dGhpbmcgZWxzZSA9IHJldHVybnMgZmluZEluZGV4L2ZpbmRLZXkgbWV0aG9kcy5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBtYWtlRmluZE1ldGhvZChlYWNoTWV0aG9kLCBmaW5kV2hhdCkge1xuICAgIHZhciBhcmdJbmRleCA9IGZpbmRXaGF0ID09ICd2YWx1ZScgPyAwIDogMTtcblxuICAgIHJldHVybiBmdW5jdGlvbiBmaW5kVmFsdWVPckluZGV4KGNhbGxiYWNrLCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSkge1xuICAgICAgICB2YXIgY2F1Z2h0RXJyb3I7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlYWNoTWV0aG9kLmNhbGwodGhpcywgdGVzdEl0ZW0sIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICAgICAgfSBjYXRjaCAoZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChmb3VuZCA9PT0gX2Vycm9yKSB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGxvb2tpbmcgZm9yIGluZGV4IGFuZCBub3QgZm91bmQsIHJldHVybiAtMVxuICAgICAgICBpZiAoYXJnSW5kZXggJiYgZWFjaE1ldGhvZCA9PSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaClcbiAgICAgICAgICAgIHJldHVybiAtMTsgXG5cbiAgICAgICAgZnVuY3Rpb24gdGVzdEl0ZW0odmFsdWUsIGluZGV4LCBzZWxmKSB7XG4gICAgICAgICAgICB2YXIgdGVzdDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGVzdCA9IGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGluZGV4LCBzZWxmKTtcbiAgICAgICAgICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgdGhyb3cgX2Vycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlc3QpXG4gICAgICAgICAgICAgICAgdGhyb3cgYXJndW1lbnRzW2FyZ0luZGV4XTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ== ; \ No newline at end of file diff --git a/milo.bundle.map b/milo.bundle.map index 6721b79..d026b1a 100644 --- a/milo.bundle.map +++ b/milo.bundle.map @@ -1,140 +1,144 @@ { "version": 3, "sources": [ - "/Users/evgenypoberezkin/Work/CC/milo/lib/abstract/facet.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/abstract/faceted_object.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/abstract/registry.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/attributes/a_bind.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/attributes/a_class.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/attributes/a_load.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/attributes/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/binder.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/classes.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/command/actions_history.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/command/cmd_registry.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/command/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/command/transaction.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/command/transaction_history.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_class.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facet.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/Container.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/Data.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/Dom.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/Drag.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/Drop.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/Events.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/Frame.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/Item.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/List.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/ModelFacet.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/Options.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/Template.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/Transfer.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_facets/cf_registry.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_info.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_registry.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/c_utils.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/classes/View.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/msg_api/data.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/msg_api/de_data.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/msg_api/drop.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/msg_src/dom_events.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/msg_src/frame.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/scope.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Button.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Combo.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/ComboList.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Date.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/DropTarget.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/FoldTree.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Group.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Hyperlink.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Image.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Input.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/InputList.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/List.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/ListItem.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/RadioGroup.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Select.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/SuperCombo.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Text.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Textarea.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Time.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/Wrapper.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/bootstrap/Alert.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/bootstrap/Dialog.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/components/ui/bootstrap/Dropdown.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/config.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/loader.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/milo.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/registry.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/services/de_constrs.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/services/dom_source.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/services/mail/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/services/mail/mail_api.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/services/mail/mail_source.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/services/window.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/use_components.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/use_facets.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/component_name.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/create_component_class.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/deprecate.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/dom.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/dom_listeners.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/domready.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/dragdrop.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/error.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/fragment.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/json_parse.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/request.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/selection/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/storage/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/storage/model.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/storage/msg_src.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/unique_id.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/websocket/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/websocket/msg_api.js", - "/Users/evgenypoberezkin/Work/CC/milo/lib/util/websocket/msg_src.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/base32/lib/base32.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/browserify/node_modules/browser-builtins/builtin/fs.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/abstract/mixin.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/classes.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/config.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/messenger/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/messenger/m_api.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/messenger/m_api_rx.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/messenger/m_source.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/messenger/msngr_source.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/milo-core.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/minder.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/model/change_data.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/model/connector.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/model/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/model/m_msg_api.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/model/m_path.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/model/model_utils.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/model/path_msg_api.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/model/path_utils.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/model/synthesize/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/util/check.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/util/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/util/logger.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/lib/util/logger_class.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/node_modules/dot/doT.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/node_modules/dot/index.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_array.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_function.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_number.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_object.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_prototype.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_string.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_util.js", - "/Users/evgenypoberezkin/Work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/utils.js" + "/Users/jasoniangreen/work/CC/milo/lib/abstract/facet.js", + "/Users/jasoniangreen/work/CC/milo/lib/abstract/faceted_object.js", + "/Users/jasoniangreen/work/CC/milo/lib/abstract/registry.js", + "/Users/jasoniangreen/work/CC/milo/lib/attributes/a_bind.js", + "/Users/jasoniangreen/work/CC/milo/lib/attributes/a_class.js", + "/Users/jasoniangreen/work/CC/milo/lib/attributes/a_load.js", + "/Users/jasoniangreen/work/CC/milo/lib/attributes/index.js", + "/Users/jasoniangreen/work/CC/milo/lib/binder.js", + "/Users/jasoniangreen/work/CC/milo/lib/classes.js", + "/Users/jasoniangreen/work/CC/milo/lib/command/actions_history.js", + "/Users/jasoniangreen/work/CC/milo/lib/command/cmd_registry.js", + "/Users/jasoniangreen/work/CC/milo/lib/command/index.js", + "/Users/jasoniangreen/work/CC/milo/lib/command/transaction.js", + "/Users/jasoniangreen/work/CC/milo/lib/command/transaction_history.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_class.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facet.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/Container.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/Data.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/Dom.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/Drag.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/Drop.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/Events.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/Frame.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/Item.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/List.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/ModelFacet.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/Options.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/Template.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/Transfer.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_facets/cf_registry.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_info.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_registry.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/c_utils.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/classes/View.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/msg_api/data.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/msg_api/de_data.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/msg_api/drop.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/msg_src/dom_events.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/msg_src/frame.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/scope.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Button.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Combo.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/ComboList.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Date.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/DropTarget.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/FoldTree.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Group.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Hyperlink.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Image.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Input.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/InputList.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/List.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/ListItem.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/RadioGroup.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Select.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/SuperCombo.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Text.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Textarea.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Time.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/Wrapper.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/bootstrap/Alert.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/bootstrap/Dialog.js", + "/Users/jasoniangreen/work/CC/milo/lib/components/ui/bootstrap/Dropdown.js", + "/Users/jasoniangreen/work/CC/milo/lib/config.js", + "/Users/jasoniangreen/work/CC/milo/lib/loader.js", + "/Users/jasoniangreen/work/CC/milo/lib/milo.js", + "/Users/jasoniangreen/work/CC/milo/lib/registry.js", + "/Users/jasoniangreen/work/CC/milo/lib/services/de_constrs.js", + "/Users/jasoniangreen/work/CC/milo/lib/services/dom_source.js", + "/Users/jasoniangreen/work/CC/milo/lib/services/mail/index.js", + "/Users/jasoniangreen/work/CC/milo/lib/services/mail/mail_api.js", + "/Users/jasoniangreen/work/CC/milo/lib/services/mail/mail_source.js", + "/Users/jasoniangreen/work/CC/milo/lib/services/window.js", + "/Users/jasoniangreen/work/CC/milo/lib/use_components.js", + "/Users/jasoniangreen/work/CC/milo/lib/use_facets.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/component_name.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/create_component_class.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/deprecate.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/dom.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/dom_listeners.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/domready.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/dragdrop.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/error.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/fragment.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/index.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/json_parse.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/request.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/selection/index.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/storage/index.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/storage/model.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/storage/msg_src.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/unique_id.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/websocket/index.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/websocket/msg_api.js", + "/Users/jasoniangreen/work/CC/milo/lib/util/websocket/msg_src.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/base32/lib/base32.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/browserify/node_modules/browser-builtins/builtin/fs.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/abstract/mixin.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/classes.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/config.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/messenger/index.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/messenger/m_api.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/messenger/m_api_rx.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/messenger/m_source.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/messenger/msngr_source.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/milo-core.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/minder.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/model/change_data.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/model/connector.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/model/index.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/model/m_msg_api.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/model/m_path.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/model/model_utils.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/model/path_msg_api.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/model/path_utils.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/model/synthesize/index.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/util/check.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/util/index.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/util/logger.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/lib/util/logger_class.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/node_modules/dot/doT.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/node_modules/dot/index.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_array.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_function.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_number.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_object.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_prototype.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_string.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/proto_util.js", + "/Users/jasoniangreen/work/CC/milo/node_modules/milo-core/node_modules/mol-proto/lib/utils.js" ], "names": [], +<<<<<<< HEAD "mappings": ";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACx5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnMA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACznBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", +======= + "mappings": ";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACx5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnMA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACznBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", +>>>>>>> added dragCls config to drag facet "file": "generated.js", "sourceRoot": "", "sourcesContent": [ diff --git a/milo.min.js.map b/milo.min.js.map index 2048a4b..27ddda6 100644 --- a/milo.min.js.map +++ b/milo.min.js.map @@ -1 +1,5 @@ -{"version":3,"file":"milo.min.js","sources":["milo.bundle.js"],"names":["e","t","n","r","s","o","u","a","require","i","Error","f","exports","call","length",1,"module","Facet","owner","config","this","name","_","firstLowerCase","constructor","init","apply","arguments","proto","extendProto","milo-core",2,"FacetedObject","instantiateFacet","FacetClass","facetName","fctConfig","facetsConfig","facets","facetsDescriptors","enumerable","value","facetsClasses","eachKey","Object","defineProperties","defineProperty","FacetedObject$addFacet","facetConfig","throwOnErrors","check","Function","Match","Optional","String","protoFacets","prototype","message","logger","error","newFacet","ENUM","FacetedObject$$hasFacet","FacetedObject$$getFacetConfig","hasFacet","FacetedObject$$createFacetedClass","addInheritedFacets","superClass","facetsInfo","facetsInfoName","inheritedFacetsInfo","clone","extend","ObjectHash","Subclass","fctName","hasOwnProperty","FacetedClass","createSubclass","miloCore","util","createFacetedClass","getFacetConfig","addFacet","./facet",3,"ClassRegistry","FoundationClass","setClass","__registeredClasses","add","aClass","IdentifierString","get","remove","nameOrClass","OneOf","clean",4,"attrName","attrs","bind","parse","node","bindTo","match","ATTRIBUTE_REGEXP","compClass","compFacets","split","FACETS_SPLIT_REGEXP","undefined","compName","validate","render","milo","componentName","ATTRIBUTE_TEMPLATE","replace","join","BindAttribute$$setInfo","el","componentClass","componentFacets","attr","BindAttribute","decorate","Attribute","setInfo","../config","./a_class",5,"attributes","Attribute$$remove","deep","removeAttribute","selector","children","querySelectorAll","forEach","childEl","Attribute$remove","Attribute$destroy","Attribute$get","getAttribute","Attribute$set","setAttribute","Attribute$decorate","set","toBeImplemented","destroy",6,"load","loadUrl","LoadAttribute",7,"./a_bind","./a_load",8,"binder","scopeEl","rootScope","bindRootElement","createBinderScope","scope","info","ComponentInfo","Component","create","twoPass","scanScope","scan","hostObject","Scope","_rootEl","addMethod","_each","compInfo","aComponent","container","scopeObjectFactory","createScopeForElement","postChildrenBoundMessage","elComp","getComponent","postMessageSync","scopedObject","isContainer","childNodes","innerScope","_hostObject","createScopeForChildren","containerEl","utilDom","document","body","componentsRegistry","./attributes/a_bind","./components/c_facets/cf_registry","./components/c_info","./components/c_registry","./components/scope","./services/mail","./util/dom",9,"coreClasses","classes","Mixin","MessageSource","MessengerMessageSource","MessengerAPI","DOMEventsSource","Transaction","TransactionHistory","./abstract/facet","./abstract/faceted_object","./abstract/registry","./command/transaction","./command/transaction_history","./components/msg_src/dom_events",10,"ActionsHistory","maxLength","_maxLength","Infinity","actions","position","ActionsHistory$store","command","_truncateToCurrentPosition","push","act","shift","ActionsHistory$deleteLast","ActionsHistory$undo","cb","undo","ActionsHistory$redo","redo","ActionsHistory$undoAll","ActionsHistory$redoAll","ActionsHistory$undoAllAsync","deferMethod","defer","ActionsHistory$redoAllAsync","ActionsHistory$each","funcOrMethod","thisArg","func","ActionsHistory$eachReverse","reverse","each","ActionsHistory$getLastAction","ActionsHistory$getDescription","map","getDescription","store","deleteLast","undoAll","redoAll","undoAllAsync","redoAllAsync","eachReverse","getLastAction",11,"Command","commandsRegistry","../abstract/registry","./index",12,"Command$init","args","slice","Command$execute","result","Command$setUndo","undoCommand","UNDO_COMMAND","warn","Command$getUndo","Command$undo","undoCmd","getUndo","execute","Command$setArguments","toArray","Command$getArguments","Command$changeArguments","Command$addArguments","appendArray","Command$$create","newApply","Command$$createWithUndo","Command$destroy","Command$setComment","comment","Command$getDescription","setUndo","setArguments","addArguments","getArguments","changeArguments","setComment","createWithUndo",13,"commands","Transaction$execute","Transaction$undo","Transaction$redo","Transaction$destroy","Transaction$storeCommand","Transaction$merge","transaction","cmd","Transaction$setComment","Transaction$getDescription","storeCommand","merge","./actions_history",14,"transactions","currentBatch","currentTransaction","SCHEDULED","TransactionHistory$storeCommand","appendTransaction","_postTransactionMessage","_storeTransaction","TransactionHistory$deleteLastTransaction","_addBatchToTransaction","_storeCurrentTransaction","TransactionHistory$endTransaction","TransactionHistory$storeTransaction","endTransaction","msg","_messenger","postMessage","TransactionHistory$undo","TransactionHistory$redo","TransactionHistory$inTransaction","TransactionHistory$getDescription","TransactionHistory$useMessenger","Messenger","defaultMethods","TransactionHistory$destroy","storeTransaction","deleteLastTransaction","inTransaction","useMessenger","./transaction",15,"Component$$createComponentClass","Array","isArray","configMap","fct","keys","fctClassName","firstUpperCase","facetsRegistry","ComponentClass","_registerWithDomStorage","className","DOMStorage","registerDataType","Component_domStorageSerializer","Component_domStorageParser","component","state","getState","JSON","stringify","compStr","jsonParse","createFromState","Component$$create","extraFacetsClasses","Component$$copy","deepCopy","Boolean","newEl","dom","copy","cloneNode","createOnElement","extraFacets","_getState","setState","Component$$createOnElement","innerHTML","_createComponentElement","_findOrCreateComponentRootScope","_addAttributeAndBindComponent","broadcast","Dom","domFacetConfig","templateFacetConfig","template","elConfig","domConfig","content","createElement","parent","getContainingComponent","miloBinder","Component$$createFromState","newUniqueName","ObjectIncluding","facetsStates","outerHTML","wrapEl","_createComponentWrapElement","_any","_add","domUtils","compEl","miloComponentName","Component$$createFromDataTransfer","dataTransfer","dataType","find","types","type","COMPONENT_DATA_TYPE_REGEX","test","getData","Component$init","element","componentInfo","componentRef","messenger","MESSENGER_PROPERTY","allFacets","start","Component$start","Component$createElement","Component$hasFacet","facetNameOrClass","facet","ComponentFacet","Component$addFacet","facetClassName","Component$allFacets","method","mapKeys","Component$rename","renameInScope","rename","Component$remove","preserveScopeProperty","quiet","_remove","Component$insertInto","parentEl","referenceEl","insertBefore","setScopeParentFromDOM","Component$getState","rootComponent","Component$getTransferState","options","transfer","Component$_getState","deepState","filterKeys","fctState","Component$setState","Component$getScopeParent","conditionOrFacet","_callGetScopeParent","_getScopeParent","_getScopeParentFunc","conditionFunc","componentUtils","_makeComponentConditionFunc","Component$getScopeParentWithClass","comp","Component$getTopScopeParent","_getTopScopeParent","topParent","Component$getTopScopeParentWithClass","Component$setScopeParentFromDOM","foundParent","parentNode","Component$walkScopeTree","callback","walkScopeTree","Component$treePathOf","treePathOf","Component$getComponentAtTreePath","treePath","nearest","getNodeAtTreePath","Component$insertAtTreePath","wasInserted","insertAtTreePath","Component$broadcast","data","synchronously","postMethod","Component$destroy","_destroyed","detachComponent","removeElement","Component$isDestroyed","createComponentClass","isComponent","createFromDataTransfer","insertInto","getTransferState","getScopeParent","getTopScopeParent","getScopeParentWithClass","getTopScopeParentWithClass","getComponentAtTreePath","isDestroyed","useWith","../abstract/faceted_object","../attributes/a_bind","../binder","../util/component_name","../util/dom","../util/storage","./c_facets/cf_registry","./c_utils","./scope",16,"ComponentFacet$init","_createMessenger","ComponentFacet$start","messages","onConfigMessages","ComponentFacet$onConfigMessages","messageSubscribers","notYetRegisteredMap","subscriber","subscriberType","on","contextType","context","ComponentFacet$check","reqFacet","ComponentFacet$destroy","domParent","parentComponent","scopeParent","_postParent","getParentMethod","messageType","messageData","parentFacet","_setMessageSource","messageSource","getMessageSource","dispatchSourceMessage","dispatchMessage","_createMessageSource","MessageSourceClass","_createMessageSourceWithAPI","messengerAPIOrClass","requiresFacet","facetRequire","indexOf","postDomParent","partial","postScopeParent","../abstract/facet",17,"Container$binder","Container$start","Container$path","path","throwInvalidPath","len","allowedNamePattern","Container$getState","Container$setState","compData","Container$destroy","_detachElement","Container$unwrap","renameChildren","unwrapElement","child","Container$append","appendChild","Container$insertBefore","sibling","Container$remove","removeChild","Container","unwrap","append","../../binder","../../util/dom","../c_facet","../scope","./cf_registry",18,"Data$start","pathUtils","wrapMessengerMethods","elData","getElementDataAccess","_dataChangesQueue","_prepareMessageSource","_path","_value","onSync","onOwnDataChange","onDataChangesFinished","onChildData","changeDataHandler","dataAPI","DataMsgAPI","dataEventsSource","proxyDataSourceMethods","_createProxyMethod","msgType","_bubbleUpDataChange","_queueDataChange","getTransactionFlag","Data$_bubbleUpDataChange","msgData","parentData","parentMsg","Data$_queueDataChange","change","_postDataChanges","Data$_postDataChanges","queue","changes","Data$set","executeHook","noHook","setTransactionFlag","_set","oldValue","newValue","Data$_set","setChildData","valueSet","childValue","key","pathSyntax","childPath","childDataFacet","listFacet","list","listLength","count","newItemsCount","_addItems","_updateDataPaths","index","listCount","removeCount","_removeItem","_setScalarValue","Data$del","postTransactionFinished","_del","Data$_del","Data$_setScalarValue","Data$get","deepGet","_get","Data$_get","scopeData","listItem","scopeItem","contains","_getScalarValue","Data$_getScalarValue","Data$splice","_splice","spliceIndex","removed","addedCount","methodName","hook","Data$_splice","spliceHowMany","modelUtils","normalizeSpliceIndex","item","itemData","added","argsLen","addItems","j","Data$len","_len","Data$_len","Data$path","accessPath","createItem","parsedPath","parseAccessPath","currentComponent","pathNode","nodeKey","getPathNodeKey","syntax","itemComponent","_addItem","property","currentDataFacet","Data$getPath","Data$getKey","Data$getState","Data$setState","Model","_utils","model","Data","del","splice","getPath","getKey","Path","trigger","../msg_api/data","../msg_api/de_data","../msg_src/dom_events",19,"Dom$$createElement","tagName","_applyConfigToElement","doT","cssClasses","cls","configAttributes","attrValue","_attachCssClasses","currentStyle","window","getComputedStyle","_visible","display","show","toggle","hide","doShow","style","_manageCssClasses","enforce","callMethod","cssCls","doToggle","classList","detach","setStyle","setStyles","properties","isDeep","prepend","thisEl","firstChild","appendChildren","prependChildren","insertAfter","nextSibling","appendToScopeParent","Dom$children","direction","iterator","findDirections","treeWalker","createTreeWalker","NodeFilter","SHOW_ELEMENT","currentNode","nextNode","found","hasTextBeforeSelection","selection","getSelection","isCollapsed","text","focusNode","textContent","startPos","charAt","anchorOffset","SHOW_TEXT","anchorNode","prevNode","previousNode","isText","nodeValue","trim","hasTextAfterSelection","addCssClasses","removeCssClasses","toggleCssClasses","up","down","../../attributes/a_bind","../../config",20,"Drag$init","_dragData","dataTypeInfo","_dataTypeInfo","Drag$setHandle","handleEl","_dragHandle","Drag$start","_addDragAttribute","_createDragImage","onMessages","mousedown","onMouseDown","mouseenter mouseleave mousemove","onMouseMovement","dragstart","onDragStart","drag","onDragging","dragend","onDragEnd","getstatestarted","_removeDragAttribute","getstatecompleted","dragImage","_dragElement","Image","src","url","eventType","event","__mouseDownTarget","target","targetInDragHandle","empty","stopPropagation","shouldBeDraggable","setMeta","params","getMetaData","_dragMetaDataType","dt","setComponentMeta","_dragMetaData","meta","setAdditionalDataTypes","dataTypes","_dataTypesData","getDataFunc","setData","off","preventDefault","setDragImage","x","y","DragDrop","setComponentState","_setAllowedEffects","service","dragDrop","dragFacet","_dragIsDisabled","effects","allowedEffects","setAllowedEffects","Drag","setHandle","../../util/dragdrop","../c_class",21,"Drop$init","DropMsgAPI","Drop$start","dragenter dragover","drop","onDrop","dragenter dragover dragleave drop dragin dragout","postToService","_handleDropDependency","setDropEffect","dropFacet","_handleDropDependencyNothrottle","originalDropComponent","allow","parentAllowed","checkParent","_isDropAllowed","allowComps","components","getComponentMeta","Drop","throttle","../msg_api/drop",22,"Events$init","domEventsSource","MSG_SOURCE_KEY","Events",23,"Frame$init","FrameMessageSource","Frame$start","postDomReady","self","Frame$destroy","Frame$getWindow","contentWindow","Frame$isReady","readyState","getWindow","Frame$isMiloReady","frameMilo","isReady","milo_version","Frame$milo","whenMiloReady","win","_makeWhenReadyFunc","isReadyFunc","callFunc","Frame","Frame$whenReady","Frame$whenMiloReady","whenReady","isMiloReady","../../services/de_constrs","../msg_src/frame",24,"ItemFacet$getState","getIndex","ItemFacet$setState","setIndex","ItemFacet$getIndex","ItemFacet$setIndex","ItemFacet$removeItem","removeItem","ItemFacet$extractItem","extractItem","ItemFacet","../../services/mail",25,"List$init","_listItems","_listItemsHash","WRIT","List$start","onChildrenBound","items","itemsHash","foundItem","itemSample","LIST_SAMPLE_CSS_CLASS","miloConfig","_createCacheTemplate","List$_createCacheTemplate","itemElCopy","itemsTemplateStr","itemsTemplate","compile","List$item","List$count","List$_setItem","List$contains","List$addItem","List$_addItem","prevComponent","_itemPreviousComponent","_setItem","_updateItemsIndexes","fromIndex","toIndex","List$addItems","itemsData","concat","repeat","spliceArgs","dataFacet","List$_addItems","Integer","itemsHTML","frag","createDocumentFragment","newComponents","List$removeItem","List$extractItem","itemComp","List$_removeItem","doDestroyItem","List$replaceItem","newItem","oldItem","List$_updateDataPaths","List$each","List$destroy","List","addItem","replaceItem","../../util/component_name",26,"ModelFacet$init","m","ModelFacet$getState","modelValue","deepClone","ModelFacet$setState","ModelFacet$_createMessenger","ModelFacet$destroy","ModelFacet",27,"Options$init","proxyMethods","Options$_createMessenger","Options$destroy","Options",28,"Template$init","interpolate","compileOptions","Template$start","autoRender","autoBinder","Template$getCompiled","_template","Template$set","templateStr","_templateStr","_compile","Template$render","Template$binder","Template","getCompiled",29,"Transfer$init","_activeState","_defaultKey","_state","Transfer$getState","Transfer$setState","setActiveState","Transfer$setActiveState","Transfer$setStateWithKey","isDefaultKey","Transfer$getStateWithKey","Transfer$getComponentMeta","Transfer","setStateWithKey","getStateWithKey",30,"../../abstract/registry",31,"getComponentClass","getComponentExtraFacets","hasContainerFacet","ComponentInfo$destroy","ComponentInfo$rename","reportBinderError","classHasFacetThatRequiresContainer","someKey","facetRequiresContainer","./c_registry",32,"./c_class",33,"returnCurrent","_getContainingComponent",34,"View","../c_registry",35,"DataMsgAPI$init","DataMsgAPI$value","componentGetter","translateToSourceMessage","componentEvent","filterSourceMessage","sourceMessage","createInternalData","internalData","./de_data",36,"inputDataProperty","inputType","inputElementTypes","byDefault","inputChangeEvent","toLowerCase","domElementsDataAccess","div","span","p","input","textarea","select","img","caption","thead","tbody","tfoot","tagInfo","propFunc","checkbox","radio",37,"dropEventsMap","resetFilterVars","_currentTarget","_inside","ok","dragin","dragout",38,"DOMEventsSource$destroy","emitter","DOMEmitterSource","../../services/dom_source",39,"frameWindow","addSourceSubscriber","addEventListener","removeSourceSubscriber","removeEventListener","handleEvent",40,"rootEl","Scope$_add","object","checkName","__add","Scope$_safeAdd","shouldRename","Scope$_copy","aScope","Scope$_move","otherScope","Scope$_merge","Scope$_each","Scope$_filter","Scope$_length","Scope$_any","Scope$_remove","Scope$_clean","Scope$_detachElement","Scope$_has","Scope$$rename","obj","_safeAdd","_copy","_move","_merge","_length","_clean","_has","_filter",41,"MLButton$disable","disable","disabled","MLButton$isDisabled","MLButton","events","isDisabled",42,"MLCombo$init","_comboInput","_comboList","datalist","DATALIST_TEMPLATE","dispatchChangeMessage","MLCombo_get","MLCombo_set","changeComboData","MLCombo_del","COMBO_CHANGE_MESSAGE","onOptionsChange","comboOptions","MLCombo","***",43,"MLComboList$init","_dataValidation","once","MLComboList$setDataValidation","dataValidation","MLComboList$setOptions","arr","_combo","setOptions","MLComboList$clearComboInput","clearComboInput","MLComboList$toggleAddButton","toggleAddButton","MLComboList$setAddItemPrompt","prompt","setAddItemPrompt","MLComboList$destroy","_connector","minder","destroyConnector","componentSetup","combo","_list","onComboChange","onAddItem","onItemsChange","COMBO_LIST_CHANGE_MESSAGE","MLComboList_get","MLComboList_set","MLComboList_del","MLComboList","setDataValidation",44,"MLDate$getMin","date","min","MLDate$setMin","toDate","toISO8601Format","MLDate$getMax","max","MLDate$setMax","MLDate_get","MLDate_set","dispatchInputMessage","MLDate_del","pad","dateArr","getFullYear","getMonth","getDate","dateStr","MLDate","getMin","setMin","getMax","setMax",45,"MLDropTarget",46,"foldUnfold","itemMessage","id","_itemsMap","onItemEvent","MLFoldTree$setItemTemplate","_itemTemplate","MLFoldTree$renderTree","_renderTree","itemsIDs","uniqueId","COMPILED_TREE_TEMPLATE","itemIDs","itemTemplate","DEFAULT_COMPILED_ITEM_TEMPLATE","treeTemplate","_data","TREE_TEMPLATE","MLFoldTree","click dblclick","setItemTemplate","renderTree","../../util/unique_id",47,"MLGroup",48,"MLHyperlink",49,"MLImage$init","MLImage_set","MLImage_get","MLImage_del","IMAGE_CHANGE_MESSAGE","onModelChange","MLImage",".src",50,"MLInput$disable","MLInput$isDisabled","MLInput$setMaxLength","MLInput","setMaxLength",51,"MLInputList$init","MLInputList$setPlaceHolder","placeHolder","_input","MLInputList$setAsync","newHandler","asyncHandler","MLInputList$destroy","_button","button","onClick","label","INPUT_LIST_CHANGE_MESSAGE","MLInputList_get","MLInputList_set","MLInputList_del","MLInputList_splice","MLInputList","setAsync","setPlaceHolder",52,"MLList$init","MLList$destroy","MLList$removeItem","MLList$moveItem","from","to","splicedData","deferChangeMode","MLList","moveItem",53,"MLListItem$init","deleteBtn","MLListItem$removeItem","listOwner","MLListItem$moveItem","MLListItem$isDropAllowed","isComponentAllowed","isDropAllowed","onItemDrop","onDragOut","getComponentState","onDragHover","MLListItem_get","MLListItem_set","_sendChangeMessage","MLListItem_del","LISTITEM_CHANGE_MESSAGE","MLListItem","dragenter","dragover","dragleave",54,"MLRadioGroup$init","CONF","ELEMENT_NAME_PROPERTY","ELEMENT_NAME_PREFIX","_renderOptions","MLRadioGroup$setRenderOptions","MLRadioGroup_set","setResult","_radioList","checked","MLRadioGroup_get","MLRadioGroup_del","onGroupClick","RADIO_CHANGE_MESSAGE","radioOptions","elementName","radioEls","MLRadioGroup$destroy","MLRadioGroup","click","setRenderOptions",55,"MLSelect$setOptions","modelChangeListener","MLSelect$disable","selectOptions","MLSelect","**",56,"MLSuperCombo$init","_optionsData","_filteredOptionsData","_comboOptions","_comboBefore","before","_comboAfter","after","_comboAddItemDiv","addItemDiv","_comboAddPrompt","addPrompt","_comboAddBtn","addBtn","_optionTemplate","OPTIONS_TEMPLATE","_startIndex","_endIndex","MAX_RENDERED","_hidden","_elementHeight","DEFAULT_ELEMENT_HEIGHT","_total","_optionsHeight","_lastScrollPos","_currentValue","_selected","_isAddButtonShown","setupComboList","setupComboInput","setupComboBtn","changeSelected","MLSuperCombo$toggleOptions","MLSuperCombo$showOptions","COMBO_OPEN","MLSuperCombo$hideOptions","MLSuperCombo$toggleAddButton","preserveState","__showAddOnClick","MLSuperCombo$setAddItemPrompt","_addItemPrompt","MLSuperCombo$setOptions","setFilteredOptions","MLSuperCombo$initOptionsURL","_optionsURL","_formatOptionsURL","formatOptions","_getOptionsURL","queryString","noop","request","post","err","response","responseData","MLSuperCombo$setFilteredOptions","update","MLSuperCombo$update","wasHidden","arrToShow","hideOptions","beforeHeight","afterHeight","height","overflow","width","zIndex","onListClick","scroll","onListScroll","onDataChange","onInputClick","onEnterKey","btn","onAddBtn","MLSuperCombo_get","MLSuperCombo_set","MLSuperCombo_del","_updateOptionsAndAddButton","filteredData","_filterData","filter","option","selected","filteredArr","isExactMatch","showOptions","scrollTop","directionMap","keyCode","_changeSelected","scrollPos","selectedPos","offsetTop","relativePos","_getDataValueFromElement","thisItem","adjItem","onMouseOver","_mouseIsOver","onMouseLeave","_mouseOutTimer","clearInterval","setTimeout","_onMouseLeave","_setData","lastElementChild","lastChild","firstElementChild","lastElPosition","firstElPosition","distFromLastEl","distFromFirstEl","elsFromStart","Math","floor","elsToTheEnd","totalElementsBefore","BUFFER","Number","MLSuperCombo","mouseleave","mouseover","toggleOptions","initOptionsURL",57,"MLText",58,"MLTextarea$startAutoresize","_autoresize","_autoresizeOptions","_adjustAreaHeight","_manageSubscriptions","onOff","newHeight","scrollHeight","minHeight","maxHeight","MLTextarea$stopAutoresize","MLTextarea$isAutoresized","MLTextarea$disable","MLTextarea","startAutoresize","stopAutoresize","isAutoresized",59,"MLTime_get","timeStr","TIME_REGEX","hours","mins","time","Date","MLTime_set","TIME_TEMPLATE","getHours","getMinutes","MLTime_del","MLTime",60,"MLWrapper",61,"MLAlert$$createAlert","close","timeout","alert","MLAlert","_prepareOptions","alertCls","ALERT_CSS_CLASSES","_alert","visible","alertScope","closeBtn","_onCloseBtnClick","closeAlert","MLAlert$$openAlert","createAlert","openAlert","MLAlert$openAlert","_toggleAlert","MLAlert$closeAlert","addRemove","appendRemove","success","warning","danger","fixed","role","aria-hidden","../../../util/component_name","../../c_class","../../c_registry",62,"MLDialog$$createDialog","initialize","title","html","backdrop","keyboard","buttons","Any","cssClass","dialog","MLDialog","_dialog","dialogScope","_onBackdropClick","buttonSubscriber","_dialogButtonClick","_toggleDialog","_dispatchResult","closeDialog","_onKeyDown","openedDialog","DEFAULT_BUTTONS","CLOSE_OPTIONS","mapToObject","opt","MLDialog$$openDialog","createDialog","openDialog","dialogsInitialized","_initializeDialogs","backdropEl","MLDialog$openDialog","MLDialog$closeDialog","MLDialog$$getOpenedDialog","MLDialog$destroy","getOpenedDialog",63,"MLDropdown$start","onDocOut","relatedTarget","listeners","_dropdown","isIframe","hideMenu","toggleEl","querySelector","TOGGLE_CSS_CLASS","menuEl","MENU_CSS_CLASS","doc","clickHandler","toggleMenu","DOMListeners","menu","MLDropdown$destroy","removeAll","MLDropdown$showMenu","MLDropdown$hideMenu","MLDropdown$toggleMenu","MLDropdown","showMenu","../../../util/dom_listeners",64,"componentPrefix","domStorage","typeSuffix","prefixSeparator","root","messageKey","messageTimestamp","quotaExceeded","throwError","componentMetaTemplate","componentMetaRegex","jsonpTimeout","jsonpCallbackPrefix","optionsKey","defaults","websocket","rpc","responsePrefix","deprecationWarning",65,"loader","_loader","miloMail","_loadViewsInElement","views","loadElements","totalCount","loadedCount","loadView","./attributes/a_load","./config","./util/request",66,"domReady","mail","registry","./attributes","./binder","./classes","./command","./components/c_class","./components/c_facet","./loader","./registry","./services/window","./use_components","./use_facets","./util","./util/create_component_class",67,"./command/cmd_registry",68,"eventTypes","ClipboardEvent","Event","FocusEvent","KeyboardEvent","MouseEvent","TouchEvent","global","eTypes","eventConstructorName","eventConstructor","makeFunction","domEventsConstructors",69,"eventEmitter","DOMEmitterSource$destroy","sourceSubscriberMethod","capture","useCapturePattern","isCapturePhase","eventPhase","CAPTURING_PHASE","useCapturePostfix","DOMEmitterSource$postMessage","EventConstructor","domEvent","notCancelled","dispatchEvent","../components/c_class","./de_constrs",70,"MailMsgAPI","MailMessageSource","mailMsgSource","./mail_api","./mail_source",71,"windowMessageRegExp","windowMessagePrefix",72,"isReadyStateChange","readystatechange","_windowSubscriberMethod","isWindowMessage","../de_constrs",73,"windowService_isTop","top","__karma__","windowService","domEmitterSource","isTop","./dom_source",74,"./components/classes/View","./components/ui/Button","./components/ui/Combo","./components/ui/ComboList","./components/ui/Date","./components/ui/DropTarget","./components/ui/FoldTree","./components/ui/Group","./components/ui/Hyperlink","./components/ui/Image","./components/ui/Input","./components/ui/InputList","./components/ui/List","./components/ui/ListItem","./components/ui/RadioGroup","./components/ui/Select","./components/ui/SuperCombo","./components/ui/Text","./components/ui/Textarea","./components/ui/Time","./components/ui/Wrapper","./components/ui/bootstrap/Dropdown",75,"./components/c_facets/Container","./components/c_facets/Data","./components/c_facets/Dom","./components/c_facets/Drag","./components/c_facets/Drop","./components/c_facets/Events","./components/c_facets/Frame","./components/c_facets/Item","./components/c_facets/List","./components/c_facets/ModelFacet","./components/c_facets/Options","./components/c_facets/Template","./components/c_facets/Transfer",76,"prefix","./unique_id",77,"superClassName","methods","staticMethods","SuperClass","componentRegistry","../components/c_registry",78,"deprecate","fn","deprecated","warned","prop",79,"filterNodeListByType","Node","ELEMENT_NODE","nodeList","nodeType","containingElement","selectElementContents","ownerDocument","range","createRange","selectNodeContents","getNodeWindow","sel","removeAllRanges","addRange","selectElementText","fromNode","firstTextNode","toNode","lastTextNode","setSelection","setCaretPosition","pos","setStart","getSelectionDirection","_getDirection","focusOffset","startOffset","endOffset","docPosition","compareDocumentPosition","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","originalContentEditable","backward","setEnd","collapse","commonAncestorContainer","parentElement","isContentEditable","contentEditable","clearSelection","getElementOffset","includeBorder","yPos","xPos","offsetLeft","offsetParent","getBorder","topOffset","leftOffset","side","styles","sideValue","parseInt","getPropertyValue","normalize","TEXT_NODE","replaceChild","wrapInElement","wrapIntoEl","trimNodeRight","_trimNode","trimNodeLeft","stripHtml","str","walkTree","tw","containsEl","nodeIndex","findIndex","childIndex","toNormalize","isTreePathBefore","path1","path2","isBefore","htmlEntities","charCodeAt","whatToShow","defaultView","parentWindow","forEachNodesInRange","isNodeInsideRange","nodeRange","isInside","selectNode","compareBoundaryPoints","Range","START_TO_START","END_TO_END","rangeContainer","getComponentsFromRange","startContainer","deleteRangeWithComponents","deleteContents","areRangesEqual","range1","range2","addDebugPoint","dbEl",80,"DOMListeners$add","handler","DOMListeners$remove","listener","idx","isEqual","_removeListener","DOMListeners$removeAll","l",81,"domReadySubscribed","onDomReady","domReadyFuncs",82,"DragDrop$$componentDataType","dragDropConfig","DragDrop$isComponent","componentDataType","DragDrop$getComponentState","stateStr","DragDrop$setComponentState","requestedBy","DragDrop$setComponentMeta","_componentMeta","paramsStr","toQueryString","_encode","base32","encode","DragDrop$getComponentMeta","metaDataType","dType","decode","fromQueryString","metaData","DragDrop$getAllowedEffects","effectAllowed","DragDrop$setAllowedEffects","DragDrop$getDropEffect","dropEffect","DragDrop$setDropEffect","effect","DragDrop$isEffectAllowed","getAllowedEffects","isCopy","isMove","isLink","isAllowed","DragDrop$getData","DragDrop$setData","dataStr","DragDrop$clearData","clearData","onDragDropStarted","_currentDragDrop","_currentDragFacet","onDragDropCompleted","onCompleteDragDrop","dragDropService","getCurrentDragDrop","DragDrop_destroy","offAll","getDropEffect","isEffectAllowed","dragdropstarted","dragdropcompleted","completedragdrop",83,"error$createClass","errorClassName","ErrorClass","makeSubclass","error$toBeImplemented","AbstractClass","errorClassNames","createClass",84,"fragment_getState","wrapperClassName","_getRangeContainer","cloneContents","wrapper","_wrapFragmentInContainer","_transferStates","_renameChildren","wrapperState","fragment_getStateAsync","fromComp","toComp","fromScope","toChildComp","fromChildComp","expandRangeToSiblings","siblings","getRangeSiblings","createRangeFromSiblings","nodes","setStartBefore","setEndAfter","end","containerNode","startNode","endNode","endContainer","startSibling","_findContainingChild","endSibling","selNode","_createNodesAndPathsFunc","fromObj","toObj","createRangePaths","createRangeNodes","getStateAsync","createRangeFromNodes","./dom",85,"util_destroy","domListeners","fragment","storage","../components/ui/bootstrap/Alert","../components/ui/bootstrap/Dialog","./component_name","./deprecate","./dom_listeners","./domready","./dragdrop","./error","./fragment","./json_parse","./request","./selection","./storage","./websocket",86,87,"createPromiseOverride","functionName","promise","Promise","keepRequestObject","_request","opts","onReady","_onReady","req","xPromise","contentType","XMLHttpRequest","open","setRequestHeader","setRequestHeaders","headers","onreadystatechange","ontimeout","onabort","_createXPromise","send","_pendingRequests","resolvePromise","rejectPromise","resolve","reject","then","promiseThen","promiseCatch","status","responseText","spliceItem","errorReason","reason","request$useMessenger","request$get","request$post","request$json","jsonPromise","errData","request$jsonp","_onResult","uniqueCallback","cleanUp","clearTimeout","head","script","jsonpOptions","omitKeys","request$file","fileData","progress","upload","onprogress","file","binary","formData","FormData","request$destroy","whenRequestsCompleted","delay","json","jsonp",88,"TextSelection","TextSelection$init","rangeCount","getRangeAt","TextSelection$text","_text","toString","TextSelection$textNodes","_textNodes","_getTextNodes","TextSelection$clear","textNodes","selStart","selEnd","inEnd","_getElement","thisPropName","rangePropName","_getComponent","elMethodName","TextSelection$containedComponents","_containedComponents","TextSelection$eachContainedComponent","containedComponents","TextSelection$del","selectEndContainer","selPoint","_getPostDeleteSelectionPoint","_selectAfterDelete","selOffset","offset","trimRight","TextSelection$getRange","TextSelection$getState","createStateObject","TextSelection$$createStateObject","_getSelectionPointState","TextSelection$$createFromState","_selectionNodeFromState","pointState","TextSelection$$createFromRange","endRange","cloneRange","TextSelection$$getNormalizedRange","newRange","TextSelection$$getDirection","TextSelection$startElement","TextSelection$endElement","TextSelection$containingElement","TextSelection$startComponent","TextSelection$endComponent","TextSelection$containingComponent","clear","startElement","endElement","startComponent","endComponent","containingComponent","eachContainedComponent","getRange","getNormalizedRange","getDirection","createFromRange","../../components/c_class","../dom",89,"keyPrefix","sessionOnly","_storage","sessionStorage","localStorage","_typeSuffix","_keys","DOMStorage$set","setItem","DomStorageError","DOMStorage$get","deepForEach","getItem","DOMStorage$remove","DOMStorage$hasItem","pKey","_storageKey","DOMStorage$getItem","_getKeyDataType","valueStr","_parseData","DOMStorage$setItem","_setKeyDataType","_serializeData","cfg","_domStorage","DOMStorage$removeItem","_removeKeyDataType","DOMStorage$getAllKeys","storedKeys","keysInStorage","hasItem","DOMStorage$getAllItems","getAllKeys","DOMStorage$_storageKey","DOMStorage$_domStorageKey","storageKey","unPrefix","_dataTypeKey","_getValueType","valueType","valuesDataTypes","serializer","dataSerializers","parser","dataParsers","DOMStorage$$registerDataType","storeAsDataType","DOMStorage$createMessenger","storageMessageSource","StorageMessageSource","_messageSource","DOMStorage$destroy","_storedKeys","true","false","_domStorageKey","getAllItems","createMessenger","_sessionStorage","_localStorage","local","session","valStr","boolean","number","function","toFunction","RegExp","toRegExp","./model","./msg_src",90,"Model$$registerWithDOMStorage","Model_domStorageSerializer","Model_domStorageParser","registerWithDOMStorage",91,"StorageMessageSource$addSourceSubscriber","StorageMessageSource$removeSourceSubscriber","StorageMessageSource$postMessage","StorageMessageSource$trigger","storageArea",92,"uniqueCount","newTimestamp","now","uniqueID","timestamp",93,"wsMessenger","wsMsgSource","WSMessageSource","connect","WSMsgAPI","./msg_api",94,"SOCKET_MESSAGES",95,"WSMessageSource$connect","_options","host","location","port","_ws","onopen","ws","onmessage","onclose","onerror","WebSocket","_wsSubscriberMethod","WSMessageSource$handleEvent","WSMessageSource$trigger","onTimeout","toggleRpcSubscription","callbackCorrId","onResponse","interval","corrId",96,"Encoder","skip","bits","output","readByte","byte","alphabet","finish","Decoder","readChar","char","fromCharCode","val","lookup","encoder","decoder","alias","table","flush",97,98,"_createProxyMethods","proxyMethodName","mixinMethodName","boundMethod","Mixin_setInstanceKey","hostClass","instanceKey","mixin","instancePropertiesMap","instanceKeys","Mixin_addMethod","hostMethodName","wrappedMethod","_wrapMixinMethod","mixinInstance","_getMixinInstance","mixinProp","Mixin$$useWith","mixinMethods","../util/check","mol-proto",99,"MessengerRegexpAPI","./abstract/mixin","./messenger/m_api","./messenger/m_api_rx","./messenger/m_source","./messenger/msngr_source",100,"deepExtend","debug",101,"_initializeSubscribers","_messageSubscribers","_patternMessageSubscribers","Messenger$destroy","Messenger$on","_Messenger_onWithOptions","Messenger$once","dispatchTimes","Messenger$onceSync","sync","Messenger$onSync","Messenger$onAsync","_Messenger_on","_eachMessage","messagesSplitRegExp","subscribersHash","_chooseSubscribersHash","changed","subscriptionChanged","_registerSubscriber","pattern","onSubscriberAdded","noSubscribers","msgSubscribers","notYetRegistered","_indexOfSubscriber","subscr","Messenger$off","_Messenger_off","_removeSubscriber","subscriberIndex","_removeAllSubscribers","onSubscriberRemoved","offMessages","subscriberRemovedMap","Messenger$offAll","_offAllSubscribers","subscribers","_synchronous","_callSubscribers","_callPatternSubscribers","calledMsgSubscribers","patternSubscribers","_callSubscriber","syncSubscriber","synchro","__messages","getSubscribers","includePatternSubscribers","onceSync","onAsync","onMessage","offMessage","subscriptions","../abstract/mixin","./m_source",102,"MessengerAPI$destroy","addInternalMessage","internalMsgs","_internalMessages","removeInternalMessage","unexpectedNotificationWarning","messageIndex","getInternalMessages","sourceData","../util/logger",103,"_patternInternalMessages","_catchAllSubscribed","noPatternInternalMessages","internalMessages","internalMessagesHash","patternMessages","sourcePattern","./m_api",104,"messengerAPI","_prepareMessengerAPI","MessageSource$destroy","setMessenger","newSourceMessage","removedSourceMessage","api","shouldDispatch",105,"sourceMessenger","MessengerMessageSource$postMessage",106,"./messenger","./minder",107,"ds1","mode","ds2","connDescriptions","connectors","descr","Connector","_addConnector","cnct","___minder_id","_connectors","onConnectorMessage","connector","_receivedMessages","_isPropagating","_idleCheck","minder_isPropagating","minder_whenPropagationCompleted","executeCallback","minder_getConnectors","isOn","minder_destroyConnector","minder_getExpandedConnections","searchStr","getConnectors","connections","connection","leftSource","_getExpandedSource","rightSource","cnctn","_sourceMatchesString","ds","source","_model","_accessPath","unshift","matchStr","some","srcNode","_stringMatch","substr","minder_destroy","destroyDS","getExpandedConnections","isPropagating","whenPropagationCompleted","./model/connector","./util/logger",108,"flag","__inChangeTransaction","passTransactionFlag","fromFunc","toFunc","processChanges","notify","processTransaction","prepareTransaction","validateTransaction","changeFinished","sameSource","checkChange","checkSplice","checkMethod","parentPathChanged","pathsToChange","parentPath","_pathIsParentOf","todo","exitLoop","pathsToSplice","hadSplice","parentPathSpliced","every","processChange","modelPath","executeSplice","executeMethod","howMany","CHANGE_TYPE_TO_METHOD_MAP","deleted","./path_utils",109,"setupMode","_changesQueue1","_changesQueue2","pathTranslation","patternTranslation","getPatternTranslations","pathTranslation1","reverseTranslationRules","pathTranslation2","patternTranslation1","reversePatternTranslationRules","patternTranslation2","dataTranslation","dataTranslation1","dataTranslation2","dataValidation1","dataValidation2","turnOn","modeParseError","parsedMode","modePattern","depth1","depth2","Connector$changeMode","turnOff","Connector$deferChangeMode","rules","reverseRules","path2_value","path1_key","_throwInvalidTranslation","_getStaticPath","starIndex1","starIndex2","fromPattern","createRegexPath","fromStaticPath","toPattern","toStaticPath","pt","Connector$turnOn","linkDataSource","reverseLink","fromDS","toDS","changesQueue","onData","batch","translatePath","sourcePath","translatedPath","pTranslation","subscriptionPattern","translateData","translate","validateData","callValidator","validator","alreadyFailed","valid","passedCount","validators","propagateData","sendData","postChangeData","subscriptionSwitch","mergeTransactions","batches","targetPath","subscriptionPath","_subscriptionPath","_link1","_link2","Connector$turnOff","unlinkDataSource","linkName","Connector$destroy","changeMode","../messenger",110,"Model$path","__proto__","reactive","_prepareMessengers","Model$get","ModelPath","proxyMessenger","modelHostObject","Model$$useWith","modelMethodsToProxy","internalMessenger","internalMessengerSource","ModelMsgAPI","externalMessenger","_getHostObject","Model$destroy","_internalMessenger","synthesize","modelMethods","../messenger/msngr_source","./change_data","./m_msg_api","./m_path","./model_utils","./synthesize",111,"../messenger/m_api_rx",112,"ModelPath$path","_args","interpolateAccessPath","_prepareMessenger","freeze","reduce","accessPathStr","currNode","thisPathArgsCount","newPath","ModelPath$len","ModelPath$push","newLength","ModelPath$pop","ModelPath$unshift","ModelPath$shift","mPathAPI","ModelPathMsgAPI","modelMessageSource","mPathMessenger","_getDefinition","_createFromDefinition","definition","ModelPath$destroy","pop","./path_msg_api",113,114,"rootPath","internalChanges","truncateChangePath","fullPath","../messenger/m_api",115,"nodeParsePattern","pathParsePattern","unparsed","nodeStr","pathNodeTypes","patternPathParsePattern","regexStr","patternsStarted","regex","nodeRegex","interpolated","startIndex","methodsNames","wrappedMethods","origMethod","regexPath","propertyPathSyntax","arrayPathSyntax","interpolationSyntax","propertyInterpolateSyntax","arrayInterpolateSyntax","propertyStarSyntax","arrayStarSyntax","starSyntax","pathParseSyntax","patternPathParseSyntax",".","[","*",".*","[*]",116,"_synthesizePathMethods","synthesizers","synthszr","_synthesize","synthesizer","addChangeMessage","messagesHash","addTreeChangesMessages","oldIsTree","valueIsTree","newIsTree","addMessages","valueProp","_addMessages","addMessage","existingMsg","cloneTree","valueIsNormalObject","protectValue","addBatchIdsToMessage","batchId","msgId","__batch_id","__msg_id","methodCode","eval","ModelError","fs","templates","include_defines","include_create_tree","include_traverse_tree","dotDef","modelAccessPrefix","modelPostMessageCode","modelPostBatchCode","modelDotDef","dotSettings","templateSettings","strip","tmpl","modelSynthesizers","synthesizePathMethods","memoize","../../util/logger","../change_data","../model_utils","../path_utils","dot",117,"choices","Where","condition","Superclass","matchSuperclassToo","matchSuperclass","checkSubtree","typeofChecks","_jsKeywords","valueElement","_prependPath","unknownKeysAllowed","keyPattern","emptyHash","requiredPatterns","optionalPatterns","subPattern","subValue","base","TypeError",118,"./check","./logger",119,"Logger","level","./logger_class",120,"maxLevelLength","colored","color","levels","colors","DEFAULT_OPTIONS","throwLevel","enabled","logPrefix","log","console","logPrefixColor",121,"resolveDefs","c","block","def","define","code","assign","substring","defineParams","param","v","arg","use","useParams","d","rw","__exp","unescape","_globals","version","evaluate","conditional","iterate","varname","selfcontained","doNotSkipEncoded","encodeHTMLSource","encodeHTMLRules","&","<",">","\"","'","/","matchHTML","amd","startend","startencode","needhtmlencode","indv","cse","sid","elsecase","vname","iname","_encodeHTML",122,"InstallDots","__path","__destination","destination","__global","__rendermodule","rendermodule","__settings","__includes","addexports","ret","readdata","readFileSync","process","compileAll","compileToFile","modulename","lastIndexOf","defs","settings","compileoptions","defaultcompiled","compiled","writeFileSync","compilePath","k","defFolder","sources","readdirSync","./doT",123,"Proto","wrapped","unwrapProto","utils","prototypeMethods","objectMethods","arrayMethods","functionMethods","stringMethods","numberMethods","utilMethods","__","_constants","protoFuncs","makeProtoFunction","protoInstanceMethods","makeProtoInstanceMethod","underscore","./proto_array","./proto_function","./proto_number","./proto_object","./proto_prototype","./proto_string","./proto_util","./utils",124,"arrayToAppend","prependArray","arrayToPrepend","values","valuesIsArray","unique","itemIndex","filtered","it","itemIndexOf","_deepForEach","nativeArrayMethodsNames","nativeArrayMethods","makeFindMethod",125,"arg1","arg2","funcBody","partialRight","hashFunc","limit","cache","keysList","wait","_delay","deferTicks","ticks","deferFunc","delayMethod","funcOrMethodName","_delayMethod","delayed","passArgs","deferred","debounce","immediate","later","last","callNow","previous","leading","remaining","trailing","memo","ran","waitFor","maxTimeout","timedOutFunc","checkInterval","testCondition","setInterval","not",126,"isNumeric","isNaN","parseFloat","isFinite",127,"onlyEnumerable","descriptors","getOwnPropertyDescriptor","clonedObject","propertyName","decriptorFlags","_getDescriptor","descriptor","constants","ENUMERABLE","configurable","CONFIGURABLE","writable","WRITABLE","propertyValues","_extendTree","selfNode","objNode","objTraversed","loop","allKeys","getOwnPropertyNames","keyOf","searchElement","allKeysOf","mapProperty","reduceKeys","initialValue","filterProperty","testProperty","_passed","everyKey","_didNotPass","pickKeys","ArrayProto","multiline","ignoreCase","isNot","findValue","findKey",128,"propDescriptors","applyConstructor","thisClass","subclass","constructorCode",129,"toUpperCase","rx","regexpStringPattern","getTime","qs","encodeURIComponent","pairs","results","decodeURIComponent","pair","splitPair","hashCode","hash",130,"times","tap","identity","compareProperty","b",131,"eachMethod","findWhat","argIndex","testItem","caughtError","_error"],"mappings":"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","sourceRoot":"/"} \ No newline at end of file +<<<<<<< HEAD +{"version":3,"file":"milo.min.js","sources":["milo.bundle.js"],"names":["e","t","n","r","s","o","u","a","require","i","Error","f","exports","call","length",1,"module","Facet","owner","config","this","name","_","firstLowerCase","constructor","init","apply","arguments","proto","extendProto","milo-core",2,"FacetedObject","instantiateFacet","FacetClass","facetName","fctConfig","facetsConfig","facets","facetsDescriptors","enumerable","value","facetsClasses","eachKey","Object","defineProperties","defineProperty","FacetedObject$addFacet","facetConfig","throwOnErrors","check","Function","Match","Optional","String","protoFacets","prototype","message","logger","error","newFacet","ENUM","FacetedObject$$hasFacet","FacetedObject$$getFacetConfig","hasFacet","FacetedObject$$createFacetedClass","addInheritedFacets","superClass","facetsInfo","facetsInfoName","inheritedFacetsInfo","clone","extend","ObjectHash","Subclass","fctName","hasOwnProperty","FacetedClass","createSubclass","miloCore","util","createFacetedClass","getFacetConfig","addFacet","./facet",3,"ClassRegistry","FoundationClass","setClass","__registeredClasses","add","aClass","IdentifierString","get","remove","nameOrClass","OneOf","clean",4,"attrName","attrs","bind","parse","node","bindTo","match","ATTRIBUTE_REGEXP","compClass","compFacets","split","FACETS_SPLIT_REGEXP","undefined","compName","validate","render","milo","componentName","ATTRIBUTE_TEMPLATE","replace","join","BindAttribute$$setInfo","el","componentClass","componentFacets","attr","BindAttribute","decorate","Attribute","setInfo","../config","./a_class",5,"attributes","Attribute$$remove","deep","removeAttribute","selector","children","querySelectorAll","forEach","childEl","Attribute$remove","Attribute$destroy","Attribute$get","getAttribute","Attribute$set","setAttribute","Attribute$decorate","set","toBeImplemented","destroy",6,"load","loadUrl","LoadAttribute",7,"./a_bind","./a_load",8,"binder","scopeEl","rootScope","bindRootElement","createBinderScope","scope","info","ComponentInfo","Component","create","twoPass","scanScope","scan","hostObject","Scope","_rootEl","addMethod","_each","compInfo","aComponent","container","scopeObjectFactory","createScopeForElement","postChildrenBoundMessage","elComp","getComponent","postMessageSync","scopedObject","isContainer","childNodes","innerScope","_hostObject","createScopeForChildren","containerEl","utilDom","document","body","componentsRegistry","./attributes/a_bind","./components/c_facets/cf_registry","./components/c_info","./components/c_registry","./components/scope","./services/mail","./util/dom",9,"coreClasses","classes","Mixin","MessageSource","MessengerMessageSource","MessengerAPI","DOMEventsSource","Transaction","TransactionHistory","./abstract/facet","./abstract/faceted_object","./abstract/registry","./command/transaction","./command/transaction_history","./components/msg_src/dom_events",10,"ActionsHistory","maxLength","_maxLength","Infinity","actions","position","ActionsHistory$store","command","_truncateToCurrentPosition","push","act","shift","ActionsHistory$deleteLast","ActionsHistory$undo","cb","undo","ActionsHistory$redo","redo","ActionsHistory$undoAll","ActionsHistory$redoAll","ActionsHistory$undoAllAsync","deferMethod","defer","ActionsHistory$redoAllAsync","ActionsHistory$each","funcOrMethod","thisArg","func","ActionsHistory$eachReverse","reverse","each","ActionsHistory$getLastAction","ActionsHistory$getDescription","map","getDescription","store","deleteLast","undoAll","redoAll","undoAllAsync","redoAllAsync","eachReverse","getLastAction",11,"Command","commandsRegistry","../abstract/registry","./index",12,"Command$init","args","slice","Command$execute","result","Command$setUndo","undoCommand","UNDO_COMMAND","warn","Command$getUndo","Command$undo","undoCmd","getUndo","execute","Command$setArguments","toArray","Command$getArguments","Command$changeArguments","Command$addArguments","appendArray","Command$$create","newApply","Command$$createWithUndo","Command$destroy","Command$setComment","comment","Command$getDescription","setUndo","setArguments","addArguments","getArguments","changeArguments","setComment","createWithUndo",13,"commands","Transaction$execute","Transaction$undo","Transaction$redo","Transaction$destroy","Transaction$storeCommand","Transaction$merge","transaction","cmd","Transaction$setComment","Transaction$getDescription","storeCommand","merge","./actions_history",14,"transactions","currentBatch","currentTransaction","SCHEDULED","TransactionHistory$storeCommand","appendTransaction","_postTransactionMessage","_storeTransaction","TransactionHistory$deleteLastTransaction","_addBatchToTransaction","_storeCurrentTransaction","TransactionHistory$endTransaction","TransactionHistory$storeTransaction","endTransaction","msg","_messenger","postMessage","TransactionHistory$undo","TransactionHistory$redo","TransactionHistory$inTransaction","TransactionHistory$getDescription","TransactionHistory$useMessenger","Messenger","defaultMethods","TransactionHistory$destroy","storeTransaction","deleteLastTransaction","inTransaction","useMessenger","./transaction",15,"Component$$createComponentClass","Array","isArray","configMap","fct","keys","fctClassName","firstUpperCase","facetsRegistry","ComponentClass","_registerWithDomStorage","className","DOMStorage","registerDataType","Component_domStorageSerializer","Component_domStorageParser","component","state","getState","JSON","stringify","compStr","jsonParse","createFromState","Component$$create","extraFacetsClasses","Component$$copy","deepCopy","Boolean","newEl","dom","copy","cloneNode","createOnElement","extraFacets","_getState","setState","Component$$createOnElement","innerHTML","_createComponentElement","_findOrCreateComponentRootScope","_addAttributeAndBindComponent","broadcast","Dom","domFacetConfig","templateFacetConfig","template","elConfig","domConfig","content","createElement","parent","getContainingComponent","miloBinder","Component$$createFromState","newUniqueName","ObjectIncluding","facetsStates","outerHTML","wrapEl","_createComponentWrapElement","_any","_add","domUtils","compEl","miloComponentName","Component$$createFromDataTransfer","dataTransfer","dataType","find","types","type","COMPONENT_DATA_TYPE_REGEX","test","getData","Component$init","element","componentInfo","componentRef","messenger","MESSENGER_PROPERTY","allFacets","start","Component$start","Component$createElement","Component$hasFacet","facetNameOrClass","facet","ComponentFacet","Component$addFacet","facetClassName","Component$allFacets","method","mapKeys","Component$rename","renameInScope","rename","Component$remove","preserveScopeProperty","quiet","_remove","Component$insertInto","parentEl","referenceEl","insertBefore","setScopeParentFromDOM","Component$getState","rootComponent","Component$getTransferState","options","transfer","Component$_getState","deepState","filterKeys","fctState","Component$setState","Component$getScopeParent","conditionOrFacet","_callGetScopeParent","_getScopeParent","_getScopeParentFunc","conditionFunc","componentUtils","_makeComponentConditionFunc","Component$getScopeParentWithClass","comp","Component$getTopScopeParent","_getTopScopeParent","topParent","Component$getTopScopeParentWithClass","Component$setScopeParentFromDOM","foundParent","parentNode","Component$walkScopeTree","callback","walkScopeTree","Component$treePathOf","treePathOf","Component$getComponentAtTreePath","treePath","nearest","getNodeAtTreePath","Component$insertAtTreePath","wasInserted","insertAtTreePath","Component$broadcast","data","synchronously","postMethod","Component$destroy","_destroyed","detachComponent","removeElement","Component$isDestroyed","createComponentClass","isComponent","createFromDataTransfer","insertInto","getTransferState","getScopeParent","getTopScopeParent","getScopeParentWithClass","getTopScopeParentWithClass","getComponentAtTreePath","isDestroyed","useWith","../abstract/faceted_object","../attributes/a_bind","../binder","../util/component_name","../util/dom","../util/storage","./c_facets/cf_registry","./c_utils","./scope",16,"ComponentFacet$init","_createMessenger","ComponentFacet$start","messages","onConfigMessages","ComponentFacet$onConfigMessages","messageSubscribers","notYetRegisteredMap","subscriber","subscriberType","on","contextType","context","ComponentFacet$check","reqFacet","ComponentFacet$destroy","domParent","parentComponent","scopeParent","_postParent","getParentMethod","messageType","messageData","parentFacet","_setMessageSource","messageSource","getMessageSource","dispatchSourceMessage","dispatchMessage","_createMessageSource","MessageSourceClass","_createMessageSourceWithAPI","messengerAPIOrClass","requiresFacet","facetRequire","indexOf","postDomParent","partial","postScopeParent","../abstract/facet",17,"Container$binder","Container$start","Container$path","path","throwInvalidPath","len","allowedNamePattern","Container$getState","Container$setState","compData","Container$destroy","_detachElement","Container$unwrap","renameChildren","unwrapElement","child","Container$append","appendChild","Container$insertBefore","sibling","Container$remove","removeChild","Container","unwrap","append","../../binder","../../util/dom","../c_facet","../scope","./cf_registry",18,"Data$start","pathUtils","wrapMessengerMethods","elData","getElementDataAccess","_dataChangesQueue","_prepareMessageSource","_path","_value","onSync","onOwnDataChange","onDataChangesFinished","onChildData","changeDataHandler","dataAPI","DataMsgAPI","dataEventsSource","proxyDataSourceMethods","_createProxyMethod","msgType","_bubbleUpDataChange","_queueDataChange","getTransactionFlag","Data$_bubbleUpDataChange","msgData","parentData","parentMsg","Data$_queueDataChange","change","_postDataChanges","Data$_postDataChanges","queue","changes","Data$set","executeHook","noHook","setTransactionFlag","_set","oldValue","newValue","Data$_set","setChildData","valueSet","childValue","key","pathSyntax","childPath","childDataFacet","listFacet","list","listLength","count","newItemsCount","_addItems","_updateDataPaths","index","listCount","removeCount","_removeItem","_setScalarValue","Data$del","postTransactionFinished","_del","Data$_del","Data$_setScalarValue","Data$get","deepGet","_get","Data$_get","scopeData","listItem","scopeItem","contains","_getScalarValue","Data$_getScalarValue","Data$splice","_splice","spliceIndex","removed","addedCount","methodName","hook","Data$_splice","spliceHowMany","modelUtils","normalizeSpliceIndex","item","itemData","added","argsLen","addItems","j","Data$len","_len","Data$_len","Data$path","accessPath","createItem","parsedPath","parseAccessPath","currentComponent","pathNode","nodeKey","getPathNodeKey","syntax","itemComponent","_addItem","property","currentDataFacet","Data$getPath","Data$getKey","Data$getState","Data$setState","Model","_utils","model","Data","del","splice","getPath","getKey","Path","trigger","../msg_api/data","../msg_api/de_data","../msg_src/dom_events",19,"Dom$$createElement","tagName","_applyConfigToElement","doT","cssClasses","cls","configAttributes","attrValue","_attachCssClasses","currentStyle","window","getComputedStyle","_visible","display","show","toggle","hide","doShow","style","_manageCssClasses","enforce","callMethod","cssCls","doToggle","classList","detach","setStyle","setStyles","properties","isDeep","prepend","thisEl","firstChild","appendChildren","prependChildren","insertAfter","nextSibling","appendToScopeParent","Dom$children","direction","iterator","findDirections","treeWalker","createTreeWalker","NodeFilter","SHOW_ELEMENT","currentNode","nextNode","found","hasTextBeforeSelection","selection","getSelection","isCollapsed","text","focusNode","textContent","startPos","charAt","anchorOffset","SHOW_TEXT","anchorNode","prevNode","previousNode","isText","nodeValue","trim","hasTextAfterSelection","addCssClasses","removeCssClasses","toggleCssClasses","up","down","../../attributes/a_bind","../../config",20,"Drag$init","_dragData","dataTypeInfo","_dataTypeInfo","Drag$setHandle","handleEl","_dragHandle","Drag$start","_addDragAttribute","_createDragImage","onMessages","mousedown","onMouseDown","mouseenter mouseleave mousemove","onMouseMovement","dragstart","onDragStart","drag","onDragging","dragend","onDragEnd","getstatestarted","_removeDragAttribute","getstatecompleted","dragImage","_dragElement","Image","src","url","eventType","event","__mouseDownTarget","target","targetInDragHandle","empty","stopPropagation","shouldBeDraggable","setMeta","params","getMetaData","_dragMetaDataType","dt","setComponentMeta","_dragMetaData","meta","setAdditionalDataTypes","dataTypes","_dataTypesData","getDataFunc","setData","off","preventDefault","setDragImage","x","y","DragDrop","setComponentState","_setAllowedEffects","service","dragDrop","dragFacet","_dragIsDisabled","effects","allowedEffects","setAllowedEffects","Drag","setHandle","../../util/dragdrop","../c_class",21,"Drop$init","DropMsgAPI","Drop$start","dragenter dragover","drop","onDrop","dragenter dragover dragleave drop dragin dragout","postToService","_handleDropDependency","setDropEffect","dropFacet","_handleDropDependencyNothrottle","originalDropComponent","allow","parentAllowed","checkParent","_isDropAllowed","allowComps","components","getComponentMeta","Drop","throttle","../msg_api/drop",22,"Events$init","domEventsSource","MSG_SOURCE_KEY","Events",23,"Frame$init","FrameMessageSource","Frame$start","postDomReady","self","Frame$destroy","Frame$getWindow","contentWindow","Frame$isReady","readyState","getWindow","Frame$isMiloReady","frameMilo","isReady","milo_version","Frame$milo","whenMiloReady","win","_makeWhenReadyFunc","isReadyFunc","callFunc","Frame","Frame$whenReady","Frame$whenMiloReady","whenReady","isMiloReady","../../services/de_constrs","../msg_src/frame",24,"ItemFacet$getState","getIndex","ItemFacet$setState","setIndex","ItemFacet$getIndex","ItemFacet$setIndex","ItemFacet$removeItem","removeItem","ItemFacet$extractItem","extractItem","ItemFacet","../../services/mail",25,"List$init","_listItems","_listItemsHash","WRIT","List$start","onChildrenBound","items","itemsHash","foundItem","itemSample","LIST_SAMPLE_CSS_CLASS","miloConfig","_createCacheTemplate","List$_createCacheTemplate","itemElCopy","itemsTemplateStr","itemsTemplate","compile","List$item","List$count","List$_setItem","List$contains","List$addItem","List$_addItem","prevComponent","_itemPreviousComponent","_setItem","_updateItemsIndexes","fromIndex","toIndex","List$addItems","itemsData","concat","repeat","spliceArgs","dataFacet","List$_addItems","Integer","itemsHTML","frag","createDocumentFragment","newComponents","List$removeItem","List$extractItem","itemComp","List$_removeItem","doDestroyItem","List$replaceItem","newItem","oldItem","List$_updateDataPaths","List$each","List$destroy","List","addItem","replaceItem","../../util/component_name",26,"ModelFacet$init","m","ModelFacet$getState","modelValue","deepClone","ModelFacet$setState","ModelFacet$_createMessenger","ModelFacet$destroy","ModelFacet",27,"Options$init","proxyMethods","Options$_createMessenger","Options$destroy","Options",28,"Template$init","interpolate","compileOptions","Template$start","autoRender","autoBinder","Template$getCompiled","_template","Template$set","templateStr","_templateStr","_compile","Template$render","Template$binder","Template","getCompiled",29,"Transfer$init","_activeState","_defaultKey","_state","Transfer$getState","Transfer$setState","setActiveState","Transfer$setActiveState","Transfer$setStateWithKey","isDefaultKey","Transfer$getStateWithKey","Transfer$getComponentMeta","Transfer","setStateWithKey","getStateWithKey",30,"../../abstract/registry",31,"getComponentClass","getComponentExtraFacets","hasContainerFacet","ComponentInfo$destroy","ComponentInfo$rename","reportBinderError","classHasFacetThatRequiresContainer","someKey","facetRequiresContainer","./c_registry",32,"./c_class",33,"returnCurrent","_getContainingComponent",34,"View","../c_registry",35,"DataMsgAPI$init","DataMsgAPI$value","componentGetter","translateToSourceMessage","componentEvent","filterSourceMessage","sourceMessage","createInternalData","internalData","./de_data",36,"inputDataProperty","inputType","inputElementTypes","byDefault","inputChangeEvent","toLowerCase","domElementsDataAccess","div","span","p","input","textarea","select","img","caption","thead","tbody","tfoot","tagInfo","propFunc","checkbox","radio",37,"dropEventsMap","resetFilterVars","_currentTarget","_inside","ok","dragin","dragout",38,"DOMEventsSource$destroy","emitter","DOMEmitterSource","../../services/dom_source",39,"frameWindow","addSourceSubscriber","addEventListener","removeSourceSubscriber","removeEventListener","handleEvent",40,"rootEl","Scope$_add","object","checkName","__add","Scope$_safeAdd","shouldRename","Scope$_copy","aScope","Scope$_move","otherScope","Scope$_merge","Scope$_each","Scope$_filter","Scope$_length","Scope$_any","Scope$_remove","Scope$_clean","Scope$_detachElement","Scope$_has","Scope$$rename","obj","_safeAdd","_copy","_move","_merge","_length","_clean","_has","_filter",41,"MLButton$disable","disable","disabled","MLButton$isDisabled","MLButton","events","isDisabled",42,"MLCombo$init","_comboInput","_comboList","datalist","DATALIST_TEMPLATE","dispatchChangeMessage","MLCombo_get","MLCombo_set","changeComboData","MLCombo_del","COMBO_CHANGE_MESSAGE","onOptionsChange","comboOptions","MLCombo","***",43,"MLComboList$init","_dataValidation","once","MLComboList$setDataValidation","dataValidation","MLComboList$setOptions","arr","_combo","setOptions","MLComboList$clearComboInput","clearComboInput","MLComboList$toggleAddButton","toggleAddButton","MLComboList$setAddItemPrompt","prompt","setAddItemPrompt","MLComboList$destroy","_connector","minder","destroyConnector","componentSetup","combo","_list","onComboChange","onAddItem","onItemsChange","COMBO_LIST_CHANGE_MESSAGE","MLComboList_get","MLComboList_set","MLComboList_del","MLComboList","setDataValidation",44,"MLDate$getMin","date","min","MLDate$setMin","toDate","toISO8601Format","MLDate$getMax","max","MLDate$setMax","MLDate_get","MLDate_set","dispatchInputMessage","MLDate_del","pad","dateArr","getFullYear","getMonth","getDate","dateStr","MLDate","getMin","setMin","getMax","setMax",45,"MLDropTarget",46,"foldUnfold","itemMessage","id","_itemsMap","onItemEvent","MLFoldTree$setItemTemplate","_itemTemplate","MLFoldTree$renderTree","_renderTree","itemsIDs","uniqueId","COMPILED_TREE_TEMPLATE","itemIDs","itemTemplate","DEFAULT_COMPILED_ITEM_TEMPLATE","treeTemplate","_data","TREE_TEMPLATE","MLFoldTree","click dblclick","setItemTemplate","renderTree","../../util/unique_id",47,"MLGroup",48,"MLHyperlink",49,"MLImage$init","MLImage_set","MLImage_get","MLImage_del","IMAGE_CHANGE_MESSAGE","onModelChange","MLImage",".src",50,"MLInput$disable","MLInput$isDisabled","MLInput$setMaxLength","MLInput","setMaxLength",51,"MLInputList$init","MLInputList$setPlaceHolder","placeHolder","_input","MLInputList$setAsync","newHandler","asyncHandler","MLInputList$destroy","_button","button","onClick","label","INPUT_LIST_CHANGE_MESSAGE","MLInputList_get","MLInputList_set","MLInputList_del","MLInputList_splice","MLInputList","setAsync","setPlaceHolder",52,"MLList$init","MLList$destroy","MLList$removeItem","MLList$moveItem","from","to","splicedData","deferChangeMode","MLList","moveItem",53,"MLListItem$init","deleteBtn","MLListItem$removeItem","listOwner","MLListItem$moveItem","MLListItem$isDropAllowed","isComponentAllowed","isDropAllowed","onItemDrop","onDragOut","getComponentState","onDragHover","MLListItem_get","MLListItem_set","_sendChangeMessage","MLListItem_del","LISTITEM_CHANGE_MESSAGE","MLListItem","dragenter","dragover","dragleave",54,"MLRadioGroup$init","CONF","ELEMENT_NAME_PROPERTY","ELEMENT_NAME_PREFIX","_renderOptions","MLRadioGroup$setRenderOptions","MLRadioGroup_set","setResult","_radioList","checked","MLRadioGroup_get","MLRadioGroup_del","onGroupClick","RADIO_CHANGE_MESSAGE","radioOptions","elementName","radioEls","MLRadioGroup$destroy","MLRadioGroup","click","setRenderOptions",55,"MLSelect$setOptions","modelChangeListener","MLSelect$disable","selectOptions","MLSelect","**",56,"MLSuperCombo$init","_optionsData","_filteredOptionsData","_comboOptions","_comboBefore","before","_comboAfter","after","_comboAddItemDiv","addItemDiv","_comboAddPrompt","addPrompt","_comboAddBtn","addBtn","_optionTemplate","OPTIONS_TEMPLATE","_startIndex","_endIndex","MAX_RENDERED","_hidden","_elementHeight","DEFAULT_ELEMENT_HEIGHT","_total","_optionsHeight","_lastScrollPos","_currentValue","_selected","_isAddButtonShown","setupComboList","setupComboInput","setupComboBtn","changeSelected","MLSuperCombo$toggleOptions","MLSuperCombo$showOptions","COMBO_OPEN","MLSuperCombo$hideOptions","MLSuperCombo$toggleAddButton","preserveState","__showAddOnClick","MLSuperCombo$setAddItemPrompt","_addItemPrompt","MLSuperCombo$setOptions","setFilteredOptions","MLSuperCombo$initOptionsURL","_optionsURL","_formatOptionsURL","formatOptions","_getOptionsURL","queryString","noop","request","post","err","response","responseData","MLSuperCombo$setFilteredOptions","update","MLSuperCombo$update","wasHidden","arrToShow","hideOptions","beforeHeight","afterHeight","height","overflow","width","zIndex","onListClick","scroll","onListScroll","onDataChange","onInputClick","onEnterKey","btn","onAddBtn","MLSuperCombo_get","MLSuperCombo_set","MLSuperCombo_del","_updateOptionsAndAddButton","filteredData","_filterData","filter","option","selected","filteredArr","isExactMatch","showOptions","scrollTop","directionMap","keyCode","_changeSelected","scrollPos","selectedPos","offsetTop","relativePos","_getDataValueFromElement","thisItem","adjItem","onMouseOver","_mouseIsOver","onMouseLeave","_mouseOutTimer","clearInterval","setTimeout","_onMouseLeave","_setData","lastElementChild","lastChild","firstElementChild","lastElPosition","firstElPosition","distFromLastEl","distFromFirstEl","elsFromStart","Math","floor","elsToTheEnd","totalElementsBefore","BUFFER","Number","MLSuperCombo","mouseleave","mouseover","toggleOptions","initOptionsURL",57,"MLText",58,"MLTextarea$startAutoresize","_autoresize","_autoresizeOptions","_adjustAreaHeight","_manageSubscriptions","onOff","newHeight","scrollHeight","minHeight","maxHeight","MLTextarea$stopAutoresize","MLTextarea$isAutoresized","MLTextarea$disable","MLTextarea","startAutoresize","stopAutoresize","isAutoresized",59,"MLTime_get","timeStr","TIME_REGEX","hours","mins","time","Date","MLTime_set","TIME_TEMPLATE","getHours","getMinutes","MLTime_del","MLTime",60,"MLWrapper",61,"MLAlert$$createAlert","close","timeout","alert","MLAlert","_prepareOptions","alertCls","ALERT_CSS_CLASSES","_alert","visible","alertScope","closeBtn","_onCloseBtnClick","closeAlert","MLAlert$$openAlert","createAlert","openAlert","MLAlert$openAlert","_toggleAlert","MLAlert$closeAlert","addRemove","appendRemove","success","warning","danger","fixed","role","aria-hidden","../../../util/component_name","../../c_class","../../c_registry",62,"MLDialog$$createDialog","initialize","title","html","backdrop","keyboard","buttons","Any","cssClass","dialog","MLDialog","_dialog","dialogScope","_onBackdropClick","buttonSubscriber","_dialogButtonClick","_toggleDialog","_dispatchResult","closeDialog","_onKeyDown","openedDialog","DEFAULT_BUTTONS","CLOSE_OPTIONS","mapToObject","opt","MLDialog$$openDialog","createDialog","openDialog","dialogsInitialized","_initializeDialogs","backdropEl","MLDialog$openDialog","MLDialog$closeDialog","MLDialog$$getOpenedDialog","MLDialog$destroy","getOpenedDialog",63,"MLDropdown$start","onDocOut","relatedTarget","listeners","_dropdown","isIframe","hideMenu","toggleEl","querySelector","TOGGLE_CSS_CLASS","menuEl","MENU_CSS_CLASS","doc","clickHandler","toggleMenu","DOMListeners","menu","MLDropdown$destroy","removeAll","MLDropdown$showMenu","MLDropdown$hideMenu","MLDropdown$toggleMenu","MLDropdown","showMenu","../../../util/dom_listeners",64,"componentPrefix","domStorage","typeSuffix","prefixSeparator","root","messageKey","messageTimestamp","quotaExceeded","throwError","componentMetaTemplate","componentMetaRegex","jsonpTimeout","jsonpCallbackPrefix","optionsKey","defaults","websocket","rpc","responsePrefix","deprecationWarning",65,"loader","_loader","miloMail","_loadViewsInElement","views","loadElements","totalCount","loadedCount","loadView","./attributes/a_load","./config","./util/request",66,"domReady","mail","registry","./attributes","./binder","./classes","./command","./components/c_class","./components/c_facet","./loader","./registry","./services/window","./use_components","./use_facets","./util","./util/create_component_class",67,"./command/cmd_registry",68,"eventTypes","ClipboardEvent","Event","FocusEvent","KeyboardEvent","MouseEvent","TouchEvent","global","eTypes","eventConstructorName","eventConstructor","makeFunction","domEventsConstructors",69,"eventEmitter","DOMEmitterSource$destroy","sourceSubscriberMethod","capture","useCapturePattern","isCapturePhase","eventPhase","CAPTURING_PHASE","useCapturePostfix","DOMEmitterSource$postMessage","EventConstructor","domEvent","notCancelled","dispatchEvent","../components/c_class","./de_constrs",70,"MailMsgAPI","MailMessageSource","mailMsgSource","./mail_api","./mail_source",71,"windowMessageRegExp","windowMessagePrefix",72,"isReadyStateChange","readystatechange","_windowSubscriberMethod","isWindowMessage","../de_constrs",73,"windowService_isTop","top","__karma__","windowService","domEmitterSource","isTop","./dom_source",74,"./components/classes/View","./components/ui/Button","./components/ui/Combo","./components/ui/ComboList","./components/ui/Date","./components/ui/DropTarget","./components/ui/FoldTree","./components/ui/Group","./components/ui/Hyperlink","./components/ui/Image","./components/ui/Input","./components/ui/InputList","./components/ui/List","./components/ui/ListItem","./components/ui/RadioGroup","./components/ui/Select","./components/ui/SuperCombo","./components/ui/Text","./components/ui/Textarea","./components/ui/Time","./components/ui/Wrapper","./components/ui/bootstrap/Dropdown",75,"./components/c_facets/Container","./components/c_facets/Data","./components/c_facets/Dom","./components/c_facets/Drag","./components/c_facets/Drop","./components/c_facets/Events","./components/c_facets/Frame","./components/c_facets/Item","./components/c_facets/List","./components/c_facets/ModelFacet","./components/c_facets/Options","./components/c_facets/Template","./components/c_facets/Transfer",76,"prefix","./unique_id",77,"superClassName","methods","staticMethods","SuperClass","componentRegistry","../components/c_registry",78,"deprecate","fn","deprecated","warned","prop",79,"filterNodeListByType","Node","ELEMENT_NODE","nodeList","nodeType","containingElement","selectElementContents","ownerDocument","range","createRange","selectNodeContents","getNodeWindow","sel","removeAllRanges","addRange","selectElementText","fromNode","firstTextNode","toNode","lastTextNode","setSelection","setCaretPosition","pos","setStart","getSelectionDirection","_getDirection","focusOffset","startOffset","endOffset","docPosition","compareDocumentPosition","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","originalContentEditable","backward","setEnd","collapse","commonAncestorContainer","parentElement","isContentEditable","contentEditable","clearSelection","getElementOffset","includeBorder","yPos","xPos","offsetLeft","offsetParent","getBorder","topOffset","leftOffset","side","styles","sideValue","parseInt","getPropertyValue","normalize","TEXT_NODE","replaceChild","wrapInElement","wrapIntoEl","trimNodeRight","_trimNode","trimNodeLeft","stripHtml","str","walkTree","tw","containsEl","nodeIndex","findIndex","childIndex","toNormalize","isTreePathBefore","path1","path2","isBefore","htmlEntities","charCodeAt","whatToShow","defaultView","parentWindow","forEachNodesInRange","isNodeInsideRange","nodeRange","isInside","selectNode","compareBoundaryPoints","Range","START_TO_START","END_TO_END","rangeContainer","getComponentsFromRange","startContainer","deleteRangeWithComponents","deleteContents","areRangesEqual","range1","range2","addDebugPoint","dbEl",80,"DOMListeners$add","handler","DOMListeners$remove","listener","idx","isEqual","_removeListener","DOMListeners$removeAll","l",81,"domReadySubscribed","onDomReady","domReadyFuncs",82,"DragDrop$$componentDataType","dragDropConfig","DragDrop$isComponent","componentDataType","DragDrop$getComponentState","stateStr","DragDrop$setComponentState","requestedBy","DragDrop$setComponentMeta","_componentMeta","paramsStr","toQueryString","_encode","base32","encode","DragDrop$getComponentMeta","metaDataType","dType","decode","fromQueryString","metaData","DragDrop$getAllowedEffects","effectAllowed","DragDrop$setAllowedEffects","DragDrop$getDropEffect","dropEffect","DragDrop$setDropEffect","effect","DragDrop$isEffectAllowed","getAllowedEffects","isCopy","isMove","isLink","isAllowed","DragDrop$getData","DragDrop$setData","dataStr","DragDrop$clearData","clearData","onDragDropStarted","_currentDragDrop","_currentDragFacet","onDragDropCompleted","onCompleteDragDrop","dragDropService","getCurrentDragDrop","DragDrop_destroy","offAll","getDropEffect","isEffectAllowed","dragdropstarted","dragdropcompleted","completedragdrop",83,"error$createClass","errorClassName","ErrorClass","makeSubclass","error$toBeImplemented","AbstractClass","errorClassNames","createClass",84,"fragment_getState","wrapperClassName","_getRangeContainer","cloneContents","wrapper","_wrapFragmentInContainer","_transferStates","_renameChildren","wrapperState","fragment_getStateAsync","fromComp","toComp","fromScope","toChildComp","fromChildComp","expandRangeToSiblings","siblings","getRangeSiblings","createRangeFromSiblings","nodes","setStartBefore","setEndAfter","end","containerNode","startNode","endNode","endContainer","startSibling","_findContainingChild","endSibling","selNode","_createNodesAndPathsFunc","fromObj","toObj","createRangePaths","createRangeNodes","getStateAsync","createRangeFromNodes","./dom",85,"util_destroy","domListeners","fragment","storage","../components/ui/bootstrap/Alert","../components/ui/bootstrap/Dialog","./component_name","./deprecate","./dom_listeners","./domready","./dragdrop","./error","./fragment","./json_parse","./request","./selection","./storage","./websocket",86,87,"createPromiseOverride","functionName","promise","Promise","keepRequestObject","_request","opts","onReady","_onReady","req","xPromise","contentType","XMLHttpRequest","open","setRequestHeader","setRequestHeaders","headers","onreadystatechange","ontimeout","onabort","_createXPromise","send","_pendingRequests","resolvePromise","rejectPromise","resolve","reject","then","promiseThen","promiseCatch","status","responseText","spliceItem","errorReason","reason","request$useMessenger","request$get","request$post","request$json","jsonPromise","errData","request$jsonp","_onResult","uniqueCallback","cleanUp","clearTimeout","head","script","jsonpOptions","omitKeys","request$file","fileData","progress","upload","onprogress","file","binary","formData","FormData","request$destroy","whenRequestsCompleted","delay","json","jsonp",88,"TextSelection","TextSelection$init","rangeCount","getRangeAt","TextSelection$text","_text","toString","TextSelection$textNodes","_textNodes","_getTextNodes","TextSelection$clear","textNodes","selStart","selEnd","inEnd","_getElement","thisPropName","rangePropName","_getComponent","elMethodName","TextSelection$containedComponents","_containedComponents","TextSelection$eachContainedComponent","containedComponents","TextSelection$del","selectEndContainer","selPoint","_getPostDeleteSelectionPoint","_selectAfterDelete","selOffset","offset","trimRight","TextSelection$getRange","TextSelection$getState","createStateObject","TextSelection$$createStateObject","_getSelectionPointState","TextSelection$$createFromState","_selectionNodeFromState","pointState","TextSelection$$createFromRange","endRange","cloneRange","TextSelection$$getNormalizedRange","newRange","TextSelection$$getDirection","TextSelection$startElement","TextSelection$endElement","TextSelection$containingElement","TextSelection$startComponent","TextSelection$endComponent","TextSelection$containingComponent","clear","startElement","endElement","startComponent","endComponent","containingComponent","eachContainedComponent","getRange","getNormalizedRange","getDirection","createFromRange","../../components/c_class","../dom",89,"keyPrefix","sessionOnly","_storage","sessionStorage","localStorage","_typeSuffix","_keys","DOMStorage$set","setItem","DomStorageError","DOMStorage$get","deepForEach","getItem","DOMStorage$remove","DOMStorage$hasItem","pKey","_storageKey","DOMStorage$getItem","_getKeyDataType","valueStr","_parseData","DOMStorage$setItem","_setKeyDataType","_serializeData","cfg","_domStorage","DOMStorage$removeItem","_removeKeyDataType","DOMStorage$getAllKeys","storedKeys","keysInStorage","hasItem","DOMStorage$getAllItems","getAllKeys","DOMStorage$_storageKey","DOMStorage$_domStorageKey","storageKey","unPrefix","_dataTypeKey","_getValueType","valueType","valuesDataTypes","serializer","dataSerializers","parser","dataParsers","DOMStorage$$registerDataType","storeAsDataType","DOMStorage$createMessenger","storageMessageSource","StorageMessageSource","_messageSource","DOMStorage$destroy","_storedKeys","true","false","_domStorageKey","getAllItems","createMessenger","_sessionStorage","_localStorage","local","session","valStr","boolean","number","function","toFunction","RegExp","toRegExp","./model","./msg_src",90,"Model$$registerWithDOMStorage","Model_domStorageSerializer","Model_domStorageParser","registerWithDOMStorage",91,"StorageMessageSource$addSourceSubscriber","StorageMessageSource$removeSourceSubscriber","StorageMessageSource$postMessage","StorageMessageSource$trigger","storageArea",92,"uniqueCount","newTimestamp","now","uniqueID","timestamp",93,"wsMessenger","wsMsgSource","WSMessageSource","connect","WSMsgAPI","./msg_api",94,"SOCKET_MESSAGES",95,"WSMessageSource$connect","_options","host","location","port","_ws","onopen","ws","onmessage","onclose","onerror","WebSocket","_wsSubscriberMethod","WSMessageSource$handleEvent","WSMessageSource$trigger","onTimeout","toggleRpcSubscription","callbackCorrId","onResponse","interval","corrId",96,"Encoder","skip","bits","output","readByte","byte","alphabet","finish","Decoder","readChar","char","fromCharCode","val","lookup","encoder","decoder","alias","table","flush",97,98,"_createProxyMethods","proxyMethodName","mixinMethodName","boundMethod","Mixin_setInstanceKey","hostClass","instanceKey","mixin","instancePropertiesMap","instanceKeys","Mixin_addMethod","hostMethodName","wrappedMethod","_wrapMixinMethod","mixinInstance","_getMixinInstance","mixinProp","Mixin$$useWith","mixinMethods","../util/check","mol-proto",99,"MessengerRegexpAPI","./abstract/mixin","./messenger/m_api","./messenger/m_api_rx","./messenger/m_source","./messenger/msngr_source",100,"deepExtend","debug",101,"_initializeSubscribers","_messageSubscribers","_patternMessageSubscribers","Messenger$destroy","Messenger$on","_Messenger_onWithOptions","Messenger$once","dispatchTimes","Messenger$onceSync","sync","Messenger$onSync","Messenger$onAsync","_Messenger_on","_eachMessage","messagesSplitRegExp","subscribersHash","_chooseSubscribersHash","changed","subscriptionChanged","_registerSubscriber","pattern","onSubscriberAdded","noSubscribers","msgSubscribers","notYetRegistered","_indexOfSubscriber","subscr","Messenger$off","_Messenger_off","_removeSubscriber","subscriberIndex","_removeAllSubscribers","onSubscriberRemoved","offMessages","subscriberRemovedMap","Messenger$offAll","_offAllSubscribers","subscribers","_synchronous","_callSubscribers","_callPatternSubscribers","calledMsgSubscribers","patternSubscribers","_callSubscriber","syncSubscriber","synchro","__messages","getSubscribers","includePatternSubscribers","onceSync","onAsync","onMessage","offMessage","subscriptions","../abstract/mixin","./m_source",102,"MessengerAPI$destroy","addInternalMessage","internalMsgs","_internalMessages","removeInternalMessage","unexpectedNotificationWarning","messageIndex","getInternalMessages","sourceData","../util/logger",103,"_patternInternalMessages","_catchAllSubscribed","noPatternInternalMessages","internalMessages","internalMessagesHash","patternMessages","sourcePattern","./m_api",104,"messengerAPI","_prepareMessengerAPI","MessageSource$destroy","setMessenger","newSourceMessage","removedSourceMessage","api","shouldDispatch",105,"sourceMessenger","MessengerMessageSource$postMessage",106,"./messenger","./minder",107,"ds1","mode","ds2","connDescriptions","connectors","descr","Connector","_addConnector","cnct","___minder_id","_connectors","onConnectorMessage","connector","_receivedMessages","_isPropagating","_idleCheck","minder_isPropagating","minder_whenPropagationCompleted","executeCallback","minder_getConnectors","isOn","minder_destroyConnector","minder_getExpandedConnections","searchStr","getConnectors","connections","connection","leftSource","_getExpandedSource","rightSource","cnctn","_sourceMatchesString","ds","source","_model","_accessPath","unshift","matchStr","some","srcNode","_stringMatch","substr","minder_destroy","destroyDS","getExpandedConnections","isPropagating","whenPropagationCompleted","./model/connector","./util/logger",108,"flag","__inChangeTransaction","passTransactionFlag","fromFunc","toFunc","processChanges","notify","processTransaction","prepareTransaction","validateTransaction","changeFinished","sameSource","checkChange","checkSplice","checkMethod","parentPathChanged","pathsToChange","parentPath","_pathIsParentOf","todo","exitLoop","pathsToSplice","hadSplice","parentPathSpliced","every","processChange","modelPath","executeSplice","executeMethod","howMany","CHANGE_TYPE_TO_METHOD_MAP","deleted","./path_utils",109,"setupMode","_changesQueue1","_changesQueue2","pathTranslation","patternTranslation","getPatternTranslations","pathTranslation1","reverseTranslationRules","pathTranslation2","patternTranslation1","reversePatternTranslationRules","patternTranslation2","dataTranslation","dataTranslation1","dataTranslation2","dataValidation1","dataValidation2","turnOn","modeParseError","parsedMode","modePattern","depth1","depth2","Connector$changeMode","turnOff","Connector$deferChangeMode","rules","reverseRules","path2_value","path1_key","_throwInvalidTranslation","_getStaticPath","starIndex1","starIndex2","fromPattern","createRegexPath","fromStaticPath","toPattern","toStaticPath","pt","Connector$turnOn","linkDataSource","reverseLink","fromDS","toDS","changesQueue","onData","batch","translatePath","sourcePath","translatedPath","pTranslation","subscriptionPattern","translateData","translate","validateData","callValidator","validator","alreadyFailed","valid","passedCount","validators","propagateData","sendData","postChangeData","subscriptionSwitch","mergeTransactions","batches","targetPath","subscriptionPath","_subscriptionPath","_link1","_link2","Connector$turnOff","unlinkDataSource","linkName","Connector$destroy","changeMode","../messenger",110,"Model$path","__proto__","reactive","_prepareMessengers","Model$get","ModelPath","proxyMessenger","modelHostObject","Model$$useWith","modelMethodsToProxy","internalMessenger","internalMessengerSource","ModelMsgAPI","externalMessenger","_getHostObject","Model$destroy","_internalMessenger","synthesize","modelMethods","../messenger/msngr_source","./change_data","./m_msg_api","./m_path","./model_utils","./synthesize",111,"../messenger/m_api_rx",112,"ModelPath$path","_args","interpolateAccessPath","_prepareMessenger","freeze","reduce","accessPathStr","currNode","thisPathArgsCount","newPath","ModelPath$len","ModelPath$push","newLength","ModelPath$pop","ModelPath$unshift","ModelPath$shift","mPathAPI","ModelPathMsgAPI","modelMessageSource","mPathMessenger","_getDefinition","_createFromDefinition","definition","ModelPath$destroy","pop","./path_msg_api",113,114,"rootPath","internalChanges","truncateChangePath","fullPath","../messenger/m_api",115,"nodeParsePattern","pathParsePattern","unparsed","nodeStr","pathNodeTypes","patternPathParsePattern","regexStr","patternsStarted","regex","nodeRegex","interpolated","startIndex","methodsNames","wrappedMethods","origMethod","regexPath","propertyPathSyntax","arrayPathSyntax","interpolationSyntax","propertyInterpolateSyntax","arrayInterpolateSyntax","propertyStarSyntax","arrayStarSyntax","starSyntax","pathParseSyntax","patternPathParseSyntax",".","[","*",".*","[*]",116,"_synthesizePathMethods","synthesizers","synthszr","_synthesize","synthesizer","addChangeMessage","messagesHash","addTreeChangesMessages","oldIsTree","valueIsTree","newIsTree","addMessages","valueProp","_addMessages","addMessage","existingMsg","cloneTree","valueIsNormalObject","protectValue","addBatchIdsToMessage","batchId","msgId","__batch_id","__msg_id","methodCode","eval","ModelError","fs","templates","include_defines","include_create_tree","include_traverse_tree","dotDef","modelAccessPrefix","modelPostMessageCode","modelPostBatchCode","modelDotDef","dotSettings","templateSettings","strip","tmpl","modelSynthesizers","synthesizePathMethods","memoize","../../util/logger","../change_data","../model_utils","../path_utils","dot",117,"choices","Where","condition","Superclass","matchSuperclassToo","matchSuperclass","checkSubtree","typeofChecks","_jsKeywords","valueElement","_prependPath","unknownKeysAllowed","keyPattern","emptyHash","requiredPatterns","optionalPatterns","subPattern","subValue","base","TypeError",118,"./check","./logger",119,"Logger","level","./logger_class",120,"maxLevelLength","colored","color","levels","colors","DEFAULT_OPTIONS","throwLevel","enabled","logPrefix","log","console","logPrefixColor",121,"resolveDefs","c","block","def","define","code","assign","substring","defineParams","param","v","arg","use","useParams","d","rw","__exp","unescape","_globals","version","evaluate","conditional","iterate","varname","selfcontained","doNotSkipEncoded","encodeHTMLSource","encodeHTMLRules","&","<",">","\"","'","/","matchHTML","amd","startend","startencode","needhtmlencode","indv","cse","sid","elsecase","vname","iname","_encodeHTML",122,"InstallDots","__path","__destination","destination","__global","__rendermodule","rendermodule","__settings","__includes","addexports","ret","readdata","readFileSync","process","compileAll","compileToFile","modulename","lastIndexOf","defs","settings","compileoptions","defaultcompiled","compiled","writeFileSync","compilePath","k","defFolder","sources","readdirSync","./doT",123,"Proto","wrapped","unwrapProto","utils","prototypeMethods","objectMethods","arrayMethods","functionMethods","stringMethods","numberMethods","utilMethods","__","_constants","protoFuncs","makeProtoFunction","protoInstanceMethods","makeProtoInstanceMethod","underscore","./proto_array","./proto_function","./proto_number","./proto_object","./proto_prototype","./proto_string","./proto_util","./utils",124,"arrayToAppend","prependArray","arrayToPrepend","values","valuesIsArray","unique","itemIndex","filtered","it","itemIndexOf","_deepForEach","nativeArrayMethodsNames","nativeArrayMethods","makeFindMethod",125,"arg1","arg2","funcBody","partialRight","hashFunc","limit","cache","keysList","wait","_delay","deferTicks","ticks","deferFunc","delayMethod","funcOrMethodName","_delayMethod","delayed","passArgs","deferred","debounce","immediate","later","last","callNow","previous","leading","remaining","trailing","memo","ran","waitFor","maxTimeout","timedOutFunc","checkInterval","testCondition","setInterval","not",126,"isNumeric","isNaN","parseFloat","isFinite",127,"onlyEnumerable","descriptors","getOwnPropertyDescriptor","clonedObject","propertyName","decriptorFlags","_getDescriptor","descriptor","constants","ENUMERABLE","configurable","CONFIGURABLE","writable","WRITABLE","propertyValues","_extendTree","selfNode","objNode","objTraversed","loop","allKeys","getOwnPropertyNames","keyOf","searchElement","allKeysOf","mapProperty","reduceKeys","initialValue","filterProperty","testProperty","_passed","everyKey","_didNotPass","pickKeys","ArrayProto","multiline","ignoreCase","isNot","findValue","findKey",128,"propDescriptors","applyConstructor","thisClass","subclass","constructorCode",129,"toUpperCase","rx","regexpStringPattern","getTime","qs","encodeURIComponent","pairs","results","decodeURIComponent","pair","splitPair","hashCode","hash",130,"times","tap","identity","compareProperty","b",131,"eachMethod","findWhat","argIndex","testItem","caughtError","_error"],"mappings":"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","sourceRoot":"/"} +======= +{"version":3,"file":"milo.min.js","sources":["milo.bundle.js"],"names":["e","t","n","r","s","o","u","a","require","i","Error","f","exports","call","length",1,"module","Facet","owner","config","this","name","_","firstLowerCase","constructor","init","apply","arguments","proto","extendProto","milo-core",2,"FacetedObject","instantiateFacet","FacetClass","facetName","fctConfig","facetsConfig","facets","facetsDescriptors","enumerable","value","facetsClasses","eachKey","Object","defineProperties","defineProperty","FacetedObject$addFacet","facetConfig","throwOnErrors","check","Function","Match","Optional","String","protoFacets","prototype","message","logger","error","newFacet","ENUM","FacetedObject$$hasFacet","FacetedObject$$getFacetConfig","hasFacet","FacetedObject$$createFacetedClass","addInheritedFacets","superClass","facetsInfo","facetsInfoName","inheritedFacetsInfo","clone","extend","ObjectHash","Subclass","fctName","hasOwnProperty","FacetedClass","createSubclass","miloCore","util","createFacetedClass","getFacetConfig","addFacet","./facet",3,"ClassRegistry","FoundationClass","setClass","__registeredClasses","add","aClass","IdentifierString","get","remove","nameOrClass","OneOf","clean",4,"attrName","attrs","bind","parse","node","bindTo","match","ATTRIBUTE_REGEXP","compClass","compFacets","split","FACETS_SPLIT_REGEXP","undefined","compName","validate","render","milo","componentName","ATTRIBUTE_TEMPLATE","replace","join","BindAttribute$$setInfo","el","componentClass","componentFacets","attr","BindAttribute","decorate","Attribute","setInfo","../config","./a_class",5,"attributes","Attribute$$remove","deep","removeAttribute","selector","children","querySelectorAll","forEach","childEl","Attribute$remove","Attribute$destroy","Attribute$get","getAttribute","Attribute$set","setAttribute","Attribute$decorate","set","toBeImplemented","destroy",6,"load","loadUrl","LoadAttribute",7,"./a_bind","./a_load",8,"binder","scopeEl","rootScope","bindRootElement","createBinderScope","scope","info","ComponentInfo","Component","create","twoPass","scanScope","scan","hostObject","Scope","_rootEl","addMethod","_each","compInfo","aComponent","container","scopeObjectFactory","createScopeForElement","postChildrenBoundMessage","elComp","getComponent","postMessageSync","scopedObject","isContainer","childNodes","innerScope","_hostObject","createScopeForChildren","containerEl","utilDom","document","body","componentsRegistry","./attributes/a_bind","./components/c_facets/cf_registry","./components/c_info","./components/c_registry","./components/scope","./services/mail","./util/dom",9,"coreClasses","classes","Mixin","MessageSource","MessengerMessageSource","MessengerAPI","DOMEventsSource","Transaction","TransactionHistory","./abstract/facet","./abstract/faceted_object","./abstract/registry","./command/transaction","./command/transaction_history","./components/msg_src/dom_events",10,"ActionsHistory","maxLength","_maxLength","Infinity","actions","position","ActionsHistory$store","command","_truncateToCurrentPosition","push","act","shift","ActionsHistory$deleteLast","ActionsHistory$undo","cb","undo","ActionsHistory$redo","redo","ActionsHistory$undoAll","ActionsHistory$redoAll","ActionsHistory$undoAllAsync","deferMethod","defer","ActionsHistory$redoAllAsync","ActionsHistory$each","funcOrMethod","thisArg","func","ActionsHistory$eachReverse","reverse","each","ActionsHistory$getLastAction","ActionsHistory$getDescription","map","getDescription","store","deleteLast","undoAll","redoAll","undoAllAsync","redoAllAsync","eachReverse","getLastAction",11,"Command","commandsRegistry","../abstract/registry","./index",12,"Command$init","args","slice","Command$execute","result","Command$setUndo","undoCommand","UNDO_COMMAND","warn","Command$getUndo","Command$undo","undoCmd","getUndo","execute","Command$setArguments","toArray","Command$getArguments","Command$changeArguments","Command$addArguments","appendArray","Command$$create","newApply","Command$$createWithUndo","Command$destroy","Command$setComment","comment","Command$getDescription","setUndo","setArguments","addArguments","getArguments","changeArguments","setComment","createWithUndo",13,"commands","Transaction$execute","Transaction$undo","Transaction$redo","Transaction$destroy","Transaction$storeCommand","Transaction$merge","transaction","cmd","Transaction$setComment","Transaction$getDescription","storeCommand","merge","./actions_history",14,"transactions","currentBatch","currentTransaction","SCHEDULED","TransactionHistory$storeCommand","appendTransaction","_postTransactionMessage","_storeTransaction","TransactionHistory$deleteLastTransaction","_addBatchToTransaction","_storeCurrentTransaction","TransactionHistory$endTransaction","TransactionHistory$storeTransaction","endTransaction","msg","_messenger","postMessage","TransactionHistory$undo","TransactionHistory$redo","TransactionHistory$inTransaction","TransactionHistory$getDescription","TransactionHistory$useMessenger","Messenger","defaultMethods","TransactionHistory$destroy","storeTransaction","deleteLastTransaction","inTransaction","useMessenger","./transaction",15,"Component$$createComponentClass","Array","isArray","configMap","fct","keys","fctClassName","firstUpperCase","facetsRegistry","ComponentClass","_registerWithDomStorage","className","DOMStorage","registerDataType","Component_domStorageSerializer","Component_domStorageParser","component","state","getState","JSON","stringify","compStr","jsonParse","createFromState","Component$$create","extraFacetsClasses","Component$$copy","deepCopy","Boolean","newEl","dom","copy","cloneNode","createOnElement","extraFacets","_getState","setState","Component$$createOnElement","innerHTML","_createComponentElement","_findOrCreateComponentRootScope","_addAttributeAndBindComponent","broadcast","Dom","domFacetConfig","templateFacetConfig","template","elConfig","domConfig","content","createElement","parent","getContainingComponent","miloBinder","Component$$createFromState","newUniqueName","ObjectIncluding","facetsStates","outerHTML","wrapEl","_createComponentWrapElement","_any","_add","domUtils","compEl","miloComponentName","Component$$createFromDataTransfer","dataTransfer","dataType","find","types","type","COMPONENT_DATA_TYPE_REGEX","test","getData","Component$init","element","componentInfo","componentRef","messenger","MESSENGER_PROPERTY","allFacets","start","Component$start","Component$createElement","Component$hasFacet","facetNameOrClass","facet","ComponentFacet","Component$addFacet","facetClassName","Component$allFacets","method","mapKeys","Component$rename","renameInScope","rename","Component$remove","preserveScopeProperty","quiet","_remove","Component$insertInto","parentEl","referenceEl","insertBefore","setScopeParentFromDOM","Component$getState","rootComponent","Component$getTransferState","options","transfer","Component$_getState","deepState","filterKeys","fctState","Component$setState","Component$getScopeParent","conditionOrFacet","_callGetScopeParent","_getScopeParent","_getScopeParentFunc","conditionFunc","componentUtils","_makeComponentConditionFunc","Component$getScopeParentWithClass","comp","Component$getTopScopeParent","_getTopScopeParent","topParent","Component$getTopScopeParentWithClass","Component$setScopeParentFromDOM","foundParent","parentNode","Component$walkScopeTree","callback","walkScopeTree","Component$treePathOf","treePathOf","Component$getComponentAtTreePath","treePath","nearest","getNodeAtTreePath","Component$insertAtTreePath","wasInserted","insertAtTreePath","Component$broadcast","data","synchronously","postMethod","Component$destroy","_destroyed","detachComponent","removeElement","Component$isDestroyed","createComponentClass","isComponent","createFromDataTransfer","insertInto","getTransferState","getScopeParent","getTopScopeParent","getScopeParentWithClass","getTopScopeParentWithClass","getComponentAtTreePath","isDestroyed","useWith","../abstract/faceted_object","../attributes/a_bind","../binder","../util/component_name","../util/dom","../util/storage","./c_facets/cf_registry","./c_utils","./scope",16,"ComponentFacet$init","_createMessenger","ComponentFacet$start","messages","onConfigMessages","ComponentFacet$onConfigMessages","messageSubscribers","notYetRegisteredMap","subscriber","subscriberType","on","contextType","context","ComponentFacet$check","reqFacet","ComponentFacet$destroy","domParent","parentComponent","scopeParent","_postParent","getParentMethod","messageType","messageData","parentFacet","_setMessageSource","messageSource","getMessageSource","dispatchSourceMessage","dispatchMessage","_createMessageSource","MessageSourceClass","_createMessageSourceWithAPI","messengerAPIOrClass","requiresFacet","facetRequire","indexOf","postDomParent","partial","postScopeParent","../abstract/facet",17,"Container$binder","Container$start","Container$path","path","throwInvalidPath","len","allowedNamePattern","Container$getState","Container$setState","compData","Container$destroy","_detachElement","Container$unwrap","renameChildren","unwrapElement","child","Container$append","appendChild","Container$insertBefore","sibling","Container$remove","removeChild","Container","unwrap","append","../../binder","../../util/dom","../c_facet","../scope","./cf_registry",18,"Data$start","pathUtils","wrapMessengerMethods","elData","getElementDataAccess","_dataChangesQueue","_prepareMessageSource","_path","_value","onSync","onOwnDataChange","onDataChangesFinished","onChildData","changeDataHandler","dataAPI","DataMsgAPI","dataEventsSource","proxyDataSourceMethods","_createProxyMethod","msgType","_bubbleUpDataChange","_queueDataChange","getTransactionFlag","Data$_bubbleUpDataChange","msgData","parentData","parentMsg","Data$_queueDataChange","change","_postDataChanges","Data$_postDataChanges","queue","changes","Data$set","executeHook","noHook","setTransactionFlag","_set","oldValue","newValue","Data$_set","setChildData","valueSet","childValue","key","pathSyntax","childPath","childDataFacet","listFacet","list","listLength","count","newItemsCount","_addItems","_updateDataPaths","index","listCount","removeCount","_removeItem","_setScalarValue","Data$del","postTransactionFinished","_del","Data$_del","Data$_setScalarValue","Data$get","deepGet","_get","Data$_get","scopeData","listItem","scopeItem","contains","_getScalarValue","Data$_getScalarValue","Data$splice","_splice","spliceIndex","removed","addedCount","methodName","hook","Data$_splice","spliceHowMany","modelUtils","normalizeSpliceIndex","item","itemData","added","argsLen","addItems","j","Data$len","_len","Data$_len","Data$path","accessPath","createItem","parsedPath","parseAccessPath","currentComponent","pathNode","nodeKey","getPathNodeKey","syntax","itemComponent","_addItem","property","currentDataFacet","Data$getPath","Data$getKey","Data$getState","Data$setState","Model","_utils","model","Data","del","splice","getPath","getKey","Path","trigger","../msg_api/data","../msg_api/de_data","../msg_src/dom_events",19,"Dom$$createElement","tagName","_applyConfigToElement","doT","cssClasses","cls","configAttributes","attrValue","_attachCssClasses","currentStyle","window","getComputedStyle","_visible","display","show","toggle","hide","doShow","style","_manageCssClasses","enforce","callMethod","cssCls","doToggle","classList","detach","setStyle","setStyles","properties","isDeep","prepend","thisEl","firstChild","appendChildren","prependChildren","insertAfter","nextSibling","appendToScopeParent","Dom$children","direction","iterator","findDirections","treeWalker","createTreeWalker","NodeFilter","SHOW_ELEMENT","currentNode","nextNode","found","hasTextBeforeSelection","selection","getSelection","isCollapsed","text","focusNode","textContent","startPos","charAt","anchorOffset","SHOW_TEXT","anchorNode","prevNode","previousNode","isText","nodeValue","trim","hasTextAfterSelection","addCssClasses","removeCssClasses","toggleCssClasses","up","down","../../attributes/a_bind","../../config",20,"Drag$init","_dragData","dataTypeInfo","_dataTypeInfo","Drag$setHandle","handleEl","_dragHandle","Drag$start","_addDragAttribute","_createDragImage","onMessages","mousedown","onMouseDown","mouseenter mouseleave mousemove","onMouseMovement","dragstart","onDragStart","drag","onDragging","dragend","onDragEnd","getstatestarted","_removeDragAttribute","getstatecompleted","dragImage","_dragElement","Image","src","url","eventType","event","__mouseDownTarget","target","targetInDragHandle","empty","stopPropagation","shouldBeDraggable","setMeta","params","getMetaData","_dragMetaDataType","dt","setComponentMeta","_dragMetaData","meta","setAdditionalDataTypes","dataTypes","_dataTypesData","getDataFunc","setData","off","preventDefault","setDragImage","x","y","DragDrop","setComponentState","_setAllowedEffects","service","dragDrop","dragFacet","_dragIsDisabled","effects","allowedEffects","setAllowedEffects","Drag","setHandle","../../util/dragdrop","../c_class",21,"Drop$init","DropMsgAPI","Drop$start","dragenter dragover","drop","onDrop","dragenter dragover dragleave drop dragin dragout","postToService","_handleDropDependency","setDropEffect","dropFacet","_handleDropDependencyNothrottle","originalDropComponent","allow","parentAllowed","checkParent","_isDropAllowed","allowComps","components","getComponentMeta","Drop","throttle","../msg_api/drop",22,"Events$init","domEventsSource","MSG_SOURCE_KEY","Events",23,"Frame$init","FrameMessageSource","Frame$start","postDomReady","self","Frame$destroy","Frame$getWindow","contentWindow","Frame$isReady","readyState","getWindow","Frame$isMiloReady","frameMilo","isReady","milo_version","Frame$milo","whenMiloReady","win","_makeWhenReadyFunc","isReadyFunc","callFunc","Frame","Frame$whenReady","Frame$whenMiloReady","whenReady","isMiloReady","../../services/de_constrs","../msg_src/frame",24,"ItemFacet$getState","getIndex","ItemFacet$setState","setIndex","ItemFacet$getIndex","ItemFacet$setIndex","ItemFacet$removeItem","removeItem","ItemFacet$extractItem","extractItem","ItemFacet","../../services/mail",25,"List$init","_listItems","_listItemsHash","WRIT","List$start","onChildrenBound","items","itemsHash","foundItem","itemSample","LIST_SAMPLE_CSS_CLASS","miloConfig","_createCacheTemplate","List$_createCacheTemplate","itemElCopy","itemsTemplateStr","itemsTemplate","compile","List$item","List$count","List$_setItem","List$contains","List$addItem","List$_addItem","prevComponent","_itemPreviousComponent","_setItem","_updateItemsIndexes","fromIndex","toIndex","List$addItems","itemsData","concat","repeat","spliceArgs","dataFacet","List$_addItems","Integer","itemsHTML","frag","createDocumentFragment","newComponents","List$removeItem","List$extractItem","itemComp","List$_removeItem","doDestroyItem","List$replaceItem","newItem","oldItem","List$_updateDataPaths","List$each","List$destroy","List","addItem","replaceItem","../../util/component_name",26,"ModelFacet$init","m","ModelFacet$getState","modelValue","deepClone","ModelFacet$setState","ModelFacet$_createMessenger","ModelFacet$destroy","ModelFacet",27,"Options$init","proxyMethods","Options$_createMessenger","Options$destroy","Options",28,"Template$init","interpolate","compileOptions","Template$start","autoRender","autoBinder","Template$getCompiled","_template","Template$set","templateStr","_templateStr","_compile","Template$render","Template$binder","Template","getCompiled",29,"Transfer$init","_activeState","_defaultKey","_state","Transfer$getState","Transfer$setState","setActiveState","Transfer$setActiveState","Transfer$setStateWithKey","isDefaultKey","Transfer$getStateWithKey","Transfer$getComponentMeta","Transfer","setStateWithKey","getStateWithKey",30,"../../abstract/registry",31,"getComponentClass","getComponentExtraFacets","hasContainerFacet","ComponentInfo$destroy","ComponentInfo$rename","reportBinderError","classHasFacetThatRequiresContainer","someKey","facetRequiresContainer","./c_registry",32,"./c_class",33,"returnCurrent","_getContainingComponent",34,"View","../c_registry",35,"DataMsgAPI$init","DataMsgAPI$value","componentGetter","translateToSourceMessage","componentEvent","filterSourceMessage","sourceMessage","createInternalData","internalData","./de_data",36,"inputDataProperty","inputType","inputElementTypes","byDefault","inputChangeEvent","toLowerCase","domElementsDataAccess","div","span","p","input","textarea","select","img","caption","thead","tbody","tfoot","tagInfo","propFunc","checkbox","radio",37,"dropEventsMap","resetFilterVars","_currentTarget","_inside","ok","dragin","dragout",38,"DOMEventsSource$destroy","emitter","DOMEmitterSource","../../services/dom_source",39,"frameWindow","addSourceSubscriber","addEventListener","removeSourceSubscriber","removeEventListener","handleEvent",40,"rootEl","Scope$_add","object","checkName","__add","Scope$_safeAdd","shouldRename","Scope$_copy","aScope","Scope$_move","otherScope","Scope$_merge","Scope$_each","Scope$_filter","Scope$_length","Scope$_any","Scope$_remove","Scope$_clean","Scope$_detachElement","Scope$_has","Scope$$rename","obj","_safeAdd","_copy","_move","_merge","_length","_clean","_has","_filter",41,"MLButton$disable","disable","disabled","MLButton$isDisabled","MLButton","events","isDisabled",42,"MLCombo$init","_comboInput","_comboList","datalist","DATALIST_TEMPLATE","dispatchChangeMessage","MLCombo_get","MLCombo_set","changeComboData","MLCombo_del","COMBO_CHANGE_MESSAGE","onOptionsChange","comboOptions","MLCombo","***",43,"MLComboList$init","_dataValidation","once","MLComboList$setDataValidation","dataValidation","MLComboList$setOptions","arr","_combo","setOptions","MLComboList$clearComboInput","clearComboInput","MLComboList$toggleAddButton","toggleAddButton","MLComboList$setAddItemPrompt","prompt","setAddItemPrompt","MLComboList$destroy","_connector","minder","destroyConnector","componentSetup","combo","_list","onComboChange","onAddItem","onItemsChange","COMBO_LIST_CHANGE_MESSAGE","MLComboList_get","MLComboList_set","MLComboList_del","MLComboList","setDataValidation",44,"MLDate$getMin","date","min","MLDate$setMin","toDate","toISO8601Format","MLDate$getMax","max","MLDate$setMax","MLDate_get","MLDate_set","dispatchInputMessage","MLDate_del","pad","dateArr","getFullYear","getMonth","getDate","dateStr","MLDate","getMin","setMin","getMax","setMax",45,"MLDropTarget",46,"foldUnfold","itemMessage","id","_itemsMap","onItemEvent","MLFoldTree$setItemTemplate","_itemTemplate","MLFoldTree$renderTree","_renderTree","itemsIDs","uniqueId","COMPILED_TREE_TEMPLATE","itemIDs","itemTemplate","DEFAULT_COMPILED_ITEM_TEMPLATE","treeTemplate","_data","TREE_TEMPLATE","MLFoldTree","click dblclick","setItemTemplate","renderTree","../../util/unique_id",47,"MLGroup",48,"MLHyperlink",49,"MLImage$init","MLImage_set","MLImage_get","MLImage_del","IMAGE_CHANGE_MESSAGE","onModelChange","MLImage",".src",50,"MLInput$disable","MLInput$isDisabled","MLInput$setMaxLength","MLInput","setMaxLength",51,"MLInputList$init","MLInputList$setPlaceHolder","placeHolder","_input","MLInputList$setAsync","newHandler","asyncHandler","MLInputList$destroy","_button","button","onClick","label","INPUT_LIST_CHANGE_MESSAGE","MLInputList_get","MLInputList_set","MLInputList_del","MLInputList_splice","MLInputList","setAsync","setPlaceHolder",52,"MLList$init","MLList$destroy","MLList$removeItem","MLList$moveItem","from","to","splicedData","deferChangeMode","MLList","moveItem",53,"MLListItem$init","deleteBtn","MLListItem$removeItem","listOwner","MLListItem$moveItem","MLListItem$isDropAllowed","isComponentAllowed","isDropAllowed","onItemDrop","onDragOut","getComponentState","onDragHover","MLListItem_get","MLListItem_set","_sendChangeMessage","MLListItem_del","LISTITEM_CHANGE_MESSAGE","MLListItem","dragenter","dragover","dragleave",54,"MLRadioGroup$init","CONF","ELEMENT_NAME_PROPERTY","ELEMENT_NAME_PREFIX","_renderOptions","MLRadioGroup$setRenderOptions","MLRadioGroup_set","setResult","_radioList","checked","MLRadioGroup_get","MLRadioGroup_del","onGroupClick","RADIO_CHANGE_MESSAGE","radioOptions","elementName","radioEls","MLRadioGroup$destroy","MLRadioGroup","click","setRenderOptions",55,"MLSelect$setOptions","modelChangeListener","MLSelect$disable","selectOptions","MLSelect","**",56,"MLSuperCombo$init","_optionsData","_filteredOptionsData","_comboOptions","_comboBefore","before","_comboAfter","after","_comboAddItemDiv","addItemDiv","_comboAddPrompt","addPrompt","_comboAddBtn","addBtn","_optionTemplate","OPTIONS_TEMPLATE","_startIndex","_endIndex","MAX_RENDERED","_hidden","_elementHeight","DEFAULT_ELEMENT_HEIGHT","_total","_optionsHeight","_lastScrollPos","_currentValue","_selected","_isAddButtonShown","setupComboList","setupComboInput","setupComboBtn","changeSelected","MLSuperCombo$toggleOptions","MLSuperCombo$showOptions","COMBO_OPEN","MLSuperCombo$hideOptions","MLSuperCombo$toggleAddButton","preserveState","__showAddOnClick","MLSuperCombo$setAddItemPrompt","_addItemPrompt","MLSuperCombo$setOptions","setFilteredOptions","MLSuperCombo$initOptionsURL","_optionsURL","_formatOptionsURL","formatOptions","_getOptionsURL","queryString","noop","request","post","err","response","responseData","MLSuperCombo$setFilteredOptions","update","MLSuperCombo$update","wasHidden","arrToShow","hideOptions","beforeHeight","afterHeight","height","overflow","width","zIndex","onListClick","scroll","onListScroll","onDataChange","onInputClick","onEnterKey","btn","onAddBtn","MLSuperCombo_get","MLSuperCombo_set","MLSuperCombo_del","_updateOptionsAndAddButton","filteredData","_filterData","filter","option","selected","filteredArr","isExactMatch","showOptions","scrollTop","directionMap","keyCode","_changeSelected","scrollPos","selectedPos","offsetTop","relativePos","_getDataValueFromElement","thisItem","adjItem","onMouseOver","_mouseIsOver","onMouseLeave","_mouseOutTimer","clearInterval","setTimeout","_onMouseLeave","_setData","lastElementChild","lastChild","firstElementChild","lastElPosition","firstElPosition","distFromLastEl","distFromFirstEl","elsFromStart","Math","floor","elsToTheEnd","totalElementsBefore","BUFFER","Number","MLSuperCombo","mouseleave","mouseover","toggleOptions","initOptionsURL",57,"MLText",58,"MLTextarea$startAutoresize","_autoresize","_autoresizeOptions","_adjustAreaHeight","_manageSubscriptions","onOff","newHeight","scrollHeight","minHeight","maxHeight","MLTextarea$stopAutoresize","MLTextarea$isAutoresized","MLTextarea$disable","MLTextarea","startAutoresize","stopAutoresize","isAutoresized",59,"MLTime_get","timeStr","TIME_REGEX","hours","mins","time","Date","MLTime_set","TIME_TEMPLATE","getHours","getMinutes","MLTime_del","MLTime",60,"MLWrapper",61,"MLAlert$$createAlert","close","timeout","alert","MLAlert","_prepareOptions","alertCls","ALERT_CSS_CLASSES","_alert","visible","alertScope","closeBtn","_onCloseBtnClick","closeAlert","MLAlert$$openAlert","createAlert","openAlert","MLAlert$openAlert","_toggleAlert","MLAlert$closeAlert","addRemove","appendRemove","success","warning","danger","fixed","role","aria-hidden","../../../util/component_name","../../c_class","../../c_registry",62,"MLDialog$$createDialog","initialize","title","html","backdrop","keyboard","buttons","Any","cssClass","dialog","MLDialog","_dialog","dialogScope","_onBackdropClick","buttonSubscriber","_dialogButtonClick","_toggleDialog","_dispatchResult","closeDialog","_onKeyDown","openedDialog","DEFAULT_BUTTONS","CLOSE_OPTIONS","mapToObject","opt","MLDialog$$openDialog","createDialog","openDialog","dialogsInitialized","_initializeDialogs","backdropEl","MLDialog$openDialog","MLDialog$closeDialog","MLDialog$$getOpenedDialog","MLDialog$destroy","getOpenedDialog",63,"MLDropdown$start","onDocOut","relatedTarget","listeners","_dropdown","isIframe","hideMenu","toggleEl","querySelector","TOGGLE_CSS_CLASS","menuEl","MENU_CSS_CLASS","doc","clickHandler","toggleMenu","DOMListeners","menu","MLDropdown$destroy","removeAll","MLDropdown$showMenu","MLDropdown$hideMenu","MLDropdown$toggleMenu","MLDropdown","showMenu","../../../util/dom_listeners",64,"componentPrefix","domStorage","typeSuffix","prefixSeparator","root","messageKey","messageTimestamp","quotaExceeded","throwError","componentMetaTemplate","componentMetaRegex","jsonpTimeout","jsonpCallbackPrefix","optionsKey","defaults","websocket","rpc","responsePrefix","deprecationWarning",65,"loader","_loader","miloMail","_loadViewsInElement","views","loadElements","totalCount","loadedCount","loadView","./attributes/a_load","./config","./util/request",66,"domReady","mail","registry","./attributes","./binder","./classes","./command","./components/c_class","./components/c_facet","./loader","./registry","./services/window","./use_components","./use_facets","./util","./util/create_component_class",67,"./command/cmd_registry",68,"eventTypes","ClipboardEvent","Event","FocusEvent","KeyboardEvent","MouseEvent","TouchEvent","global","eTypes","eventConstructorName","eventConstructor","makeFunction","domEventsConstructors",69,"eventEmitter","DOMEmitterSource$destroy","sourceSubscriberMethod","capture","useCapturePattern","isCapturePhase","eventPhase","CAPTURING_PHASE","useCapturePostfix","DOMEmitterSource$postMessage","EventConstructor","domEvent","notCancelled","dispatchEvent","../components/c_class","./de_constrs",70,"MailMsgAPI","MailMessageSource","mailMsgSource","./mail_api","./mail_source",71,"windowMessageRegExp","windowMessagePrefix",72,"isReadyStateChange","readystatechange","_windowSubscriberMethod","isWindowMessage","../de_constrs",73,"windowService_isTop","top","__karma__","windowService","domEmitterSource","isTop","./dom_source",74,"./components/classes/View","./components/ui/Button","./components/ui/Combo","./components/ui/ComboList","./components/ui/Date","./components/ui/DropTarget","./components/ui/FoldTree","./components/ui/Group","./components/ui/Hyperlink","./components/ui/Image","./components/ui/Input","./components/ui/InputList","./components/ui/List","./components/ui/ListItem","./components/ui/RadioGroup","./components/ui/Select","./components/ui/SuperCombo","./components/ui/Text","./components/ui/Textarea","./components/ui/Time","./components/ui/Wrapper","./components/ui/bootstrap/Dropdown",75,"./components/c_facets/Container","./components/c_facets/Data","./components/c_facets/Dom","./components/c_facets/Drag","./components/c_facets/Drop","./components/c_facets/Events","./components/c_facets/Frame","./components/c_facets/Item","./components/c_facets/List","./components/c_facets/ModelFacet","./components/c_facets/Options","./components/c_facets/Template","./components/c_facets/Transfer",76,"prefix","./unique_id",77,"superClassName","methods","staticMethods","SuperClass","componentRegistry","../components/c_registry",78,"deprecate","fn","deprecated","warned","prop",79,"filterNodeListByType","Node","ELEMENT_NODE","nodeList","nodeType","containingElement","selectElementContents","ownerDocument","range","createRange","selectNodeContents","getNodeWindow","sel","removeAllRanges","addRange","selectElementText","fromNode","firstTextNode","toNode","lastTextNode","setSelection","setCaretPosition","pos","setStart","getSelectionDirection","_getDirection","focusOffset","startOffset","endOffset","docPosition","compareDocumentPosition","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_PRECEDING","originalContentEditable","backward","setEnd","collapse","commonAncestorContainer","parentElement","isContentEditable","contentEditable","clearSelection","getElementOffset","includeBorder","yPos","xPos","offsetLeft","offsetParent","getBorder","topOffset","leftOffset","side","styles","sideValue","parseInt","getPropertyValue","normalize","TEXT_NODE","replaceChild","wrapInElement","wrapIntoEl","trimNodeRight","_trimNode","trimNodeLeft","stripHtml","str","walkTree","tw","containsEl","nodeIndex","findIndex","childIndex","toNormalize","isTreePathBefore","path1","path2","isBefore","htmlEntities","charCodeAt","whatToShow","defaultView","parentWindow","forEachNodesInRange","isNodeInsideRange","nodeRange","isInside","selectNode","compareBoundaryPoints","Range","START_TO_START","END_TO_END","rangeContainer","getComponentsFromRange","startContainer","deleteRangeWithComponents","deleteContents","areRangesEqual","range1","range2","addDebugPoint","dbEl",80,"DOMListeners$add","handler","DOMListeners$remove","listener","idx","isEqual","_removeListener","DOMListeners$removeAll","l",81,"domReadySubscribed","onDomReady","domReadyFuncs",82,"DragDrop$$componentDataType","dragDropConfig","DragDrop$isComponent","componentDataType","DragDrop$getComponentState","stateStr","DragDrop$setComponentState","requestedBy","DragDrop$setComponentMeta","_componentMeta","paramsStr","toQueryString","_encode","base32","encode","DragDrop$getComponentMeta","metaDataType","dType","decode","fromQueryString","metaData","DragDrop$getAllowedEffects","effectAllowed","DragDrop$setAllowedEffects","DragDrop$getDropEffect","dropEffect","DragDrop$setDropEffect","effect","DragDrop$isEffectAllowed","getAllowedEffects","isCopy","isMove","isLink","isAllowed","DragDrop$getData","DragDrop$setData","dataStr","DragDrop$clearData","clearData","onDragDropStarted","_currentDragDrop","_currentDragFacet","onDragDropCompleted","onCompleteDragDrop","dragDropService","getCurrentDragDrop","DragDrop_destroy","offAll","getDropEffect","isEffectAllowed","dragdropstarted","dragdropcompleted","completedragdrop",83,"error$createClass","errorClassName","ErrorClass","makeSubclass","error$toBeImplemented","AbstractClass","errorClassNames","createClass",84,"fragment_getState","wrapperClassName","_getRangeContainer","cloneContents","wrapper","_wrapFragmentInContainer","_transferStates","_renameChildren","wrapperState","fragment_getStateAsync","fromComp","toComp","fromScope","toChildComp","fromChildComp","expandRangeToSiblings","siblings","getRangeSiblings","createRangeFromSiblings","nodes","setStartBefore","setEndAfter","end","containerNode","startNode","endNode","endContainer","startSibling","_findContainingChild","endSibling","selNode","_createNodesAndPathsFunc","fromObj","toObj","createRangePaths","createRangeNodes","getStateAsync","createRangeFromNodes","./dom",85,"util_destroy","domListeners","fragment","storage","../components/ui/bootstrap/Alert","../components/ui/bootstrap/Dialog","./component_name","./deprecate","./dom_listeners","./domready","./dragdrop","./error","./fragment","./json_parse","./request","./selection","./storage","./websocket",86,87,"createPromiseOverride","functionName","promise","Promise","keepRequestObject","_request","opts","onReady","_onReady","req","xPromise","contentType","XMLHttpRequest","open","setRequestHeader","setRequestHeaders","headers","onreadystatechange","ontimeout","onabort","_createXPromise","send","_pendingRequests","resolvePromise","rejectPromise","resolve","reject","then","promiseThen","promiseCatch","status","responseText","spliceItem","errorReason","reason","request$useMessenger","request$get","request$post","request$json","jsonPromise","errData","request$jsonp","_onResult","uniqueCallback","cleanUp","clearTimeout","head","script","jsonpOptions","omitKeys","request$file","fileData","progress","upload","onprogress","file","binary","formData","FormData","request$destroy","whenRequestsCompleted","delay","json","jsonp",88,"TextSelection","TextSelection$init","rangeCount","getRangeAt","TextSelection$text","_text","toString","TextSelection$textNodes","_textNodes","_getTextNodes","TextSelection$clear","textNodes","selStart","selEnd","inEnd","_getElement","thisPropName","rangePropName","_getComponent","elMethodName","TextSelection$containedComponents","_containedComponents","TextSelection$eachContainedComponent","containedComponents","TextSelection$del","selectEndContainer","selPoint","_getPostDeleteSelectionPoint","_selectAfterDelete","selOffset","offset","trimRight","TextSelection$getRange","TextSelection$getState","createStateObject","TextSelection$$createStateObject","_getSelectionPointState","TextSelection$$createFromState","_selectionNodeFromState","pointState","TextSelection$$createFromRange","endRange","cloneRange","TextSelection$$getNormalizedRange","newRange","TextSelection$$getDirection","TextSelection$startElement","TextSelection$endElement","TextSelection$containingElement","TextSelection$startComponent","TextSelection$endComponent","TextSelection$containingComponent","clear","startElement","endElement","startComponent","endComponent","containingComponent","eachContainedComponent","getRange","getNormalizedRange","getDirection","createFromRange","../../components/c_class","../dom",89,"keyPrefix","sessionOnly","_storage","sessionStorage","localStorage","_typeSuffix","_keys","DOMStorage$set","setItem","DomStorageError","DOMStorage$get","deepForEach","getItem","DOMStorage$remove","DOMStorage$hasItem","pKey","_storageKey","DOMStorage$getItem","_getKeyDataType","valueStr","_parseData","DOMStorage$setItem","_setKeyDataType","_serializeData","cfg","_domStorage","DOMStorage$removeItem","_removeKeyDataType","DOMStorage$getAllKeys","storedKeys","keysInStorage","hasItem","DOMStorage$getAllItems","getAllKeys","DOMStorage$_storageKey","DOMStorage$_domStorageKey","storageKey","unPrefix","_dataTypeKey","_getValueType","valueType","valuesDataTypes","serializer","dataSerializers","parser","dataParsers","DOMStorage$$registerDataType","storeAsDataType","DOMStorage$createMessenger","storageMessageSource","StorageMessageSource","_messageSource","DOMStorage$destroy","_storedKeys","true","false","_domStorageKey","getAllItems","createMessenger","_sessionStorage","_localStorage","local","session","valStr","boolean","number","function","toFunction","RegExp","toRegExp","./model","./msg_src",90,"Model$$registerWithDOMStorage","Model_domStorageSerializer","Model_domStorageParser","registerWithDOMStorage",91,"StorageMessageSource$addSourceSubscriber","StorageMessageSource$removeSourceSubscriber","StorageMessageSource$postMessage","StorageMessageSource$trigger","storageArea",92,"uniqueCount","newTimestamp","now","uniqueID","timestamp",93,"wsMessenger","wsMsgSource","WSMessageSource","connect","WSMsgAPI","./msg_api",94,"SOCKET_MESSAGES",95,"WSMessageSource$connect","_options","host","location","port","_ws","onopen","ws","onmessage","onclose","onerror","WebSocket","_wsSubscriberMethod","WSMessageSource$handleEvent","WSMessageSource$trigger","onTimeout","toggleRpcSubscription","callbackCorrId","onResponse","interval","corrId",96,"Encoder","skip","bits","output","readByte","byte","alphabet","finish","Decoder","readChar","char","fromCharCode","val","lookup","encoder","decoder","alias","table","flush",97,98,"_createProxyMethods","proxyMethodName","mixinMethodName","boundMethod","Mixin_setInstanceKey","hostClass","instanceKey","mixin","instancePropertiesMap","instanceKeys","Mixin_addMethod","hostMethodName","wrappedMethod","_wrapMixinMethod","mixinInstance","_getMixinInstance","Mixin$$useWith","mixinMethods","../util/check","mol-proto",99,"MessengerRegexpAPI","./abstract/mixin","./messenger/m_api","./messenger/m_api_rx","./messenger/m_source","./messenger/msngr_source",100,"deepExtend","debug",101,"_initializeSubscribers","_messageSubscribers","_patternMessageSubscribers","Messenger$destroy","Messenger$on","_Messenger_onWithOptions","Messenger$once","dispatchTimes","Messenger$onceSync","sync","Messenger$onSync","Messenger$onAsync","_Messenger_on","_eachMessage","messagesSplitRegExp","subscribersHash","_chooseSubscribersHash","changed","subscriptionChanged","_registerSubscriber","pattern","onSubscriberAdded","noSubscribers","msgSubscribers","notYetRegistered","_indexOfSubscriber","subscr","Messenger$off","_Messenger_off","_removeSubscriber","subscriberIndex","_removeAllSubscribers","onSubscriberRemoved","offMessages","subscriberRemovedMap","Messenger$offAll","_offAllSubscribers","subscribers","_synchronous","_callSubscribers","_callPatternSubscribers","calledMsgSubscribers","patternSubscribers","_callSubscriber","syncSubscriber","synchro","__messages","getSubscribers","includePatternSubscribers","onceSync","onAsync","onMessage","offMessage","subscriptions","../abstract/mixin","./m_source",102,"MessengerAPI$destroy","addInternalMessage","internalMsgs","_internalMessages","removeInternalMessage","unexpectedNotificationWarning","messageIndex","getInternalMessages","sourceData","../util/logger",103,"_patternInternalMessages","_catchAllSubscribed","noPatternInternalMessages","internalMessages","internalMessagesHash","patternMessages","sourcePattern","./m_api",104,"messengerAPI","_prepareMessengerAPI","MessageSource$destroy","setMessenger","newSourceMessage","removedSourceMessage","api","shouldDispatch",105,"sourceMessenger","MessengerMessageSource$postMessage",106,"./messenger","./minder",107,"ds1","mode","ds2","connDescriptions","connectors","descr","Connector","_addConnector","cnct","___minder_id","_connectors","onConnectorMessage","connector","_receivedMessages","_isPropagating","_idleCheck","minder_isPropagating","minder_whenPropagationCompleted","executeCallback","minder_getConnectors","isOn","minder_destroyConnector","minder_getExpandedConnections","searchStr","getConnectors","connections","connection","leftSource","_getExpandedSource","rightSource","cnctn","_sourceMatchesString","ds","source","_model","_accessPath","unshift","matchStr","some","srcNode","_stringMatch","substr","minder_destroy","destroyDS","getExpandedConnections","isPropagating","whenPropagationCompleted","./model/connector","./util/logger",108,"flag","__inChangeTransaction","passTransactionFlag","fromFunc","toFunc","processChanges","notify","processTransaction","prepareTransaction","validateTransaction","changeFinished","sameSource","checkChange","checkSplice","checkMethod","parentPathChanged","pathsToChange","parentPath","_pathIsParentOf","todo","exitLoop","pathsToSplice","hadSplice","parentPathSpliced","every","processChange","modelPath","executeSplice","executeMethod","howMany","CHANGE_TYPE_TO_METHOD_MAP","deleted","./path_utils",109,"setupMode","_changesQueue1","_changesQueue2","pathTranslation","patternTranslation","getPatternTranslations","pathTranslation1","reverseTranslationRules","pathTranslation2","patternTranslation1","reversePatternTranslationRules","patternTranslation2","dataTranslation","dataTranslation1","dataTranslation2","dataValidation1","dataValidation2","turnOn","modeParseError","parsedMode","modePattern","depth1","depth2","Connector$changeMode","turnOff","Connector$deferChangeMode","rules","reverseRules","path2_value","path1_key","_throwInvalidTranslation","_getStaticPath","starIndex1","starIndex2","fromPattern","createRegexPath","fromStaticPath","toPattern","toStaticPath","pt","Connector$turnOn","linkDataSource","reverseLink","fromDS","toDS","changesQueue","onData","batch","translatePath","sourcePath","translatedPath","pTranslation","subscriptionPattern","translateData","translate","validateData","callValidator","validator","alreadyFailed","valid","passedCount","validators","propagateData","sendData","postChangeData","subscriptionSwitch","mergeTransactions","batches","targetPath","subscriptionPath","_subscriptionPath","_link1","_link2","Connector$turnOff","unlinkDataSource","linkName","Connector$destroy","changeMode","../messenger",110,"Model$path","__proto__","reactive","_prepareMessengers","Model$get","ModelPath","proxyMessenger","modelHostObject","Model$$useWith","modelMethodsToProxy","internalMessenger","internalMessengerSource","ModelMsgAPI","externalMessenger","_getHostObject","Model$destroy","_internalMessenger","synthesize","modelMethods","../messenger/msngr_source","./change_data","./m_msg_api","./m_path","./model_utils","./synthesize",111,"../messenger/m_api_rx",112,"ModelPath$path","_args","interpolateAccessPath","_prepareMessenger","freeze","reduce","accessPathStr","currNode","thisPathArgsCount","newPath","ModelPath$len","ModelPath$push","newLength","ModelPath$pop","ModelPath$unshift","ModelPath$shift","mPathAPI","ModelPathMsgAPI","modelMessageSource","mPathMessenger","_getDefinition","_createFromDefinition","definition","ModelPath$destroy","pop","./path_msg_api",113,114,"rootPath","internalChanges","truncateChangePath","fullPath","../messenger/m_api",115,"nodeParsePattern","pathParsePattern","unparsed","nodeStr","pathNodeTypes","patternPathParsePattern","regexStr","patternsStarted","regex","nodeRegex","interpolated","startIndex","methodsNames","wrappedMethods","origMethod","regexPath","propertyPathSyntax","arrayPathSyntax","interpolationSyntax","propertyInterpolateSyntax","arrayInterpolateSyntax","propertyStarSyntax","arrayStarSyntax","starSyntax","pathParseSyntax","patternPathParseSyntax",".","[","*",".*","[*]",116,"_synthesizePathMethods","synthesizers","synthszr","_synthesize","synthesizer","addChangeMessage","messagesHash","addTreeChangesMessages","oldIsTree","valueIsTree","newIsTree","addMessages","valueProp","_addMessages","addMessage","existingMsg","cloneTree","valueIsNormalObject","protectValue","addBatchIdsToMessage","batchId","msgId","__batch_id","__msg_id","methodCode","eval","ModelError","fs","templates","include_defines","include_create_tree","include_traverse_tree","dotDef","modelAccessPrefix","modelPostMessageCode","modelPostBatchCode","modelDotDef","dotSettings","templateSettings","strip","tmpl","modelSynthesizers","synthesizePathMethods","memoize","../../util/logger","../change_data","../model_utils","../path_utils","dot",117,"choices","Where","condition","Superclass","matchSuperclassToo","matchSuperclass","checkSubtree","typeofChecks","_jsKeywords","valueElement","_prependPath","unknownKeysAllowed","keyPattern","emptyHash","requiredPatterns","optionalPatterns","subPattern","subValue","base","TypeError",118,"./check","./logger",119,"Logger","level","./logger_class",120,"maxLevelLength","colored","color","levels","colors","DEFAULT_OPTIONS","throwLevel","enabled","logPrefix","log","console","logPrefixColor",121,"resolveDefs","c","block","def","define","code","assign","substring","defineParams","param","v","arg","use","useParams","d","rw","__exp","unescape","_globals","version","evaluate","conditional","iterate","varname","selfcontained","doNotSkipEncoded","encodeHTMLSource","encodeHTMLRules","&","<",">","\"","'","/","matchHTML","amd","startend","startencode","needhtmlencode","indv","cse","sid","elsecase","vname","iname","_encodeHTML",122,"InstallDots","__path","__destination","destination","__global","__rendermodule","rendermodule","__settings","__includes","addexports","ret","readdata","readFileSync","process","compileAll","compileToFile","modulename","lastIndexOf","defs","settings","compileoptions","defaultcompiled","compiled","writeFileSync","compilePath","k","defFolder","sources","readdirSync","./doT",123,"Proto","wrapped","unwrapProto","utils","prototypeMethods","objectMethods","arrayMethods","functionMethods","stringMethods","numberMethods","utilMethods","__","_constants","protoFuncs","makeProtoFunction","protoInstanceMethods","makeProtoInstanceMethod","underscore","./proto_array","./proto_function","./proto_number","./proto_object","./proto_prototype","./proto_string","./proto_util","./utils",124,"arrayToAppend","prependArray","arrayToPrepend","values","valuesIsArray","unique","itemIndex","filtered","it","itemIndexOf","_deepForEach","nativeArrayMethodsNames","nativeArrayMethods","makeFindMethod",125,"arg1","arg2","funcBody","partialRight","hashFunc","limit","cache","keysList","wait","_delay","deferTicks","ticks","deferFunc","delayMethod","funcOrMethodName","_delayMethod","delayed","passArgs","deferred","debounce","immediate","later","last","callNow","previous","leading","remaining","trailing","memo","ran","waitFor","maxTimeout","timedOutFunc","checkInterval","testCondition","setInterval","not",126,"isNumeric","isNaN","parseFloat","isFinite",127,"onlyEnumerable","descriptors","getOwnPropertyDescriptor","clonedObject","propertyName","decriptorFlags","_getDescriptor","descriptor","constants","ENUMERABLE","configurable","CONFIGURABLE","writable","WRITABLE","propertyValues","_extendTree","selfNode","objNode","objTraversed","loop","allKeys","getOwnPropertyNames","keyOf","searchElement","allKeysOf","mapProperty","reduceKeys","initialValue","filterProperty","testProperty","_passed","everyKey","_didNotPass","pickKeys","ArrayProto","multiline","ignoreCase","isNot","findValue","findKey",128,"propDescriptors","applyConstructor","thisClass","subclass","constructorCode",129,"toUpperCase","rx","regexpStringPattern","getTime","qs","encodeURIComponent","pairs","results","decodeURIComponent","pair","splitPair","hashCode","hash",130,"times","tap","identity","compareProperty","b",131,"eachMethod","findWhat","argIndex","testItem","caughtError","_error"],"mappings":"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","sourceRoot":"/"} +>>>>>>> added dragCls config to drag facet