diff --git a/package.json b/package.json index 560f3aa897..2032f05c5d 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,8 @@ "mobx@6.12.3": "patches/mobx@6.12.3.patch", "mobx-react-lite@4.0.7": "patches/mobx-react-lite@4.0.7.patch", "mime-types": "patches/mime-types.patch", - "rc-trigger": "patches/rc-trigger.patch" + "rc-trigger": "patches/rc-trigger.patch", + "react-dropzone": "patches/react-dropzone.patch" }, "onlyBuiltDependencies": [ "canvas" diff --git a/packages/modules/file-uploader/package.json b/packages/modules/file-uploader/package.json index 4b999edc48..6a44fe4a2a 100644 --- a/packages/modules/file-uploader/package.json +++ b/packages/modules/file-uploader/package.json @@ -1,7 +1,7 @@ { "name": "@mendix/file-uploader", "moduleName": "File Uploader module", - "version": "2.2.2", + "version": "2.3.0", "copyright": "© Mendix Technology BV 2025. All rights reserved.", "license": "Apache-2.0", "private": true, diff --git a/packages/pluggableWidgets/file-uploader-web/CHANGELOG.md b/packages/pluggableWidgets/file-uploader-web/CHANGELOG.md index d04ec89b89..4010cab0d8 100644 --- a/packages/pluggableWidgets/file-uploader-web/CHANGELOG.md +++ b/packages/pluggableWidgets/file-uploader-web/CHANGELOG.md @@ -8,6 +8,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Fixed +- We improved the file extension validation to allow special characters like dashes and plus signs (e.g., '.tar-gz', '.c++'). + +- We clarified error messages for invalid file extensions to better explain the expected format. + - We fixed an issue where file uploader can still add more files when refreshed eventhough the number of maximum uploaded files has been reached. ### Changed diff --git a/packages/pluggableWidgets/file-uploader-web/src/utils/__tests__/parseAllowedFormats.spec.ts b/packages/pluggableWidgets/file-uploader-web/src/utils/__tests__/parseAllowedFormats.spec.ts index 5d82d46298..cae4020b47 100644 --- a/packages/pluggableWidgets/file-uploader-web/src/utils/__tests__/parseAllowedFormats.spec.ts +++ b/packages/pluggableWidgets/file-uploader-web/src/utils/__tests__/parseAllowedFormats.spec.ts @@ -95,6 +95,40 @@ describe("parseAllowedFormats", () => { "Value 'application-pdf' is not recognized. Accepted format: 'image/jpeg'" ); }); + test("handles extensions with special characters like dashes and plus signs", () => { + const input: AllowedFileFormatsType[] = [ + { + configMode: "advanced", + typeFormatDescription: dynamicValue("special-extensions"), + predefinedType: "pdfFile", + mimeType: "application/x-custom", + extensions: ".tar-gz,.js-map,.c++" + } + ]; + + expect(parseAllowedFormats(input)).toEqual([ + { + description: "special-extensions", + entries: [["application/x-custom", [".tar-gz", ".js-map", ".c++"]]] + } + ]); + }); + test("throws on extension without leading dot", () => { + const input: AllowedFileFormatsType[] = [ + { + configMode: "advanced", + typeFormatDescription: dynamicValue("test"), + predefinedType: "pdfFile", + mimeType: "text/*", + extensions: ".txt,pdf" + } + ]; + + expect(() => parseAllowedFormats(input)).toThrow( + "Value 'pdf' is not recognized. Extension must start with a dot and contain only valid filename characters" + ); + }); + test("throws on incorrect extension format", () => { const input: AllowedFileFormatsType[] = [ { @@ -106,6 +140,24 @@ describe("parseAllowedFormats", () => { } ]; - expect(() => parseAllowedFormats(input)).toThrow("Value 'abc' is not recognized. Accepted format: '.pdf'"); + expect(() => parseAllowedFormats(input)).toThrow( + "Value 'abc' is not recognized. Extension must start with a dot and contain only valid filename characters" + ); + }); + + test("throws on extension with dot in the middle", () => { + const input: AllowedFileFormatsType[] = [ + { + configMode: "advanced", + typeFormatDescription: dynamicValue("test"), + predefinedType: "pdfFile", + mimeType: "text/*", + extensions: ".txt,.config.json" + } + ]; + + expect(() => parseAllowedFormats(input)).toThrow( + "Value '.config.json' is not recognized. Extension must start with a dot and contain only valid filename characters" + ); }); }); diff --git a/packages/pluggableWidgets/file-uploader-web/src/utils/parseAllowedFormats.ts b/packages/pluggableWidgets/file-uploader-web/src/utils/parseAllowedFormats.ts index c3218110d1..a78200785a 100644 --- a/packages/pluggableWidgets/file-uploader-web/src/utils/parseAllowedFormats.ts +++ b/packages/pluggableWidgets/file-uploader-web/src/utils/parseAllowedFormats.ts @@ -59,11 +59,13 @@ function parseExtensionsList(config: string): string[] { .map(c => c.trim()) .filter(c => c) .map(c => { - if (/^\.\w+$/.test(c)) { - // ".ext" string + if (/^\.[^/\\?*<>|:".]+$/.test(c)) { + // ".ext" string - allowing most characters except those invalid in filenames return c; } - throw new Error(`Value '${c}' is not recognized. Accepted format: '.pdf'`); + throw new Error( + `Value '${c}' is not recognized. Extension must start with a dot and contain only valid filename characters (e.g. '.pdf', '.doc', '.tar-gz')` + ); }); } diff --git a/patches/react-dropzone.patch b/patches/react-dropzone.patch new file mode 100644 index 0000000000..ea84377295 --- /dev/null +++ b/patches/react-dropzone.patch @@ -0,0 +1,34 @@ +diff --git a/dist/es/utils/index.js b/dist/es/utils/index.js +index 41ff75108f03e5d2afbf66ef4290a4a17a62ef42..bf42ffe8b2032d87e2bfde1134791e8df6ac9ce3 100644 +--- a/dist/es/utils/index.js ++++ b/dist/es/utils/index.js +@@ -311,7 +311,7 @@ export function isMIMEType(v) { + */ + + export function isExt(v) { +- return /^.*\.[\w]+$/.test(v); ++ return /^\.[^/\\?*<>|:".]+$/.test(v); + } + /** + * @typedef {Object.} AcceptProp +diff --git a/dist/index.js b/dist/index.js +index c1cbab6e0a1361d01103c041a20259f49c7eb605..60eb7c55ee9c2b174f4daba0f0e40075fc6af847 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -1,2 +1,2 @@ +-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("prop-types")):"function"==typeof define&&define.amd?define(["exports","react","prop-types"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).reactDropzone={},e.React,e.PropTypes)}(this,(function(e,t,n){"use strict";function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=r(t),i=r(n);function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function s(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,c=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(c)throw o}}return i}(e,t)||p(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function f(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||p(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(e,t){if(e){if("string"==typeof e)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}function y(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o0?r:e.name,writable:!1,configurable:!1,enumerable:!0})}return n}var w=[".DS_Store","Thumbs.db"];function D(e){return"object"==typeof e&&null!==e}function x(e){return O(e.target.files).map((function(e){return h(e)}))}function j(e){return v(this,void 0,void 0,(function(){return m(this,(function(t){switch(t.label){case 0:return[4,Promise.all(e.map((function(e){return e.getFile()})))];case 1:return[2,t.sent().map((function(e){return h(e)}))]}}))}))}function F(e,t){return v(this,void 0,void 0,(function(){var n;return m(this,(function(r){switch(r.label){case 0:return e.items?(n=O(e.items).filter((function(e){return"file"===e.kind})),"drop"!==t?[2,n]:[4,Promise.all(n.map(E))]):[3,2];case 1:return[2,A(k(r.sent()))];case 2:return[2,A(O(e.files).map((function(e){return h(e)})))]}}))}))}function A(e){return e.filter((function(e){return-1===w.indexOf(e.name)}))}function O(e){if(null===e)return[];for(var t=[],n=0;nn)return[!1,q(n)];if(e.sizen)return[!1,q(n)]}return[!0,null]}function H(e){return null!=e}function N(e){var t=e.files,n=e.accept,r=e.minSize,o=e.maxSize,i=e.multiple,a=e.maxFiles,c=e.validator;return!(!i&&t.length>1||i&&a>=1&&t.length>a)&&t.every((function(e){var t=s($(e,n),1)[0],i=s(G(e,r,o),1)[0],a=c?c(e):null;return t&&i&&!a}))}function Y(e){return"function"==typeof e.isPropagationStopped?e.isPropagationStopped():void 0!==e.cancelBubble&&e.cancelBubble}function J(e){return e.dataTransfer?Array.prototype.some.call(e.dataTransfer.types,(function(e){return"Files"===e||"application/x-moz-file"===e})):!!e.target&&!!e.target.files}function Q(e){e.preventDefault()}function V(e){return-1!==e.indexOf("MSIE")||-1!==e.indexOf("Trident/")}function X(e){return-1!==e.indexOf("Edge/")}function Z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.navigator.userAgent;return V(e)||X(e)}function ee(){for(var e=arguments.length,t=new Array(e),n=0;n1?n-1:0),o=1;o0&&void 0!==arguments[0]?arguments[0]:{},n=c(c({},de),e),r=n.accept,o=n.disabled,i=n.getFilesFromEvent,a=n.maxSize,p=n.minSize,d=n.multiple,v=n.maxFiles,m=n.onDragEnter,g=n.onDragLeave,y=n.onDragOver,b=n.onDrop,h=n.onDropAccepted,w=n.onDropRejected,D=n.onFileDialogCancel,x=n.onFileDialogOpen,j=n.useFsAccessApi,F=n.autoFocus,A=n.preventDropOnDocument,O=n.noClick,E=n.noKeyboard,k=n.noDrag,S=n.noDragEventsBubbling,P=n.onError,C=n.validator,z=t.useMemo((function(){return re(r)}),[r]),R=t.useMemo((function(){return ne(r)}),[r]),T=t.useMemo((function(){return"function"==typeof x?x:ye}),[x]),I=t.useMemo((function(){return"function"==typeof D?D:ye}),[D]),M=t.useRef(null),L=t.useRef(null),_=t.useReducer(ge,ve),B=s(_,2),K=B[0],q=B[1],U=K.isFocused,H=K.isFileDialogActive,V=t.useRef("undefined"!=typeof window&&window.isSecureContext&&j&&te()),X=function(){!V.current&&H&&setTimeout((function(){L.current&&(L.current.files.length||(q({type:"closeDialog"}),I()))}),300)};t.useEffect((function(){return window.addEventListener("focus",X,!1),function(){window.removeEventListener("focus",X,!1)}}),[L,H,I,V]);var ae=t.useRef([]),ce=function(e){M.current&&M.current.contains(e.target)||(e.preventDefault(),ae.current=[])};t.useEffect((function(){return A&&(document.addEventListener("dragover",Q,!1),document.addEventListener("drop",ce,!1)),function(){A&&(document.removeEventListener("dragover",Q),document.removeEventListener("drop",ce))}}),[M,A]),t.useEffect((function(){return!o&&F&&M.current&&M.current.focus(),function(){}}),[M,F,o]);var ue=t.useCallback((function(e){P?P(e):console.error(e)}),[P]),le=t.useCallback((function(e){e.preventDefault(),e.persist(),ke(e),ae.current=[].concat(f(ae.current),[e.target]),J(e)&&Promise.resolve(i(e)).then((function(t){if(!Y(e)||S){var n=t.length,r=n>0&&N({files:t,accept:z,minSize:p,maxSize:a,multiple:d,maxFiles:v,validator:C});q({isDragAccept:r,isDragReject:n>0&&!r,isDragActive:!0,type:"setDraggedFiles"}),m&&m(e)}})).catch((function(e){return ue(e)}))}),[i,m,ue,S,z,p,a,d,v,C]),pe=t.useCallback((function(e){e.preventDefault(),e.persist(),ke(e);var t=J(e);if(t&&e.dataTransfer)try{e.dataTransfer.dropEffect="copy"}catch(e){}return t&&y&&y(e),!1}),[y,S]),me=t.useCallback((function(e){e.preventDefault(),e.persist(),ke(e);var t=ae.current.filter((function(e){return M.current&&M.current.contains(e)})),n=t.indexOf(e.target);-1!==n&&t.splice(n,1),ae.current=t,t.length>0||(q({type:"setDraggedFiles",isDragActive:!1,isDragAccept:!1,isDragReject:!1}),J(e)&&g&&g(e))}),[M,g,S]),be=t.useCallback((function(e,t){var n=[],r=[];e.forEach((function(e){var t=s($(e,z),2),o=t[0],i=t[1],c=s(G(e,p,a),2),u=c[0],l=c[1],f=C?C(e):null;if(o&&u&&!f)n.push(e);else{var d=[i,l];f&&(d=d.concat(f)),r.push({file:e,errors:d.filter((function(e){return e}))})}})),(!d&&n.length>1||d&&v>=1&&n.length>v)&&(n.forEach((function(e){r.push({file:e,errors:[W]})})),n.splice(0)),q({acceptedFiles:n,fileRejections:r,type:"setFiles"}),b&&b(n,r,t),r.length>0&&w&&w(r,t),n.length>0&&h&&h(n,t)}),[q,d,z,p,a,v,b,h,w,C]),he=t.useCallback((function(e){e.preventDefault(),e.persist(),ke(e),ae.current=[],J(e)&&Promise.resolve(i(e)).then((function(t){Y(e)&&!S||be(t,e)})).catch((function(e){return ue(e)})),q({type:"reset"})}),[i,be,ue,S]),we=t.useCallback((function(){if(V.current){q({type:"openDialog"}),T();var e={multiple:d,types:R};window.showOpenFilePicker(e).then((function(e){return i(e)})).then((function(e){be(e,null),q({type:"closeDialog"})})).catch((function(e){oe(e)?(I(e),q({type:"closeDialog"})):ie(e)?(V.current=!1,L.current?(L.current.value=null,L.current.click()):ue(new Error("Cannot open the file picker because the https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API is not supported and no was provided."))):ue(e)}))}else L.current&&(q({type:"openDialog"}),T(),L.current.value=null,L.current.click())}),[q,T,I,j,be,ue,R,d]),De=t.useCallback((function(e){M.current&&M.current.isEqualNode(e.target)&&(" "!==e.key&&"Enter"!==e.key&&32!==e.keyCode&&13!==e.keyCode||(e.preventDefault(),we()))}),[M,we]),xe=t.useCallback((function(){q({type:"focus"})}),[]),je=t.useCallback((function(){q({type:"blur"})}),[]),Fe=t.useCallback((function(){O||(Z()?setTimeout(we,0):we())}),[O,we]),Ae=function(e){return o?null:e},Oe=function(e){return E?null:Ae(e)},Ee=function(e){return k?null:Ae(e)},ke=function(e){S&&e.stopPropagation()},Se=t.useMemo((function(){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.refKey,n=void 0===t?"ref":t,r=e.role,i=e.onKeyDown,a=e.onFocus,s=e.onBlur,f=e.onClick,p=e.onDragEnter,d=e.onDragOver,v=e.onDragLeave,m=e.onDrop,g=l(e,se);return c(c(u({onKeyDown:Oe(ee(i,De)),onFocus:Oe(ee(a,xe)),onBlur:Oe(ee(s,je)),onClick:Ae(ee(f,Fe)),onDragEnter:Ee(ee(p,le)),onDragOver:Ee(ee(d,pe)),onDragLeave:Ee(ee(v,me)),onDrop:Ee(ee(m,he)),role:"string"==typeof r&&""!==r?r:"presentation"},n,M),o||E?{}:{tabIndex:0}),g)}}),[M,De,xe,je,Fe,le,pe,me,he,E,k,o]),Pe=t.useCallback((function(e){e.stopPropagation()}),[]),Ce=t.useMemo((function(){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.refKey,n=void 0===t?"ref":t,r=e.onChange,o=e.onClick,i=l(e,fe),a=u({accept:z,multiple:d,type:"file",style:{display:"none"},onChange:Ae(ee(r,he)),onClick:Ae(ee(o,Pe)),tabIndex:-1},n,L);return c(c({},a),i)}}),[L,r,d,he,o]);return c(c({},K),{},{isFocused:U&&!o,getRootProps:Se,getInputProps:Ce,rootRef:M,inputRef:L,open:Ae(we)})}function ge(e,t){switch(t.type){case"focus":return c(c({},e),{},{isFocused:!0});case"blur":return c(c({},e),{},{isFocused:!1});case"openDialog":return c(c({},ve),{},{isFileDialogActive:!0});case"closeDialog":return c(c({},e),{},{isFileDialogActive:!1});case"setDraggedFiles":return c(c({},e),{},{isDragActive:t.isDragActive,isDragAccept:t.isDragAccept,isDragReject:t.isDragReject});case"setFiles":return c(c({},e),{},{acceptedFiles:t.acceptedFiles,fileRejections:t.fileRejections});case"reset":return c({},ve);default:return e}}function ye(){}e.ErrorCode=B,e.default=pe,e.useDropzone=me,Object.defineProperty(e,"__esModule",{value:!0})})); ++!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("prop-types")):"function"==typeof define&&define.amd?define(["exports","react","prop-types"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).reactDropzone={},e.React,e.PropTypes)}(this,(function(e,t,n){"use strict";function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=r(t),i=r(n);function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function s(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,c=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){c=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(c)throw o}}return i}(e,t)||p(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function f(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||p(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(e,t){if(e){if("string"==typeof e)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}function y(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o0?r:e.name,writable:!1,configurable:!1,enumerable:!0})}return n}var w=[".DS_Store","Thumbs.db"];function D(e){return"object"==typeof e&&null!==e}function x(e){return O(e.target.files).map((function(e){return h(e)}))}function j(e){return v(this,void 0,void 0,(function(){return m(this,(function(t){switch(t.label){case 0:return[4,Promise.all(e.map((function(e){return e.getFile()})))];case 1:return[2,t.sent().map((function(e){return h(e)}))]}}))}))}function F(e,t){return v(this,void 0,void 0,(function(){var n;return m(this,(function(r){switch(r.label){case 0:return e.items?(n=O(e.items).filter((function(e){return"file"===e.kind})),"drop"!==t?[2,n]:[4,Promise.all(n.map(E))]):[3,2];case 1:return[2,A(k(r.sent()))];case 2:return[2,A(O(e.files).map((function(e){return h(e)})))]}}))}))}function A(e){return e.filter((function(e){return-1===w.indexOf(e.name)}))}function O(e){if(null===e)return[];for(var t=[],n=0;nn)return[!1,q(n)];if(e.sizen)return[!1,q(n)]}return[!0,null]}function H(e){return null!=e}function N(e){var t=e.files,n=e.accept,r=e.minSize,o=e.maxSize,i=e.multiple,a=e.maxFiles,c=e.validator;return!(!i&&t.length>1||i&&a>=1&&t.length>a)&&t.every((function(e){var t=s($(e,n),1)[0],i=s(G(e,r,o),1)[0],a=c?c(e):null;return t&&i&&!a}))}function Y(e){return"function"==typeof e.isPropagationStopped?e.isPropagationStopped():void 0!==e.cancelBubble&&e.cancelBubble}function J(e){return e.dataTransfer?Array.prototype.some.call(e.dataTransfer.types,(function(e){return"Files"===e||"application/x-moz-file"===e})):!!e.target&&!!e.target.files}function Q(e){e.preventDefault()}function V(e){return-1!==e.indexOf("MSIE")||-1!==e.indexOf("Trident/")}function X(e){return-1!==e.indexOf("Edge/")}function Z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.navigator.userAgent;return V(e)||X(e)}function ee(){for(var e=arguments.length,t=new Array(e),n=0;n1?n-1:0),o=1;o|:".]+$/.test(e)}var ue=["children"],le=["open"],se=["refKey","role","onKeyDown","onFocus","onBlur","onClick","onDragEnter","onDragOver","onDragLeave","onDrop"],fe=["refKey","onChange","onClick"],pe=t.forwardRef((function(e,n){var r=e.children,i=me(l(e,ue)),a=i.open,u=l(i,le);return t.useImperativeHandle(n,(function(){return{open:a}}),[a]),o.default.createElement(t.Fragment,null,r(c(c({},u),{},{open:a})))}));pe.displayName="Dropzone";var de={disabled:!1,getFilesFromEvent:function(e){return v(this,void 0,void 0,(function(){return m(this,(function(t){return D(e)&&D(e.dataTransfer)?[2,F(e.dataTransfer,e.type)]:function(e){return D(e)&&D(e.target)}(e)?[2,x(e)]:Array.isArray(e)&&e.every((function(e){return"getFile"in e&&"function"==typeof e.getFile}))?[2,j(e)]:[2,[]]}))}))},maxSize:1/0,minSize:0,multiple:!0,maxFiles:0,preventDropOnDocument:!0,noClick:!1,noKeyboard:!1,noDrag:!1,noDragEventsBubbling:!1,validator:null,useFsAccessApi:!1,autoFocus:!1};pe.defaultProps=de,pe.propTypes={children:i.default.func,accept:i.default.objectOf(i.default.arrayOf(i.default.string)),multiple:i.default.bool,preventDropOnDocument:i.default.bool,noClick:i.default.bool,noKeyboard:i.default.bool,noDrag:i.default.bool,noDragEventsBubbling:i.default.bool,minSize:i.default.number,maxSize:i.default.number,maxFiles:i.default.number,disabled:i.default.bool,getFilesFromEvent:i.default.func,onFileDialogCancel:i.default.func,onFileDialogOpen:i.default.func,useFsAccessApi:i.default.bool,autoFocus:i.default.bool,onDragEnter:i.default.func,onDragLeave:i.default.func,onDragOver:i.default.func,onDrop:i.default.func,onDropAccepted:i.default.func,onDropRejected:i.default.func,onError:i.default.func,validator:i.default.func};var ve={isFocused:!1,isFileDialogActive:!1,isDragActive:!1,isDragAccept:!1,isDragReject:!1,acceptedFiles:[],fileRejections:[]};function me(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=c(c({},de),e),r=n.accept,o=n.disabled,i=n.getFilesFromEvent,a=n.maxSize,p=n.minSize,d=n.multiple,v=n.maxFiles,m=n.onDragEnter,g=n.onDragLeave,y=n.onDragOver,b=n.onDrop,h=n.onDropAccepted,w=n.onDropRejected,D=n.onFileDialogCancel,x=n.onFileDialogOpen,j=n.useFsAccessApi,F=n.autoFocus,A=n.preventDropOnDocument,O=n.noClick,E=n.noKeyboard,k=n.noDrag,S=n.noDragEventsBubbling,P=n.onError,C=n.validator,z=t.useMemo((function(){return re(r)}),[r]),R=t.useMemo((function(){return ne(r)}),[r]),T=t.useMemo((function(){return"function"==typeof x?x:ye}),[x]),I=t.useMemo((function(){return"function"==typeof D?D:ye}),[D]),M=t.useRef(null),L=t.useRef(null),_=t.useReducer(ge,ve),B=s(_,2),K=B[0],q=B[1],U=K.isFocused,H=K.isFileDialogActive,V=t.useRef("undefined"!=typeof window&&window.isSecureContext&&j&&te()),X=function(){!V.current&&H&&setTimeout((function(){L.current&&(L.current.files.length||(q({type:"closeDialog"}),I()))}),300)};t.useEffect((function(){return window.addEventListener("focus",X,!1),function(){window.removeEventListener("focus",X,!1)}}),[L,H,I,V]);var ae=t.useRef([]),ce=function(e){M.current&&M.current.contains(e.target)||(e.preventDefault(),ae.current=[])};t.useEffect((function(){return A&&(document.addEventListener("dragover",Q,!1),document.addEventListener("drop",ce,!1)),function(){A&&(document.removeEventListener("dragover",Q),document.removeEventListener("drop",ce))}}),[M,A]),t.useEffect((function(){return!o&&F&&M.current&&M.current.focus(),function(){}}),[M,F,o]);var ue=t.useCallback((function(e){P?P(e):console.error(e)}),[P]),le=t.useCallback((function(e){e.preventDefault(),e.persist(),ke(e),ae.current=[].concat(f(ae.current),[e.target]),J(e)&&Promise.resolve(i(e)).then((function(t){if(!Y(e)||S){var n=t.length,r=n>0&&N({files:t,accept:z,minSize:p,maxSize:a,multiple:d,maxFiles:v,validator:C});q({isDragAccept:r,isDragReject:n>0&&!r,isDragActive:!0,type:"setDraggedFiles"}),m&&m(e)}})).catch((function(e){return ue(e)}))}),[i,m,ue,S,z,p,a,d,v,C]),pe=t.useCallback((function(e){e.preventDefault(),e.persist(),ke(e);var t=J(e);if(t&&e.dataTransfer)try{e.dataTransfer.dropEffect="copy"}catch(e){}return t&&y&&y(e),!1}),[y,S]),me=t.useCallback((function(e){e.preventDefault(),e.persist(),ke(e);var t=ae.current.filter((function(e){return M.current&&M.current.contains(e)})),n=t.indexOf(e.target);-1!==n&&t.splice(n,1),ae.current=t,t.length>0||(q({type:"setDraggedFiles",isDragActive:!1,isDragAccept:!1,isDragReject:!1}),J(e)&&g&&g(e))}),[M,g,S]),be=t.useCallback((function(e,t){var n=[],r=[];e.forEach((function(e){var t=s($(e,z),2),o=t[0],i=t[1],c=s(G(e,p,a),2),u=c[0],l=c[1],f=C?C(e):null;if(o&&u&&!f)n.push(e);else{var d=[i,l];f&&(d=d.concat(f)),r.push({file:e,errors:d.filter((function(e){return e}))})}})),(!d&&n.length>1||d&&v>=1&&n.length>v)&&(n.forEach((function(e){r.push({file:e,errors:[W]})})),n.splice(0)),q({acceptedFiles:n,fileRejections:r,type:"setFiles"}),b&&b(n,r,t),r.length>0&&w&&w(r,t),n.length>0&&h&&h(n,t)}),[q,d,z,p,a,v,b,h,w,C]),he=t.useCallback((function(e){e.preventDefault(),e.persist(),ke(e),ae.current=[],J(e)&&Promise.resolve(i(e)).then((function(t){Y(e)&&!S||be(t,e)})).catch((function(e){return ue(e)})),q({type:"reset"})}),[i,be,ue,S]),we=t.useCallback((function(){if(V.current){q({type:"openDialog"}),T();var e={multiple:d,types:R};window.showOpenFilePicker(e).then((function(e){return i(e)})).then((function(e){be(e,null),q({type:"closeDialog"})})).catch((function(e){oe(e)?(I(e),q({type:"closeDialog"})):ie(e)?(V.current=!1,L.current?(L.current.value=null,L.current.click()):ue(new Error("Cannot open the file picker because the https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API is not supported and no was provided."))):ue(e)}))}else L.current&&(q({type:"openDialog"}),T(),L.current.value=null,L.current.click())}),[q,T,I,j,be,ue,R,d]),De=t.useCallback((function(e){M.current&&M.current.isEqualNode(e.target)&&(" "!==e.key&&"Enter"!==e.key&&32!==e.keyCode&&13!==e.keyCode||(e.preventDefault(),we()))}),[M,we]),xe=t.useCallback((function(){q({type:"focus"})}),[]),je=t.useCallback((function(){q({type:"blur"})}),[]),Fe=t.useCallback((function(){O||(Z()?setTimeout(we,0):we())}),[O,we]),Ae=function(e){return o?null:e},Oe=function(e){return E?null:Ae(e)},Ee=function(e){return k?null:Ae(e)},ke=function(e){S&&e.stopPropagation()},Se=t.useMemo((function(){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.refKey,n=void 0===t?"ref":t,r=e.role,i=e.onKeyDown,a=e.onFocus,s=e.onBlur,f=e.onClick,p=e.onDragEnter,d=e.onDragOver,v=e.onDragLeave,m=e.onDrop,g=l(e,se);return c(c(u({onKeyDown:Oe(ee(i,De)),onFocus:Oe(ee(a,xe)),onBlur:Oe(ee(s,je)),onClick:Ae(ee(f,Fe)),onDragEnter:Ee(ee(p,le)),onDragOver:Ee(ee(d,pe)),onDragLeave:Ee(ee(v,me)),onDrop:Ee(ee(m,he)),role:"string"==typeof r&&""!==r?r:"presentation"},n,M),o||E?{}:{tabIndex:0}),g)}}),[M,De,xe,je,Fe,le,pe,me,he,E,k,o]),Pe=t.useCallback((function(e){e.stopPropagation()}),[]),Ce=t.useMemo((function(){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.refKey,n=void 0===t?"ref":t,r=e.onChange,o=e.onClick,i=l(e,fe),a=u({accept:z,multiple:d,type:"file",style:{display:"none"},onChange:Ae(ee(r,he)),onClick:Ae(ee(o,Pe)),tabIndex:-1},n,L);return c(c({},a),i)}}),[L,r,d,he,o]);return c(c({},K),{},{isFocused:U&&!o,getRootProps:Se,getInputProps:Ce,rootRef:M,inputRef:L,open:Ae(we)})}function ge(e,t){switch(t.type){case"focus":return c(c({},e),{},{isFocused:!0});case"blur":return c(c({},e),{},{isFocused:!1});case"openDialog":return c(c({},ve),{},{isFileDialogActive:!0});case"closeDialog":return c(c({},e),{},{isFileDialogActive:!1});case"setDraggedFiles":return c(c({},e),{},{isDragActive:t.isDragActive,isDragAccept:t.isDragAccept,isDragReject:t.isDragReject});case"setFiles":return c(c({},e),{},{acceptedFiles:t.acceptedFiles,fileRejections:t.fileRejections});case"reset":return c({},ve);default:return e}}function ye(){}e.ErrorCode=B,e.default=pe,e.useDropzone=me,Object.defineProperty(e,"__esModule",{value:!0})})); + //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9maWxlLXNlbGVjdG9yL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2VsZWN0b3IvZGlzdC9lczUvZmlsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9maWxlLXNlbGVjdG9yL2Rpc3QvZXM1L2ZpbGUtc2VsZWN0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvYXR0ci1hY2NlcHQvZGlzdC9lcy9pbmRleC5qcyIsIi4uL3NyYy91dGlscy9pbmRleC5qcyIsIi4uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiZXhwb3J0IHZhciBDT01NT05fTUlNRV9UWVBFUyA9IG5ldyBNYXAoW1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvTUlNRV90eXBlcy9Db21tb25fdHlwZXNcbiAgICBbJ2FhYycsICdhdWRpby9hYWMnXSxcbiAgICBbJ2FidycsICdhcHBsaWNhdGlvbi94LWFiaXdvcmQnXSxcbiAgICBbJ2FyYycsICdhcHBsaWNhdGlvbi94LWZyZWVhcmMnXSxcbiAgICBbJ2F2aWYnLCAnaW1hZ2UvYXZpZiddLFxuICAgIFsnYXZpJywgJ3ZpZGVvL3gtbXN2aWRlbyddLFxuICAgIFsnYXp3JywgJ2FwcGxpY2F0aW9uL3ZuZC5hbWF6b24uZWJvb2snXSxcbiAgICBbJ2JpbicsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXSxcbiAgICBbJ2JtcCcsICdpbWFnZS9ibXAnXSxcbiAgICBbJ2J6JywgJ2FwcGxpY2F0aW9uL3gtYnppcCddLFxuICAgIFsnYnoyJywgJ2FwcGxpY2F0aW9uL3gtYnppcDInXSxcbiAgICBbJ2NkYScsICdhcHBsaWNhdGlvbi94LWNkZiddLFxuICAgIFsnY3NoJywgJ2FwcGxpY2F0aW9uL3gtY3NoJ10sXG4gICAgWydjc3MnLCAndGV4dC9jc3MnXSxcbiAgICBbJ2NzdicsICd0ZXh0L2NzdiddLFxuICAgIFsnZG9jJywgJ2FwcGxpY2F0aW9uL21zd29yZCddLFxuICAgIFsnZG9jeCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCddLFxuICAgIFsnZW90JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0J10sXG4gICAgWydlcHViJywgJ2FwcGxpY2F0aW9uL2VwdWIremlwJ10sXG4gICAgWydneicsICdhcHBsaWNhdGlvbi9nemlwJ10sXG4gICAgWydnaWYnLCAnaW1hZ2UvZ2lmJ10sXG4gICAgWydoZWljJywgJ2ltYWdlL2hlaWMnXSxcbiAgICBbJ2hlaWYnLCAnaW1hZ2UvaGVpZiddLFxuICAgIFsnaHRtJywgJ3RleHQvaHRtbCddLFxuICAgIFsnaHRtbCcsICd0ZXh0L2h0bWwnXSxcbiAgICBbJ2ljbycsICdpbWFnZS92bmQubWljcm9zb2Z0Lmljb24nXSxcbiAgICBbJ2ljcycsICd0ZXh0L2NhbGVuZGFyJ10sXG4gICAgWydqYXInLCAnYXBwbGljYXRpb24vamF2YS1hcmNoaXZlJ10sXG4gICAgWydqcGVnJywgJ2ltYWdlL2pwZWcnXSxcbiAgICBbJ2pwZycsICdpbWFnZS9qcGVnJ10sXG4gICAgWydqcycsICd0ZXh0L2phdmFzY3JpcHQnXSxcbiAgICBbJ2pzb24nLCAnYXBwbGljYXRpb24vanNvbiddLFxuICAgIFsnanNvbmxkJywgJ2FwcGxpY2F0aW9uL2xkK2pzb24nXSxcbiAgICBbJ21pZCcsICdhdWRpby9taWRpJ10sXG4gICAgWydtaWRpJywgJ2F1ZGlvL21pZGknXSxcbiAgICBbJ21qcycsICd0ZXh0L2phdmFzY3JpcHQnXSxcbiAgICBbJ21wMycsICdhdWRpby9tcGVnJ10sXG4gICAgWydtcDQnLCAndmlkZW8vbXA0J10sXG4gICAgWydtcGVnJywgJ3ZpZGVvL21wZWcnXSxcbiAgICBbJ21wa2cnLCAnYXBwbGljYXRpb24vdm5kLmFwcGxlLmluc3RhbGxlcit4bWwnXSxcbiAgICBbJ29kcCcsICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbiddLFxuICAgIFsnb2RzJywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQnXSxcbiAgICBbJ29kdCcsICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQnXSxcbiAgICBbJ29nYScsICdhdWRpby9vZ2cnXSxcbiAgICBbJ29ndicsICd2aWRlby9vZ2cnXSxcbiAgICBbJ29neCcsICdhcHBsaWNhdGlvbi9vZ2cnXSxcbiAgICBbJ29wdXMnLCAnYXVkaW8vb3B1cyddLFxuICAgIFsnb3RmJywgJ2ZvbnQvb3RmJ10sXG4gICAgWydwbmcnLCAnaW1hZ2UvcG5nJ10sXG4gICAgWydwZGYnLCAnYXBwbGljYXRpb24vcGRmJ10sXG4gICAgWydwaHAnLCAnYXBwbGljYXRpb24veC1odHRwZC1waHAnXSxcbiAgICBbJ3BwdCcsICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCddLFxuICAgIFsncHB0eCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uJ10sXG4gICAgWydyYXInLCAnYXBwbGljYXRpb24vdm5kLnJhciddLFxuICAgIFsncnRmJywgJ2FwcGxpY2F0aW9uL3J0ZiddLFxuICAgIFsnc2gnLCAnYXBwbGljYXRpb24veC1zaCddLFxuICAgIFsnc3ZnJywgJ2ltYWdlL3N2Zyt4bWwnXSxcbiAgICBbJ3N3ZicsICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCddLFxuICAgIFsndGFyJywgJ2FwcGxpY2F0aW9uL3gtdGFyJ10sXG4gICAgWyd0aWYnLCAnaW1hZ2UvdGlmZiddLFxuICAgIFsndGlmZicsICdpbWFnZS90aWZmJ10sXG4gICAgWyd0cycsICd2aWRlby9tcDJ0J10sXG4gICAgWyd0dGYnLCAnZm9udC90dGYnXSxcbiAgICBbJ3R4dCcsICd0ZXh0L3BsYWluJ10sXG4gICAgWyd2c2QnLCAnYXBwbGljYXRpb24vdm5kLnZpc2lvJ10sXG4gICAgWyd3YXYnLCAnYXVkaW8vd2F2J10sXG4gICAgWyd3ZWJhJywgJ2F1ZGlvL3dlYm0nXSxcbiAgICBbJ3dlYm0nLCAndmlkZW8vd2VibSddLFxuICAgIFsnd2VicCcsICdpbWFnZS93ZWJwJ10sXG4gICAgWyd3b2ZmJywgJ2ZvbnQvd29mZiddLFxuICAgIFsnd29mZjInLCAnZm9udC93b2ZmMiddLFxuICAgIFsneGh0bWwnLCAnYXBwbGljYXRpb24veGh0bWwreG1sJ10sXG4gICAgWyd4bHMnLCAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJ10sXG4gICAgWyd4bHN4JywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0J10sXG4gICAgWyd4bWwnLCAnYXBwbGljYXRpb24veG1sJ10sXG4gICAgWyd4dWwnLCAnYXBwbGljYXRpb24vdm5kLm1vemlsbGEueHVsK3htbCddLFxuICAgIFsnemlwJywgJ2FwcGxpY2F0aW9uL3ppcCddLFxuICAgIFsnN3onLCAnYXBwbGljYXRpb24veC03ei1jb21wcmVzc2VkJ10sXG4gICAgLy8gT3RoZXJzXG4gICAgWydta3YnLCAndmlkZW8veC1tYXRyb3NrYSddLFxuICAgIFsnbW92JywgJ3ZpZGVvL3F1aWNrdGltZSddLFxuICAgIFsnbXNnJywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rJ11cbl0pO1xuZXhwb3J0IGZ1bmN0aW9uIHRvRmlsZVdpdGhQYXRoKGZpbGUsIHBhdGgpIHtcbiAgICB2YXIgZiA9IHdpdGhNaW1lVHlwZShmaWxlKTtcbiAgICBpZiAodHlwZW9mIGYucGF0aCAhPT0gJ3N0cmluZycpIHsgLy8gb24gZWxlY3Ryb24sIHBhdGggaXMgYWxyZWFkeSBzZXQgdG8gdGhlIGFic29sdXRlIHBhdGhcbiAgICAgICAgdmFyIHdlYmtpdFJlbGF0aXZlUGF0aCA9IGZpbGUud2Via2l0UmVsYXRpdmVQYXRoO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgJ3BhdGgnLCB7XG4gICAgICAgICAgICB2YWx1ZTogdHlwZW9mIHBhdGggPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBwYXRoXG4gICAgICAgICAgICAgICAgLy8gSWYgPGlucHV0IHdlYmtpdGRpcmVjdG9yeT4gaXMgc2V0LFxuICAgICAgICAgICAgICAgIC8vIHRoZSBGaWxlIHdpbGwgaGF2ZSBhIHt3ZWJraXRSZWxhdGl2ZVBhdGh9IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxJbnB1dEVsZW1lbnQvd2Via2l0ZGlyZWN0b3J5XG4gICAgICAgICAgICAgICAgOiB0eXBlb2Ygd2Via2l0UmVsYXRpdmVQYXRoID09PSAnc3RyaW5nJyAmJiB3ZWJraXRSZWxhdGl2ZVBhdGgubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICA/IHdlYmtpdFJlbGF0aXZlUGF0aFxuICAgICAgICAgICAgICAgICAgICA6IGZpbGUubmFtZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZjtcbn1cbmZ1bmN0aW9uIHdpdGhNaW1lVHlwZShmaWxlKSB7XG4gICAgdmFyIG5hbWUgPSBmaWxlLm5hbWU7XG4gICAgdmFyIGhhc0V4dGVuc2lvbiA9IG5hbWUgJiYgbmFtZS5sYXN0SW5kZXhPZignLicpICE9PSAtMTtcbiAgICBpZiAoaGFzRXh0ZW5zaW9uICYmICFmaWxlLnR5cGUpIHtcbiAgICAgICAgdmFyIGV4dCA9IG5hbWUuc3BsaXQoJy4nKVxuICAgICAgICAgICAgLnBvcCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciB0eXBlID0gQ09NTU9OX01JTUVfVFlQRVMuZ2V0KGV4dCk7XG4gICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmlsZSwgJ3R5cGUnLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHR5cGUsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbGU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgdG9GaWxlV2l0aFBhdGggfSBmcm9tICcuL2ZpbGUnO1xudmFyIEZJTEVTX1RPX0lHTk9SRSA9IFtcbiAgICAvLyBUaHVtYm5haWwgY2FjaGUgZmlsZXMgZm9yIG1hY09TIGFuZCBXaW5kb3dzXG4gICAgJy5EU19TdG9yZScsXG4gICAgJ1RodW1icy5kYicgLy8gV2luZG93c1xuXTtcbi8qKlxuICogQ29udmVydCBhIERyYWdFdmVudCdzIERhdGFUcmFzZmVyIG9iamVjdCB0byBhIGxpc3Qgb2YgRmlsZSBvYmplY3RzXG4gKiBOT1RFOiBJZiBzb21lIG9mIHRoZSBpdGVtcyBhcmUgZm9sZGVycyxcbiAqIGV2ZXJ5dGhpbmcgd2lsbCBiZSBmbGF0dGVuZWQgYW5kIHBsYWNlZCBpbiB0aGUgc2FtZSBsaXN0IGJ1dCB0aGUgcGF0aHMgd2lsbCBiZSBrZXB0IGFzIGEge3BhdGh9IHByb3BlcnR5LlxuICpcbiAqIEVYUEVSSU1FTlRBTDogQSBsaXN0IG9mIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtSGFuZGxlIG9iamVjdHMgY2FuIGFsc28gYmUgcGFzc2VkIGFzIGFuIGFyZ1xuICogYW5kIGEgbGlzdCBvZiBGaWxlIG9iamVjdHMgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gZXZ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRXZlbnQoZXZ0KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QoZXZ0KSAmJiBpc0RhdGFUcmFuc2ZlcihldnQuZGF0YVRyYW5zZmVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBnZXREYXRhVHJhbnNmZXJGaWxlcyhldnQuZGF0YVRyYW5zZmVyLCBldnQudHlwZSldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNDaGFuZ2VFdnQoZXZ0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBnZXRJbnB1dEZpbGVzKGV2dCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShldnQpICYmIGV2dC5ldmVyeShmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gJ2dldEZpbGUnIGluIGl0ZW0gJiYgdHlwZW9mIGl0ZW0uZ2V0RmlsZSA9PT0gJ2Z1bmN0aW9uJzsgfSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZ2V0RnNIYW5kbGVGaWxlcyhldnQpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBbXV07XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaXNEYXRhVHJhbnNmZXIodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpO1xufVxuZnVuY3Rpb24gaXNDaGFuZ2VFdnQodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIGlzT2JqZWN0KHZhbHVlLnRhcmdldCk7XG59XG5mdW5jdGlvbiBpc09iamVjdCh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0SW5wdXRGaWxlcyhldnQpIHtcbiAgICByZXR1cm4gZnJvbUxpc3QoZXZ0LnRhcmdldC5maWxlcykubWFwKGZ1bmN0aW9uIChmaWxlKSB7IHJldHVybiB0b0ZpbGVXaXRoUGF0aChmaWxlKTsgfSk7XG59XG4vLyBFZSBleHBlY3QgZWFjaCBoYW5kbGUgdG8gYmUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1GaWxlSGFuZGxlXG5mdW5jdGlvbiBnZXRGc0hhbmRsZUZpbGVzKGhhbmRsZXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmaWxlcztcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoaGFuZGxlcy5tYXAoZnVuY3Rpb24gKGgpIHsgcmV0dXJuIGguZ2V0RmlsZSgpOyB9KSldO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmaWxlcy5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIHRvRmlsZVdpdGhQYXRoKGZpbGUpOyB9KV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0RGF0YVRyYW5zZmVyRmlsZXMoZHQsIHR5cGUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpdGVtcywgZmlsZXM7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmICghZHQuaXRlbXMpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IGZyb21MaXN0KGR0Lml0ZW1zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gaXRlbS5raW5kID09PSAnZmlsZSc7IH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZG5kLmh0bWwjZG5kZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5ICdkcmFnc3RhcnQnIGFuZCAnZHJvcCcgaGFzIGFjY2VzcyB0byB0aGUgZGF0YSAoc291cmNlIG5vZGUpXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSAnZHJvcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBpdGVtc107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoaXRlbXMubWFwKHRvRmlsZVByb21pc2VzKSldO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBub0lnbm9yZWRGaWxlcyhmbGF0dGVuKGZpbGVzKSldO1xuICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5vSWdub3JlZEZpbGVzKGZyb21MaXN0KGR0LmZpbGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoZmlsZSkgeyByZXR1cm4gdG9GaWxlV2l0aFBhdGgoZmlsZSk7IH0pKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gbm9JZ25vcmVkRmlsZXMoZmlsZXMpIHtcbiAgICByZXR1cm4gZmlsZXMuZmlsdGVyKGZ1bmN0aW9uIChmaWxlKSB7IHJldHVybiBGSUxFU19UT19JR05PUkUuaW5kZXhPZihmaWxlLm5hbWUpID09PSAtMTsgfSk7XG59XG4vLyBJRTExIGRvZXMgbm90IHN1cHBvcnQgQXJyYXkuZnJvbSgpXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9mcm9tI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVMaXN0XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVySXRlbUxpc3RcbmZ1bmN0aW9uIGZyb21MaXN0KGl0ZW1zKSB7XG4gICAgaWYgKGl0ZW1zID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdmFyIGZpbGVzID0gW107XG4gICAgLy8gdHNsaW50OmRpc2FibGU6IHByZWZlci1mb3Itb2ZcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmaWxlID0gaXRlbXNbaV07XG4gICAgICAgIGZpbGVzLnB1c2goZmlsZSk7XG4gICAgfVxuICAgIHJldHVybiBmaWxlcztcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9EYXRhVHJhbnNmZXJJdGVtXG5mdW5jdGlvbiB0b0ZpbGVQcm9taXNlcyhpdGVtKSB7XG4gICAgaWYgKHR5cGVvZiBpdGVtLndlYmtpdEdldEFzRW50cnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZyb21EYXRhVHJhbnNmZXJJdGVtKGl0ZW0pO1xuICAgIH1cbiAgICB2YXIgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTtcbiAgICAvLyBTYWZhcmkgc3VwcG9ydHMgZHJvcHBpbmcgYW4gaW1hZ2Ugbm9kZSBmcm9tIGEgZGlmZmVyZW50IHdpbmRvdyBhbmQgY2FuIGJlIHJldHJpZXZlZCB1c2luZ1xuICAgIC8vIHRoZSBEYXRhVHJhbnNmZXJJdGVtLmdldEFzRmlsZSgpIEFQSVxuICAgIC8vIE5PVEU6IEZpbGVTeXN0ZW1FbnRyeS5maWxlKCkgdGhyb3dzIGlmIHRyeWluZyB0byBnZXQgdGhlIGZpbGVcbiAgICBpZiAoZW50cnkgJiYgZW50cnkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgcmV0dXJuIGZyb21EaXJFbnRyeShlbnRyeSk7XG4gICAgfVxuICAgIHJldHVybiBmcm9tRGF0YVRyYW5zZmVySXRlbShpdGVtKTtcbn1cbmZ1bmN0aW9uIGZsYXR0ZW4oaXRlbXMpIHtcbiAgICByZXR1cm4gaXRlbXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGZpbGVzKSB7IHJldHVybiBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhY2MpLCBmYWxzZSksIF9fcmVhZCgoQXJyYXkuaXNBcnJheShmaWxlcykgPyBmbGF0dGVuKGZpbGVzKSA6IFtmaWxlc10pKSwgZmFsc2UpOyB9LCBbXSk7XG59XG5mdW5jdGlvbiBmcm9tRGF0YVRyYW5zZmVySXRlbShpdGVtKSB7XG4gICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSgpO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJcIi5jb25jYXQoaXRlbSwgXCIgaXMgbm90IGEgRmlsZVwiKSk7XG4gICAgfVxuICAgIHZhciBmd3AgPSB0b0ZpbGVXaXRoUGF0aChmaWxlKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZ3cCk7XG59XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZVN5c3RlbUVudHJ5XG5mdW5jdGlvbiBmcm9tRW50cnkoZW50cnkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBlbnRyeS5pc0RpcmVjdG9yeSA/IGZyb21EaXJFbnRyeShlbnRyeSkgOiBmcm9tRmlsZUVudHJ5KGVudHJ5KV07XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1EaXJlY3RvcnlFbnRyeVxuZnVuY3Rpb24gZnJvbURpckVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgICAgIGZ1bmN0aW9uIHJlYWRFbnRyaWVzKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtRGlyZWN0b3J5RW50cnkvY3JlYXRlUmVhZGVyXG4gICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZVN5c3RlbURpcmVjdG9yeVJlYWRlci9yZWFkRW50cmllc1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChiYXRjaCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBmaWxlcywgZXJyXzEsIGl0ZW1zO1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWJhdGNoLmxlbmd0aCkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoZW50cmllcyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gUHJvbWlzZS5hbGwoYmF0Y2gubWFwKGZyb21FbnRyeSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChpdGVtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUgcmVhZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pOyB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZWFkRW50cmllcygpO1xuICAgIH0pO1xufVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1GaWxlRW50cnlcbmZ1bmN0aW9uIGZyb21GaWxlRW50cnkoZW50cnkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5LmZpbGUoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmd3AgPSB0b0ZpbGVXaXRoUGF0aChmaWxlLCBlbnRyeS5mdWxsUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZ3cCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZS1zZWxlY3Rvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKGZpbGUsIGFjY2VwdGVkRmlsZXMpIHtcbiAgaWYgKGZpbGUgJiYgYWNjZXB0ZWRGaWxlcykge1xuICAgIHZhciBhY2NlcHRlZEZpbGVzQXJyYXkgPSBBcnJheS5pc0FycmF5KGFjY2VwdGVkRmlsZXMpID8gYWNjZXB0ZWRGaWxlcyA6IGFjY2VwdGVkRmlsZXMuc3BsaXQoJywnKTtcbiAgICB2YXIgZmlsZU5hbWUgPSBmaWxlLm5hbWUgfHwgJyc7XG4gICAgdmFyIG1pbWVUeXBlID0gKGZpbGUudHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgYmFzZU1pbWVUeXBlID0gbWltZVR5cGUucmVwbGFjZSgvXFwvLiokLywgJycpO1xuICAgIHJldHVybiBhY2NlcHRlZEZpbGVzQXJyYXkuc29tZShmdW5jdGlvbiAodHlwZSkge1xuICAgICAgdmFyIHZhbGlkVHlwZSA9IHR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmICh2YWxpZFR5cGUuY2hhckF0KDApID09PSAnLicpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgodmFsaWRUeXBlKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsaWRUeXBlLmVuZHNXaXRoKCcvKicpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgc29tZXRoaW5nIGxpa2UgYSBpbWFnZS8qIG1pbWUgdHlwZVxuICAgICAgICByZXR1cm4gYmFzZU1pbWVUeXBlID09PSB2YWxpZFR5cGUucmVwbGFjZSgvXFwvLiokLywgJycpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWltZVR5cGUgPT09IHZhbGlkVHlwZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTsiLCJpbXBvcnQgX2FjY2VwdHMgZnJvbSBcImF0dHItYWNjZXB0XCI7XG5cbmNvbnN0IGFjY2VwdHMgPSB0eXBlb2YgX2FjY2VwdHMgPT09IFwiZnVuY3Rpb25cIiA/IF9hY2NlcHRzIDogX2FjY2VwdHMuZGVmYXVsdDtcblxuLy8gRXJyb3IgY29kZXNcbmV4cG9ydCBjb25zdCBGSUxFX0lOVkFMSURfVFlQRSA9IFwiZmlsZS1pbnZhbGlkLXR5cGVcIjtcbmV4cG9ydCBjb25zdCBGSUxFX1RPT19MQVJHRSA9IFwiZmlsZS10b28tbGFyZ2VcIjtcbmV4cG9ydCBjb25zdCBGSUxFX1RPT19TTUFMTCA9IFwiZmlsZS10b28tc21hbGxcIjtcbmV4cG9ydCBjb25zdCBUT09fTUFOWV9GSUxFUyA9IFwidG9vLW1hbnktZmlsZXNcIjtcblxuZXhwb3J0IGNvbnN0IEVycm9yQ29kZSA9IHtcbiAgRmlsZUludmFsaWRUeXBlOiBGSUxFX0lOVkFMSURfVFlQRSxcbiAgRmlsZVRvb0xhcmdlOiBGSUxFX1RPT19MQVJHRSxcbiAgRmlsZVRvb1NtYWxsOiBGSUxFX1RPT19TTUFMTCxcbiAgVG9vTWFueUZpbGVzOiBUT09fTUFOWV9GSUxFUyxcbn07XG5cbi8vIEZpbGUgRXJyb3JzXG5leHBvcnQgY29uc3QgZ2V0SW52YWxpZFR5cGVSZWplY3Rpb25FcnIgPSAoYWNjZXB0KSA9PiB7XG4gIGFjY2VwdCA9IEFycmF5LmlzQXJyYXkoYWNjZXB0KSAmJiBhY2NlcHQubGVuZ3RoID09PSAxID8gYWNjZXB0WzBdIDogYWNjZXB0O1xuICBjb25zdCBtZXNzYWdlU3VmZml4ID0gQXJyYXkuaXNBcnJheShhY2NlcHQpXG4gICAgPyBgb25lIG9mICR7YWNjZXB0LmpvaW4oXCIsIFwiKX1gXG4gICAgOiBhY2NlcHQ7XG4gIHJldHVybiB7XG4gICAgY29kZTogRklMRV9JTlZBTElEX1RZUEUsXG4gICAgbWVzc2FnZTogYEZpbGUgdHlwZSBtdXN0IGJlICR7bWVzc2FnZVN1ZmZpeH1gLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRvb0xhcmdlUmVqZWN0aW9uRXJyID0gKG1heFNpemUpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBGSUxFX1RPT19MQVJHRSxcbiAgICBtZXNzYWdlOiBgRmlsZSBpcyBsYXJnZXIgdGhhbiAke21heFNpemV9ICR7XG4gICAgICBtYXhTaXplID09PSAxID8gXCJieXRlXCIgOiBcImJ5dGVzXCJcbiAgICB9YCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUb29TbWFsbFJlamVjdGlvbkVyciA9IChtaW5TaXplKSA9PiB7XG4gIHJldHVybiB7XG4gICAgY29kZTogRklMRV9UT09fU01BTEwsXG4gICAgbWVzc2FnZTogYEZpbGUgaXMgc21hbGxlciB0aGFuICR7bWluU2l6ZX0gJHtcbiAgICAgIG1pblNpemUgPT09IDEgPyBcImJ5dGVcIiA6IFwiYnl0ZXNcIlxuICAgIH1gLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IFRPT19NQU5ZX0ZJTEVTX1JFSkVDVElPTiA9IHtcbiAgY29kZTogVE9PX01BTllfRklMRVMsXG4gIG1lc3NhZ2U6IFwiVG9vIG1hbnkgZmlsZXNcIixcbn07XG5cbi8vIEZpcmVmb3ggdmVyc2lvbnMgcHJpb3IgdG8gNTMgcmV0dXJuIGEgYm9ndXMgTUlNRSB0eXBlIGZvciBldmVyeSBmaWxlIGRyYWcsIHNvIGRyYWdvdmVycyB3aXRoXG4vLyB0aGF0IE1JTUUgdHlwZSB3aWxsIGFsd2F5cyBiZSBhY2NlcHRlZFxuZXhwb3J0IGZ1bmN0aW9uIGZpbGVBY2NlcHRlZChmaWxlLCBhY2NlcHQpIHtcbiAgY29uc3QgaXNBY2NlcHRhYmxlID1cbiAgICBmaWxlLnR5cGUgPT09IFwiYXBwbGljYXRpb24veC1tb3otZmlsZVwiIHx8IGFjY2VwdHMoZmlsZSwgYWNjZXB0KTtcbiAgcmV0dXJuIFtcbiAgICBpc0FjY2VwdGFibGUsXG4gICAgaXNBY2NlcHRhYmxlID8gbnVsbCA6IGdldEludmFsaWRUeXBlUmVqZWN0aW9uRXJyKGFjY2VwdCksXG4gIF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWxlTWF0Y2hTaXplKGZpbGUsIG1pblNpemUsIG1heFNpemUpIHtcbiAgaWYgKGlzRGVmaW5lZChmaWxlLnNpemUpKSB7XG4gICAgaWYgKGlzRGVmaW5lZChtaW5TaXplKSAmJiBpc0RlZmluZWQobWF4U2l6ZSkpIHtcbiAgICAgIGlmIChmaWxlLnNpemUgPiBtYXhTaXplKSByZXR1cm4gW2ZhbHNlLCBnZXRUb29MYXJnZVJlamVjdGlvbkVycihtYXhTaXplKV07XG4gICAgICBpZiAoZmlsZS5zaXplIDwgbWluU2l6ZSkgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vU21hbGxSZWplY3Rpb25FcnIobWluU2l6ZSldO1xuICAgIH0gZWxzZSBpZiAoaXNEZWZpbmVkKG1pblNpemUpICYmIGZpbGUuc2l6ZSA8IG1pblNpemUpXG4gICAgICByZXR1cm4gW2ZhbHNlLCBnZXRUb29TbWFsbFJlamVjdGlvbkVycihtaW5TaXplKV07XG4gICAgZWxzZSBpZiAoaXNEZWZpbmVkKG1heFNpemUpICYmIGZpbGUuc2l6ZSA+IG1heFNpemUpXG4gICAgICByZXR1cm4gW2ZhbHNlLCBnZXRUb29MYXJnZVJlamVjdGlvbkVycihtYXhTaXplKV07XG4gIH1cbiAgcmV0dXJuIFt0cnVlLCBudWxsXTtcbn1cblxuZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtGaWxlW119IG9wdGlvbnMuZmlsZXNcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbb3B0aW9ucy5hY2NlcHRdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluU2l6ZV1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhTaXplXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5tdWx0aXBsZV1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhGaWxlc11cbiAqIEBwYXJhbSB7KGY6IEZpbGUpID0+IEZpbGVFcnJvcnxGaWxlRXJyb3JbXXxudWxsfSBbb3B0aW9ucy52YWxpZGF0b3JdXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsRmlsZXNBY2NlcHRlZCh7XG4gIGZpbGVzLFxuICBhY2NlcHQsXG4gIG1pblNpemUsXG4gIG1heFNpemUsXG4gIG11bHRpcGxlLFxuICBtYXhGaWxlcyxcbiAgdmFsaWRhdG9yLFxufSkge1xuICBpZiAoXG4gICAgKCFtdWx0aXBsZSAmJiBmaWxlcy5sZW5ndGggPiAxKSB8fFxuICAgIChtdWx0aXBsZSAmJiBtYXhGaWxlcyA+PSAxICYmIGZpbGVzLmxlbmd0aCA+IG1heEZpbGVzKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZmlsZXMuZXZlcnkoKGZpbGUpID0+IHtcbiAgICBjb25zdCBbYWNjZXB0ZWRdID0gZmlsZUFjY2VwdGVkKGZpbGUsIGFjY2VwdCk7XG4gICAgY29uc3QgW3NpemVNYXRjaF0gPSBmaWxlTWF0Y2hTaXplKGZpbGUsIG1pblNpemUsIG1heFNpemUpO1xuICAgIGNvbnN0IGN1c3RvbUVycm9ycyA9IHZhbGlkYXRvciA/IHZhbGlkYXRvcihmaWxlKSA6IG51bGw7XG4gICAgcmV0dXJuIGFjY2VwdGVkICYmIHNpemVNYXRjaCAmJiAhY3VzdG9tRXJyb3JzO1xuICB9KTtcbn1cblxuLy8gUmVhY3QncyBzeW50aGV0aWMgZXZlbnRzIGhhcyBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCxcbi8vIGJ1dCB0byByZW1haW4gY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGxpYnMgKFByZWFjdCkgZmFsbCBiYWNrXG4vLyB0byBjaGVjayBldmVudC5jYW5jZWxCdWJibGVcbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3BhZ2F0aW9uU3RvcHBlZChldmVudCkge1xuICBpZiAodHlwZW9mIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIGV2ZW50LmNhbmNlbEJ1YmJsZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0V2dFdpdGhGaWxlcyhldmVudCkge1xuICBpZiAoIWV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgIHJldHVybiAhIWV2ZW50LnRhcmdldCAmJiAhIWV2ZW50LnRhcmdldC5maWxlcztcbiAgfVxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVyL3R5cGVzXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MX0RyYWdfYW5kX0Ryb3BfQVBJL1JlY29tbWVuZGVkX2RyYWdfdHlwZXMjZmlsZVxuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbChcbiAgICBldmVudC5kYXRhVHJhbnNmZXIudHlwZXMsXG4gICAgKHR5cGUpID0+IHR5cGUgPT09IFwiRmlsZXNcIiB8fCB0eXBlID09PSBcImFwcGxpY2F0aW9uL3gtbW96LWZpbGVcIlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNLaW5kRmlsZShpdGVtKSB7XG4gIHJldHVybiB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJiBpdGVtICE9PSBudWxsICYmIGl0ZW0ua2luZCA9PT0gXCJmaWxlXCI7XG59XG5cbi8vIGFsbG93IHRoZSBlbnRpcmUgZG9jdW1lbnQgdG8gYmUgYSBkcmFnIHRhcmdldFxuZXhwb3J0IGZ1bmN0aW9uIG9uRG9jdW1lbnREcmFnT3ZlcihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG5mdW5jdGlvbiBpc0llKHVzZXJBZ2VudCkge1xuICByZXR1cm4gKFxuICAgIHVzZXJBZ2VudC5pbmRleE9mKFwiTVNJRVwiKSAhPT0gLTEgfHwgdXNlckFnZW50LmluZGV4T2YoXCJUcmlkZW50L1wiKSAhPT0gLTFcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNFZGdlKHVzZXJBZ2VudCkge1xuICByZXR1cm4gdXNlckFnZW50LmluZGV4T2YoXCJFZGdlL1wiKSAhPT0gLTE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0llT3JFZGdlKHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSB7XG4gIHJldHVybiBpc0llKHVzZXJBZ2VudCkgfHwgaXNFZGdlKHVzZXJBZ2VudCk7XG59XG5cbi8qKlxuICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNvbXBvc2UgZXZlbnQgaGFuZGxlcnNcbiAqIFRoZXkgYXJlIGV4ZWN1dGVkIGluIG9yZGVyIHVudGlsIG9uZSBvZiB0aGVtIGNhbGxzIGBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpYC5cbiAqIE5vdGUgdGhhdCB0aGUgY2hlY2sgaXMgZG9uZSBvbiB0aGUgZmlyc3QgaW52b2tlIHRvbyxcbiAqIG1lYW5pbmcgdGhhdCBpZiBwcm9wYWdhdGlvbiB3YXMgc3RvcHBlZCBiZWZvcmUgaW52b2tpbmcgdGhlIGZucyxcbiAqIG5vIGhhbmRsZXJzIHdpbGwgYmUgZXhlY3V0ZWQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5zIHRoZSBldmVudCBoYW5sZGVyIGZ1bmN0aW9uc1xuICogQHJldHVybiB7RnVuY3Rpb259IHRoZSBldmVudCBoYW5kbGVyIHRvIGFkZCB0byBhbiBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlRXZlbnRIYW5kbGVycyguLi5mbnMpIHtcbiAgcmV0dXJuIChldmVudCwgLi4uYXJncykgPT5cbiAgICBmbnMuc29tZSgoZm4pID0+IHtcbiAgICAgIGlmICghaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpICYmIGZuKSB7XG4gICAgICAgIGZuKGV2ZW50LCAuLi5hcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1Byb3BhZ2F0aW9uU3RvcHBlZChldmVudCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogY2FuVXNlRmlsZVN5c3RlbUFjY2Vzc0FQSSBjaGVja3MgaWYgdGhlIFtGaWxlIFN5c3RlbSBBY2Nlc3MgQVBJXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZV9TeXN0ZW1fQWNjZXNzX0FQSSlcbiAqIGlzIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuVXNlRmlsZVN5c3RlbUFjY2Vzc0FQSSgpIHtcbiAgcmV0dXJuIFwic2hvd09wZW5GaWxlUGlja2VyXCIgaW4gd2luZG93O1xufVxuXG4vKipcbiAqIENvbnZlcnQgdGhlIGB7YWNjZXB0fWAgZHJvcHpvbmUgcHJvcCB0byB0aGVcbiAqIGB7dHlwZXN9YCBvcHRpb24gZm9yIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS93aW5kb3cvc2hvd09wZW5GaWxlUGlja2VyXG4gKlxuICogQHBhcmFtIHtBY2NlcHRQcm9wfSBhY2NlcHRcbiAqIEByZXR1cm5zIHt7YWNjZXB0OiBzdHJpbmdbXX1bXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tlck9wdGlvbnNGcm9tQWNjZXB0KGFjY2VwdCkge1xuICBpZiAoaXNEZWZpbmVkKGFjY2VwdCkpIHtcbiAgICBjb25zdCBhY2NlcHRGb3JQaWNrZXIgPSBPYmplY3QuZW50cmllcyhhY2NlcHQpXG4gICAgICAuZmlsdGVyKChbbWltZVR5cGUsIGV4dF0pID0+IHtcbiAgICAgICAgbGV0IG9rID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIWlzTUlNRVR5cGUobWltZVR5cGUpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFNraXBwZWQgXCIke21pbWVUeXBlfVwiIGJlY2F1c2UgaXQgaXMgbm90IGEgdmFsaWQgTUlNRSB0eXBlLiBDaGVjayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0Jhc2ljc19vZl9IVFRQL01JTUVfdHlwZXMvQ29tbW9uX3R5cGVzIGZvciBhIGxpc3Qgb2YgdmFsaWQgTUlNRSB0eXBlcy5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBvayA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV4dCkgfHwgIWV4dC5ldmVyeShpc0V4dCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgU2tpcHBlZCBcIiR7bWltZVR5cGV9XCIgYmVjYXVzZSBhbiBpbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIHdhcyBwcm92aWRlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBvayA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9rO1xuICAgICAgfSlcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhZ2csIFttaW1lVHlwZSwgZXh0XSkgPT4gKHtcbiAgICAgICAgICAuLi5hZ2csXG4gICAgICAgICAgW21pbWVUeXBlXTogZXh0LFxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICAgICk7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgLy8gZGVzY3JpcHRpb24gaXMgcmVxdWlyZWQgZHVlIHRvIGh0dHBzOi8vY3JidWcuY29tLzEyNjQ3MDhcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRmlsZXNcIixcbiAgICAgICAgYWNjZXB0OiBhY2NlcHRGb3JQaWNrZXIsXG4gICAgICB9LFxuICAgIF07XG4gIH1cbiAgcmV0dXJuIGFjY2VwdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBge2FjY2VwdH1gIGRyb3B6b25lIHByb3AgdG8gYW4gYXJyYXkgb2YgTUlNRSB0eXBlcy9leHRlbnNpb25zLlxuICogQHBhcmFtIHtBY2NlcHRQcm9wfSBhY2NlcHRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY2NlcHRQcm9wQXNBY2NlcHRBdHRyKGFjY2VwdCkge1xuICBpZiAoaXNEZWZpbmVkKGFjY2VwdCkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgT2JqZWN0LmVudHJpZXMoYWNjZXB0KVxuICAgICAgICAucmVkdWNlKChhLCBbbWltZVR5cGUsIGV4dF0pID0+IFsuLi5hLCBtaW1lVHlwZSwgLi4uZXh0XSwgW10pXG4gICAgICAgIC8vIFNpbGVudGx5IGRpc2NhcmQgaW52YWxpZCBlbnRyaWVzIGFzIHBpY2tlck9wdGlvbnNGcm9tQWNjZXB0IHdhcm5zIGFib3V0IHRoZXNlXG4gICAgICAgIC5maWx0ZXIoKHYpID0+IGlzTUlNRVR5cGUodikgfHwgaXNFeHQodikpXG4gICAgICAgIC5qb2luKFwiLFwiKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHYgaXMgYW4gZXhjZXB0aW9uIGNhdXNlZCBieSBhYm9ydGluZyBhIHJlcXVlc3QgKGUuZyB3aW5kb3cuc2hvd09wZW5GaWxlUGlja2VyKCkpLlxuICpcbiAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRE9NRXhjZXB0aW9uLlxuICogQHBhcmFtIHthbnl9IHZcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHYgaXMgYW4gYWJvcnQgZXhjZXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBYm9ydCh2KSB7XG4gIHJldHVybiAoXG4gICAgdiBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJlxuICAgICh2Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiIHx8IHYuY29kZSA9PT0gdi5BQk9SVF9FUlIpXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdiBpcyBhIHNlY3VyaXR5IGVycm9yLlxuICpcbiAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRE9NRXhjZXB0aW9uLlxuICogQHBhcmFtIHthbnl9IHZcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHYgaXMgYSBzZWN1cml0eSBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VjdXJpdHlFcnJvcih2KSB7XG4gIHJldHVybiAoXG4gICAgdiBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJlxuICAgICh2Lm5hbWUgPT09IFwiU2VjdXJpdHlFcnJvclwiIHx8IHYuY29kZSA9PT0gdi5TRUNVUklUWV9FUlIpXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdiBpcyBhIE1JTUUgdHlwZSBzdHJpbmcuXG4gKlxuICogU2VlIGFjY2VwdGVkIGZvcm1hdDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0L2ZpbGUjdW5pcXVlX2ZpbGVfdHlwZV9zcGVjaWZpZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01JTUVUeXBlKHYpIHtcbiAgcmV0dXJuIChcbiAgICB2ID09PSBcImF1ZGlvLypcIiB8fFxuICAgIHYgPT09IFwidmlkZW8vKlwiIHx8XG4gICAgdiA9PT0gXCJpbWFnZS8qXCIgfHxcbiAgICB2ID09PSBcInRleHQvKlwiIHx8XG4gICAgL1xcdytcXC9bLSsuXFx3XSsvZy50ZXN0KHYpXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdiBpcyBhIGZpbGUgZXh0ZW5zaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXh0KHYpIHtcbiAgcmV0dXJuIC9eLipcXC5bXFx3XSskLy50ZXN0KHYpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3QuPHN0cmluZywgc3RyaW5nW10+fSBBY2NlcHRQcm9wXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaWxlRXJyb3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcHJvcGVydHkge0Vycm9yQ29kZXxzdHJpbmd9IGNvZGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtcImZpbGUtaW52YWxpZC10eXBlXCJ8XCJmaWxlLXRvby1sYXJnZVwifFwiZmlsZS10b28tc21hbGxcInxcInRvby1tYW55LWZpbGVzXCJ9IEVycm9yQ29kZVxuICovXG4iLCIvKiBlc2xpbnQgcHJlZmVyLXRlbXBsYXRlOiAwICovXG5pbXBvcnQgUmVhY3QsIHtcbiAgZm9yd2FyZFJlZixcbiAgRnJhZ21lbnQsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZHVjZXIsXG4gIHVzZVJlZixcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tIFwiZmlsZS1zZWxlY3RvclwiO1xuaW1wb3J0IHtcbiAgYWNjZXB0UHJvcEFzQWNjZXB0QXR0cixcbiAgYWxsRmlsZXNBY2NlcHRlZCxcbiAgY29tcG9zZUV2ZW50SGFuZGxlcnMsXG4gIGZpbGVBY2NlcHRlZCxcbiAgZmlsZU1hdGNoU2l6ZSxcbiAgY2FuVXNlRmlsZVN5c3RlbUFjY2Vzc0FQSSxcbiAgaXNBYm9ydCxcbiAgaXNFdnRXaXRoRmlsZXMsXG4gIGlzSWVPckVkZ2UsXG4gIGlzUHJvcGFnYXRpb25TdG9wcGVkLFxuICBpc1NlY3VyaXR5RXJyb3IsXG4gIG9uRG9jdW1lbnREcmFnT3ZlcixcbiAgcGlja2VyT3B0aW9uc0Zyb21BY2NlcHQsXG4gIFRPT19NQU5ZX0ZJTEVTX1JFSkVDVElPTixcbn0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSB3cmFwcGVyIGNvbXBvbmVudCBmb3IgdGhlIGB1c2VEcm9wem9uZWAgaG9va1xuICpcbiAqIGBgYGpzeFxuICogPERyb3B6b25lPlxuICogICB7KHtnZXRSb290UHJvcHMsIGdldElucHV0UHJvcHN9KSA9PiAoXG4gKiAgICAgPGRpdiB7Li4uZ2V0Um9vdFByb3BzKCl9PlxuICogICAgICAgPGlucHV0IHsuLi5nZXRJbnB1dFByb3BzKCl9IC8+XG4gKiAgICAgICA8cD5EcmFnICduJyBkcm9wIHNvbWUgZmlsZXMgaGVyZSwgb3IgY2xpY2sgdG8gc2VsZWN0IGZpbGVzPC9wPlxuICogICAgIDwvZGl2PlxuICogICApfVxuICogPC9Ecm9wem9uZT5cbiAqIGBgYFxuICovXG5jb25zdCBEcm9wem9uZSA9IGZvcndhcmRSZWYoKHsgY2hpbGRyZW4sIC4uLnBhcmFtcyB9LCByZWYpID0+IHtcbiAgY29uc3QgeyBvcGVuLCAuLi5wcm9wcyB9ID0gdXNlRHJvcHpvbmUocGFyYW1zKTtcblxuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHsgb3BlbiB9KSwgW29wZW5dKTtcblxuICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSByZWFjdC1zdHlsZWd1aWRpc3QgY2Fubm90IGNyZWF0ZSBkb2NzIGlmIHdlIGRvbid0IHJldHVybiBhIGpzeCBlbGVtZW50XG4gIHJldHVybiA8RnJhZ21lbnQ+e2NoaWxkcmVuKHsgLi4ucHJvcHMsIG9wZW4gfSl9PC9GcmFnbWVudD47XG59KTtcblxuRHJvcHpvbmUuZGlzcGxheU5hbWUgPSBcIkRyb3B6b25lXCI7XG5cbi8vIEFkZCBkZWZhdWx0IHByb3BzIGZvciByZWFjdC1kb2NnZW5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBnZXRGaWxlc0Zyb21FdmVudDogZnJvbUV2ZW50LFxuICBtYXhTaXplOiBJbmZpbml0eSxcbiAgbWluU2l6ZTogMCxcbiAgbXVsdGlwbGU6IHRydWUsXG4gIG1heEZpbGVzOiAwLFxuICBwcmV2ZW50RHJvcE9uRG9jdW1lbnQ6IHRydWUsXG4gIG5vQ2xpY2s6IGZhbHNlLFxuICBub0tleWJvYXJkOiBmYWxzZSxcbiAgbm9EcmFnOiBmYWxzZSxcbiAgbm9EcmFnRXZlbnRzQnViYmxpbmc6IGZhbHNlLFxuICB2YWxpZGF0b3I6IG51bGwsXG4gIHVzZUZzQWNjZXNzQXBpOiBmYWxzZSxcbiAgYXV0b0ZvY3VzOiBmYWxzZSxcbn07XG5cbkRyb3B6b25lLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuRHJvcHpvbmUucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogUmVuZGVyIGZ1bmN0aW9uIHRoYXQgZXhwb3NlcyB0aGUgZHJvcHpvbmUgc3RhdGUgYW5kIHByb3AgZ2V0dGVyIGZuc1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtcy5nZXRSb290UHJvcHMgUmV0dXJucyB0aGUgcHJvcHMgeW91IHNob3VsZCBhcHBseSB0byB0aGUgcm9vdCBkcm9wIGNvbnRhaW5lciB5b3UgcmVuZGVyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtcy5nZXRJbnB1dFByb3BzIFJldHVybnMgdGhlIHByb3BzIHlvdSBzaG91bGQgYXBwbHkgdG8gaGlkZGVuIGZpbGUgaW5wdXQgeW91IHJlbmRlclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJhbXMub3BlbiBPcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmlzRm9jdXNlZCBEcm9wem9uZSBhcmVhIGlzIGluIGZvY3VzXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmlzRmlsZURpYWxvZ0FjdGl2ZSBGaWxlIGRpYWxvZyBpcyBvcGVuZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNEcmFnQWN0aXZlIEFjdGl2ZSBkcmFnIGlzIGluIHByb2dyZXNzXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmlzRHJhZ0FjY2VwdCBEcmFnZ2VkIGZpbGVzIGFyZSBhY2NlcHRlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5pc0RyYWdSZWplY3QgU29tZSBkcmFnZ2VkIGZpbGVzIGFyZSByZWplY3RlZFxuICAgKiBAcGFyYW0ge0ZpbGVbXX0gcGFyYW1zLmFjY2VwdGVkRmlsZXMgQWNjZXB0ZWQgZmlsZXNcbiAgICogQHBhcmFtIHtGaWxlUmVqZWN0aW9uW119IHBhcmFtcy5maWxlUmVqZWN0aW9ucyBSZWplY3RlZCBmaWxlcyBhbmQgd2h5IHRoZXkgd2VyZSByZWplY3RlZFxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBTZXQgYWNjZXB0ZWQgZmlsZSB0eXBlcy5cbiAgICogQ2hlY2tvdXQgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3dpbmRvdy9zaG93T3BlbkZpbGVQaWNrZXIgdHlwZXMgb3B0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKiBLZWVwIGluIG1pbmQgdGhhdCBtaW1lIHR5cGUgZGV0ZXJtaW5hdGlvbiBpcyBub3QgcmVsaWFibGUgYWNyb3NzIHBsYXRmb3Jtcy4gQ1NWIGZpbGVzLFxuICAgKiBmb3IgZXhhbXBsZSwgYXJlIHJlcG9ydGVkIGFzIHRleHQvcGxhaW4gdW5kZXIgbWFjT1MgYnV0IGFzIGFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCB1bmRlclxuICAgKiBXaW5kb3dzLiBJbiBzb21lIGNhc2VzIHRoZXJlIG1pZ2h0IG5vdCBiZSBhIG1pbWUgdHlwZSBzZXQgYXQgYWxsIChodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZHJvcHpvbmUvcmVhY3QtZHJvcHpvbmUvaXNzdWVzLzI3NikuXG4gICAqL1xuICBhY2NlcHQ6IFByb3BUeXBlcy5vYmplY3RPZihQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSksXG5cbiAgLyoqXG4gICAqIEFsbG93IGRyYWcgJ24nIGRyb3AgKG9yIHNlbGVjdGlvbiBmcm9tIHRoZSBmaWxlIGRpYWxvZykgb2YgbXVsdGlwbGUgZmlsZXNcbiAgICovXG4gIG11bHRpcGxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgZmFsc2UsIGFsbG93IGRyb3BwZWQgaXRlbXMgdG8gdGFrZSBvdmVyIHRoZSBjdXJyZW50IGJyb3dzZXIgd2luZG93XG4gICAqL1xuICBwcmV2ZW50RHJvcE9uRG9jdW1lbnQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBkaXNhYmxlcyBjbGljayB0byBvcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nXG4gICAqL1xuICBub0NsaWNrOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgZGlzYWJsZXMgU1BBQ0UvRU5URVIgdG8gb3BlbiB0aGUgbmF0aXZlIGZpbGUgc2VsZWN0aW9uIGRpYWxvZy5cbiAgICogTm90ZSB0aGF0IGl0IGFsc28gc3RvcHMgdHJhY2tpbmcgdGhlIGZvY3VzIHN0YXRlLlxuICAgKi9cbiAgbm9LZXlib2FyZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGRpc2FibGVzIGRyYWcgJ24nIGRyb3BcbiAgICovXG4gIG5vRHJhZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHN0b3BzIGRyYWcgZXZlbnQgcHJvcGFnYXRpb24gdG8gcGFyZW50c1xuICAgKi9cbiAgbm9EcmFnRXZlbnRzQnViYmxpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBNaW5pbXVtIGZpbGUgc2l6ZSAoaW4gYnl0ZXMpXG4gICAqL1xuICBtaW5TaXplOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGZpbGUgc2l6ZSAoaW4gYnl0ZXMpXG4gICAqL1xuICBtYXhTaXplOiBQcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICogTWF4aW11bSBhY2NlcHRlZCBudW1iZXIgb2YgZmlsZXNcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMCB3aGljaCBtZWFucyB0aGVyZSBpcyBubyBsaW1pdGF0aW9uIHRvIGhvdyBtYW55IGZpbGVzIGFyZSBhY2NlcHRlZC5cbiAgICovXG4gIG1heEZpbGVzOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBFbmFibGUvZGlzYWJsZSB0aGUgZHJvcHpvbmVcbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogVXNlIHRoaXMgdG8gcHJvdmlkZSBhIGN1c3RvbSBmaWxlIGFnZ3JlZ2F0b3JcbiAgICpcbiAgICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnQgQSBkcmFnIGV2ZW50IG9yIGlucHV0IGNoYW5nZSBldmVudCAoaWYgZmlsZXMgd2VyZSBzZWxlY3RlZCB2aWEgdGhlIGZpbGUgZGlhbG9nKVxuICAgKi9cbiAgZ2V0RmlsZXNGcm9tRXZlbnQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiBjbG9zaW5nIHRoZSBmaWxlIGRpYWxvZyB3aXRoIG5vIHNlbGVjdGlvblxuICAgKi9cbiAgb25GaWxlRGlhbG9nQ2FuY2VsOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gb3BlbmluZyB0aGUgZmlsZSBkaWFsb2dcbiAgICovXG4gIG9uRmlsZURpYWxvZ09wZW46IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB0byB1c2UgdGhlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlX1N5c3RlbV9BY2Nlc3NfQVBJXG4gICAqIHRvIG9wZW4gdGhlIGZpbGUgcGlja2VyIGluc3RlYWQgb2YgdXNpbmcgYW4gYDxpbnB1dCB0eXBlPVwiZmlsZVwiPmAgY2xpY2sgZXZlbnQuXG4gICAqL1xuICB1c2VGc0FjY2Vzc0FwaTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHRvIGZvY3VzIHRoZSByb290IGVsZW1lbnQgb24gcmVuZGVyXG4gICAqL1xuICBhdXRvRm9jdXM6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyYWdlbnRlcmAgZXZlbnQgb2NjdXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uRHJhZ0VudGVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcmFnbGVhdmVgIGV2ZW50IG9jY3Vyc1xuICAgKlxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uRHJhZ0xlYXZlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcmFnb3ZlcmAgZXZlbnQgb2NjdXJzXG4gICAqXG4gICAqIEBwYXJhbSB7RHJhZ0V2ZW50fSBldmVudFxuICAgKi9cbiAgb25EcmFnT3ZlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJvcGAgZXZlbnQgb2NjdXJzLlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGFmdGVyIHRoZSBgZ2V0RmlsZXNGcm9tRXZlbnRgIGNhbGxiYWNrIGlzIGRvbmUuXG4gICAqXG4gICAqIEZpbGVzIGFyZSBhY2NlcHRlZCBvciByZWplY3RlZCBiYXNlZCBvbiB0aGUgYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCBhbmQgYG1heFNpemVgIHByb3BzLlxuICAgKiBgYWNjZXB0YCBtdXN0IGJlIGEgdmFsaWQgW01JTUUgdHlwZV0oaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9tZWRpYS10eXBlcy54aHRtbCkgYWNjb3JkaW5nIHRvIFtpbnB1dCBlbGVtZW50IHNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy93aWtpL0hUTUwvRWxlbWVudHMvaW5wdXQvZmlsZSkgb3IgYSB2YWxpZCBmaWxlIGV4dGVuc2lvbi5cbiAgICogSWYgYG11bHRpcGxlYCBpcyBzZXQgdG8gZmFsc2UgYW5kIGFkZGl0aW9uYWwgZmlsZXMgYXJlIGRyb3BwZWQsXG4gICAqIGFsbCBmaWxlcyBiZXNpZGVzIHRoZSBmaXJzdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBBbnkgZmlsZSB3aGljaCBkb2VzIG5vdCBoYXZlIGEgc2l6ZSBpbiB0aGUgW2BtaW5TaXplYCwgYG1heFNpemVgXSByYW5nZSwgd2lsbCBiZSByZWplY3RlZCBhcyB3ZWxsLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIGBvbkRyb3BgIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGJlIGludm9rZWQgcmVnYXJkbGVzcyBpZiB0aGUgZHJvcHBlZCBmaWxlcyB3ZXJlIGFjY2VwdGVkIG9yIHJlamVjdGVkLlxuICAgKiBJZiB5b3UnZCBsaWtlIHRvIHJlYWN0IHRvIGEgc3BlY2lmaWMgc2NlbmFyaW8sIHVzZSB0aGUgYG9uRHJvcEFjY2VwdGVkYC9gb25Ecm9wUmVqZWN0ZWRgIHByb3BzLlxuICAgKlxuICAgKiBgb25Ecm9wYCB3aWxsIHByb3ZpZGUgeW91IHdpdGggYW4gYXJyYXkgb2YgW0ZpbGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlKSBvYmplY3RzIHdoaWNoIHlvdSBjYW4gdGhlbiBwcm9jZXNzIGFuZCBzZW5kIHRvIGEgc2VydmVyLlxuICAgKiBGb3IgZXhhbXBsZSwgd2l0aCBbU3VwZXJBZ2VudF0oaHR0cHM6Ly9naXRodWIuY29tL3Zpc2lvbm1lZGlhL3N1cGVyYWdlbnQpIGFzIGEgaHR0cC9hamF4IGxpYnJhcnk6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGZ1bmN0aW9uIG9uRHJvcChhY2NlcHRlZEZpbGVzKSB7XG4gICAqICAgY29uc3QgcmVxID0gcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAgICogICBhY2NlcHRlZEZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAqICAgICByZXEuYXR0YWNoKGZpbGUubmFtZSwgZmlsZSlcbiAgICogICB9KVxuICAgKiAgIHJlcS5lbmQoY2FsbGJhY2spXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBhY2NlcHRlZEZpbGVzXG4gICAqIEBwYXJhbSB7RmlsZVJlamVjdGlvbltdfSBmaWxlUmVqZWN0aW9uc1xuICAgKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gICAqL1xuICBvbkRyb3A6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyb3BgIGV2ZW50IG9jY3Vycy5cbiAgICogTm90ZSB0aGF0IGlmIG5vIGZpbGVzIGFyZSBhY2NlcHRlZCwgdGhpcyBjYWxsYmFjayBpcyBub3QgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtGaWxlW119IGZpbGVzXG4gICAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50XG4gICAqL1xuICBvbkRyb3BBY2NlcHRlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJvcGAgZXZlbnQgb2NjdXJzLlxuICAgKiBOb3RlIHRoYXQgaWYgbm8gZmlsZXMgYXJlIHJlamVjdGVkLCB0aGlzIGNhbGxiYWNrIGlzIG5vdCBpbnZva2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge0ZpbGVSZWplY3Rpb25bXX0gZmlsZVJlamVjdGlvbnNcbiAgICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnRcbiAgICovXG4gIG9uRHJvcFJlamVjdGVkOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlcmUncyBzb21lIGVycm9yIGZyb20gYW55IG9mIHRoZSBwcm9taXNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAgICovXG4gIG9uRXJyb3I6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbi4gSXQgbXVzdCByZXR1cm4gbnVsbCBpZiB0aGVyZSdzIG5vIGVycm9ycy5cbiAgICogQHBhcmFtIHtGaWxlfSBmaWxlXG4gICAqIEByZXR1cm5zIHtGaWxlRXJyb3J8RmlsZUVycm9yW118bnVsbH1cbiAgICovXG4gIHZhbGlkYXRvcjogUHJvcFR5cGVzLmZ1bmMsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBEcm9wem9uZTtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCBmb3IgdGhlIGBkcmFnZW50ZXJgLFxuICogYGRyYWdvdmVyYCBhbmQgYGRyYWdsZWF2ZWAgZXZlbnRzLlxuICogSXQgaXMgbm90IGludm9rZWQgaWYgdGhlIGl0ZW1zIGFyZSBub3QgZmlsZXMgKHN1Y2ggYXMgbGluaywgdGV4dCwgZXRjLikuXG4gKlxuICogQGNhbGxiYWNrIGRyYWdDYlxuICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50XG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCBmb3IgdGhlIGBkcm9wYCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQuXG4gKiBJdCBpcyBub3QgaW52b2tlZCBpZiB0aGUgaXRlbXMgYXJlIG5vdCBmaWxlcyAoc3VjaCBhcyBsaW5rLCB0ZXh0LCBldGMuKS5cbiAqXG4gKiBAY2FsbGJhY2sgZHJvcENiXG4gKiBAcGFyYW0ge0ZpbGVbXX0gYWNjZXB0ZWRGaWxlcyBMaXN0IG9mIGFjY2VwdGVkIGZpbGVzXG4gKiBAcGFyYW0ge0ZpbGVSZWplY3Rpb25bXX0gZmlsZVJlamVjdGlvbnMgTGlzdCBvZiByZWplY3RlZCBmaWxlcyBhbmQgd2h5IHRoZXkgd2VyZSByZWplY3RlZFxuICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnQgQSBkcmFnIGV2ZW50IG9yIGlucHV0IGNoYW5nZSBldmVudCAoaWYgZmlsZXMgd2VyZSBzZWxlY3RlZCB2aWEgdGhlIGZpbGUgZGlhbG9nKVxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgZm9yIHRoZSBgZHJvcGAgb3IgaW5wdXQgY2hhbmdlIGV2ZW50LlxuICogSXQgaXMgbm90IGludm9rZWQgaWYgdGhlIGl0ZW1zIGFyZSBmaWxlcyAoc3VjaCBhcyBsaW5rLCB0ZXh0LCBldGMuKS5cbiAqXG4gKiBAY2FsbGJhY2sgZHJvcEFjY2VwdGVkQ2JcbiAqIEBwYXJhbSB7RmlsZVtdfSBmaWxlcyBMaXN0IG9mIGFjY2VwdGVkIGZpbGVzIHRoYXQgbWVldCB0aGUgZ2l2ZW4gY3JpdGVyaWFcbiAqIChgYWNjZXB0YCwgYG11bHRpcGxlYCwgYG1pblNpemVgLCBgbWF4U2l6ZWApXG4gKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCBmb3IgdGhlIGBkcm9wYCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQuXG4gKlxuICogQGNhbGxiYWNrIGRyb3BSZWplY3RlZENiXG4gKiBAcGFyYW0ge0ZpbGVbXX0gZmlsZXMgTGlzdCBvZiByZWplY3RlZCBmaWxlcyB0aGF0IGRvIG5vdCBtZWV0IHRoZSBnaXZlbiBjcml0ZXJpYVxuICogKGBhY2NlcHRgLCBgbXVsdGlwbGVgLCBgbWluU2l6ZWAsIGBtYXhTaXplYClcbiAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAqL1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIGFnZ3JlZ2F0ZSBmaWxlcyxcbiAqIGluIGEgYXN5bmNocm9ub3VzIGZhc2hpb24sIGZyb20gZHJhZyBvciBpbnB1dCBjaGFuZ2UgZXZlbnRzLlxuICpcbiAqIEBjYWxsYmFjayBnZXRGaWxlc0Zyb21FdmVudFxuICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnQgQSBkcmFnIGV2ZW50IG9yIGlucHV0IGNoYW5nZSBldmVudCAoaWYgZmlsZXMgd2VyZSBzZWxlY3RlZCB2aWEgdGhlIGZpbGUgZGlhbG9nKVxuICogQHJldHVybnMgeyhGaWxlW118UHJvbWlzZTxGaWxlW10+KX1cbiAqL1xuXG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IGRyb3B6b25lIHN0YXRlLlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERyb3B6b25lU3RhdGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNGb2N1c2VkIERyb3B6b25lIGFyZWEgaXMgaW4gZm9jdXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNGaWxlRGlhbG9nQWN0aXZlIEZpbGUgZGlhbG9nIGlzIG9wZW5lZFxuICogQHByb3BlcnR5IHtib29sZWFufSBpc0RyYWdBY3RpdmUgQWN0aXZlIGRyYWcgaXMgaW4gcHJvZ3Jlc3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNEcmFnQWNjZXB0IERyYWdnZWQgZmlsZXMgYXJlIGFjY2VwdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRHJhZ1JlamVjdCBTb21lIGRyYWdnZWQgZmlsZXMgYXJlIHJlamVjdGVkXG4gKiBAcHJvcGVydHkge0ZpbGVbXX0gYWNjZXB0ZWRGaWxlcyBBY2NlcHRlZCBmaWxlc1xuICogQHByb3BlcnR5IHtGaWxlUmVqZWN0aW9uW119IGZpbGVSZWplY3Rpb25zIFJlamVjdGVkIGZpbGVzIGFuZCB3aHkgdGhleSB3ZXJlIHJlamVjdGVkXG4gKi9cblxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZHJvcHpvbmUgbWV0aG9kcy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEcm9wem9uZU1ldGhvZHNcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldFJvb3RQcm9wcyBSZXR1cm5zIHRoZSBwcm9wcyB5b3Ugc2hvdWxkIGFwcGx5IHRvIHRoZSByb290IGRyb3AgY29udGFpbmVyIHlvdSByZW5kZXJcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldElucHV0UHJvcHMgUmV0dXJucyB0aGUgcHJvcHMgeW91IHNob3VsZCBhcHBseSB0byBoaWRkZW4gZmlsZSBpbnB1dCB5b3UgcmVuZGVyXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBvcGVuIE9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2dcbiAqL1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGlzRm9jdXNlZDogZmFsc2UsXG4gIGlzRmlsZURpYWxvZ0FjdGl2ZTogZmFsc2UsXG4gIGlzRHJhZ0FjdGl2ZTogZmFsc2UsXG4gIGlzRHJhZ0FjY2VwdDogZmFsc2UsXG4gIGlzRHJhZ1JlamVjdDogZmFsc2UsXG4gIGFjY2VwdGVkRmlsZXM6IFtdLFxuICBmaWxlUmVqZWN0aW9uczogW10sXG59O1xuXG4vKipcbiAqIEEgUmVhY3QgaG9vayB0aGF0IGNyZWF0ZXMgYSBkcmFnICduJyBkcm9wIGFyZWEuXG4gKlxuICogYGBganN4XG4gKiBmdW5jdGlvbiBNeURyb3B6b25lKHByb3BzKSB7XG4gKiAgIGNvbnN0IHtnZXRSb290UHJvcHMsIGdldElucHV0UHJvcHN9ID0gdXNlRHJvcHpvbmUoe1xuICogICAgIG9uRHJvcDogYWNjZXB0ZWRGaWxlcyA9PiB7XG4gKiAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgRmlsZSBvYmplY3RzLCBlLmcuIHVwbG9hZCB0byBzb21lIHNlcnZlclxuICogICAgIH1cbiAqICAgfSk7XG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGRpdiB7Li4uZ2V0Um9vdFByb3BzKCl9PlxuICogICAgICAgPGlucHV0IHsuLi5nZXRJbnB1dFByb3BzKCl9IC8+XG4gKiAgICAgICA8cD5EcmFnIGFuZCBkcm9wIHNvbWUgZmlsZXMgaGVyZSwgb3IgY2xpY2sgdG8gc2VsZWN0IGZpbGVzPC9wPlxuICogICAgIDwvZGl2PlxuICogICApXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZnVuY3Rpb24gdXNlRHJvcHpvbmVcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi91dGlsc1wiKS5BY2NlcHRQcm9wfSBbcHJvcHMuYWNjZXB0XSBTZXQgYWNjZXB0ZWQgZmlsZSB0eXBlcy5cbiAqIENoZWNrb3V0IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS93aW5kb3cvc2hvd09wZW5GaWxlUGlja2VyIHR5cGVzIG9wdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqIEtlZXAgaW4gbWluZCB0aGF0IG1pbWUgdHlwZSBkZXRlcm1pbmF0aW9uIGlzIG5vdCByZWxpYWJsZSBhY3Jvc3MgcGxhdGZvcm1zLiBDU1YgZmlsZXMsXG4gKiBmb3IgZXhhbXBsZSwgYXJlIHJlcG9ydGVkIGFzIHRleHQvcGxhaW4gdW5kZXIgbWFjT1MgYnV0IGFzIGFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCB1bmRlclxuICogV2luZG93cy4gSW4gc29tZSBjYXNlcyB0aGVyZSBtaWdodCBub3QgYmUgYSBtaW1lIHR5cGUgc2V0IGF0IGFsbCAoaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRyb3B6b25lL3JlYWN0LWRyb3B6b25lL2lzc3Vlcy8yNzYpLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMubXVsdGlwbGU9dHJ1ZV0gQWxsb3cgZHJhZyAnbicgZHJvcCAob3Igc2VsZWN0aW9uIGZyb20gdGhlIGZpbGUgZGlhbG9nKSBvZiBtdWx0aXBsZSBmaWxlc1xuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMucHJldmVudERyb3BPbkRvY3VtZW50PXRydWVdIElmIGZhbHNlLCBhbGxvdyBkcm9wcGVkIGl0ZW1zIHRvIHRha2Ugb3ZlciB0aGUgY3VycmVudCBicm93c2VyIHdpbmRvd1xuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMubm9DbGljaz1mYWxzZV0gSWYgdHJ1ZSwgZGlzYWJsZXMgY2xpY2sgdG8gb3BlbiB0aGUgbmF0aXZlIGZpbGUgc2VsZWN0aW9uIGRpYWxvZ1xuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMubm9LZXlib2FyZD1mYWxzZV0gSWYgdHJ1ZSwgZGlzYWJsZXMgU1BBQ0UvRU5URVIgdG8gb3BlbiB0aGUgbmF0aXZlIGZpbGUgc2VsZWN0aW9uIGRpYWxvZy5cbiAqIE5vdGUgdGhhdCBpdCBhbHNvIHN0b3BzIHRyYWNraW5nIHRoZSBmb2N1cyBzdGF0ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLm5vRHJhZz1mYWxzZV0gSWYgdHJ1ZSwgZGlzYWJsZXMgZHJhZyAnbicgZHJvcFxuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMubm9EcmFnRXZlbnRzQnViYmxpbmc9ZmFsc2VdIElmIHRydWUsIHN0b3BzIGRyYWcgZXZlbnQgcHJvcGFnYXRpb24gdG8gcGFyZW50c1xuICogQHBhcmFtIHtudW1iZXJ9IFtwcm9wcy5taW5TaXplPTBdIE1pbmltdW0gZmlsZSBzaXplIChpbiBieXRlcylcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcHJvcHMubWF4U2l6ZT1JbmZpbml0eV0gTWF4aW11bSBmaWxlIHNpemUgKGluIGJ5dGVzKVxuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMuZGlzYWJsZWQ9ZmFsc2VdIEVuYWJsZS9kaXNhYmxlIHRoZSBkcm9wem9uZVxuICogQHBhcmFtIHtnZXRGaWxlc0Zyb21FdmVudH0gW3Byb3BzLmdldEZpbGVzRnJvbUV2ZW50XSBVc2UgdGhpcyB0byBwcm92aWRlIGEgY3VzdG9tIGZpbGUgYWdncmVnYXRvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Byb3BzLm9uRmlsZURpYWxvZ0NhbmNlbF0gQ2IgZm9yIHdoZW4gY2xvc2luZyB0aGUgZmlsZSBkaWFsb2cgd2l0aCBubyBzZWxlY3Rpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLnVzZUZzQWNjZXNzQXBpXSBTZXQgdG8gdHJ1ZSB0byB1c2UgdGhlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlX1N5c3RlbV9BY2Nlc3NfQVBJXG4gKiB0byBvcGVuIHRoZSBmaWxlIHBpY2tlciBpbnN0ZWFkIG9mIHVzaW5nIGFuIGA8aW5wdXQgdHlwZT1cImZpbGVcIj5gIGNsaWNrIGV2ZW50LlxuICogQHBhcmFtIHtib29sZWFufSBhdXRvRm9jdXMgU2V0IHRvIHRydWUgdG8gYXV0byBmb2N1cyB0aGUgcm9vdCBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Byb3BzLm9uRmlsZURpYWxvZ09wZW5dIENiIGZvciB3aGVuIG9wZW5pbmcgdGhlIGZpbGUgZGlhbG9nXG4gKiBAcGFyYW0ge2RyYWdDYn0gW3Byb3BzLm9uRHJhZ0VudGVyXSBDYiBmb3Igd2hlbiB0aGUgYGRyYWdlbnRlcmAgZXZlbnQgb2NjdXJzLlxuICogQHBhcmFtIHtkcmFnQ2J9IFtwcm9wcy5vbkRyYWdMZWF2ZV0gQ2IgZm9yIHdoZW4gdGhlIGBkcmFnbGVhdmVgIGV2ZW50IG9jY3Vyc1xuICogQHBhcmFtIHtkcmFnQ2J9IFtwcm9wcy5vbkRyYWdPdmVyXSBDYiBmb3Igd2hlbiB0aGUgYGRyYWdvdmVyYCBldmVudCBvY2N1cnNcbiAqIEBwYXJhbSB7ZHJvcENifSBbcHJvcHMub25Ecm9wXSBDYiBmb3Igd2hlbiB0aGUgYGRyb3BgIGV2ZW50IG9jY3Vycy5cbiAqIE5vdGUgdGhhdCB0aGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYWZ0ZXIgdGhlIGBnZXRGaWxlc0Zyb21FdmVudGAgY2FsbGJhY2sgaXMgZG9uZS5cbiAqXG4gKiBGaWxlcyBhcmUgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQgYmFzZWQgb24gdGhlIGBhY2NlcHRgLCBgbXVsdGlwbGVgLCBgbWluU2l6ZWAgYW5kIGBtYXhTaXplYCBwcm9wcy5cbiAqIGBhY2NlcHRgIG11c3QgYmUgYW4gb2JqZWN0IHdpdGgga2V5cyBhcyBhIHZhbGlkIFtNSU1FIHR5cGVdKGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvbWVkaWEtdHlwZXMueGh0bWwpIGFjY29yZGluZyB0byBbaW5wdXQgZWxlbWVudCBzcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy53My5vcmcvd2lraS9IVE1ML0VsZW1lbnRzL2lucHV0L2ZpbGUpIGFuZCB0aGUgdmFsdWUgYW4gYXJyYXkgb2YgZmlsZSBleHRlbnNpb25zIChvcHRpb25hbCkuXG4gKiBJZiBgbXVsdGlwbGVgIGlzIHNldCB0byBmYWxzZSBhbmQgYWRkaXRpb25hbCBmaWxlcyBhcmUgZHJvcHBlZCxcbiAqIGFsbCBmaWxlcyBiZXNpZGVzIHRoZSBmaXJzdCB3aWxsIGJlIHJlamVjdGVkLlxuICogQW55IGZpbGUgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHNpemUgaW4gdGhlIFtgbWluU2l6ZWAsIGBtYXhTaXplYF0gcmFuZ2UsIHdpbGwgYmUgcmVqZWN0ZWQgYXMgd2VsbC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIGBvbkRyb3BgIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGJlIGludm9rZWQgcmVnYXJkbGVzcyBpZiB0aGUgZHJvcHBlZCBmaWxlcyB3ZXJlIGFjY2VwdGVkIG9yIHJlamVjdGVkLlxuICogSWYgeW91J2QgbGlrZSB0byByZWFjdCB0byBhIHNwZWNpZmljIHNjZW5hcmlvLCB1c2UgdGhlIGBvbkRyb3BBY2NlcHRlZGAvYG9uRHJvcFJlamVjdGVkYCBwcm9wcy5cbiAqXG4gKiBgb25Ecm9wYCB3aWxsIHByb3ZpZGUgeW91IHdpdGggYW4gYXJyYXkgb2YgW0ZpbGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlKSBvYmplY3RzIHdoaWNoIHlvdSBjYW4gdGhlbiBwcm9jZXNzIGFuZCBzZW5kIHRvIGEgc2VydmVyLlxuICogRm9yIGV4YW1wbGUsIHdpdGggW1N1cGVyQWdlbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS92aXNpb25tZWRpYS9zdXBlcmFnZW50KSBhcyBhIGh0dHAvYWpheCBsaWJyYXJ5OlxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBvbkRyb3AoYWNjZXB0ZWRGaWxlcykge1xuICogICBjb25zdCByZXEgPSByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICBhY2NlcHRlZEZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gKiAgICAgcmVxLmF0dGFjaChmaWxlLm5hbWUsIGZpbGUpXG4gKiAgIH0pXG4gKiAgIHJlcS5lbmQoY2FsbGJhY2spXG4gKiB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7ZHJvcEFjY2VwdGVkQ2J9IFtwcm9wcy5vbkRyb3BBY2NlcHRlZF1cbiAqIEBwYXJhbSB7ZHJvcFJlamVjdGVkQ2J9IFtwcm9wcy5vbkRyb3BSZWplY3RlZF1cbiAqIEBwYXJhbSB7KGVycm9yOiBFcnJvcikgPT4gdm9pZH0gW3Byb3BzLm9uRXJyb3JdXG4gKlxuICogQHJldHVybnMge0Ryb3B6b25lU3RhdGUgJiBEcm9wem9uZU1ldGhvZHN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEcm9wem9uZShwcm9wcyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhY2NlcHQsXG4gICAgZGlzYWJsZWQsXG4gICAgZ2V0RmlsZXNGcm9tRXZlbnQsXG4gICAgbWF4U2l6ZSxcbiAgICBtaW5TaXplLFxuICAgIG11bHRpcGxlLFxuICAgIG1heEZpbGVzLFxuICAgIG9uRHJhZ0VudGVyLFxuICAgIG9uRHJhZ0xlYXZlLFxuICAgIG9uRHJhZ092ZXIsXG4gICAgb25Ecm9wLFxuICAgIG9uRHJvcEFjY2VwdGVkLFxuICAgIG9uRHJvcFJlamVjdGVkLFxuICAgIG9uRmlsZURpYWxvZ0NhbmNlbCxcbiAgICBvbkZpbGVEaWFsb2dPcGVuLFxuICAgIHVzZUZzQWNjZXNzQXBpLFxuICAgIGF1dG9Gb2N1cyxcbiAgICBwcmV2ZW50RHJvcE9uRG9jdW1lbnQsXG4gICAgbm9DbGljayxcbiAgICBub0tleWJvYXJkLFxuICAgIG5vRHJhZyxcbiAgICBub0RyYWdFdmVudHNCdWJibGluZyxcbiAgICBvbkVycm9yLFxuICAgIHZhbGlkYXRvcixcbiAgfSA9IHtcbiAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgLi4ucHJvcHMsXG4gIH07XG5cbiAgY29uc3QgYWNjZXB0QXR0ciA9IHVzZU1lbW8oKCkgPT4gYWNjZXB0UHJvcEFzQWNjZXB0QXR0cihhY2NlcHQpLCBbYWNjZXB0XSk7XG4gIGNvbnN0IHBpY2tlclR5cGVzID0gdXNlTWVtbygoKSA9PiBwaWNrZXJPcHRpb25zRnJvbUFjY2VwdChhY2NlcHQpLCBbYWNjZXB0XSk7XG5cbiAgY29uc3Qgb25GaWxlRGlhbG9nT3BlbkNiID0gdXNlTWVtbyhcbiAgICAoKSA9PiAodHlwZW9mIG9uRmlsZURpYWxvZ09wZW4gPT09IFwiZnVuY3Rpb25cIiA/IG9uRmlsZURpYWxvZ09wZW4gOiBub29wKSxcbiAgICBbb25GaWxlRGlhbG9nT3Blbl1cbiAgKTtcbiAgY29uc3Qgb25GaWxlRGlhbG9nQ2FuY2VsQ2IgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICB0eXBlb2Ygb25GaWxlRGlhbG9nQ2FuY2VsID09PSBcImZ1bmN0aW9uXCIgPyBvbkZpbGVEaWFsb2dDYW5jZWwgOiBub29wLFxuICAgIFtvbkZpbGVEaWFsb2dDYW5jZWxdXG4gICk7XG5cbiAgLyoqXG4gICAqIEBjb25zdGFudFxuICAgKiBAdHlwZSB7UmVhY3QuTXV0YWJsZVJlZk9iamVjdDxIVE1MRWxlbWVudD59XG4gICAqL1xuICBjb25zdCByb290UmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIGNvbnN0IFtzdGF0ZSwgZGlzcGF0Y2hdID0gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsU3RhdGUpO1xuICBjb25zdCB7IGlzRm9jdXNlZCwgaXNGaWxlRGlhbG9nQWN0aXZlIH0gPSBzdGF0ZTtcblxuICBjb25zdCBmc0FjY2Vzc0FwaVdvcmtzUmVmID0gdXNlUmVmKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgIHdpbmRvdy5pc1NlY3VyZUNvbnRleHQgJiZcbiAgICAgIHVzZUZzQWNjZXNzQXBpICYmXG4gICAgICBjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJKClcbiAgKTtcblxuICAvLyBVcGRhdGUgZmlsZSBkaWFsb2cgYWN0aXZlIHN0YXRlIHdoZW4gdGhlIHdpbmRvdyBpcyBmb2N1c2VkIG9uXG4gIGNvbnN0IG9uV2luZG93Rm9jdXMgPSAoKSA9PiB7XG4gICAgLy8gRXhlY3V0ZSB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBmaWxlIGRpYWxvZyBpcyBvcGVuZWQgaW4gdGhlIGJyb3dzZXJcbiAgICBpZiAoIWZzQWNjZXNzQXBpV29ya3NSZWYuY3VycmVudCAmJiBpc0ZpbGVEaWFsb2dBY3RpdmUpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgICAgIGNvbnN0IHsgZmlsZXMgfSA9IGlucHV0UmVmLmN1cnJlbnQ7XG5cbiAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcImNsb3NlRGlhbG9nXCIgfSk7XG4gICAgICAgICAgICBvbkZpbGVEaWFsb2dDYW5jZWxDYigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgMzAwKTtcbiAgICB9XG4gIH07XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBvbldpbmRvd0ZvY3VzLCBmYWxzZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgb25XaW5kb3dGb2N1cywgZmFsc2UpO1xuICAgIH07XG4gIH0sIFtpbnB1dFJlZiwgaXNGaWxlRGlhbG9nQWN0aXZlLCBvbkZpbGVEaWFsb2dDYW5jZWxDYiwgZnNBY2Nlc3NBcGlXb3Jrc1JlZl0pO1xuXG4gIGNvbnN0IGRyYWdUYXJnZXRzUmVmID0gdXNlUmVmKFtdKTtcbiAgY29uc3Qgb25Eb2N1bWVudERyb3AgPSAoZXZlbnQpID0+IHtcbiAgICBpZiAocm9vdFJlZi5jdXJyZW50ICYmIHJvb3RSZWYuY3VycmVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAvLyBJZiB3ZSBpbnRlcmNlcHRlZCBhbiBldmVudCBmb3Igb3VyIGluc3RhbmNlLCBsZXQgaXQgcHJvcGFnYXRlIGRvd24gdG8gdGhlIGluc3RhbmNlJ3Mgb25Ecm9wIGhhbmRsZXJcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBkcmFnVGFyZ2V0c1JlZi5jdXJyZW50ID0gW107XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocHJldmVudERyb3BPbkRvY3VtZW50KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ292ZXJcIiwgb25Eb2N1bWVudERyYWdPdmVyLCBmYWxzZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZHJvcFwiLCBvbkRvY3VtZW50RHJvcCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocHJldmVudERyb3BPbkRvY3VtZW50KSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJkcmFnb3ZlclwiLCBvbkRvY3VtZW50RHJhZ092ZXIpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZHJvcFwiLCBvbkRvY3VtZW50RHJvcCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3Jvb3RSZWYsIHByZXZlbnREcm9wT25Eb2N1bWVudF0pO1xuXG4gIC8vIEF1dG8gZm9jdXMgdGhlIHJvb3Qgd2hlbiBhdXRvRm9jdXMgaXMgdHJ1ZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZGlzYWJsZWQgJiYgYXV0b0ZvY3VzICYmIHJvb3RSZWYuY3VycmVudCkge1xuICAgICAgcm9vdFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7fTtcbiAgfSwgW3Jvb3RSZWYsIGF1dG9Gb2N1cywgZGlzYWJsZWRdKTtcblxuICBjb25zdCBvbkVyckNiID0gdXNlQ2FsbGJhY2soXG4gICAgKGUpID0+IHtcbiAgICAgIGlmIChvbkVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IoZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBMZXQgdGhlIHVzZXIga25vdyBzb21ldGhpbmcncyBnb25lIHdyb25nIGlmIHRoZXkgaGF2ZW4ndCBwcm92aWRlZCB0aGUgb25FcnJvciBjYi5cbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtvbkVycm9yXVxuICApO1xuXG4gIGNvbnN0IG9uRHJhZ0VudGVyQ2IgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBQZXJzaXN0IGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRoZSBldmVudCBsYXRlciBhZnRlciBnZXRGaWxlc0Zyb21FdmVudCgpIGlzIGRvbmVcbiAgICAgIGV2ZW50LnBlcnNpc3QoKTtcbiAgICAgIHN0b3BQcm9wYWdhdGlvbihldmVudCk7XG5cbiAgICAgIGRyYWdUYXJnZXRzUmVmLmN1cnJlbnQgPSBbLi4uZHJhZ1RhcmdldHNSZWYuY3VycmVudCwgZXZlbnQudGFyZ2V0XTtcblxuICAgICAgaWYgKGlzRXZ0V2l0aEZpbGVzKGV2ZW50KSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoZ2V0RmlsZXNGcm9tRXZlbnQoZXZlbnQpKVxuICAgICAgICAgIC50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgICAgaWYgKGlzUHJvcGFnYXRpb25TdG9wcGVkKGV2ZW50KSAmJiAhbm9EcmFnRXZlbnRzQnViYmxpbmcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWxlQ291bnQgPSBmaWxlcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBpc0RyYWdBY2NlcHQgPVxuICAgICAgICAgICAgICBmaWxlQ291bnQgPiAwICYmXG4gICAgICAgICAgICAgIGFsbEZpbGVzQWNjZXB0ZWQoe1xuICAgICAgICAgICAgICAgIGZpbGVzLFxuICAgICAgICAgICAgICAgIGFjY2VwdDogYWNjZXB0QXR0cixcbiAgICAgICAgICAgICAgICBtaW5TaXplLFxuICAgICAgICAgICAgICAgIG1heFNpemUsXG4gICAgICAgICAgICAgICAgbXVsdGlwbGUsXG4gICAgICAgICAgICAgICAgbWF4RmlsZXMsXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGlzRHJhZ1JlamVjdCA9IGZpbGVDb3VudCA+IDAgJiYgIWlzRHJhZ0FjY2VwdDtcblxuICAgICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgICBpc0RyYWdBY2NlcHQsXG4gICAgICAgICAgICAgIGlzRHJhZ1JlamVjdCxcbiAgICAgICAgICAgICAgaXNEcmFnQWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICB0eXBlOiBcInNldERyYWdnZWRGaWxlc1wiLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChvbkRyYWdFbnRlcikge1xuICAgICAgICAgICAgICBvbkRyYWdFbnRlcihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IG9uRXJyQ2IoZSkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgZ2V0RmlsZXNGcm9tRXZlbnQsXG4gICAgICBvbkRyYWdFbnRlcixcbiAgICAgIG9uRXJyQ2IsXG4gICAgICBub0RyYWdFdmVudHNCdWJibGluZyxcbiAgICAgIGFjY2VwdEF0dHIsXG4gICAgICBtaW5TaXplLFxuICAgICAgbWF4U2l6ZSxcbiAgICAgIG11bHRpcGxlLFxuICAgICAgbWF4RmlsZXMsXG4gICAgICB2YWxpZGF0b3IsXG4gICAgXVxuICApO1xuXG4gIGNvbnN0IG9uRHJhZ092ZXJDYiA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnBlcnNpc3QoKTtcbiAgICAgIHN0b3BQcm9wYWdhdGlvbihldmVudCk7XG5cbiAgICAgIGNvbnN0IGhhc0ZpbGVzID0gaXNFdnRXaXRoRmlsZXMoZXZlbnQpO1xuICAgICAgaWYgKGhhc0ZpbGVzICYmIGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJjb3B5XCI7XG4gICAgICAgIH0gY2F0Y2gge30gLyogZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eSAqL1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzRmlsZXMgJiYgb25EcmFnT3Zlcikge1xuICAgICAgICBvbkRyYWdPdmVyKGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgW29uRHJhZ092ZXIsIG5vRHJhZ0V2ZW50c0J1YmJsaW5nXVxuICApO1xuXG4gIGNvbnN0IG9uRHJhZ0xlYXZlQ2IgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5wZXJzaXN0KCk7XG4gICAgICBzdG9wUHJvcGFnYXRpb24oZXZlbnQpO1xuXG4gICAgICAvLyBPbmx5IGRlYWN0aXZhdGUgb25jZSB0aGUgZHJvcHpvbmUgYW5kIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gbGVmdFxuICAgICAgY29uc3QgdGFyZ2V0cyA9IGRyYWdUYXJnZXRzUmVmLmN1cnJlbnQuZmlsdGVyKFxuICAgICAgICAodGFyZ2V0KSA9PiByb290UmVmLmN1cnJlbnQgJiYgcm9vdFJlZi5jdXJyZW50LmNvbnRhaW5zKHRhcmdldClcbiAgICAgICk7XG4gICAgICAvLyBNYWtlIHN1cmUgdG8gcmVtb3ZlIGEgdGFyZ2V0IHByZXNlbnQgbXVsdGlwbGUgdGltZXMgb25seSBvbmNlXG4gICAgICAvLyAoRmlyZWZveCBtYXkgZmlyZSBkcmFnZW50ZXIvZHJhZ2xlYXZlIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGVsZW1lbnQpXG4gICAgICBjb25zdCB0YXJnZXRJZHggPSB0YXJnZXRzLmluZGV4T2YoZXZlbnQudGFyZ2V0KTtcbiAgICAgIGlmICh0YXJnZXRJZHggIT09IC0xKSB7XG4gICAgICAgIHRhcmdldHMuc3BsaWNlKHRhcmdldElkeCwgMSk7XG4gICAgICB9XG4gICAgICBkcmFnVGFyZ2V0c1JlZi5jdXJyZW50ID0gdGFyZ2V0cztcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFwic2V0RHJhZ2dlZEZpbGVzXCIsXG4gICAgICAgIGlzRHJhZ0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIGlzRHJhZ0FjY2VwdDogZmFsc2UsXG4gICAgICAgIGlzRHJhZ1JlamVjdDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzRXZ0V2l0aEZpbGVzKGV2ZW50KSAmJiBvbkRyYWdMZWF2ZSkge1xuICAgICAgICBvbkRyYWdMZWF2ZShldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbcm9vdFJlZiwgb25EcmFnTGVhdmUsIG5vRHJhZ0V2ZW50c0J1YmJsaW5nXVxuICApO1xuXG4gIGNvbnN0IHNldEZpbGVzID0gdXNlQ2FsbGJhY2soXG4gICAgKGZpbGVzLCBldmVudCkgPT4ge1xuICAgICAgY29uc3QgYWNjZXB0ZWRGaWxlcyA9IFtdO1xuICAgICAgY29uc3QgZmlsZVJlamVjdGlvbnMgPSBbXTtcblxuICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBbYWNjZXB0ZWQsIGFjY2VwdEVycm9yXSA9IGZpbGVBY2NlcHRlZChmaWxlLCBhY2NlcHRBdHRyKTtcbiAgICAgICAgY29uc3QgW3NpemVNYXRjaCwgc2l6ZUVycm9yXSA9IGZpbGVNYXRjaFNpemUoZmlsZSwgbWluU2l6ZSwgbWF4U2l6ZSk7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVycm9ycyA9IHZhbGlkYXRvciA/IHZhbGlkYXRvcihmaWxlKSA6IG51bGw7XG5cbiAgICAgICAgaWYgKGFjY2VwdGVkICYmIHNpemVNYXRjaCAmJiAhY3VzdG9tRXJyb3JzKSB7XG4gICAgICAgICAgYWNjZXB0ZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBlcnJvcnMgPSBbYWNjZXB0RXJyb3IsIHNpemVFcnJvcl07XG5cbiAgICAgICAgICBpZiAoY3VzdG9tRXJyb3JzKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KGN1c3RvbUVycm9ycyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmlsZVJlamVjdGlvbnMucHVzaCh7IGZpbGUsIGVycm9yczogZXJyb3JzLmZpbHRlcigoZSkgPT4gZSkgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXG4gICAgICAgICghbXVsdGlwbGUgJiYgYWNjZXB0ZWRGaWxlcy5sZW5ndGggPiAxKSB8fFxuICAgICAgICAobXVsdGlwbGUgJiYgbWF4RmlsZXMgPj0gMSAmJiBhY2NlcHRlZEZpbGVzLmxlbmd0aCA+IG1heEZpbGVzKVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlamVjdCBldmVyeXRoaW5nIGFuZCBlbXB0eSBhY2NlcHRlZCBmaWxlc1xuICAgICAgICBhY2NlcHRlZEZpbGVzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICBmaWxlUmVqZWN0aW9ucy5wdXNoKHsgZmlsZSwgZXJyb3JzOiBbVE9PX01BTllfRklMRVNfUkVKRUNUSU9OXSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFjY2VwdGVkRmlsZXMuc3BsaWNlKDApO1xuICAgICAgfVxuXG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIGFjY2VwdGVkRmlsZXMsXG4gICAgICAgIGZpbGVSZWplY3Rpb25zLFxuICAgICAgICB0eXBlOiBcInNldEZpbGVzXCIsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG9uRHJvcCkge1xuICAgICAgICBvbkRyb3AoYWNjZXB0ZWRGaWxlcywgZmlsZVJlamVjdGlvbnMsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVSZWplY3Rpb25zLmxlbmd0aCA+IDAgJiYgb25Ecm9wUmVqZWN0ZWQpIHtcbiAgICAgICAgb25Ecm9wUmVqZWN0ZWQoZmlsZVJlamVjdGlvbnMsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjY2VwdGVkRmlsZXMubGVuZ3RoID4gMCAmJiBvbkRyb3BBY2NlcHRlZCkge1xuICAgICAgICBvbkRyb3BBY2NlcHRlZChhY2NlcHRlZEZpbGVzLCBldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBkaXNwYXRjaCxcbiAgICAgIG11bHRpcGxlLFxuICAgICAgYWNjZXB0QXR0cixcbiAgICAgIG1pblNpemUsXG4gICAgICBtYXhTaXplLFxuICAgICAgbWF4RmlsZXMsXG4gICAgICBvbkRyb3AsXG4gICAgICBvbkRyb3BBY2NlcHRlZCxcbiAgICAgIG9uRHJvcFJlamVjdGVkLFxuICAgICAgdmFsaWRhdG9yLFxuICAgIF1cbiAgKTtcblxuICBjb25zdCBvbkRyb3BDYiA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIFBlcnNpc3QgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdGhlIGV2ZW50IGxhdGVyIGFmdGVyIGdldEZpbGVzRnJvbUV2ZW50KCkgaXMgZG9uZVxuICAgICAgZXZlbnQucGVyc2lzdCgpO1xuICAgICAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50KTtcblxuICAgICAgZHJhZ1RhcmdldHNSZWYuY3VycmVudCA9IFtdO1xuXG4gICAgICBpZiAoaXNFdnRXaXRoRmlsZXMoZXZlbnQpKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShnZXRGaWxlc0Zyb21FdmVudChldmVudCkpXG4gICAgICAgICAgLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpICYmICFub0RyYWdFdmVudHNCdWJibGluZykge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRGaWxlcyhmaWxlcywgZXZlbnQpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiBvbkVyckNiKGUpKTtcbiAgICAgIH1cbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJyZXNldFwiIH0pO1xuICAgIH0sXG4gICAgW2dldEZpbGVzRnJvbUV2ZW50LCBzZXRGaWxlcywgb25FcnJDYiwgbm9EcmFnRXZlbnRzQnViYmxpbmddXG4gICk7XG5cbiAgLy8gRm4gZm9yIG9wZW5pbmcgdGhlIGZpbGUgZGlhbG9nIHByb2dyYW1tYXRpY2FsbHlcbiAgY29uc3Qgb3BlbkZpbGVEaWFsb2cgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gTm8gcG9pbnQgdG8gdXNlIEZTIGFjY2VzcyBBUElzIGlmIGNvbnRleHQgaXMgbm90IHNlY3VyZVxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1NlY3VyaXR5L1NlY3VyZV9Db250ZXh0cyNmZWF0dXJlX2RldGVjdGlvblxuICAgIGlmIChmc0FjY2Vzc0FwaVdvcmtzUmVmLmN1cnJlbnQpIHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJvcGVuRGlhbG9nXCIgfSk7XG4gICAgICBvbkZpbGVEaWFsb2dPcGVuQ2IoKTtcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS93aW5kb3cvc2hvd09wZW5GaWxlUGlja2VyXG4gICAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICBtdWx0aXBsZSxcbiAgICAgICAgdHlwZXM6IHBpY2tlclR5cGVzLFxuICAgICAgfTtcbiAgICAgIHdpbmRvd1xuICAgICAgICAuc2hvd09wZW5GaWxlUGlja2VyKG9wdHMpXG4gICAgICAgIC50aGVuKChoYW5kbGVzKSA9PiBnZXRGaWxlc0Zyb21FdmVudChoYW5kbGVzKSlcbiAgICAgICAgLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgc2V0RmlsZXMoZmlsZXMsIG51bGwpO1xuICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJjbG9zZURpYWxvZ1wiIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAvLyBBYm9ydEVycm9yIG1lYW5zIHRoZSB1c2VyIGNhbmNlbGVkXG4gICAgICAgICAgaWYgKGlzQWJvcnQoZSkpIHtcbiAgICAgICAgICAgIG9uRmlsZURpYWxvZ0NhbmNlbENiKGUpO1xuICAgICAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcImNsb3NlRGlhbG9nXCIgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1NlY3VyaXR5RXJyb3IoZSkpIHtcbiAgICAgICAgICAgIGZzQWNjZXNzQXBpV29ya3NSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gQ09SUywgc28gY2Fubm90IHVzZSB0aGlzIEFQSVxuICAgICAgICAgICAgLy8gVHJ5IHVzaW5nIHRoZSBpbnB1dFxuICAgICAgICAgICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgaW5wdXRSZWYuY3VycmVudC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgIGlucHV0UmVmLmN1cnJlbnQuY2xpY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9uRXJyQ2IoXG4gICAgICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJDYW5ub3Qgb3BlbiB0aGUgZmlsZSBwaWNrZXIgYmVjYXVzZSB0aGUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVfU3lzdGVtX0FjY2Vzc19BUEkgaXMgbm90IHN1cHBvcnRlZCBhbmQgbm8gPGlucHV0PiB3YXMgcHJvdmlkZWQuXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9uRXJyQ2IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIm9wZW5EaWFsb2dcIiB9KTtcbiAgICAgIG9uRmlsZURpYWxvZ09wZW5DYigpO1xuICAgICAgaW5wdXRSZWYuY3VycmVudC52YWx1ZSA9IG51bGw7XG4gICAgICBpbnB1dFJlZi5jdXJyZW50LmNsaWNrKCk7XG4gICAgfVxuICB9LCBbXG4gICAgZGlzcGF0Y2gsXG4gICAgb25GaWxlRGlhbG9nT3BlbkNiLFxuICAgIG9uRmlsZURpYWxvZ0NhbmNlbENiLFxuICAgIHVzZUZzQWNjZXNzQXBpLFxuICAgIHNldEZpbGVzLFxuICAgIG9uRXJyQ2IsXG4gICAgcGlja2VyVHlwZXMsXG4gICAgbXVsdGlwbGUsXG4gIF0pO1xuXG4gIC8vIENiIHRvIG9wZW4gdGhlIGZpbGUgZGlhbG9nIHdoZW4gU1BBQ0UvRU5URVIgb2NjdXJzIG9uIHRoZSBkcm9wem9uZVxuICBjb25zdCBvbktleURvd25DYiA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgLy8gSWdub3JlIGtleWJvYXJkIGV2ZW50cyBidWJibGluZyB1cCB0aGUgRE9NIHRyZWVcbiAgICAgIGlmICghcm9vdFJlZi5jdXJyZW50IHx8ICFyb290UmVmLmN1cnJlbnQuaXNFcXVhbE5vZGUoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnQua2V5ID09PSBcIiBcIiB8fFxuICAgICAgICBldmVudC5rZXkgPT09IFwiRW50ZXJcIiB8fFxuICAgICAgICBldmVudC5rZXlDb2RlID09PSAzMiB8fFxuICAgICAgICBldmVudC5rZXlDb2RlID09PSAxM1xuICAgICAgKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9wZW5GaWxlRGlhbG9nKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbcm9vdFJlZiwgb3BlbkZpbGVEaWFsb2ddXG4gICk7XG5cbiAgLy8gVXBkYXRlIGZvY3VzIHN0YXRlIGZvciB0aGUgZHJvcHpvbmVcbiAgY29uc3Qgb25Gb2N1c0NiID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGRpc3BhdGNoKHsgdHlwZTogXCJmb2N1c1wiIH0pO1xuICB9LCBbXSk7XG4gIGNvbnN0IG9uQmx1ckNiID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGRpc3BhdGNoKHsgdHlwZTogXCJibHVyXCIgfSk7XG4gIH0sIFtdKTtcblxuICAvLyBDYiB0byBvcGVuIHRoZSBmaWxlIGRpYWxvZyB3aGVuIGNsaWNrIG9jY3VycyBvbiB0aGUgZHJvcHpvbmVcbiAgY29uc3Qgb25DbGlja0NiID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChub0NsaWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW4gSUUxMS9FZGdlIHRoZSBmaWxlLWJyb3dzZXIgZGlhbG9nIGlzIGJsb2NraW5nLCB0aGVyZWZvcmUsIHVzZSBzZXRUaW1lb3V0KClcbiAgICAvLyB0byBlbnN1cmUgUmVhY3QgY2FuIGhhbmRsZSBzdGF0ZSBjaGFuZ2VzXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZHJvcHpvbmUvcmVhY3QtZHJvcHpvbmUvaXNzdWVzLzQ1MFxuICAgIGlmIChpc0llT3JFZGdlKCkpIHtcbiAgICAgIHNldFRpbWVvdXQob3BlbkZpbGVEaWFsb2csIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVuRmlsZURpYWxvZygpO1xuICAgIH1cbiAgfSwgW25vQ2xpY2ssIG9wZW5GaWxlRGlhbG9nXSk7XG5cbiAgY29uc3QgY29tcG9zZUhhbmRsZXIgPSAoZm4pID0+IHtcbiAgICByZXR1cm4gZGlzYWJsZWQgPyBudWxsIDogZm47XG4gIH07XG5cbiAgY29uc3QgY29tcG9zZUtleWJvYXJkSGFuZGxlciA9IChmbikgPT4ge1xuICAgIHJldHVybiBub0tleWJvYXJkID8gbnVsbCA6IGNvbXBvc2VIYW5kbGVyKGZuKTtcbiAgfTtcblxuICBjb25zdCBjb21wb3NlRHJhZ0hhbmRsZXIgPSAoZm4pID0+IHtcbiAgICByZXR1cm4gbm9EcmFnID8gbnVsbCA6IGNvbXBvc2VIYW5kbGVyKGZuKTtcbiAgfTtcblxuICBjb25zdCBzdG9wUHJvcGFnYXRpb24gPSAoZXZlbnQpID0+IHtcbiAgICBpZiAobm9EcmFnRXZlbnRzQnViYmxpbmcpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRSb290UHJvcHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICAoe1xuICAgICAgICByZWZLZXkgPSBcInJlZlwiLFxuICAgICAgICByb2xlLFxuICAgICAgICBvbktleURvd24sXG4gICAgICAgIG9uRm9jdXMsXG4gICAgICAgIG9uQmx1cixcbiAgICAgICAgb25DbGljayxcbiAgICAgICAgb25EcmFnRW50ZXIsXG4gICAgICAgIG9uRHJhZ092ZXIsXG4gICAgICAgIG9uRHJhZ0xlYXZlLFxuICAgICAgICBvbkRyb3AsXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0gPSB7fSkgPT4gKHtcbiAgICAgICAgb25LZXlEb3duOiBjb21wb3NlS2V5Ym9hcmRIYW5kbGVyKFxuICAgICAgICAgIGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uS2V5RG93biwgb25LZXlEb3duQ2IpXG4gICAgICAgICksXG4gICAgICAgIG9uRm9jdXM6IGNvbXBvc2VLZXlib2FyZEhhbmRsZXIoXG4gICAgICAgICAgY29tcG9zZUV2ZW50SGFuZGxlcnMob25Gb2N1cywgb25Gb2N1c0NiKVxuICAgICAgICApLFxuICAgICAgICBvbkJsdXI6IGNvbXBvc2VLZXlib2FyZEhhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25CbHVyLCBvbkJsdXJDYikpLFxuICAgICAgICBvbkNsaWNrOiBjb21wb3NlSGFuZGxlcihjb21wb3NlRXZlbnRIYW5kbGVycyhvbkNsaWNrLCBvbkNsaWNrQ2IpKSxcbiAgICAgICAgb25EcmFnRW50ZXI6IGNvbXBvc2VEcmFnSGFuZGxlcihcbiAgICAgICAgICBjb21wb3NlRXZlbnRIYW5kbGVycyhvbkRyYWdFbnRlciwgb25EcmFnRW50ZXJDYilcbiAgICAgICAgKSxcbiAgICAgICAgb25EcmFnT3ZlcjogY29tcG9zZURyYWdIYW5kbGVyKFxuICAgICAgICAgIGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uRHJhZ092ZXIsIG9uRHJhZ092ZXJDYilcbiAgICAgICAgKSxcbiAgICAgICAgb25EcmFnTGVhdmU6IGNvbXBvc2VEcmFnSGFuZGxlcihcbiAgICAgICAgICBjb21wb3NlRXZlbnRIYW5kbGVycyhvbkRyYWdMZWF2ZSwgb25EcmFnTGVhdmVDYilcbiAgICAgICAgKSxcbiAgICAgICAgb25Ecm9wOiBjb21wb3NlRHJhZ0hhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25Ecm9wLCBvbkRyb3BDYikpLFxuICAgICAgICByb2xlOiB0eXBlb2Ygcm9sZSA9PT0gXCJzdHJpbmdcIiAmJiByb2xlICE9PSBcIlwiID8gcm9sZSA6IFwicHJlc2VudGF0aW9uXCIsXG4gICAgICAgIFtyZWZLZXldOiByb290UmVmLFxuICAgICAgICAuLi4oIWRpc2FibGVkICYmICFub0tleWJvYXJkID8geyB0YWJJbmRleDogMCB9IDoge30pLFxuICAgICAgICAuLi5yZXN0LFxuICAgICAgfSksXG4gICAgW1xuICAgICAgcm9vdFJlZixcbiAgICAgIG9uS2V5RG93bkNiLFxuICAgICAgb25Gb2N1c0NiLFxuICAgICAgb25CbHVyQ2IsXG4gICAgICBvbkNsaWNrQ2IsXG4gICAgICBvbkRyYWdFbnRlckNiLFxuICAgICAgb25EcmFnT3ZlckNiLFxuICAgICAgb25EcmFnTGVhdmVDYixcbiAgICAgIG9uRHJvcENiLFxuICAgICAgbm9LZXlib2FyZCxcbiAgICAgIG5vRHJhZyxcbiAgICAgIGRpc2FibGVkLFxuICAgIF1cbiAgKTtcblxuICBjb25zdCBvbklucHV0RWxlbWVudENsaWNrID0gdXNlQ2FsbGJhY2soKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBnZXRJbnB1dFByb3BzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgKHsgcmVmS2V5ID0gXCJyZWZcIiwgb25DaGFuZ2UsIG9uQ2xpY2ssIC4uLnJlc3QgfSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0UHJvcHMgPSB7XG4gICAgICAgICAgYWNjZXB0OiBhY2NlcHRBdHRyLFxuICAgICAgICAgIG11bHRpcGxlLFxuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6IFwibm9uZVwiIH0sXG4gICAgICAgICAgb25DaGFuZ2U6IGNvbXBvc2VIYW5kbGVyKGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uQ2hhbmdlLCBvbkRyb3BDYikpLFxuICAgICAgICAgIG9uQ2xpY2s6IGNvbXBvc2VIYW5kbGVyKFxuICAgICAgICAgICAgY29tcG9zZUV2ZW50SGFuZGxlcnMob25DbGljaywgb25JbnB1dEVsZW1lbnRDbGljaylcbiAgICAgICAgICApLFxuICAgICAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgICAgICBbcmVmS2V5XTogaW5wdXRSZWYsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAgIC4uLnJlc3QsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIFtpbnB1dFJlZiwgYWNjZXB0LCBtdWx0aXBsZSwgb25Ecm9wQ2IsIGRpc2FibGVkXVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgaXNGb2N1c2VkOiBpc0ZvY3VzZWQgJiYgIWRpc2FibGVkLFxuICAgIGdldFJvb3RQcm9wcyxcbiAgICBnZXRJbnB1dFByb3BzLFxuICAgIHJvb3RSZWYsXG4gICAgaW5wdXRSZWYsXG4gICAgb3BlbjogY29tcG9zZUhhbmRsZXIob3BlbkZpbGVEaWFsb2cpLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RHJvcHpvbmVTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7e3R5cGU6IHN0cmluZ30gJiBEcm9wem9uZVN0YXRlfSBhY3Rpb25cbiAqIEByZXR1cm5zIHtEcm9wem9uZVN0YXRlfVxuICovXG5mdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgXCJmb2N1c1wiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGlzRm9jdXNlZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgY2FzZSBcImJsdXJcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0ZvY3VzZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICBjYXNlIFwib3BlbkRpYWxvZ1wiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5pdGlhbFN0YXRlLFxuICAgICAgICBpc0ZpbGVEaWFsb2dBY3RpdmU6IHRydWUsXG4gICAgICB9O1xuICAgIGNhc2UgXCJjbG9zZURpYWxvZ1wiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGlzRmlsZURpYWxvZ0FjdGl2ZTogZmFsc2UsXG4gICAgICB9O1xuICAgIGNhc2UgXCJzZXREcmFnZ2VkRmlsZXNcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0RyYWdBY3RpdmU6IGFjdGlvbi5pc0RyYWdBY3RpdmUsXG4gICAgICAgIGlzRHJhZ0FjY2VwdDogYWN0aW9uLmlzRHJhZ0FjY2VwdCxcbiAgICAgICAgaXNEcmFnUmVqZWN0OiBhY3Rpb24uaXNEcmFnUmVqZWN0LFxuICAgICAgfTtcbiAgICBjYXNlIFwic2V0RmlsZXNcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBhY2NlcHRlZEZpbGVzOiBhY3Rpb24uYWNjZXB0ZWRGaWxlcyxcbiAgICAgICAgZmlsZVJlamVjdGlvbnM6IGFjdGlvbi5maWxlUmVqZWN0aW9ucyxcbiAgICAgIH07XG4gICAgY2FzZSBcInJlc2V0XCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbml0aWFsU3RhdGUsXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmV4cG9ydCB7IEVycm9yQ29kZSB9IGZyb20gXCIuL3V0aWxzXCI7XG4iXSwibmFtZXMiOlsiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJ2YWx1ZSIsInN0ZXAiLCJuZXh0IiwiZSIsInJlamVjdGVkIiwicmVzdWx0IiwiZG9uZSIsInRoZW4iLCJhcHBseSIsIl9fZ2VuZXJhdG9yIiwiYm9keSIsImYiLCJ5IiwidCIsIl8iLCJsYWJlbCIsInNlbnQiLCJ0cnlzIiwib3BzIiwiZyIsIk9iamVjdCIsImNyZWF0ZSIsIkl0ZXJhdG9yIiwicHJvdG90eXBlIiwidmVyYiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwidGhpcyIsIm4iLCJ2Iiwib3AiLCJUeXBlRXJyb3IiLCJjYWxsIiwicG9wIiwibGVuZ3RoIiwicHVzaCIsIl9fcmVhZCIsIm8iLCJtIiwiciIsImkiLCJhciIsImVycm9yIiwiX19zcHJlYWRBcnJheSIsInRvIiwiZnJvbSIsInBhY2siLCJhcmd1bWVudHMiLCJsIiwiQXJyYXkiLCJzbGljZSIsImNvbmNhdCIsIlN1cHByZXNzZWRFcnJvciIsIkNPTU1PTl9NSU1FX1RZUEVTIiwiTWFwIiwidG9GaWxlV2l0aFBhdGgiLCJmaWxlIiwicGF0aCIsIm5hbWUiLCJsYXN0SW5kZXhPZiIsInR5cGUiLCJleHQiLCJzcGxpdCIsInRvTG93ZXJDYXNlIiwiZ2V0IiwiZGVmaW5lUHJvcGVydHkiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ3aXRoTWltZVR5cGUiLCJ3ZWJraXRSZWxhdGl2ZVBhdGgiLCJGSUxFU19UT19JR05PUkUiLCJpc09iamVjdCIsImdldElucHV0RmlsZXMiLCJldnQiLCJmcm9tTGlzdCIsInRhcmdldCIsImZpbGVzIiwibWFwIiwiZ2V0RnNIYW5kbGVGaWxlcyIsImhhbmRsZXMiLCJfYSIsImFsbCIsImgiLCJnZXRGaWxlIiwiZ2V0RGF0YVRyYW5zZmVyRmlsZXMiLCJkdCIsIml0ZW1zIiwiZmlsdGVyIiwiaXRlbSIsImtpbmQiLCJ0b0ZpbGVQcm9taXNlcyIsIm5vSWdub3JlZEZpbGVzIiwiZmxhdHRlbiIsImluZGV4T2YiLCJ3ZWJraXRHZXRBc0VudHJ5IiwiZnJvbURhdGFUcmFuc2Zlckl0ZW0iLCJlbnRyeSIsImlzRGlyZWN0b3J5IiwiZnJvbURpckVudHJ5IiwicmVkdWNlIiwiYWNjIiwiaXNBcnJheSIsImdldEFzRmlsZSIsImZ3cCIsImZyb21FbnRyeSIsImZyb21GaWxlRW50cnkiLCJyZWFkZXIiLCJjcmVhdGVSZWFkZXIiLCJlbnRyaWVzIiwicmVhZEVudHJpZXMiLCJfdGhpcyIsImJhdGNoIiwiZXJyXzEiLCJlcnIiLCJmdWxsUGF0aCIsImFjY2VwdGVkRmlsZXMiLCJhY2NlcHRlZEZpbGVzQXJyYXkiLCJmaWxlTmFtZSIsIm1pbWVUeXBlIiwiYmFzZU1pbWVUeXBlIiwicmVwbGFjZSIsInNvbWUiLCJ2YWxpZFR5cGUiLCJ0cmltIiwiY2hhckF0IiwiZW5kc1dpdGgiLCJhY2NlcHRzIiwiX2FjY2VwdHMiLCJGSUxFX0lOVkFMSURfVFlQRSIsIkZJTEVfVE9PX0xBUkdFIiwiRklMRV9UT09fU01BTEwiLCJUT09fTUFOWV9GSUxFUyIsIkVycm9yQ29kZSIsIkZpbGVJbnZhbGlkVHlwZSIsIkZpbGVUb29MYXJnZSIsIkZpbGVUb29TbWFsbCIsIlRvb01hbnlGaWxlcyIsImdldEludmFsaWRUeXBlUmVqZWN0aW9uRXJyIiwiYWNjZXB0IiwibWVzc2FnZVN1ZmZpeCIsImpvaW4iLCJjb2RlIiwibWVzc2FnZSIsImdldFRvb0xhcmdlUmVqZWN0aW9uRXJyIiwibWF4U2l6ZSIsImdldFRvb1NtYWxsUmVqZWN0aW9uRXJyIiwibWluU2l6ZSIsIlRPT19NQU5ZX0ZJTEVTX1JFSkVDVElPTiIsImZpbGVBY2NlcHRlZCIsImlzQWNjZXB0YWJsZSIsImZpbGVNYXRjaFNpemUiLCJpc0RlZmluZWQiLCJzaXplIiwiYWxsRmlsZXNBY2NlcHRlZCIsIm11bHRpcGxlIiwibWF4RmlsZXMiLCJ2YWxpZGF0b3IiLCJldmVyeSIsImFjY2VwdGVkIiwic2l6ZU1hdGNoIiwiY3VzdG9tRXJyb3JzIiwiaXNQcm9wYWdhdGlvblN0b3BwZWQiLCJldmVudCIsImNhbmNlbEJ1YmJsZSIsImlzRXZ0V2l0aEZpbGVzIiwiZGF0YVRyYW5zZmVyIiwidHlwZXMiLCJvbkRvY3VtZW50RHJhZ092ZXIiLCJwcmV2ZW50RGVmYXVsdCIsImlzSWUiLCJ1c2VyQWdlbnQiLCJpc0VkZ2UiLCJpc0llT3JFZGdlIiwid2luZG93IiwibmF2aWdhdG9yIiwiY29tcG9zZUV2ZW50SGFuZGxlcnMiLCJmbnMiLCJhcmdzIiwiZm4iLCJjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJIiwicGlja2VyT3B0aW9uc0Zyb21BY2NlcHQiLCJkZXNjcmlwdGlvbiIsIm9rIiwiaXNNSU1FVHlwZSIsImNvbnNvbGUiLCJ3YXJuIiwiaXNFeHQiLCJhZ2ciLCJhY2NlcHRQcm9wQXNBY2NlcHRBdHRyIiwiYSIsImlzQWJvcnQiLCJET01FeGNlcHRpb24iLCJBQk9SVF9FUlIiLCJpc1NlY3VyaXR5RXJyb3IiLCJTRUNVUklUWV9FUlIiLCJ0ZXN0IiwiRHJvcHpvbmUiLCJmb3J3YXJkUmVmIiwicmVmIiwiY2hpbGRyZW4iLCJ1c2VEcm9wem9uZSIsIm9wZW4iLCJwcm9wcyIsInVzZUltcGVyYXRpdmVIYW5kbGUiLCJSZWFjdCIsIkZyYWdtZW50IiwiZGlzcGxheU5hbWUiLCJkZWZhdWx0UHJvcHMiLCJkaXNhYmxlZCIsImdldEZpbGVzRnJvbUV2ZW50IiwiaXNDaGFuZ2VFdnQiLCJJbmZpbml0eSIsInByZXZlbnREcm9wT25Eb2N1bWVudCIsIm5vQ2xpY2siLCJub0tleWJvYXJkIiwibm9EcmFnIiwibm9EcmFnRXZlbnRzQnViYmxpbmciLCJ1c2VGc0FjY2Vzc0FwaSIsImF1dG9Gb2N1cyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImZ1bmMiLCJvYmplY3RPZiIsImFycmF5T2YiLCJzdHJpbmciLCJib29sIiwibnVtYmVyIiwib25GaWxlRGlhbG9nQ2FuY2VsIiwib25GaWxlRGlhbG9nT3BlbiIsIm9uRHJhZ0VudGVyIiwib25EcmFnTGVhdmUiLCJvbkRyYWdPdmVyIiwib25Ecm9wIiwib25Ecm9wQWNjZXB0ZWQiLCJvbkRyb3BSZWplY3RlZCIsIm9uRXJyb3IiLCJpbml0aWFsU3RhdGUiLCJpc0ZvY3VzZWQiLCJpc0ZpbGVEaWFsb2dBY3RpdmUiLCJpc0RyYWdBY3RpdmUiLCJpc0RyYWdBY2NlcHQiLCJpc0RyYWdSZWplY3QiLCJmaWxlUmVqZWN0aW9ucyIsImFjY2VwdEF0dHIiLCJ1c2VNZW1vIiwicGlja2VyVHlwZXMiLCJvbkZpbGVEaWFsb2dPcGVuQ2IiLCJub29wIiwib25GaWxlRGlhbG9nQ2FuY2VsQ2IiLCJyb290UmVmIiwidXNlUmVmIiwiaW5wdXRSZWYiLCJ1c2VSZWR1Y2VyIiwicmVkdWNlciIsInN0YXRlIiwiZGlzcGF0Y2giLCJmc0FjY2Vzc0FwaVdvcmtzUmVmIiwiaXNTZWN1cmVDb250ZXh0Iiwib25XaW5kb3dGb2N1cyIsImN1cnJlbnQiLCJzZXRUaW1lb3V0IiwidXNlRWZmZWN0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJkcmFnVGFyZ2V0c1JlZiIsIm9uRG9jdW1lbnREcm9wIiwiY29udGFpbnMiLCJkb2N1bWVudCIsImZvY3VzIiwib25FcnJDYiIsInVzZUNhbGxiYWNrIiwib25EcmFnRW50ZXJDYiIsInBlcnNpc3QiLCJzdG9wUHJvcGFnYXRpb24iLCJmaWxlQ291bnQiLCJjYXRjaCIsIm9uRHJhZ092ZXJDYiIsImhhc0ZpbGVzIiwiZHJvcEVmZmVjdCIsIm9uRHJhZ0xlYXZlQ2IiLCJ0YXJnZXRzIiwidGFyZ2V0SWR4Iiwic3BsaWNlIiwic2V0RmlsZXMiLCJmb3JFYWNoIiwiYWNjZXB0RXJyb3IiLCJzaXplRXJyb3IiLCJlcnJvcnMiLCJvbkRyb3BDYiIsIm9wZW5GaWxlRGlhbG9nIiwib3B0cyIsInNob3dPcGVuRmlsZVBpY2tlciIsImNsaWNrIiwiRXJyb3IiLCJvbktleURvd25DYiIsImlzRXF1YWxOb2RlIiwia2V5Iiwia2V5Q29kZSIsIm9uRm9jdXNDYiIsIm9uQmx1ckNiIiwib25DbGlja0NiIiwiY29tcG9zZUhhbmRsZXIiLCJjb21wb3NlS2V5Ym9hcmRIYW5kbGVyIiwiY29tcG9zZURyYWdIYW5kbGVyIiwiZ2V0Um9vdFByb3BzIiwicmVmS2V5Iiwicm9sZSIsIm9uS2V5RG93biIsIm9uRm9jdXMiLCJvbkJsdXIiLCJvbkNsaWNrIiwicmVzdCIsInRhYkluZGV4Iiwib25JbnB1dEVsZW1lbnRDbGljayIsImdldElucHV0UHJvcHMiLCJvbkNoYW5nZSIsImlucHV0UHJvcHMiLCJzdHlsZSIsImRpc3BsYXkiLCJhY3Rpb24iXSwibWFwcGluZ3MiOiIrdkZBa0hPLFNBQVNBLEVBQVVDLEVBQVNDLEVBQVlDLEVBQUdDLEdBRWhELE9BQU8sSUFBS0QsSUFBTUEsRUFBSUUsV0FBVSxTQUFVQyxFQUFTQyxHQUMvQyxTQUFTQyxFQUFVQyxHQUFTLElBQU1DLEVBQUtOLEVBQVVPLEtBQUtGLElBQVcsTUFBT0csR0FBS0wsRUFBT0ssSUFDcEYsU0FBU0MsRUFBU0osR0FBUyxJQUFNQyxFQUFLTixFQUFpQixNQUFFSyxJQUFXLE1BQU9HLEdBQUtMLEVBQU9LLElBQ3ZGLFNBQVNGLEVBQUtJLEdBSmxCLElBQWVMLEVBSWFLLEVBQU9DLEtBQU9ULEVBQVFRLEVBQU9MLFFBSjFDQSxFQUl5REssRUFBT0wsTUFKaERBLGFBQWlCTixFQUFJTSxFQUFRLElBQUlOLEdBQUUsU0FBVUcsR0FBV0EsRUFBUUcsT0FJVE8sS0FBS1IsRUFBV0ssR0FDbEdILEdBQU1OLEVBQVlBLEVBQVVhLE1BQU1oQixFQUFTQyxHQUFjLEtBQUtTLFdBSTdELFNBQVNPLEVBQVlqQixFQUFTa0IsR0FDbkMsSUFBc0dDLEVBQUdDLEVBQUdDLEVBQXhHQyxFQUFJLENBQUVDLE1BQU8sRUFBR0MsS0FBTSxXQUFhLEdBQVcsRUFBUEgsRUFBRSxHQUFRLE1BQU1BLEVBQUUsR0FBSSxPQUFPQSxFQUFFLElBQU9JLEtBQU0sR0FBSUMsSUFBSyxJQUFlQyxFQUFJQyxPQUFPQyxRQUE0QixtQkFBYkMsU0FBMEJBLFNBQVdGLFFBQVFHLFdBQ3RMLE9BQU9KLEVBQUVq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 +diff --git a/src/utils/index.js b/src/utils/index.js +index 5abc90b49f2a68dba693a9c850c0201facc4b162..4bbe4ba291127fd9a67dd629c73bdf75fdc1efb5 100644 +--- a/src/utils/index.js ++++ b/src/utils/index.js +@@ -306,7 +306,7 @@ export function isMIMEType(v) { + * @param {string} v + */ + export function isExt(v) { +- return /^.*\.[\w]+$/.test(v); ++ return /^\.[^/\\?*<>|:".]+$/.test(v); + } + + /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07ca88ba50..3b0ce02b04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,9 @@ patchedDependencies: react-big-calendar@0.19.2: hash: d8f03ab5a445efa65feb8cf9de6d013131afabc5b7e269c61364b2997ef90f94 path: patches/react-big-calendar@0.19.2.patch + react-dropzone: + hash: d30fd95f2a3d58218fd5d657104b52cad6924893c0ac0e173f51c8c2d8e179b6 + path: patches/react-dropzone.patch importers: @@ -1421,7 +1424,7 @@ importers: version: 4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0) react-dropzone: specifier: ^14.2.3 - version: 14.2.9(react@18.2.0) + version: 14.2.9(patch_hash=d30fd95f2a3d58218fd5d657104b52cad6924893c0ac0e173f51c8c2d8e179b6)(react@18.2.0) devDependencies: '@mendix/automation-utils': specifier: workspace:* @@ -20505,7 +20508,7 @@ snapshots: react: 18.2.0 scheduler: 0.23.2 - react-dropzone@14.2.9(react@18.2.0): + react-dropzone@14.2.9(patch_hash=d30fd95f2a3d58218fd5d657104b52cad6924893c0ac0e173f51c8c2d8e179b6)(react@18.2.0): dependencies: attr-accept: 2.2.2 file-selector: 0.6.0