-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path3442.414d17bf.iframe.bundle.js
2 lines (2 loc) · 137 KB
/
3442.414d17bf.iframe.bundle.js
1
2
"use strict";(self.webpackChunkblockly_mooc=self.webpackChunkblockly_mooc||[]).push([[3442],{"./src/code-studio/components/AddAssetButtonRow.jsx":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.assetButtonStyles=void 0;var _propTypes=_interopRequireDefault(__webpack_require__("./node_modules/prop-types/index.js")),_react=_interopRequireDefault(__webpack_require__("./node_modules/react/index.js")),_Button=_interopRequireDefault(__webpack_require__("./src/legacySharedComponents/Button.jsx")),_browserDetector=__webpack_require__("./src/util/browser-detector.js"),_locale=_interopRequireDefault(__webpack_require__("./src/util/locale-do-not-import.js")),_AssetUploader=_interopRequireDefault(__webpack_require__("./src/code-studio/components/AssetUploader.jsx"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}var assetButtonStyles=exports.assetButtonStyles={button:{paddingLeft:10,paddingRight:10,marginTop:5,fontSize:"large",fontWeight:"lighter",marginRight:10},buttonRow:{display:"flex",flexFlow:"row",alignItems:"center"}},RecordButton=function RecordButton(_ref){var onSelectRecord=_ref.onSelectRecord,disabled=_ref.disabled;return _react.default.createElement("span",null,_react.default.createElement(_Button.default,{onClick:onSelectRecord,id:"record-asset",className:"share",text:_locale.default.recordAudio(),icon:"microphone",style:assetButtonStyles.button,size:"large",disabled}))};RecordButton.propTypes={onSelectRecord:_propTypes.default.func,disabled:_propTypes.default.bool},function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}(exports.default=function(_React$Component){function AddAssetButtonRow(){return _React$Component.apply(this,arguments)||this}return function _inheritsLoose(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,_setPrototypeOf(t,o)}(AddAssetButtonRow,_React$Component),AddAssetButtonRow.prototype.render=function render(){var shouldShowRecordButton=!this.props.hideAudioRecording;return(0,_browserDetector.isIE11)()&&(shouldShowRecordButton=!1),_react.default.createElement("div",{style:assetButtonStyles.buttonRow},_react.default.createElement(_AssetUploader.default,{uploadsEnabled:this.props.uploadsEnabled,allowedExtensions:this.props.allowedExtensions,api:this.props.api,onUploadStart:this.props.onUploadStart,onUploadDone:this.props.onUploadDone,onUploadError:this.props.onUploadError}),shouldShowRecordButton&&_react.default.createElement(RecordButton,{onSelectRecord:this.props.onSelectRecord,disabled:!this.props.uploadsEnabled||this.props.recordDisabled}),_react.default.createElement("span",{id:"manage-asset-status"},this.props.statusMessage))},AddAssetButtonRow}(_react.default.Component),"propTypes",{uploadsEnabled:_propTypes.default.bool.isRequired,allowedExtensions:_propTypes.default.string,api:_propTypes.default.object,onUploadStart:_propTypes.default.func.isRequired,onUploadDone:_propTypes.default.func.isRequired,onUploadError:_propTypes.default.func.isRequired,onSelectRecord:_propTypes.default.func.isRequired,statusMessage:_propTypes.default.string,recordDisabled:_propTypes.default.bool,hideAudioRecording:_propTypes.default.bool})},"./src/code-studio/components/AssetManager.jsx":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.ImageMode=exports.AudioErrorType=void 0;var _propTypes=_interopRequireDefault(__webpack_require__("./node_modules/prop-types/index.js")),_react=_interopRequireDefault(__webpack_require__("./node_modules/react/index.js")),_assetPrefix=__webpack_require__("./src/assetManagement/assetPrefix.js"),_clientApi=__webpack_require__("./src/clientApi.js"),_firehose=_interopRequireDefault(__webpack_require__("./src/metrics/firehose.js")),_locale=_interopRequireDefault(__webpack_require__("./src/util/locale-do-not-import.js")),_assetListStore=_interopRequireDefault(__webpack_require__("./src/code-studio/assets/assetListStore.js")),_AddAssetButtonRow=_interopRequireDefault(__webpack_require__("./src/code-studio/components/AddAssetButtonRow.jsx")),_AssetRow=_interopRequireDefault(__webpack_require__("./src/code-studio/components/AssetRow.jsx")),_AudioRecorder=_interopRequireDefault(__webpack_require__("./src/code-studio/components/AudioRecorder.jsx")),_recorders=__webpack_require__("./src/code-studio/components/recorders.js");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _extends(){return _extends=Object.assign?Object.assign.bind():function(n){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var r in t)({}).hasOwnProperty.call(t,r)&&(n[r]=t[r])}return n},_extends.apply(null,arguments)}function _toConsumableArray(r){return function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}(r)||function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}(r)||function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}(r)||function _nonIterableSpread(){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 _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var AudioErrorType=exports.AudioErrorType={NONE:"none",INITIALIZE:"initialize",SAVE:"save"},errorMessages=(exports.ImageMode={FILE:"file",ICON:"icon",URL:"url",DEFAULT:"default"},{403:"Quota exceeded. Please delete some files and try again.",413:"The file is too large.",415:"This type of file is not supported.",500:"The server responded with an error.",unknown:"An unknown error occurred."});function getErrorMessage(status){return errorMessages[status]||errorMessages.unknown}var AssetManager=exports.default=function(_React$Component){function AssetManager(props){var _this;return _defineProperty(_this=_React$Component.call(this,props)||this,"onStarterAssetsReceived",(function(result){var response=JSON.parse(result.response);_this.setState({starterAssets:response.starter_assets})})),_defineProperty(_this,"onStarterAssetsFailure",(function(xhr){_this.setState({statusMessage:"Error loading starter assets: "+getErrorMessage(xhr.status)})})),_defineProperty(_this,"onAssetListReceived",(function(result){_assetListStore.default.reset(result.files),_this.setState({assets:_assetListStore.default.list(_this.props.allowedExtensions)})})),_defineProperty(_this,"onAssetListFailure",(function(_ref){var status=_ref.status;_this.props.useFilesApi&&404===status?_this.onAssetListReceived({files:[]}):_this.setState({statusMessage:"Error loading asset list: "+getErrorMessage(status)})})),_defineProperty(_this,"onUploadStart",(function(data){_this.setState({statusMessage:"Uploading..."}),data.submit()})),_defineProperty(_this,"onUploadDone",(function(result){var newState={statusMessage:'File "'+result.filename+'" successfully uploaded!'};_this.props.isStartMode?newState.starterAssets=[].concat(_toConsumableArray(_this.state.starterAssets),[result]):(_assetListStore.default.add(result),_this.props.assetsChanged&&_this.props.assetsChanged(),newState.assets=_assetListStore.default.list(_this.props.allowedExtensions)),_this.setState(newState)})),_defineProperty(_this,"onUploadError",(function(status){_this.setState({statusMessage:"Error uploading file: "+getErrorMessage(status)}),_firehose.default.putRecord({study:"project-data-integrity",study_group:"v4",event:"asset-upload-error",project_id:_this.props.projectId,data_int:status})})),_defineProperty(_this,"onSelectRecord",(function(){_this.setState({recordingAudio:!0})})),_defineProperty(_this,"deleteAssetRow",(function(name){_assetListStore.default.remove(name),_this.props.assetsChanged&&_this.props.assetsChanged(),_firehose.default.putRecord({study:"delete-asset",study_group:_this.props.assetChosen&&"function"==typeof _this.props.assetChosen?"choose-assets":"manage-assets",event:"confirm",project_id:_this.props.projectId,data_json:JSON.stringify({assetName:name,elementId:_this.props.elementId})}),_this.setState({assets:_assetListStore.default.list(_this.props.allowedExtensions),statusMessage:'File "'.concat(name,'" successfully deleted!')})})),_defineProperty(_this,"deleteStarterAssetRow",(function(name){var starterAssets=_toConsumableArray(_this.state.starterAssets).filter((function(asset){return asset.filename!==name}));_this.setState({starterAssets,statusMessage:'File "'.concat(name,'" successfully deleted!')})})),_defineProperty(_this,"afterAudioSaved",(function(err){_this.setState({recordingAudio:!1,audioErrorType:err})})),_defineProperty(_this,"defaultAssetProps",(function(asset){return{key:asset.filename,name:asset.filename,timestamp:asset.timestamp,type:asset.category,size:asset.size,soundPlayer:_this.props.soundPlayer,imagePicker:_this.props.imagePicker,projectId:_this.props.projectId,elementId:_this.props.elementId}})),_defineProperty(_this,"getStarterAssetRows",(function(){if(!_this.props.levelName||0===_this.state.starterAssets.length)return[];var boundApi=_clientApi.starterAssets.withLevelName(_this.props.levelName);return _this.state.starterAssets.map((function(asset){return _react.default.createElement(_AssetRow.default,_extends({},_this.defaultAssetProps(asset),{api:boundApi,onChoose:_this.props.assetChosen&&function(){return _this.props.assetChosen(_assetPrefix.STARTER_ASSET_PREFIX+asset.filename,asset.timestamp)},onDelete:function onDelete(){return _this.deleteStarterAssetRow(asset.filename)},levelName:_this.props.levelName,hideDelete:!_this.props.isStartMode}))}))})),_defineProperty(_this,"getAssetRows",(function(){var api=_this.props.useFilesApi?_clientApi.files:_clientApi.assets;return _this.state.assets.map((function(asset){return _react.default.createElement(_AssetRow.default,_extends({},_this.defaultAssetProps(asset),{api,onChoose:_this.props.assetChosen&&function(){return _this.props.assetChosen(asset.filename,asset.timestamp)},onDelete:function onDelete(){return _this.deleteAssetRow(asset.filename)}}))}))})),_defineProperty(_this,"uploadApi",(function(){if(_this.props.isStartMode)return _clientApi.starterAssets.withLevelName(_this.props.levelName);var api=_this.props.useFilesApi?_clientApi.files:_clientApi.assets;return api.getProjectId()||(api=api.withProjectId(_this.props.projectId)),api})),_this.state={assets:null,starterAssets:null,statusMessage:props.uploadsEnabled?"":"This project has been reported for abusive content, so uploading new assets is disabled.",recordingAudio:!1,audioErrorType:AudioErrorType.NONE},_this}!function _inheritsLoose(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,_setPrototypeOf(t,o)}(AssetManager,_React$Component);var _proto=AssetManager.prototype;return _proto.componentDidMount=function componentDidMount(){this.props.levelName?_clientApi.starterAssets.getStarterAssets(this.props.levelName,this.onStarterAssetsReceived,this.onStarterAssetsFailure):this.setState({starterAssets:[]});var api=this.props.useFilesApi?_clientApi.files:_clientApi.assets;api.getProjectId()||(api=api.withProjectId(this.props.projectId)),api.getProjectId()?api.getFiles(this.onAssetListReceived,this.onAssetListFailure):this.setState({assets:[]})},_proto.render=function render(){var assetList,displayAudioRecorder=this.state.audioErrorType!==AudioErrorType.INITIALIZE&&this.state.recordingAudio,buttons=_react.default.createElement("div",null,this.state.audioErrorType===AudioErrorType.SAVE&&_react.default.createElement("div",null,_locale.default.audioSaveError()),this.state.audioErrorType===AudioErrorType.INITIALIZE&&_react.default.createElement("div",null,_locale.default.audioInitializeError()),displayAudioRecorder&&_react.default.createElement(_AudioRecorder.default,{onUploadDone:this.onUploadDone,afterAudioSaved:this.afterAudioSaved,recordingFileType:this.props.recordingFileType,imagePicker:this.props.imagePicker}),_react.default.createElement(_AddAssetButtonRow.default,{uploadsEnabled:this.props.uploadsEnabled,allowedExtensions:this.props.allowedExtensions,api:this.uploadApi(),onUploadStart:this.onUploadStart,onUploadDone:this.onUploadDone,onUploadError:this.onUploadError,onSelectRecord:this.onSelectRecord,statusMessage:this.state.statusMessage,recordDisabled:this.state.recordingAudio,hideAudioRecording:this.props.disableAudioRecording}));if(null===this.state.assets||null===this.state.starterAssets)assetList=_react.default.createElement("div",{style:{margin:"1em 0",textAlign:"center"}},_react.default.createElement("i",{className:"fa fa-spinner fa-spin",style:{fontSize:"32px"}}));else if(0===this.state.assets.length&&0===this.state.starterAssets.length){var emptyText=".mp3"===this.props.allowedExtensions?_react.default.createElement("div",null,_react.default.createElement("div",null,_locale.default.manageAssetsSoundLibraryMessage({soundLibraryButtonText:_locale.default.soundLibrary()})),_react.default.createElement("div",null,_locale.default.manageAssetsSoundUploadMessage({assetUploaderButtonText:_locale.default.uploadFile()}))):_react.default.createElement("div",null,_locale.default.manageAssetsDefaultMessage({assetUploaderButtonText:_locale.default.uploadFile()}));assetList=_react.default.createElement("div",null,_react.default.createElement("div",{style:styles.emptyText},emptyText),buttons)}else{var rows=[].concat(_toConsumableArray(this.getStarterAssetRows()),_toConsumableArray(this.getAssetRows()));assetList=_react.default.createElement("div",null,_react.default.createElement("div",{style:{maxHeight:"380px",overflowY:"scroll",margin:"1em 0"}},_react.default.createElement("table",{style:{width:"100%"}},_react.default.createElement("tbody",null,rows))),buttons)}return assetList},AssetManager}(_react.default.Component);_defineProperty(AssetManager,"propTypes",{assetChosen:_propTypes.default.func,assetsChanged:_propTypes.default.func,allowedExtensions:_propTypes.default.string,uploadsEnabled:_propTypes.default.bool.isRequired,useFilesApi:_propTypes.default.bool,soundPlayer:_propTypes.default.object,disableAudioRecording:_propTypes.default.bool,recordingFileType:_propTypes.default.oneOf(Object.values(_recorders.RecordingFileType)),projectId:_propTypes.default.string,levelName:_propTypes.default.string,isStartMode:_propTypes.default.bool,imagePicker:_propTypes.default.bool,elementId:_propTypes.default.string});var styles={emptyText:{margin:"1em 0",fontSize:"16px",lineHeight:"20px"}}},"./src/code-studio/components/AssetRow.jsx":(module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _jquery=_interopRequireDefault(__webpack_require__("./node_modules/jquery/dist/jquery.js")),_propTypes=_interopRequireDefault(__webpack_require__("./node_modules/prop-types/index.js")),_react=_interopRequireDefault(__webpack_require__("./node_modules/react/index.js")),_firehose=_interopRequireDefault(__webpack_require__("./src/metrics/firehose.js")),_color=_interopRequireDefault(__webpack_require__("./src/util/color.js")),_locale=_interopRequireDefault(__webpack_require__("./src/util/locale-do-not-import.js")),_AssetThumbnail=_interopRequireDefault(__webpack_require__("./src/code-studio/components/AssetThumbnail.jsx"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var AssetRow=exports.default=function(_React$Component){function AssetRow(){for(var _this,_len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return _defineProperty(_this=_React$Component.call.apply(_React$Component,[this].concat(args))||this,"state",{action:"normal",actionText:"",attemptedUsedDelete:!1}),_defineProperty(_this,"confirmDelete",(function(){_this.setState({action:"confirming delete",actionText:""}),_firehose.default.putRecord({study:"delete-asset",study_group:_this.props.onChoose&&"function"==typeof _this.props.onChoose?"choose-assets":"manage-assets",event:"initiate",project_id:_this.props.projectId,data_json:JSON.stringify({assetName:_this.props.name,elementId:_this.props.elementId})})})),_defineProperty(_this,"cancelDelete",(function(){_this.setState({action:"normal",actionText:""})})),_defineProperty(_this,"handleDelete",(function(){_this.setState({action:"deleting",actionText:""}),_this.props.api.deleteFile(_this.props.name,_this.props.onDelete,(function(){_this.setState({action:"confirming delete",actionText:_locale.default.errorDeleting()})}))})),_defineProperty(_this,"chooseAsset",(function(){_this.props.imagePicker||_firehose.default.putRecord({study:"sound-dialog-2",study_group:"library-tab",event:"choose-uploaded-sound",data_json:_this.props.name},{includeUserId:!0}),_this.props.onChoose()})),_defineProperty(_this,"attemptBadDelete",(function(){_this.setState({attemptedUsedDelete:!0})})),_this}return function _inheritsLoose(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,_setPrototypeOf(t,o)}(AssetRow,_React$Component),AssetRow.prototype.render=function render(){var actions,flex;this.props.onChoose?flex=_react.default.createElement("button",{type:"button",onClick:this.chooseAsset},_locale.default.choose()):flex=(this.props.size/1e3).toFixed(2)+" kb";var usage=(0,_jquery.default)("#visualization").find('[src*="'.concat(encodeURIComponent(this.props.name),'"]')).length;switch(this.state.action){case"normal":actions=_react.default.createElement("td",{width:"250",style:{textAlign:"right"}},flex,!this.props.hideDelete&&_react.default.createElement("button",{type:"button",className:usage>0?"":"btn-danger",onClick:usage>0?this.attemptBadDelete:this.confirmDelete},_react.default.createElement("i",{className:"fa fa-trash-o"})),this.state.attemptedUsedDelete&&_react.default.createElement("div",{style:styles.deleteWarning},_locale.default.cannotDeleteUsedImage()));break;case"confirming delete":actions=_react.default.createElement("td",{width:"250",style:{textAlign:"right"}},_react.default.createElement("button",{type:"button",className:"btn-danger",onClick:this.handleDelete},"Delete File"),_react.default.createElement("button",{type:"button",onClick:this.cancelDelete},"Cancel"),_react.default.createElement("div",{style:styles.deleteWarning},_locale.default.confirmDeleteExplanation()),this.state.actionText);break;case"deleting":actions=_react.default.createElement("td",{width:"250",style:{textAlign:"right"}},_react.default.createElement("i",{className:"fa fa-spinner fa-spin",style:{fontSize:"32px",marginRight:"15px"}}))}return _react.default.createElement("tr",{className:"assetRow",onDoubleClick:this.props.onChoose},_react.default.createElement("td",{width:"80"},_react.default.createElement(_AssetThumbnail.default,{type:this.props.type,name:this.props.name,timestamp:this.props.timestamp,api:this.props.api,soundPlayer:this.props.soundPlayer,levelName:this.props.levelName})),_react.default.createElement("td",null,this.props.name),actions)},AssetRow}(_react.default.Component);_defineProperty(AssetRow,"propTypes",{name:_propTypes.default.string.isRequired,timestamp:_propTypes.default.string,type:_propTypes.default.oneOf(["image","audio","video","pdf","doc"]).isRequired,size:_propTypes.default.number,api:_propTypes.default.object.isRequired,onChoose:_propTypes.default.func,onDelete:_propTypes.default.func.isRequired,soundPlayer:_propTypes.default.object,projectId:_propTypes.default.string,levelName:_propTypes.default.string,hideDelete:_propTypes.default.bool,imagePicker:_propTypes.default.bool,elementId:_propTypes.default.string});var styles={deleteWarning:{paddingLeft:"34px",textAlign:"left",color:_color.default.red}};module.exports=exports.default},"./src/code-studio/components/AssetThumbnail.jsx":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.styles=exports.default=void 0;var _Class,_Class2,_Class3,_propTypes=_interopRequireDefault(__webpack_require__("./node_modules/prop-types/index.js")),_react=_interopRequireDefault(__webpack_require__("./node_modules/react/index.js")),_clientApi=__webpack_require__("./src/clientApi.js"),_color=_interopRequireDefault(__webpack_require__("./src/util/color.js"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach((function(r){_defineProperty(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function _inheritsLoose(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,_setPrototypeOf(t,o)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var defaultIcons={image:"fa fa-picture-o",audio:"fa fa-music",video:"fa fa-video-camera",pdf:"fa fa-file-pdf-o",doc:"fa fa-file-text-o",unknown:"fa fa-question"},assetThumbnailStyle={width:"auto",maxWidth:"100%",height:"auto",maxHeight:"100%",marginTop:"50%",transform:"translateY(-50%)",msTransform:"translateY(-50%)",WebkitTransform:"translateY(-50%)"},assetIconStyle={margin:"15px 0",fontSize:"32px"},styles=exports.styles={wrapper:{width:60,height:60,margin:"10px auto"},background:{background:"#eee",border:"1px solid #ccc",textAlign:"center"},audioIcon:{color:_color.default.purple,marginLeft:"auto",marginRight:"auto",display:"block"},audioWrapper:{display:"flex"}},AssetThumbnail=function(_React$Component){function AssetThumbnail(props){var _this;_defineProperty(_this=_React$Component.call(this,props)||this,"clickSoundControl",(function(){_this.state.isPlayingAudio&&_this.props.soundPlayer?(_this.setState({isPlayingAudio:!1}),_this.props.soundPlayer.stopPlayingURL(_this.srcPath)):_this.props.soundPlayer&&(_this.setState({isPlayingAudio:!0}),_this.props.soundPlayer.play(_this.srcPath,{onEnded:function onEnded(){_this.setState({isPlayingAudio:!1})}}))}));var api=_this.props.api||_clientApi.assets;_this.props.levelName?api=api.withLevelName(_this.props.levelName):_this.props.projectId&&(api=api.withProjectId(_this.props.projectId));var basePath=api.basePath(_this.props.name),cacheBustSuffix="";if(_this.props.timestamp){var date=new Date(_this.props.timestamp);cacheBustSuffix="?t=".concat(date.valueOf())}return _this.srcPath="".concat(basePath).concat(cacheBustSuffix),"audio"===_this.props.type&&_this.props.soundPlayer&&_this.props.soundPlayer.register({id:_this.srcPath,mp3:_this.srcPath}),_this.state={isPlayingAudio:!1},_this}return _inheritsLoose(AssetThumbnail,_React$Component),AssetThumbnail.prototype.render=function render(){var _this$props=this.props,type=_this$props.type,iconStyle=_this$props.iconStyle,style=_this$props.style;return _react.default.createElement("div",{className:"assetThumbnail"},"audio"===type?_react.default.createElement(AudioThumbnail,{clickSoundControl:this.clickSoundControl,isPlaying:this.state.isPlayingAudio}):_react.default.createElement("div",{style:_objectSpread(_objectSpread(_objectSpread({},styles.wrapper),style),styles.background)},"image"===type?_react.default.createElement(ImageThumbnail,{src:this.srcPath}):_react.default.createElement(DefaultThumbnail,{type,iconStyle})))},AssetThumbnail}(_react.default.Component);_defineProperty(AssetThumbnail,"propTypes",{name:_propTypes.default.string.isRequired,timestamp:_propTypes.default.string,type:_propTypes.default.oneOf(["image","audio","video","pdf","doc"]).isRequired,style:_propTypes.default.object,iconStyle:_propTypes.default.object,api:_propTypes.default.object,projectId:_propTypes.default.string,levelName:_propTypes.default.string,soundPlayer:_propTypes.default.object});exports.default=AssetThumbnail;var AudioThumbnail=(_Class=function(_React$Component2){function AudioThumbnail(){return _React$Component2.apply(this,arguments)||this}return _inheritsLoose(AudioThumbnail,_React$Component2),AudioThumbnail.prototype.render=function render(){var playIcon=this.props.isPlaying?"fa-pause-circle":"fa-play-circle";return _react.default.createElement("div",{style:_objectSpread(_objectSpread({},styles.wrapper),styles.audioWrapper)},_react.default.createElement("i",{onClick:this.props.clickSoundControl,className:"fa "+playIcon+" fa-4x",style:styles.audioIcon}))},AudioThumbnail}(_react.default.Component),_defineProperty(_Class,"propTypes",{clickSoundControl:_propTypes.default.func,isPlaying:_propTypes.default.bool}),_Class),ImageThumbnail=(_Class2=function(_React$Component3){function ImageThumbnail(){return _React$Component3.apply(this,arguments)||this}return _inheritsLoose(ImageThumbnail,_React$Component3),ImageThumbnail.prototype.render=function render(){return _react.default.createElement("a",{href:this.props.src,target:"_blank",rel:"noopener noreferrer"},_react.default.createElement("img",{src:this.props.src,style:assetThumbnailStyle,id:"ui-image-thumbnail",alt:""}))},ImageThumbnail}(_react.default.Component),_defineProperty(_Class2,"propTypes",{src:_propTypes.default.string}),_Class2),DefaultThumbnail=(_Class3=function(_React$Component4){function DefaultThumbnail(){return _React$Component4.apply(this,arguments)||this}return _inheritsLoose(DefaultThumbnail,_React$Component4),DefaultThumbnail.prototype.render=function render(){return _react.default.createElement("i",{className:defaultIcons[this.props.type]||defaultIcons.unknown,style:_objectSpread(_objectSpread({},assetIconStyle),this.props.iconStyle)})},DefaultThumbnail}(_react.default.Component),_defineProperty(_Class3,"propTypes",{type:_propTypes.default.oneOf(["image","audio","video","pdf","doc"]).isRequired,iconStyle:_propTypes.default.object}),_Class3)},"./src/code-studio/components/AssetUploader.jsx":(module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _propTypes=_interopRequireDefault(__webpack_require__("./node_modules/prop-types/index.js")),_react=_interopRequireDefault(__webpack_require__("./node_modules/react/index.js")),_Button=_interopRequireDefault(__webpack_require__("./src/legacySharedComponents/Button.jsx")),_locale=_interopRequireDefault(__webpack_require__("./src/util/locale-do-not-import.js")),_AddAssetButtonRow=__webpack_require__("./src/code-studio/components/AddAssetButtonRow.jsx"),_HiddenUploader=_interopRequireDefault(__webpack_require__("./src/code-studio/components/HiddenUploader.jsx"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var AssetUploader=exports.default=function(_React$Component){function AssetUploader(){for(var _this,_len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return _defineProperty(_this=_React$Component.call.apply(_React$Component,[this].concat(args))||this,"fileUploadClicked",(function(){return _this.refs.uploader.openFileChooser()})),_this}return function _inheritsLoose(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,_setPrototypeOf(t,o)}(AssetUploader,_React$Component),AssetUploader.prototype.render=function render(){var api=this.props.api,url=api.getUploadUrl(),uploadDone=api.wrapUploadDoneCallback(this.props.onUploadDone),uploadStart=api.wrapUploadStartCallback(this.props.onUploadStart);return _react.default.createElement("span",null,_react.default.createElement(_HiddenUploader.default,{ref:"uploader",toUrl:url,allowedExtensions:this.props.allowedExtensions,onUploadStart:uploadStart,onUploadDone:uploadDone,onUploadError:this.props.onUploadError}),_react.default.createElement(_Button.default,{onClick:this.fileUploadClicked,className:"share",id:"upload-asset",disabled:!this.props.uploadsEnabled,icon:"upload",text:_locale.default.uploadFile(),style:_AddAssetButtonRow.assetButtonStyles.button,size:"large"}))},AssetUploader}(_react.default.Component);_defineProperty(AssetUploader,"propTypes",{onUploadStart:_propTypes.default.func.isRequired,onUploadDone:_propTypes.default.func.isRequired,onUploadError:_propTypes.default.func,allowedExtensions:_propTypes.default.string,uploadsEnabled:_propTypes.default.bool.isRequired,api:_propTypes.default.object.isRequired}),module.exports=exports.default},"./src/code-studio/components/AudioRecorder.jsx":(module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _propTypes=_interopRequireDefault(__webpack_require__("./node_modules/prop-types/index.js")),_react=_interopRequireDefault(__webpack_require__("./node_modules/react/index.js")),_clientApi=__webpack_require__("./src/clientApi.js"),_Button=_interopRequireDefault(__webpack_require__("./src/legacySharedComponents/Button.jsx")),_firehose=_interopRequireDefault(__webpack_require__("./src/metrics/firehose.js")),_color=_interopRequireDefault(__webpack_require__("./src/util/color.js")),_locale=_interopRequireDefault(__webpack_require__("./src/util/locale-do-not-import.js")),_AddAssetButtonRow=__webpack_require__("./src/code-studio/components/AddAssetButtonRow.jsx"),_AssetManager=__webpack_require__("./src/code-studio/components/AssetManager.jsx"),_recorders=function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=_typeof(e)&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&{}.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u]}return n.default=e,t&&t.set(e,n),n}(__webpack_require__("./src/code-studio/components/recorders.js"));function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function _getRequireWildcardCache(e){return e?t:r})(e)}function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var AudioRecorder=exports.default=function(_React$Component){function AudioRecorder(props){var _this;return _defineProperty(_this=_React$Component.call(this,props)||this,"componentDidMount",(function(){navigator.mediaDevices&&navigator.mediaDevices.getUserMedia?(_this.recorder=(0,_recorders.default)(_this.props.recordingFileType),navigator.mediaDevices.getUserMedia({audio:!0}).then(_this.recorder.init).then((function(){return _this.setState({loading:!1})})).catch((function(){return _this.props.afterAudioSaved(_AssetManager.AudioErrorType.INITIALIZE)}))):_this.props.afterAudioSaved(_AssetManager.AudioErrorType.INITIALIZE)})),_defineProperty(_this,"saveAudio",(function(blob){_this.setState({loading:!0}),_clientApi.assets.putAsset(_this.state.audioName+_this.recorder.getExtension(),blob,(function(xhr){_this.setState({audioName:"",loading:!1});var result=JSON.parse(xhr.response);result.filename=decodeURI(result.filename),_this.props.onUploadDone(result),_this.props.afterAudioSaved(_AssetManager.AudioErrorType.NONE)}),(function(error){_this.setState({loading:!1}),console.error("Audio Failed to Save: ".concat(error)),_this.props.afterAudioSaved(_AssetManager.AudioErrorType.SAVE)}))})),_defineProperty(_this,"onNameChange",(function(event){_this.setState({audioName:event.target.value})})),_defineProperty(_this,"onCancel",(function(){_this.setState({audioName:"",recording:!1},(function(){_this.props.afterAudioSaved(_AssetManager.AudioErrorType.NONE),_this.recorder.isRecording()&&(clearTimeout(_this.recordTimeout),_this.recorder.stopRecording())}))})),_defineProperty(_this,"toggleRecord",(function(){_this.state.recording?_this.stopRecordingAndSave():_this.startRecording()})),_defineProperty(_this,"startRecording",(function(){var studyGroup=_this.props.imagePicker?"manage-assets":"library-tab";_this.recorder.startRecording().then((function(){_firehose.default.putRecord({study:"sound-dialog-2",study_group:studyGroup,event:"record-sound",data_json:_this.state.audioName},{includeUserId:!0}),_this.setState({recording:!_this.state.recording})})),_this.recordTimeout=setTimeout(_this.stopRecordingAndSave,3e4)})),_defineProperty(_this,"stopRecordingAndSave",(function(){_this.state.recording&&(clearTimeout(_this.recordTimeout),_this.recorder.stopRecording().then((function(blob){_this.saveAudio(blob)})),_this.setState({recording:!_this.state.recording}))})),_this.timeout=null,_this.recorder=null,_this.state={audioName:"",recording:!1,loading:!0},_this}return function _inheritsLoose(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,_setPrototypeOf(t,o)}(AudioRecorder,_React$Component),AudioRecorder.prototype.render=function render(){return _react.default.createElement("div",null,_react.default.createElement("div",{style:styles.buttonRow},_react.default.createElement("input",{type:"text",placeholder:_locale.default.soundName(),onChange:this.onNameChange,value:this.state.audioName}),this.state.recording&&_react.default.createElement("span",{style:_AddAssetButtonRow.assetButtonStyles.button},_react.default.createElement("i",{style:styles.recordingIcon,className:"fa fa-circle"}),_locale.default.recording()),_react.default.createElement("span",null,this.state.loading&&this.state.audioName.length>0&&_react.default.createElement("div",{style:styles.spinner},_react.default.createElement("i",{className:"fa fa-spinner fa-spin",style:{fontSize:"20px"}})),_react.default.createElement(_Button.default,{onClick:this.toggleRecord,id:"start-stop-record",style:_AddAssetButtonRow.assetButtonStyles.button,color:_Button.default.ButtonColor.blue,icon:this.state.recording?"stop":"circle",text:this.state.recording?_locale.default.stop():_locale.default.record(),size:"large",disabled:0===this.state.audioName.length||this.state.loading}),_react.default.createElement(_Button.default,{onClick:this.onCancel,id:"cancel-record",style:_AddAssetButtonRow.assetButtonStyles.button,color:_Button.default.ButtonColor.gray,text:_locale.default.cancel(),size:"large"}))))},AudioRecorder}(_react.default.Component);_defineProperty(AudioRecorder,"propTypes",{onUploadDone:_propTypes.default.func,afterAudioSaved:_propTypes.default.func,recordingFileType:_propTypes.default.oneOf(Object.values(_recorders.RecordingFileType)),imagePicker:_propTypes.default.bool});var styles={buttonRow:{display:"flex",flexFlow:"row",justifyContent:"space-between",alignItems:"center"},recordingIcon:{color:"red",margin:5},warning:{textAlign:"left",color:_color.default.red},spinner:{display:"inline-block",verticalAlign:"top",marginTop:"16px",marginRight:"10px"}};module.exports=exports.default},"./src/code-studio/components/HiddenUploader.jsx":(module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _jquery=_interopRequireDefault(__webpack_require__("./node_modules/jquery/dist/jquery.js")),_propTypes=_interopRequireDefault(__webpack_require__("./node_modules/prop-types/index.js")),_react=_interopRequireDefault(__webpack_require__("./node_modules/react/index.js")),_firehose=_interopRequireDefault(__webpack_require__("./src/metrics/firehose.js"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var HiddenUploader=exports.default=function(_React$Component){function HiddenUploader(){for(var _this,_len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return _defineProperty(_this=_React$Component.call.apply(_React$Component,[this].concat(args))||this,"openFileChooser",(function(){return _this.refs.uploader.click()})),_this}!function _inheritsLoose(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,_setPrototypeOf(t,o)}(HiddenUploader,_React$Component);var _proto=HiddenUploader.prototype;return _proto.componentDidMount=function componentDidMount(){var props=this.props;(0,_jquery.default)(this.refs.uploader).fileupload({dataType:"json",url:this.props.toUrl,replaceFileInput:!1,add:function add(e,data){props.onUploadStart(data);var audioFileName=data.files[0].name.includes("mp3")?data.files[0].name:null;audioFileName&&_firehose.default.putRecord({study:"sound-dialog-2",study_group:"library-file",event:"upload-file",data_json:audioFileName},{includeUserId:!0})},done:function done(e,data){props.onUploadDone(data.result)},error:function error(e,data){props.onUploadError&&props.onUploadError(e.status)}})},_proto.componentWillUnmount=function componentWillUnmount(){(0,_jquery.default)(this.refs.uploader).fileupload("destroy")},_proto.render=function render(){return _react.default.createElement("input",{ref:"uploader",className:"uitest-hidden-uploader",type:"file",style:{display:"none"},accept:this.props.allowedExtensions||"*"})},HiddenUploader}(_react.default.Component);_defineProperty(HiddenUploader,"propTypes",{toUrl:_propTypes.default.string.isRequired,allowedExtensions:_propTypes.default.string,onUploadStart:_propTypes.default.func.isRequired,onUploadDone:_propTypes.default.func.isRequired,onUploadError:_propTypes.default.func}),window.dashboard=window.dashboard||{},window.dashboard.HiddenUploader=HiddenUploader,module.exports=exports.default}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMxTSxPQUlEN0gsT0FBQSxTQUFBQSxTQUlFLE9BQ0V2RSxPQUFBLFFBQUFvQyxjQUFBLFNBQ0VnVCxJQUFJLFdBQ0o3UyxVQUFVLHlCQUNWeUksS0FBSyxPQUNMcEksTUFBTyxDQUFDZixRQUFTLFFBQ2pCd1gsT0FBUTVVLEtBQUtDLE1BQU1JLG1CQUFxQixLQUc5QyxFQUFDOFQsY0FBQSxDQWxFZ0MsQ0FBU3ZULE9BQUFBLFFBQU1DLFdBQVNwQyxnQkFBdEMwVixlQUFjLFlBQ2QsQ0FDakJ2RCxNQUFPdFMsV0FBQUEsUUFBVXlDLE9BQU9ELFdBQ3hCVCxrQkFBbUIvQixXQUFBQSxRQUFVeUMsT0FDN0JSLGNBQWVqQyxXQUFBQSxRQUFVQyxLQUFLdUMsV0FDOUJOLGFBQWNsQyxXQUFBQSxRQUFVQyxLQUFLdUMsV0FDN0JMLGNBQWVuQyxXQUFBQSxRQUFVQyxPQStEN0JzVyxPQUFPQyxVQUFZRCxPQUFPQyxXQUFhLENBQUMsRUFDeENELE9BQU9DLFVBQVVYLGVBQWlCQSxlQUFlbEksT0FBQXRQLFFBQUFBLFFBQUF1UCxPIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vc3JjL2NvZGUtc3R1ZGlvL2NvbXBvbmVudHMvQWRkQXNzZXRCdXR0b25Sb3cuanN4Iiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9jb2RlLXN0dWRpby9jb21wb25lbnRzL0Fzc2V0TWFuYWdlci5qc3giLCJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vc3JjL2NvZGUtc3R1ZGlvL2NvbXBvbmVudHMvQXNzZXRSb3cuanN4Iiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9jb2RlLXN0dWRpby9jb21wb25lbnRzL0Fzc2V0VGh1bWJuYWlsLmpzeCIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvY29kZS1zdHVkaW8vY29tcG9uZW50cy9Bc3NldFVwbG9hZGVyLmpzeCIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvY29kZS1zdHVkaW8vY29tcG9uZW50cy9BdWRpb1JlY29yZGVyLmpzeCIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvY29kZS1zdHVkaW8vY29tcG9uZW50cy9IaWRkZW5VcGxvYWRlci5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBCdXR0b24gZnJvbSAnQGNkby9hcHBzL2xlZ2FjeVNoYXJlZENvbXBvbmVudHMvQnV0dG9uJztcbmltcG9ydCB7aXNJRTExfSBmcm9tICdAY2RvL2FwcHMvdXRpbC9icm93c2VyLWRldGVjdG9yJztcbmltcG9ydCBpMThuIGZyb20gJ0BjZG8vbG9jYWxlJztcblxuaW1wb3J0IEFzc2V0VXBsb2FkZXIgZnJvbSAnLi9Bc3NldFVwbG9hZGVyJztcblxuZXhwb3J0IGNvbnN0IGFzc2V0QnV0dG9uU3R5bGVzID0ge1xuICBidXR0b246IHtcbiAgICBwYWRkaW5nTGVmdDogMTAsXG4gICAgcGFkZGluZ1JpZ2h0OiAxMCxcbiAgICBtYXJnaW5Ub3A6IDUsXG4gICAgZm9udFNpemU6ICdsYXJnZScsXG4gICAgZm9udFdlaWdodDogJ2xpZ2h0ZXInLFxuICAgIG1hcmdpblJpZ2h0OiAxMCxcbiAgfSxcbiAgYnV0dG9uUm93OiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGZsZXhGbG93OiAncm93JyxcbiAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgfSxcbn07XG5cbmNvbnN0IFJlY29yZEJ1dHRvbiA9ICh7b25TZWxlY3RSZWNvcmQsIGRpc2FibGVkfSkgPT4gKFxuICA8c3Bhbj5cbiAgICA8QnV0dG9uXG4gICAgICBvbkNsaWNrPXtvblNlbGVjdFJlY29yZH1cbiAgICAgIGlkPVwicmVjb3JkLWFzc2V0XCJcbiAgICAgIGNsYXNzTmFtZT1cInNoYXJlXCJcbiAgICAgIHRleHQ9e2kxOG4ucmVjb3JkQXVkaW8oKX1cbiAgICAgIGljb249XCJtaWNyb3Bob25lXCJcbiAgICAgIHN0eWxlPXthc3NldEJ1dHRvblN0eWxlcy5idXR0b259XG4gICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgIC8+XG4gIDwvc3Bhbj5cbik7XG5cblJlY29yZEJ1dHRvbi5wcm9wVHlwZXMgPSB7XG4gIG9uU2VsZWN0UmVjb3JkOiBQcm9wVHlwZXMuZnVuYyxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxufTtcblxuLyoqXG4gKiBBIGNvbXBvbmVudCBmb3IgdGhlIGJ1dHRvbnMgdGhhdCBlbmFibGUgYWRkaW5nIGFuIGFzc2V0IHRvIGEgcHJvamVjdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRkQXNzZXRCdXR0b25Sb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIHVwbG9hZHNFbmFibGVkOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIGFsbG93ZWRFeHRlbnNpb25zOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGFwaTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBvblVwbG9hZFN0YXJ0OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIG9uVXBsb2FkRG9uZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvblVwbG9hZEVycm9yOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIG9uU2VsZWN0UmVjb3JkOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIHN0YXR1c01lc3NhZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgcmVjb3JkRGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIGhpZGVBdWRpb1JlY29yZGluZzogUHJvcFR5cGVzLmJvb2wsXG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGxldCBzaG91bGRTaG93UmVjb3JkQnV0dG9uID0gIXRoaXMucHJvcHMuaGlkZUF1ZGlvUmVjb3JkaW5nO1xuICAgIGlmIChpc0lFMTEoKSkge1xuICAgICAgc2hvdWxkU2hvd1JlY29yZEJ1dHRvbiA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBzdHlsZT17YXNzZXRCdXR0b25TdHlsZXMuYnV0dG9uUm93fT5cbiAgICAgICAgPEFzc2V0VXBsb2FkZXJcbiAgICAgICAgICB1cGxvYWRzRW5hYmxlZD17dGhpcy5wcm9wcy51cGxvYWRzRW5hYmxlZH1cbiAgICAgICAgICBhbGxvd2VkRXh0ZW5zaW9ucz17dGhpcy5wcm9wcy5hbGxvd2VkRXh0ZW5zaW9uc31cbiAgICAgICAgICBhcGk9e3RoaXMucHJvcHMuYXBpfVxuICAgICAgICAgIG9uVXBsb2FkU3RhcnQ9e3RoaXMucHJvcHMub25VcGxvYWRTdGFydH1cbiAgICAgICAgICBvblVwbG9hZERvbmU9e3RoaXMucHJvcHMub25VcGxvYWREb25lfVxuICAgICAgICAgIG9uVXBsb2FkRXJyb3I9e3RoaXMucHJvcHMub25VcGxvYWRFcnJvcn1cbiAgICAgICAgLz5cbiAgICAgICAge3Nob3VsZFNob3dSZWNvcmRCdXR0b24gJiYgKFxuICAgICAgICAgIDxSZWNvcmRCdXR0b25cbiAgICAgICAgICAgIG9uU2VsZWN0UmVjb3JkPXt0aGlzLnByb3BzLm9uU2VsZWN0UmVjb3JkfVxuICAgICAgICAgICAgZGlzYWJsZWQ9eyF0aGlzLnByb3BzLnVwbG9hZHNFbmFibGVkIHx8IHRoaXMucHJvcHMucmVjb3JkRGlzYWJsZWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAgPHNwYW4gaWQ9XCJtYW5hZ2UtYXNzZXQtc3RhdHVzXCI+e3RoaXMucHJvcHMuc3RhdHVzTWVzc2FnZX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHtTVEFSVEVSX0FTU0VUX1BSRUZJWH0gZnJvbSAnQGNkby9hcHBzL2Fzc2V0TWFuYWdlbWVudC9hc3NldFByZWZpeCc7XG5pbXBvcnQge1xuICBhc3NldHMgYXMgYXNzZXRzQXBpLFxuICBzdGFydGVyQXNzZXRzIGFzIHN0YXJ0ZXJBc3NldHNBcGksXG4gIGZpbGVzIGFzIGZpbGVzQXBpLFxufSBmcm9tICdAY2RvL2FwcHMvY2xpZW50QXBpJztcbmltcG9ydCBmaXJlaG9zZUNsaWVudCBmcm9tICdAY2RvL2FwcHMvbWV0cmljcy9maXJlaG9zZSc7XG5pbXBvcnQgaTE4biBmcm9tICdAY2RvL2xvY2FsZSc7XG5cbmltcG9ydCBhc3NldExpc3RTdG9yZSBmcm9tICcuLi9hc3NldHMvYXNzZXRMaXN0U3RvcmUnO1xuXG5pbXBvcnQgQWRkQXNzZXRCdXR0b25Sb3cgZnJvbSAnLi9BZGRBc3NldEJ1dHRvblJvdyc7XG5pbXBvcnQgQXNzZXRSb3cgZnJvbSAnLi9Bc3NldFJvdyc7XG5pbXBvcnQgQXVkaW9SZWNvcmRlciBmcm9tICcuL0F1ZGlvUmVjb3JkZXInO1xuaW1wb3J0IHtSZWNvcmRpbmdGaWxlVHlwZX0gZnJvbSAnLi9yZWNvcmRlcnMnO1xuXG5leHBvcnQgY29uc3QgQXVkaW9FcnJvclR5cGUgPSB7XG4gIE5PTkU6ICdub25lJyxcbiAgSU5JVElBTElaRTogJ2luaXRpYWxpemUnLFxuICBTQVZFOiAnc2F2ZScsXG59O1xuZXhwb3J0IGNvbnN0IEltYWdlTW9kZSA9IHtcbiAgRklMRTogJ2ZpbGUnLFxuICBJQ09OOiAnaWNvbicsXG4gIFVSTDogJ3VybCcsXG4gIERFRkFVTFQ6ICdkZWZhdWx0Jyxcbn07XG5cbmNvbnN0IGVycm9yTWVzc2FnZXMgPSB7XG4gIDQwMzogJ1F1b3RhIGV4Y2VlZGVkLiBQbGVhc2UgZGVsZXRlIHNvbWUgZmlsZXMgYW5kIHRyeSBhZ2Fpbi4nLFxuICA0MTM6ICdUaGUgZmlsZSBpcyB0b28gbGFyZ2UuJyxcbiAgNDE1OiAnVGhpcyB0eXBlIG9mIGZpbGUgaXMgbm90IHN1cHBvcnRlZC4nLFxuICA1MDA6ICdUaGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGFuIGVycm9yLicsXG4gIHVua25vd246ICdBbiB1bmtub3duIGVycm9yIG9jY3VycmVkLicsXG59O1xuXG5jb25zdCBlcnJvclVwbG9hZERpc2FibGVkID1cbiAgJ1RoaXMgcHJvamVjdCBoYXMgYmVlbiByZXBvcnRlZCBmb3IgYWJ1c2l2ZSBjb250ZW50LCAnICtcbiAgJ3NvIHVwbG9hZGluZyBuZXcgYXNzZXRzIGlzIGRpc2FibGVkLic7XG5cbmZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShzdGF0dXMpIHtcbiAgcmV0dXJuIGVycm9yTWVzc2FnZXNbc3RhdHVzXSB8fCBlcnJvck1lc3NhZ2VzLnVua25vd247XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgZm9yIG1hbmFnaW5nIGhvc3RlZCBhc3NldHMuIElmIHV0aWxpemluZyB0aGlzIHNoYXJlZCBjb21wb25lbnQsXG4gKiB2ZXJpZnkgdGhlIEltYWdlUGlja2VyIGhhcyBhY2Nlc3MgdG8gdGhlIGNvcnJlY3QgZmllbGRzIGluIHlvdXIgcmVkdXggc3RvcmUsXG4gKiBuYW1lbHkgbGV2ZWwubmFtZSBhbmQgbGV2ZWwuaXNTdGFydE1vZGUuIE90aGVyd2lzZSwgdGhlIGZpbGVzIHdpbGwgbm90IGJlXG4gKiBzYXZlZCB0byBTMyBvciByZXRyaWV2ZWQgYW5kIGRpc3BsYXllZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXNzZXRNYW5hZ2VyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBhc3NldENob3NlbjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgYXNzZXRzQ2hhbmdlZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgYWxsb3dlZEV4dGVuc2lvbnM6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdXBsb2Fkc0VuYWJsZWQ6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gICAgdXNlRmlsZXNBcGk6IFByb3BUeXBlcy5ib29sLFxuICAgIHNvdW5kUGxheWVyOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRpc2FibGVBdWRpb1JlY29yZGluZzogUHJvcFR5cGVzLmJvb2wsXG4gICAgcmVjb3JkaW5nRmlsZVR5cGU6IFByb3BUeXBlcy5vbmVPZihPYmplY3QudmFsdWVzKFJlY29yZGluZ0ZpbGVUeXBlKSksXG4gICAgcHJvamVjdElkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGxldmVsTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBpc1N0YXJ0TW9kZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgICAvLyBGb3IgbG9nZ2luZyBwdXJwb3Nlc1xuICAgIGltYWdlUGlja2VyOiBQcm9wVHlwZXMuYm9vbCwgLy8gaWRlbnRpZmllcyBpZiBkaXNwbGF5ZWQgYnkgJ01hbmFnZSBBc3NldHMnIGZsb3dcbiAgICBlbGVtZW50SWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGFzc2V0czogbnVsbCxcbiAgICAgIHN0YXJ0ZXJBc3NldHM6IG51bGwsXG4gICAgICBzdGF0dXNNZXNzYWdlOiBwcm9wcy51cGxvYWRzRW5hYmxlZCA/ICcnIDogZXJyb3JVcGxvYWREaXNhYmxlZCxcbiAgICAgIHJlY29yZGluZ0F1ZGlvOiBmYWxzZSxcbiAgICAgIGF1ZGlvRXJyb3JUeXBlOiBBdWRpb0Vycm9yVHlwZS5OT05FLFxuICAgIH07XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5sZXZlbE5hbWUpIHtcbiAgICAgIHN0YXJ0ZXJBc3NldHNBcGkuZ2V0U3RhcnRlckFzc2V0cyhcbiAgICAgICAgdGhpcy5wcm9wcy5sZXZlbE5hbWUsXG4gICAgICAgIHRoaXMub25TdGFydGVyQXNzZXRzUmVjZWl2ZWQsXG4gICAgICAgIHRoaXMub25TdGFydGVyQXNzZXRzRmFpbHVyZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7c3RhcnRlckFzc2V0czogW119KTtcbiAgICB9XG5cbiAgICBsZXQgYXBpID0gdGhpcy5wcm9wcy51c2VGaWxlc0FwaSA/IGZpbGVzQXBpIDogYXNzZXRzQXBpO1xuICAgIGlmICghYXBpLmdldFByb2plY3RJZCgpKSB7XG4gICAgICBhcGkgPSBhcGkud2l0aFByb2plY3RJZCh0aGlzLnByb3BzLnByb2plY3RJZCk7XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCB0byBmaWxlcy9hc3NldHMgQVBJIHdpbGwgZmFpbCBpZiBubyBwcm9qZWN0SWQgaXMgcHJlc2VudCwgc28gb25seVxuICAgIC8vIHJlcXVlc3QgZmlsZXMgaWYgd2UgaGF2ZSBhIHByb2plY3RJZC5cbiAgICBpZiAoYXBpLmdldFByb2plY3RJZCgpKSB7XG4gICAgICBhcGkuZ2V0RmlsZXModGhpcy5vbkFzc2V0TGlzdFJlY2VpdmVkLCB0aGlzLm9uQXNzZXRMaXN0RmFpbHVyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2Fzc2V0czogW119KTtcbiAgICB9XG4gIH1cblxuICBvblN0YXJ0ZXJBc3NldHNSZWNlaXZlZCA9IHJlc3VsdCA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3VsdC5yZXNwb25zZSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7c3RhcnRlckFzc2V0czogcmVzcG9uc2Uuc3RhcnRlcl9hc3NldHN9KTtcbiAgfTtcblxuICBvblN0YXJ0ZXJBc3NldHNGYWlsdXJlID0geGhyID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHN0YXR1c01lc3NhZ2U6XG4gICAgICAgICdFcnJvciBsb2FkaW5nIHN0YXJ0ZXIgYXNzZXRzOiAnICsgZ2V0RXJyb3JNZXNzYWdlKHhoci5zdGF0dXMpLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBtb3VudHMsIHdoZW4gdGhlIHNlcnZlciByZXNwb25kcyB3aXRoIHRoZVxuICAgKiBjdXJyZW50IGxpc3Qgb2YgYXNzZXRzLlxuICAgKiBAcGFyYW0gcmVzdWx0XG4gICAqL1xuICBvbkFzc2V0TGlzdFJlY2VpdmVkID0gcmVzdWx0ID0+IHtcbiAgICBhc3NldExpc3RTdG9yZS5yZXNldChyZXN1bHQuZmlsZXMpO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgYXNzZXRzOiBhc3NldExpc3RTdG9yZS5saXN0KHRoaXMucHJvcHMuYWxsb3dlZEV4dGVuc2lvbnMpLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBtb3VudHMsIGlmIHRoZSBzZXJ2ZXIgcmVzcG9uZHMgd2l0aCBhbiBlcnJvclxuICAgKiB3aGVuIGxvYWRpbmcgdGhlIGN1cnJlbnQgbGlzdCBvZiBhc3NldHMuXG4gICAqIEBwYXJhbSB4aHJcbiAgICovXG4gIG9uQXNzZXRMaXN0RmFpbHVyZSA9ICh7c3RhdHVzfSkgPT4ge1xuICAgIGNvbnN0IHt1c2VGaWxlc0FwaX0gPSB0aGlzLnByb3BzO1xuICAgIGlmICh1c2VGaWxlc0FwaSAmJiBzdGF0dXMgPT09IDQwNCkge1xuICAgICAgLy8gTm8gZmlsZXMgaW4gdGhpcyBwcm9qZWN0IHlldCwgcHJvY2VlZCB3aXRoIGFuIGVtcHR5IGZpbGUgbGlzdFxuICAgICAgdGhpcy5vbkFzc2V0TGlzdFJlY2VpdmVkKHtmaWxlczogW119KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHN0YXR1c01lc3NhZ2U6ICdFcnJvciBsb2FkaW5nIGFzc2V0IGxpc3Q6ICcgKyBnZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSxcbiAgICB9KTtcbiAgfTtcblxuICBvblVwbG9hZFN0YXJ0ID0gZGF0YSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7c3RhdHVzTWVzc2FnZTogJ1VwbG9hZGluZy4uLid9KTtcbiAgICBkYXRhLnN1Ym1pdCgpO1xuICB9O1xuXG4gIG9uVXBsb2FkRG9uZSA9IHJlc3VsdCA9PiB7XG4gICAgbGV0IG5ld1N0YXRlID0ge1xuICAgICAgc3RhdHVzTWVzc2FnZTogJ0ZpbGUgXCInICsgcmVzdWx0LmZpbGVuYW1lICsgJ1wiIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCEnLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5wcm9wcy5pc1N0YXJ0TW9kZSkge1xuICAgICAgbmV3U3RhdGUuc3RhcnRlckFzc2V0cyA9IFsuLi50aGlzLnN0YXRlLnN0YXJ0ZXJBc3NldHMsIHJlc3VsdF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2V0TGlzdFN0b3JlLmFkZChyZXN1bHQpO1xuICAgICAgaWYgKHRoaXMucHJvcHMuYXNzZXRzQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLnByb3BzLmFzc2V0c0NoYW5nZWQoKTtcbiAgICAgIH1cbiAgICAgIG5ld1N0YXRlLmFzc2V0cyA9IGFzc2V0TGlzdFN0b3JlLmxpc3QodGhpcy5wcm9wcy5hbGxvd2VkRXh0ZW5zaW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gIH07XG5cbiAgb25VcGxvYWRFcnJvciA9IHN0YXR1cyA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzdGF0dXNNZXNzYWdlOiAnRXJyb3IgdXBsb2FkaW5nIGZpbGU6ICcgKyBnZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSxcbiAgICB9KTtcbiAgICBmaXJlaG9zZUNsaWVudC5wdXRSZWNvcmQoe1xuICAgICAgc3R1ZHk6ICdwcm9qZWN0LWRhdGEtaW50ZWdyaXR5JyxcbiAgICAgIHN0dWR5X2dyb3VwOiAndjQnLFxuICAgICAgZXZlbnQ6ICdhc3NldC11cGxvYWQtZXJyb3InLFxuICAgICAgcHJvamVjdF9pZDogdGhpcy5wcm9wcy5wcm9qZWN0SWQsXG4gICAgICBkYXRhX2ludDogc3RhdHVzLFxuICAgIH0pO1xuICB9O1xuXG4gIG9uU2VsZWN0UmVjb3JkID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe3JlY29yZGluZ0F1ZGlvOiB0cnVlfSk7XG4gIH07XG5cbiAgZGVsZXRlQXNzZXRSb3cgPSBuYW1lID0+IHtcbiAgICBhc3NldExpc3RTdG9yZS5yZW1vdmUobmFtZSk7XG4gICAgaWYgKHRoaXMucHJvcHMuYXNzZXRzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5wcm9wcy5hc3NldHNDaGFuZ2VkKCk7XG4gICAgfVxuICAgIGZpcmVob3NlQ2xpZW50LnB1dFJlY29yZCh7XG4gICAgICBzdHVkeTogJ2RlbGV0ZS1hc3NldCcsXG4gICAgICBzdHVkeV9ncm91cDpcbiAgICAgICAgdGhpcy5wcm9wcy5hc3NldENob3NlbiAmJiB0eXBlb2YgdGhpcy5wcm9wcy5hc3NldENob3NlbiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gJ2Nob29zZS1hc3NldHMnXG4gICAgICAgICAgOiAnbWFuYWdlLWFzc2V0cycsXG4gICAgICBldmVudDogJ2NvbmZpcm0nLFxuICAgICAgcHJvamVjdF9pZDogdGhpcy5wcm9wcy5wcm9qZWN0SWQsXG4gICAgICBkYXRhX2pzb246IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgYXNzZXROYW1lOiBuYW1lLFxuICAgICAgICBlbGVtZW50SWQ6IHRoaXMucHJvcHMuZWxlbWVudElkLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGFzc2V0czogYXNzZXRMaXN0U3RvcmUubGlzdCh0aGlzLnByb3BzLmFsbG93ZWRFeHRlbnNpb25zKSxcbiAgICAgIHN0YXR1c01lc3NhZ2U6IGBGaWxlIFwiJHtuYW1lfVwiIHN1Y2Nlc3NmdWxseSBkZWxldGVkIWAsXG4gICAgfSk7XG4gIH07XG5cbiAgZGVsZXRlU3RhcnRlckFzc2V0Um93ID0gbmFtZSA9PiB7XG4gICAgbGV0IHN0YXJ0ZXJBc3NldHMgPSBbLi4udGhpcy5zdGF0ZS5zdGFydGVyQXNzZXRzXS5maWx0ZXIoXG4gICAgICBhc3NldCA9PiBhc3NldC5maWxlbmFtZSAhPT0gbmFtZVxuICAgICk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzdGFydGVyQXNzZXRzLFxuICAgICAgc3RhdHVzTWVzc2FnZTogYEZpbGUgXCIke25hbWV9XCIgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQhYCxcbiAgICB9KTtcbiAgfTtcblxuICBhZnRlckF1ZGlvU2F2ZWQgPSBlcnIgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe3JlY29yZGluZ0F1ZGlvOiBmYWxzZSwgYXVkaW9FcnJvclR5cGU6IGVycn0pO1xuICB9O1xuXG4gIGRlZmF1bHRBc3NldFByb3BzID0gYXNzZXQgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGFzc2V0LmZpbGVuYW1lLFxuICAgICAgbmFtZTogYXNzZXQuZmlsZW5hbWUsXG4gICAgICB0aW1lc3RhbXA6IGFzc2V0LnRpbWVzdGFtcCxcbiAgICAgIHR5cGU6IGFzc2V0LmNhdGVnb3J5LFxuICAgICAgc2l6ZTogYXNzZXQuc2l6ZSxcbiAgICAgIHNvdW5kUGxheWVyOiB0aGlzLnByb3BzLnNvdW5kUGxheWVyLFxuICAgICAgaW1hZ2VQaWNrZXI6IHRoaXMucHJvcHMuaW1hZ2VQaWNrZXIsXG4gICAgICBwcm9qZWN0SWQ6IHRoaXMucHJvcHMucHJvamVjdElkLFxuICAgICAgZWxlbWVudElkOiB0aGlzLnByb3BzLmVsZW1lbnRJZCxcbiAgICB9O1xuICB9O1xuXG4gIGdldFN0YXJ0ZXJBc3NldFJvd3MgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnByb3BzLmxldmVsTmFtZSB8fCB0aGlzLnN0YXRlLnN0YXJ0ZXJBc3NldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRBcGkgPSBzdGFydGVyQXNzZXRzQXBpLndpdGhMZXZlbE5hbWUodGhpcy5wcm9wcy5sZXZlbE5hbWUpO1xuICAgIHJldHVybiB0aGlzLnN0YXRlLnN0YXJ0ZXJBc3NldHMubWFwKGFzc2V0ID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxBc3NldFJvd1xuICAgICAgICAgIHsuLi50aGlzLmRlZmF1bHRBc3NldFByb3BzKGFzc2V0KX1cbiAgICAgICAgICBhcGk9e2JvdW5kQXBpfVxuICAgICAgICAgIG9uQ2hvb3NlPXtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuYXNzZXRDaG9zZW4gJiZcbiAgICAgICAgICAgICgoKSA9PlxuICAgICAgICAgICAgICB0aGlzLnByb3BzLmFzc2V0Q2hvc2VuKFxuICAgICAgICAgICAgICAgIFNUQVJURVJfQVNTRVRfUFJFRklYICsgYXNzZXQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgYXNzZXQudGltZXN0YW1wXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgfVxuICAgICAgICAgIG9uRGVsZXRlPXsoKSA9PiB0aGlzLmRlbGV0ZVN0YXJ0ZXJBc3NldFJvdyhhc3NldC5maWxlbmFtZSl9XG4gICAgICAgICAgbGV2ZWxOYW1lPXt0aGlzLnByb3BzLmxldmVsTmFtZX1cbiAgICAgICAgICBoaWRlRGVsZXRlPXshdGhpcy5wcm9wcy5pc1N0YXJ0TW9kZX1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfSk7XG4gIH07XG5cbiAgZ2V0QXNzZXRSb3dzID0gKCkgPT4ge1xuICAgIGNvbnN0IGFwaSA9IHRoaXMucHJvcHMudXNlRmlsZXNBcGkgPyBmaWxlc0FwaSA6IGFzc2V0c0FwaTtcblxuICAgIHJldHVybiB0aGlzLnN0YXRlLmFzc2V0cy5tYXAoYXNzZXQgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEFzc2V0Um93XG4gICAgICAgICAgey4uLnRoaXMuZGVmYXVsdEFzc2V0UHJvcHMoYXNzZXQpfVxuICAgICAgICAgIGFwaT17YXBpfVxuICAgICAgICAgIG9uQ2hvb3NlPXtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuYXNzZXRDaG9zZW4gJiZcbiAgICAgICAgICAgICgoKSA9PiB0aGlzLnByb3BzLmFzc2V0Q2hvc2VuKGFzc2V0LmZpbGVuYW1lLCBhc3NldC50aW1lc3RhbXApKVxuICAgICAgICAgIH1cbiAgICAgICAgICBvbkRlbGV0ZT17KCkgPT4gdGhpcy5kZWxldGVBc3NldFJvdyhhc3NldC5maWxlbmFtZSl9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH0pO1xuICB9O1xuXG4gIHVwbG9hZEFwaSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5wcm9wcy5pc1N0YXJ0TW9kZSkge1xuICAgICAgcmV0dXJuIHN0YXJ0ZXJBc3NldHNBcGkud2l0aExldmVsTmFtZSh0aGlzLnByb3BzLmxldmVsTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBhcGkgPSB0aGlzLnByb3BzLnVzZUZpbGVzQXBpID8gZmlsZXNBcGkgOiBhc3NldHNBcGk7XG5cbiAgICAgIC8vIEJpbmQgQVBJIGlmIGl0IGlzbid0IGFscmVhZHkgYm91bmRcbiAgICAgIGlmICghYXBpLmdldFByb2plY3RJZCgpKSB7XG4gICAgICAgIGFwaSA9IGFwaS53aXRoUHJvamVjdElkKHRoaXMucHJvcHMucHJvamVjdElkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGRpc3BsYXlBdWRpb1JlY29yZGVyID1cbiAgICAgIHRoaXMuc3RhdGUuYXVkaW9FcnJvclR5cGUgIT09IEF1ZGlvRXJyb3JUeXBlLklOSVRJQUxJWkUgJiZcbiAgICAgIHRoaXMuc3RhdGUucmVjb3JkaW5nQXVkaW87XG4gICAgY29uc3QgYnV0dG9ucyA9IChcbiAgICAgIDxkaXY+XG4gICAgICAgIHt0aGlzLnN0YXRlLmF1ZGlvRXJyb3JUeXBlID09PSBBdWRpb0Vycm9yVHlwZS5TQVZFICYmIChcbiAgICAgICAgICA8ZGl2PntpMThuLmF1ZGlvU2F2ZUVycm9yKCl9PC9kaXY+XG4gICAgICAgICl9XG4gICAgICAgIHt0aGlzLnN0YXRlLmF1ZGlvRXJyb3JUeXBlID09PSBBdWRpb0Vycm9yVHlwZS5JTklUSUFMSVpFICYmIChcbiAgICAgICAgICA8ZGl2PntpMThuLmF1ZGlvSW5pdGlhbGl6ZUVycm9yKCl9PC9kaXY+XG4gICAgICAgICl9XG4gICAgICAgIHtkaXNwbGF5QXVkaW9SZWNvcmRlciAmJiAoXG4gICAgICAgICAgPEF1ZGlvUmVjb3JkZXJcbiAgICAgICAgICAgIG9uVXBsb2FkRG9uZT17dGhpcy5vblVwbG9hZERvbmV9XG4gICAgICAgICAgICBhZnRlckF1ZGlvU2F2ZWQ9e3RoaXMuYWZ0ZXJBdWRpb1NhdmVkfVxuICAgICAgICAgICAgcmVjb3JkaW5nRmlsZVR5cGU9e3RoaXMucHJvcHMucmVjb3JkaW5nRmlsZVR5cGV9XG4gICAgICAgICAgICBpbWFnZVBpY2tlcj17dGhpcy5wcm9wcy5pbWFnZVBpY2tlcn1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICA8QWRkQXNzZXRCdXR0b25Sb3dcbiAgICAgICAgICB1cGxvYWRzRW5hYmxlZD17dGhpcy5wcm9wcy51cGxvYWRzRW5hYmxlZH1cbiAgICAgICAgICBhbGxvd2VkRXh0ZW5zaW9ucz17dGhpcy5wcm9wcy5hbGxvd2VkRXh0ZW5zaW9uc31cbiAgICAgICAgICBhcGk9e3RoaXMudXBsb2FkQXBpKCl9XG4gICAgICAgICAgb25VcGxvYWRTdGFydD17dGhpcy5vblVwbG9hZFN0YXJ0fVxuICAgICAgICAgIG9uVXBsb2FkRG9uZT17dGhpcy5vblVwbG9hZERvbmV9XG4gICAgICAgICAgb25VcGxvYWRFcnJvcj17dGhpcy5vblVwbG9hZEVycm9yfVxuICAgICAgICAgIG9uU2VsZWN0UmVjb3JkPXt0aGlzLm9uU2VsZWN0UmVjb3JkfVxuICAgICAgICAgIHN0YXR1c01lc3NhZ2U9e3RoaXMuc3RhdGUuc3RhdHVzTWVzc2FnZX1cbiAgICAgICAgICByZWNvcmREaXNhYmxlZD17dGhpcy5zdGF0ZS5yZWNvcmRpbmdBdWRpb31cbiAgICAgICAgICBoaWRlQXVkaW9SZWNvcmRpbmc9e3RoaXMucHJvcHMuZGlzYWJsZUF1ZGlvUmVjb3JkaW5nfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcblxuICAgIGxldCBhc3NldExpc3Q7XG4gICAgLy8gSWYgdGhpcy5zdGF0ZS5hc3NldHMgb3IgdGhpcy5zdGF0ZS5zdGFydGVyQXNzZXRzIGFyZSBudWxsLCBhc3NldHMgYXJlIHN0aWxsIGxvYWRpbmcuXG4gICAgLy8gSWYgZW1wdHksIHRoZSBhc3NldCBsaXN0IGhhcyBsb2FkZWQgYW5kIHRoZXJlIGFyZSBubyBhc3NldHMgaW4gdGhlIGN1cnJlbnRcbiAgICAvLyBjaGFubmVsIChtYXRjaGluZyB0aGUgYGFsbG93ZWRFeHRlbnNpb25zYCwgaWYgYW55IHdlcmUgcHJvdmlkZWQpLlxuICAgIGlmICh0aGlzLnN0YXRlLmFzc2V0cyA9PT0gbnVsbCB8fCB0aGlzLnN0YXRlLnN0YXJ0ZXJBc3NldHMgPT09IG51bGwpIHtcbiAgICAgIGFzc2V0TGlzdCA9IChcbiAgICAgICAgPGRpdiBzdHlsZT17e21hcmdpbjogJzFlbSAwJywgdGV4dEFsaWduOiAnY2VudGVyJ319PlxuICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhIGZhLXNwaW5uZXIgZmEtc3BpblwiIHN0eWxlPXt7Zm9udFNpemU6ICczMnB4J319IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5zdGF0ZS5hc3NldHMubGVuZ3RoID09PSAwICYmXG4gICAgICB0aGlzLnN0YXRlLnN0YXJ0ZXJBc3NldHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBjb25zdCBlbXB0eVRleHQgPVxuICAgICAgICB0aGlzLnByb3BzLmFsbG93ZWRFeHRlbnNpb25zID09PSAnLm1wMycgPyAoXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIHtpMThuLm1hbmFnZUFzc2V0c1NvdW5kTGlicmFyeU1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHNvdW5kTGlicmFyeUJ1dHRvblRleHQ6IGkxOG4uc291bmRMaWJyYXJ5KCksXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICB7aTE4bi5tYW5hZ2VBc3NldHNTb3VuZFVwbG9hZE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIGFzc2V0VXBsb2FkZXJCdXR0b25UZXh0OiBpMThuLnVwbG9hZEZpbGUoKSxcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAge2kxOG4ubWFuYWdlQXNzZXRzRGVmYXVsdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBhc3NldFVwbG9hZGVyQnV0dG9uVGV4dDogaTE4bi51cGxvYWRGaWxlKCksXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICAgIGFzc2V0TGlzdCA9IChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXtzdHlsZXMuZW1wdHlUZXh0fT57ZW1wdHlUZXh0fTwvZGl2PlxuICAgICAgICAgIHtidXR0b25zfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy5nZXRTdGFydGVyQXNzZXRSb3dzKCksIC4uLnRoaXMuZ2V0QXNzZXRSb3dzKCldO1xuICAgICAgYXNzZXRMaXN0ID0gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXt7bWF4SGVpZ2h0OiAnMzgwcHgnLCBvdmVyZmxvd1k6ICdzY3JvbGwnLCBtYXJnaW46ICcxZW0gMCd9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0YWJsZSBzdHlsZT17e3dpZHRoOiAnMTAwJSd9fT5cbiAgICAgICAgICAgICAgPHRib2R5Pntyb3dzfTwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHtidXR0b25zfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc2V0TGlzdDtcbiAgfVxufVxuXG5jb25zdCBzdHlsZXMgPSB7XG4gIGVtcHR5VGV4dDoge1xuICAgIG1hcmdpbjogJzFlbSAwJyxcbiAgICBmb250U2l6ZTogJzE2cHgnLFxuICAgIGxpbmVIZWlnaHQ6ICcyMHB4JyxcbiAgfSxcbn07XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBmaXJlaG9zZUNsaWVudCBmcm9tICdAY2RvL2FwcHMvbWV0cmljcy9maXJlaG9zZSc7XG5pbXBvcnQgY29sb3IgZnJvbSAnQGNkby9hcHBzL3V0aWwvY29sb3InO1xuaW1wb3J0IGkxOG4gZnJvbSAnQGNkby9sb2NhbGUnO1xuXG5pbXBvcnQgQXNzZXRUaHVtYm5haWwgZnJvbSAnLi9Bc3NldFRodW1ibmFpbCc7XG5cbi8qKlxuICogQSBzaW5nbGUgcm93IGluIHRoZSBBc3NldE1hbmFnZXIsIGRlc2NyaWJpbmcgb25lIGFzc2V0LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBc3NldFJvdyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgbmFtZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHRpbWVzdGFtcDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0eXBlOiBQcm9wVHlwZXMub25lT2YoWydpbWFnZScsICdhdWRpbycsICd2aWRlbycsICdwZGYnLCAnZG9jJ10pLmlzUmVxdWlyZWQsXG4gICAgc2l6ZTogUHJvcFR5cGVzLm51bWJlcixcbiAgICBhcGk6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBvbkNob29zZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25EZWxldGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgc291bmRQbGF5ZXI6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgcHJvamVjdElkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGxldmVsTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBoaWRlRGVsZXRlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAgIC8vIEZvciBsb2dnaW5nIHB1cnBvc2VzXG4gICAgaW1hZ2VQaWNrZXI6IFByb3BUeXBlcy5ib29sLCAvLyBpZGVudGlmaWVzIGlmIGRpc3BsYXllZCBieSAnTWFuYWdlIEFzc2V0cycgZmxvd1xuICAgIGVsZW1lbnRJZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgfTtcblxuICBzdGF0ZSA9IHtcbiAgICBhY3Rpb246ICdub3JtYWwnLFxuICAgIGFjdGlvblRleHQ6ICcnLFxuICAgIGF0dGVtcHRlZFVzZWREZWxldGU6IGZhbHNlLFxuICB9O1xuXG4gIC8qKlxuICAgKiBDb25maXJtIHRoZSB1c2VyIGFjdHVhbGx5IHdhbnRzIHRvIGRlbGV0ZSB0aGlzIGFzc2V0LlxuICAgKi9cbiAgY29uZmlybURlbGV0ZSA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHthY3Rpb246ICdjb25maXJtaW5nIGRlbGV0ZScsIGFjdGlvblRleHQ6ICcnfSk7XG4gICAgZmlyZWhvc2VDbGllbnQucHV0UmVjb3JkKHtcbiAgICAgIHN0dWR5OiAnZGVsZXRlLWFzc2V0JyxcbiAgICAgIHN0dWR5X2dyb3VwOlxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hvb3NlICYmIHR5cGVvZiB0aGlzLnByb3BzLm9uQ2hvb3NlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyAnY2hvb3NlLWFzc2V0cydcbiAgICAgICAgICA6ICdtYW5hZ2UtYXNzZXRzJyxcbiAgICAgIGV2ZW50OiAnaW5pdGlhdGUnLFxuICAgICAgcHJvamVjdF9pZDogdGhpcy5wcm9wcy5wcm9qZWN0SWQsXG4gICAgICBkYXRhX2pzb246IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgYXNzZXROYW1lOiB0aGlzLnByb3BzLm5hbWUsXG4gICAgICAgIGVsZW1lbnRJZDogdGhpcy5wcm9wcy5lbGVtZW50SWQsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyB1c2VyIGRpZG4ndCB3YW50IHRvIGRlbGV0ZSB0aGlzIGFzc2V0LlxuICAgKi9cbiAgY2FuY2VsRGVsZXRlID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe2FjdGlvbjogJ25vcm1hbCcsIGFjdGlvblRleHQ6ICcnfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGlzIGFzc2V0IGFuZCBub3RpZnkgdGhlIHBhcmVudCB0byByZW1vdmUgdGhpcyByb3cuIElmIHRoZSBkZWxldGVcbiAgICogZmFpbHMsIGZsaXAgYmFjayB0byAnY29uZmlybWluZyBkZWxldGUnIGFuZCBkaXNwbGF5IGEgbWVzc2FnZS5cbiAgICovXG4gIGhhbmRsZURlbGV0ZSA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHthY3Rpb246ICdkZWxldGluZycsIGFjdGlvblRleHQ6ICcnfSk7XG5cbiAgICB0aGlzLnByb3BzLmFwaS5kZWxldGVGaWxlKHRoaXMucHJvcHMubmFtZSwgdGhpcy5wcm9wcy5vbkRlbGV0ZSwgKCkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGFjdGlvbjogJ2NvbmZpcm1pbmcgZGVsZXRlJyxcbiAgICAgICAgYWN0aW9uVGV4dDogaTE4bi5lcnJvckRlbGV0aW5nKCksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBjaG9vc2VBc3NldCA9ICgpID0+IHtcbiAgICBpZiAoIXRoaXMucHJvcHMuaW1hZ2VQaWNrZXIpIHtcbiAgICAgIGZpcmVob3NlQ2xpZW50LnB1dFJlY29yZChcbiAgICAgICAge1xuICAgICAgICAgIHN0dWR5OiAnc291bmQtZGlhbG9nLTInLFxuICAgICAgICAgIHN0dWR5X2dyb3VwOiAnbGlicmFyeS10YWInLFxuICAgICAgICAgIGV2ZW50OiAnY2hvb3NlLXVwbG9hZGVkLXNvdW5kJyxcbiAgICAgICAgICBkYXRhX2pzb246IHRoaXMucHJvcHMubmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAge2luY2x1ZGVVc2VySWQ6IHRydWV9XG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnByb3BzLm9uQ2hvb3NlKCk7XG4gIH07XG5cbiAgYXR0ZW1wdEJhZERlbGV0ZSA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHthdHRlbXB0ZWRVc2VkRGVsZXRlOiB0cnVlfSk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGxldCBhY3Rpb25zLCBmbGV4O1xuICAgIC8vIGBmbGV4YCBpcyB0aGUgXCJDaG9vc2VcIiBidXR0b24gaW4gZmlsZS1jaG9vc2UgbW9kZSwgb3IgdGhlIGZpbGVzaXplLlxuICAgIGlmICh0aGlzLnByb3BzLm9uQ2hvb3NlKSB7XG4gICAgICBmbGV4ID0gKFxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXt0aGlzLmNob29zZUFzc2V0fT5cbiAgICAgICAgICB7aTE4bi5jaG9vc2UoKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzaXplID0gKHRoaXMucHJvcHMuc2l6ZSAvIDEwMDApLnRvRml4ZWQoMik7XG4gICAgICBmbGV4ID0gc2l6ZSArICcga2InO1xuICAgIH1cblxuICAgIGxldCB1c2FnZSA9ICQoJyN2aXN1YWxpemF0aW9uJykuZmluZChcbiAgICAgIGBbc3JjKj1cIiR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMucHJvcHMubmFtZSl9XCJdYFxuICAgICkubGVuZ3RoO1xuXG4gICAgc3dpdGNoICh0aGlzLnN0YXRlLmFjdGlvbikge1xuICAgICAgY2FzZSAnbm9ybWFsJzpcbiAgICAgICAgYWN0aW9ucyA9IChcbiAgICAgICAgICA8dGQgd2lkdGg9XCIyNTBcIiBzdHlsZT17e3RleHRBbGlnbjogJ3JpZ2h0J319PlxuICAgICAgICAgICAge2ZsZXh9XG4gICAgICAgICAgICB7IXRoaXMucHJvcHMuaGlkZURlbGV0ZSAmJiAoXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3VzYWdlID4gMCA/ICcnIDogJ2J0bi1kYW5nZXInfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3VzYWdlID4gMCA/IHRoaXMuYXR0ZW1wdEJhZERlbGV0ZSA6IHRoaXMuY29uZmlybURlbGV0ZX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhIGZhLXRyYXNoLW9cIiAvPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLmF0dGVtcHRlZFVzZWREZWxldGUgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtzdHlsZXMuZGVsZXRlV2FybmluZ30+XG4gICAgICAgICAgICAgICAge2kxOG4uY2Fubm90RGVsZXRlVXNlZEltYWdlKCl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbmZpcm1pbmcgZGVsZXRlJzpcbiAgICAgICAgYWN0aW9ucyA9IChcbiAgICAgICAgICA8dGQgd2lkdGg9XCIyNTBcIiBzdHlsZT17e3RleHRBbGlnbjogJ3JpZ2h0J319PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWRhbmdlclwiXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlRGVsZXRlfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBEZWxldGUgRmlsZVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXt0aGlzLmNhbmNlbERlbGV0ZX0+XG4gICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXtzdHlsZXMuZGVsZXRlV2FybmluZ30+XG4gICAgICAgICAgICAgIHtpMThuLmNvbmZpcm1EZWxldGVFeHBsYW5hdGlvbigpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7dGhpcy5zdGF0ZS5hY3Rpb25UZXh0fVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGVsZXRpbmcnOlxuICAgICAgICBhY3Rpb25zID0gKFxuICAgICAgICAgIDx0ZCB3aWR0aD1cIjI1MFwiIHN0eWxlPXt7dGV4dEFsaWduOiAncmlnaHQnfX0+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYSBmYS1zcGlubmVyIGZhLXNwaW5cIlxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMzJweCcsXG4gICAgICAgICAgICAgICAgbWFyZ2luUmlnaHQ6ICcxNXB4JyxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDx0ciBjbGFzc05hbWU9XCJhc3NldFJvd1wiIG9uRG91YmxlQ2xpY2s9e3RoaXMucHJvcHMub25DaG9vc2V9PlxuICAgICAgICA8dGQgd2lkdGg9XCI4MFwiPlxuICAgICAgICAgIDxBc3NldFRodW1ibmFpbFxuICAgICAgICAgICAgdHlwZT17dGhpcy5wcm9wcy50eXBlfVxuICAgICAgICAgICAgbmFtZT17dGhpcy5wcm9wcy5uYW1lfVxuICAgICAgICAgICAgdGltZXN0YW1wPXt0aGlzLnByb3BzLnRpbWVzdGFtcH1cbiAgICAgICAgICAgIGFwaT17dGhpcy5wcm9wcy5hcGl9XG4gICAgICAgICAgICBzb3VuZFBsYXllcj17dGhpcy5wcm9wcy5zb3VuZFBsYXllcn1cbiAgICAgICAgICAgIGxldmVsTmFtZT17dGhpcy5wcm9wcy5sZXZlbE5hbWV9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkPnt0aGlzLnByb3BzLm5hbWV9PC90ZD5cbiAgICAgICAge2FjdGlvbnN9XG4gICAgICA8L3RyPlxuICAgICk7XG4gIH1cbn1cblxuY29uc3Qgc3R5bGVzID0ge1xuICBkZWxldGVXYXJuaW5nOiB7XG4gICAgcGFkZGluZ0xlZnQ6ICczNHB4JyxcbiAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICBjb2xvcjogY29sb3IucmVkLFxuICB9LFxufTtcbiIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQge2Fzc2V0cyBhcyBhc3NldHNBcGl9IGZyb20gJ0BjZG8vYXBwcy9jbGllbnRBcGknO1xuaW1wb3J0IGNvbG9yIGZyb20gJ0BjZG8vYXBwcy91dGlsL2NvbG9yJztcblxuY29uc3QgZGVmYXVsdEljb25zID0ge1xuICBpbWFnZTogJ2ZhIGZhLXBpY3R1cmUtbycsXG4gIGF1ZGlvOiAnZmEgZmEtbXVzaWMnLFxuICB2aWRlbzogJ2ZhIGZhLXZpZGVvLWNhbWVyYScsXG4gIHBkZjogJ2ZhIGZhLWZpbGUtcGRmLW8nLFxuICBkb2M6ICdmYSBmYS1maWxlLXRleHQtbycsXG4gIHVua25vd246ICdmYSBmYS1xdWVzdGlvbicsXG59O1xuXG5jb25zdCBhc3NldFRodW1ibmFpbFN0eWxlID0ge1xuICB3aWR0aDogJ2F1dG8nLFxuICBtYXhXaWR0aDogJzEwMCUnLFxuICBoZWlnaHQ6ICdhdXRvJyxcbiAgbWF4SGVpZ2h0OiAnMTAwJScsXG4gIG1hcmdpblRvcDogJzUwJScsXG4gIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTUwJSknLFxuICBtc1RyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTUwJSknLFxuICBXZWJraXRUcmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01MCUpJyxcbn07XG5cbmNvbnN0IGFzc2V0SWNvblN0eWxlID0ge1xuICBtYXJnaW46ICcxNXB4IDAnLFxuICBmb250U2l6ZTogJzMycHgnLFxufTtcblxuZXhwb3J0IGNvbnN0IHN0eWxlcyA9IHtcbiAgd3JhcHBlcjoge1xuICAgIHdpZHRoOiA2MCxcbiAgICBoZWlnaHQ6IDYwLFxuICAgIG1hcmdpbjogJzEwcHggYXV0bycsXG4gIH0sXG4gIGJhY2tncm91bmQ6IHtcbiAgICBiYWNrZ3JvdW5kOiAnI2VlZScsXG4gICAgYm9yZGVyOiAnMXB4IHNvbGlkICNjY2MnLFxuICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gIH0sXG4gIGF1ZGlvSWNvbjoge1xuICAgIGNvbG9yOiBjb2xvci5wdXJwbGUsXG4gICAgbWFyZ2luTGVmdDogJ2F1dG8nLFxuICAgIG1hcmdpblJpZ2h0OiAnYXV0bycsXG4gICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgfSxcbiAgYXVkaW9XcmFwcGVyOiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICB9LFxufTtcblxuY2xhc3MgQXNzZXRUaHVtYm5haWwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICB0aW1lc3RhbXA6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKFsnaW1hZ2UnLCAnYXVkaW8nLCAndmlkZW8nLCAncGRmJywgJ2RvYyddKS5pc1JlcXVpcmVkLFxuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGljb25TdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBhcGk6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgcHJvamVjdElkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGxldmVsTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBzb3VuZFBsYXllcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICBsZXQgYXBpID0gdGhpcy5wcm9wcy5hcGkgfHwgYXNzZXRzQXBpOyAvLyBGYWxsYmFjayB0byBhc3NldHNBcGkuXG4gICAgaWYgKHRoaXMucHJvcHMubGV2ZWxOYW1lKSB7XG4gICAgICBhcGkgPSBhcGkud2l0aExldmVsTmFtZSh0aGlzLnByb3BzLmxldmVsTmFtZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnByb2plY3RJZCkge1xuICAgICAgYXBpID0gYXBpLndpdGhQcm9qZWN0SWQodGhpcy5wcm9wcy5wcm9qZWN0SWQpO1xuICAgIH1cbiAgICBjb25zdCBiYXNlUGF0aCA9IGFwaS5iYXNlUGF0aCh0aGlzLnByb3BzLm5hbWUpO1xuICAgIGxldCBjYWNoZUJ1c3RTdWZmaXggPSAnJztcbiAgICBpZiAodGhpcy5wcm9wcy50aW1lc3RhbXApIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLnByb3BzLnRpbWVzdGFtcCk7XG4gICAgICBjYWNoZUJ1c3RTdWZmaXggPSBgP3Q9JHtkYXRlLnZhbHVlT2YoKX1gO1xuICAgIH1cblxuICAgIHRoaXMuc3JjUGF0aCA9IGAke2Jhc2VQYXRofSR7Y2FjaGVCdXN0U3VmZml4fWA7XG5cbiAgICBpZiAodGhpcy5wcm9wcy50eXBlID09PSAnYXVkaW8nICYmIHRoaXMucHJvcHMuc291bmRQbGF5ZXIpIHtcbiAgICAgIHRoaXMucHJvcHMuc291bmRQbGF5ZXIucmVnaXN0ZXIoe2lkOiB0aGlzLnNyY1BhdGgsIG1wMzogdGhpcy5zcmNQYXRofSk7XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc1BsYXlpbmdBdWRpbzogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIGNsaWNrU291bmRDb250cm9sID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmlzUGxheWluZ0F1ZGlvICYmIHRoaXMucHJvcHMuc291bmRQbGF5ZXIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2lzUGxheWluZ0F1ZGlvOiBmYWxzZX0pO1xuICAgICAgdGhpcy5wcm9wcy5zb3VuZFBsYXllci5zdG9wUGxheWluZ1VSTCh0aGlzLnNyY1BhdGgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zb3VuZFBsYXllcikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNQbGF5aW5nQXVkaW86IHRydWV9KTtcbiAgICAgIHRoaXMucHJvcHMuc291bmRQbGF5ZXIucGxheSh0aGlzLnNyY1BhdGgsIHtcbiAgICAgICAgb25FbmRlZDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2lzUGxheWluZ0F1ZGlvOiBmYWxzZX0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7dHlwZSwgaWNvblN0eWxlLCBzdHlsZX0gPSB0aGlzLnByb3BzO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXNzZXRUaHVtYm5haWxcIj5cbiAgICAgICAge3R5cGUgPT09ICdhdWRpbycgPyAoXG4gICAgICAgICAgPEF1ZGlvVGh1bWJuYWlsXG4gICAgICAgICAgICBjbGlja1NvdW5kQ29udHJvbD17dGhpcy5jbGlja1NvdW5kQ29udHJvbH1cbiAgICAgICAgICAgIGlzUGxheWluZz17dGhpcy5zdGF0ZS5pc1BsYXlpbmdBdWRpb31cbiAgICAgICAgICAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxkaXYgc3R5bGU9e3suLi5zdHlsZXMud3JhcHBlciwgLi4uc3R5bGUsIC4uLnN0eWxlcy5iYWNrZ3JvdW5kfX0+XG4gICAgICAgICAgICB7dHlwZSA9PT0gJ2ltYWdlJyA/IChcbiAgICAgICAgICAgICAgPEltYWdlVGh1bWJuYWlsIHNyYz17dGhpcy5zcmNQYXRofSAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPERlZmF1bHRUaHVtYm5haWwgdHlwZT17dHlwZX0gaWNvblN0eWxlPXtpY29uU3R5bGV9IC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBc3NldFRodW1ibmFpbDtcblxuY29uc3QgQXVkaW9UaHVtYm5haWwgPSBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgY2xpY2tTb3VuZENvbnRyb2w6IFByb3BUeXBlcy5mdW5jLFxuICAgIGlzUGxheWluZzogUHJvcFR5cGVzLmJvb2wsXG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHBsYXlJY29uID0gdGhpcy5wcm9wcy5pc1BsYXlpbmdcbiAgICAgID8gJ2ZhLXBhdXNlLWNpcmNsZSdcbiAgICAgIDogJ2ZhLXBsYXktY2lyY2xlJztcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHN0eWxlPXt7Li4uc3R5bGVzLndyYXBwZXIsIC4uLnN0eWxlcy5hdWRpb1dyYXBwZXJ9fT5cbiAgICAgICAgPGlcbiAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLmNsaWNrU291bmRDb250cm9sfVxuICAgICAgICAgIGNsYXNzTmFtZT17J2ZhICcgKyBwbGF5SWNvbiArICcgZmEtNHgnfVxuICAgICAgICAgIHN0eWxlPXtzdHlsZXMuYXVkaW9JY29ufVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuY29uc3QgSW1hZ2VUaHVtYm5haWwgPSBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgc3JjOiBQcm9wVHlwZXMuc3RyaW5nLFxuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGEgaHJlZj17dGhpcy5wcm9wcy5zcmN9IHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IEExMXkyNzkgKGh0dHBzOi8vY29kZWRvdG9yZy5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9BMTFZLTI3OSlcbiAgICAgICAgICAvLyBWZXJpZnkgb3IgdXBkYXRlIHRoaXMgYWx0LXRleHQgYXMgbmVjZXNzYXJ5XG4gICAgICAgIH1cbiAgICAgICAgPGltZ1xuICAgICAgICAgIHNyYz17dGhpcy5wcm9wcy5zcmN9XG4gICAgICAgICAgc3R5bGU9e2Fzc2V0VGh1bWJuYWlsU3R5bGV9XG4gICAgICAgICAgaWQ9XCJ1aS1pbWFnZS10aHVtYm5haWxcIlxuICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgIC8+XG4gICAgICA8L2E+XG4gICAgKTtcbiAgfVxufTtcblxuY29uc3QgRGVmYXVsdFRodW1ibmFpbCA9IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICB0eXBlOiBQcm9wVHlwZXMub25lT2YoWydpbWFnZScsICdhdWRpbycsICd2aWRlbycsICdwZGYnLCAnZG9jJ10pLmlzUmVxdWlyZWQsXG4gICAgaWNvblN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGlcbiAgICAgICAgY2xhc3NOYW1lPXtkZWZhdWx0SWNvbnNbdGhpcy5wcm9wcy50eXBlXSB8fCBkZWZhdWx0SWNvbnMudW5rbm93bn1cbiAgICAgICAgc3R5bGU9e3suLi5hc3NldEljb25TdHlsZSwgLi4udGhpcy5wcm9wcy5pY29uU3R5bGV9fVxuICAgICAgLz5cbiAgICApO1xuICB9XG59O1xuIiwiLyoqIEBmaWxlIFVwbG9hZCBidXR0b24gd3JhcHBpbmcgYSBoaWRkZW4gdXBsb2FkZXIgY29tcG9uZW50LiAqL1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBCdXR0b24gZnJvbSAnQGNkby9hcHBzL2xlZ2FjeVNoYXJlZENvbXBvbmVudHMvQnV0dG9uJztcbmltcG9ydCBpMThuIGZyb20gJ0BjZG8vbG9jYWxlJztcblxuaW1wb3J0IHthc3NldEJ1dHRvblN0eWxlc30gZnJvbSAnLi9BZGRBc3NldEJ1dHRvblJvdyc7XG5pbXBvcnQgSGlkZGVuVXBsb2FkZXIgZnJvbSAnLi9IaWRkZW5VcGxvYWRlci5qc3gnO1xuXG4vKipcbiAqIEEgZmlsZSB1cGxvYWQgY29tcG9uZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBc3NldFVwbG9hZGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBvblVwbG9hZFN0YXJ0OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIG9uVXBsb2FkRG9uZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvblVwbG9hZEVycm9yOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBhbGxvd2VkRXh0ZW5zaW9uczogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB1cGxvYWRzRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICBhcGk6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgfTtcblxuICAvKipcbiAgICogV2UndmUgaGlkZGVuIHRoZSA8aW5wdXQgdHlwZT1cImZpbGVcIi8+IGFuZCByZXBsYWNlZCBpdCB3aXRoIGEgYmlnIGJ1dHRvbi5cbiAgICogRm9yd2FyZCBjbGlja3Mgb24gdGhlIGJ1dHRvbiB0byB0aGUgaGlkZGVuIGZpbGUgaW5wdXQuXG4gICAqL1xuICBmaWxlVXBsb2FkQ2xpY2tlZCA9ICgpID0+IHRoaXMucmVmcy51cGxvYWRlci5vcGVuRmlsZUNob29zZXIoKTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge2FwaX0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB1cmwgPSBhcGkuZ2V0VXBsb2FkVXJsKCk7XG4gICAgbGV0IHVwbG9hZERvbmUgPSBhcGkud3JhcFVwbG9hZERvbmVDYWxsYmFjayh0aGlzLnByb3BzLm9uVXBsb2FkRG9uZSk7XG4gICAgbGV0IHVwbG9hZFN0YXJ0ID0gYXBpLndyYXBVcGxvYWRTdGFydENhbGxiYWNrKHRoaXMucHJvcHMub25VcGxvYWRTdGFydCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPHNwYW4+XG4gICAgICAgIDxIaWRkZW5VcGxvYWRlclxuICAgICAgICAgIHJlZj1cInVwbG9hZGVyXCJcbiAgICAgICAgICB0b1VybD17dXJsfVxuICAgICAgICAgIGFsbG93ZWRFeHRlbnNpb25zPXt0aGlzLnByb3BzLmFsbG93ZWRFeHRlbnNpb25zfVxuICAgICAgICAgIG9uVXBsb2FkU3RhcnQ9e3VwbG9hZFN0YXJ0fVxuICAgICAgICAgIG9uVXBsb2FkRG9uZT17dXBsb2FkRG9uZX1cbiAgICAgICAgICBvblVwbG9hZEVycm9yPXt0aGlzLnByb3BzLm9uVXBsb2FkRXJyb3J9XG4gICAgICAgIC8+XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICBvbkNsaWNrPXt0aGlzLmZpbGVVcGxvYWRDbGlja2VkfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInNoYXJlXCJcbiAgICAgICAgICBpZD1cInVwbG9hZC1hc3NldFwiXG4gICAgICAgICAgZGlzYWJsZWQ9eyF0aGlzLnByb3BzLnVwbG9hZHNFbmFibGVkfVxuICAgICAgICAgIGljb249XCJ1cGxvYWRcIlxuICAgICAgICAgIHRleHQ9e2kxOG4udXBsb2FkRmlsZSgpfVxuICAgICAgICAgIHN0eWxlPXthc3NldEJ1dHRvblN0eWxlcy5idXR0b259XG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgLz5cbiAgICAgIDwvc3Bhbj5cbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHthc3NldHMgYXMgYXNzZXRzQXBpfSBmcm9tICdAY2RvL2FwcHMvY2xpZW50QXBpJztcbmltcG9ydCBCdXR0b24gZnJvbSAnQGNkby9hcHBzL2xlZ2FjeVNoYXJlZENvbXBvbmVudHMvQnV0dG9uJztcbmltcG9ydCBmaXJlaG9zZUNsaWVudCBmcm9tICdAY2RvL2FwcHMvbWV0cmljcy9maXJlaG9zZSc7XG5pbXBvcnQgY29sb3IgZnJvbSAnQGNkby9hcHBzL3V0aWwvY29sb3InO1xuaW1wb3J0IGkxOG4gZnJvbSAnQGNkby9sb2NhbGUnO1xuXG5pbXBvcnQge2Fzc2V0QnV0dG9uU3R5bGVzfSBmcm9tICcuL0FkZEFzc2V0QnV0dG9uUm93JztcbmltcG9ydCB7QXVkaW9FcnJvclR5cGV9IGZyb20gJy4vQXNzZXRNYW5hZ2VyJztcbmltcG9ydCBnZXRSZWNvcmRlciwge1JlY29yZGluZ0ZpbGVUeXBlfSBmcm9tICcuL3JlY29yZGVycyc7XG5cbmNvbnN0IFJFQ09SRF9NQVhfVElNRSA9IDMwMDAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdWRpb1JlY29yZGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBvblVwbG9hZERvbmU6IFByb3BUeXBlcy5mdW5jLFxuICAgIGFmdGVyQXVkaW9TYXZlZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgcmVjb3JkaW5nRmlsZVR5cGU6IFByb3BUeXBlcy5vbmVPZihPYmplY3QudmFsdWVzKFJlY29yZGluZ0ZpbGVUeXBlKSksXG5cbiAgICAvL1RlbXBvcmFyeSBwcm9wIGZvciBsb2dnaW5nIC0gaW5kaWNhdGVzIHVzZXIgY2hvc2UgJ01hbmFnZSBBc3NldHMnXG4gICAgaW1hZ2VQaWNrZXI6IFByb3BUeXBlcy5ib29sLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMudGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5yZWNvcmRlciA9IG51bGw7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGF1ZGlvTmFtZTogJycsXG4gICAgICByZWNvcmRpbmc6IGZhbHNlLFxuICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgPSAoKSA9PiB7XG4gICAgaWYgKG5hdmlnYXRvci5tZWRpYURldmljZXMgJiYgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEpIHtcbiAgICAgIHRoaXMucmVjb3JkZXIgPSBnZXRSZWNvcmRlcih0aGlzLnByb3BzLnJlY29yZGluZ0ZpbGVUeXBlKTtcblxuICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAuZ2V0VXNlck1lZGlhKHthdWRpbzogdHJ1ZX0pXG4gICAgICAgIC50aGVuKHRoaXMucmVjb3JkZXIuaW5pdClcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5zZXRTdGF0ZSh7bG9hZGluZzogZmFsc2V9KSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMucHJvcHMuYWZ0ZXJBdWRpb1NhdmVkKEF1ZGlvRXJyb3JUeXBlLklOSVRJQUxJWkUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5hZnRlckF1ZGlvU2F2ZWQoQXVkaW9FcnJvclR5cGUuSU5JVElBTElaRSk7XG4gICAgfVxuICB9O1xuXG4gIHNhdmVBdWRpbyA9IGJsb2IgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe2xvYWRpbmc6IHRydWV9KTtcbiAgICBhc3NldHNBcGkucHV0QXNzZXQoXG4gICAgICB0aGlzLnN0YXRlLmF1ZGlvTmFtZSArIHRoaXMucmVjb3JkZXIuZ2V0RXh0ZW5zaW9uKCksXG4gICAgICBibG9iLFxuICAgICAgeGhyID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7YXVkaW9OYW1lOiAnJywgbG9hZGluZzogZmFsc2V9KTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgcmVzdWx0LmZpbGVuYW1lID0gZGVjb2RlVVJJKHJlc3VsdC5maWxlbmFtZSk7XG4gICAgICAgIHRoaXMucHJvcHMub25VcGxvYWREb25lKHJlc3VsdCk7XG4gICAgICAgIHRoaXMucHJvcHMuYWZ0ZXJBdWRpb1NhdmVkKEF1ZGlvRXJyb3JUeXBlLk5PTkUpO1xuICAgICAgfSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7bG9hZGluZzogZmFsc2V9KTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQXVkaW8gRmFpbGVkIHRvIFNhdmU6ICR7ZXJyb3J9YCk7XG4gICAgICAgIHRoaXMucHJvcHMuYWZ0ZXJBdWRpb1NhdmVkKEF1ZGlvRXJyb3JUeXBlLlNBVkUpO1xuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgb25OYW1lQ2hhbmdlID0gZXZlbnQgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe2F1ZGlvTmFtZTogZXZlbnQudGFyZ2V0LnZhbHVlfSk7XG4gIH07XG5cbiAgb25DYW5jZWwgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7YXVkaW9OYW1lOiAnJywgcmVjb3JkaW5nOiBmYWxzZX0sICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMuYWZ0ZXJBdWRpb1NhdmVkKEF1ZGlvRXJyb3JUeXBlLk5PTkUpO1xuICAgICAgLy8gT25seSBzdG9wIHJlY29yZGluZyBpZiBpdCdzIGJlZW4gc3RhcnRlZFxuICAgICAgaWYgKHRoaXMucmVjb3JkZXIuaXNSZWNvcmRpbmcoKSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvcmRUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5yZWNvcmRlci5zdG9wUmVjb3JkaW5nKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdG9nZ2xlUmVjb3JkID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLnJlY29yZGluZykge1xuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nQW5kU2F2ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0UmVjb3JkaW5nKCk7XG4gICAgfVxuICB9O1xuXG4gIHN0YXJ0UmVjb3JkaW5nID0gKCkgPT4ge1xuICAgIGNvbnN0IHN0dWR5R3JvdXAgPSB0aGlzLnByb3BzLmltYWdlUGlja2VyID8gJ21hbmFnZS1hc3NldHMnIDogJ2xpYnJhcnktdGFiJztcbiAgICB0aGlzLnJlY29yZGVyLnN0YXJ0UmVjb3JkaW5nKCkudGhlbigoKSA9PiB7XG4gICAgICBmaXJlaG9zZUNsaWVudC5wdXRSZWNvcmQoXG4gICAgICAgIHtcbiAgICAgICAgICBzdHVkeTogJ3NvdW5kLWRpYWxvZy0yJyxcbiAgICAgICAgICBzdHVkeV9ncm91cDogc3R1ZHlHcm91cCxcbiAgICAgICAgICBldmVudDogJ3JlY29yZC1zb3VuZCcsXG4gICAgICAgICAgZGF0YV9qc29uOiB0aGlzLnN0YXRlLmF1ZGlvTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAge2luY2x1ZGVVc2VySWQ6IHRydWV9XG4gICAgICApO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7cmVjb3JkaW5nOiAhdGhpcy5zdGF0ZS5yZWNvcmRpbmd9KTtcbiAgICB9KTtcblxuICAgIC8vU3RvcCByZWNvcmRpbmcgYWZ0ZXIgc2V0IGFtb3VudCBvZiB0aW1lXG4gICAgdGhpcy5yZWNvcmRUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLnN0b3BSZWNvcmRpbmdBbmRTYXZlLCBSRUNPUkRfTUFYX1RJTUUpO1xuICB9O1xuXG4gIC8vU3RvcCByZWNvcmRpbmcgYW5kIHNhdmUgdGhlIGZpbmFsIGF1ZGlvXG4gIHN0b3BSZWNvcmRpbmdBbmRTYXZlID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLnJlY29yZGluZykge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVjb3JkVGltZW91dCk7XG4gICAgICB0aGlzLnJlY29yZGVyLnN0b3BSZWNvcmRpbmcoKS50aGVuKGJsb2IgPT4ge1xuICAgICAgICB0aGlzLnNhdmVBdWRpbyhibG9iKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7cmVjb3JkaW5nOiAhdGhpcy5zdGF0ZS5yZWNvcmRpbmd9KTtcbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPXtzdHlsZXMuYnV0dG9uUm93fT5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtpMThuLnNvdW5kTmFtZSgpfVxuICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25OYW1lQ2hhbmdlfVxuICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuYXVkaW9OYW1lfVxuICAgICAgICAgIC8+XG4gICAgICAgICAge3RoaXMuc3RhdGUucmVjb3JkaW5nICYmIChcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPXthc3NldEJ1dHRvblN0eWxlcy5idXR0b259PlxuICAgICAgICAgICAgICA8aSBzdHlsZT17c3R5bGVzLnJlY29yZGluZ0ljb259IGNsYXNzTmFtZT1cImZhIGZhLWNpcmNsZVwiIC8+XG4gICAgICAgICAgICAgIHtpMThuLnJlY29yZGluZygpfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICl9XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICB7dGhpcy5zdGF0ZS5sb2FkaW5nICYmIHRoaXMuc3RhdGUuYXVkaW9OYW1lLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtzdHlsZXMuc3Bpbm5lcn0+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhIGZhLXNwaW5uZXIgZmEtc3BpblwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e2ZvbnRTaXplOiAnMjBweCd9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgb25DbGljaz17dGhpcy50b2dnbGVSZWNvcmR9XG4gICAgICAgICAgICAgIGlkPVwic3RhcnQtc3RvcC1yZWNvcmRcIlxuICAgICAgICAgICAgICBzdHlsZT17YXNzZXRCdXR0b25TdHlsZXMuYnV0dG9ufVxuICAgICAgICAgICAgICBjb2xvcj17QnV0dG9uLkJ1dHRvbkNvbG9yLmJsdWV9XG4gICAgICAgICAgICAgIGljb249e3RoaXMuc3RhdGUucmVjb3JkaW5nID8gJ3N0b3AnIDogJ2NpcmNsZSd9XG4gICAgICAgICAgICAgIHRleHQ9e3RoaXMuc3RhdGUucmVjb3JkaW5nID8gaTE4bi5zdG9wKCkgOiBpMThuLnJlY29yZCgpfVxuICAgICAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5hdWRpb05hbWUubGVuZ3RoID09PSAwIHx8IHRoaXMuc3RhdGUubG9hZGluZ31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25DYW5jZWx9XG4gICAgICAgICAgICAgIGlkPVwiY2FuY2VsLXJlY29yZFwiXG4gICAgICAgICAgICAgIHN0eWxlPXthc3NldEJ1dHRvblN0eWxlcy5idXR0b259XG4gICAgICAgICAgICAgIGNvbG9yPXtCdXR0b24uQnV0dG9uQ29sb3IuZ3JheX1cbiAgICAgICAgICAgICAgdGV4dD17aTE4bi5jYW5jZWwoKX1cbiAgICAgICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuY29uc3Qgc3R5bGVzID0ge1xuICBidXR0b25Sb3c6IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgZmxleEZsb3c6ICdyb3cnLFxuICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gIH0sXG4gIHJlY29yZGluZ0ljb246IHtcbiAgICBjb2xvcjogJ3JlZCcsXG4gICAgbWFyZ2luOiA1LFxuICB9LFxuICB3YXJuaW5nOiB7XG4gICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gICAgY29sb3I6IGNvbG9yLnJlZCxcbiAgfSxcbiAgc3Bpbm5lcjoge1xuICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgIHZlcnRpY2FsQWxpZ246ICd0b3AnLFxuICAgIG1hcmdpblRvcDogJzE2cHgnLFxuICAgIG1hcmdpblJpZ2h0OiAnMTBweCcsXG4gIH0sXG59O1xuIiwiLyoqIEBmaWxlIEhpZGRlbiBmaWxlIGlucHV0IHdpdGggaW50ZXJmYWNlIGZvciBoYW5kbGluZyB1cGxvYWRzLiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgZmlyZWhvc2VDbGllbnQgZnJvbSAnQGNkby9hcHBzL21ldHJpY3MvZmlyZWhvc2UnO1xuXG4vKipcbiAqIEEgaGlkZGVuIGZpbGUgaW5wdXQgcHJvdmlkaW5nIHVwbG9hZCBmdW5jdGlvbmFsaXR5IHdpdGggZXZlbnQgaG9va3MuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpZGRlblVwbG9hZGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICB0b1VybDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIGFsbG93ZWRFeHRlbnNpb25zOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG9uVXBsb2FkU3RhcnQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25VcGxvYWREb25lOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIG9uVXBsb2FkRXJyb3I6IFByb3BUeXBlcy5mdW5jLFxuICB9O1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wcztcblxuICAgICQodGhpcy5yZWZzLnVwbG9hZGVyKS5maWxldXBsb2FkKHtcbiAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICB1cmw6IHRoaXMucHJvcHMudG9VcmwsXG4gICAgICAvLyBwcmV2ZW50IGZpbGV1cGxvYWQgZnJvbSByZXBsYWNpbmcgdGhlIGlucHV0IERPTSBlbGVtZW50LCB3aGljaFxuICAgICAgLy8gUmVhY3QgZG9lcyBub3QgbGlrZVxuICAgICAgcmVwbGFjZUZpbGVJbnB1dDogZmFsc2UsXG4gICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICAgIC8vIG9uVXBsb2FkU3RhcnQgbWV0aG9kIG11c3QgY2FsbCBkYXRhLnN1Ym1pdCgpXG4gICAgICAgIHByb3BzLm9uVXBsb2FkU3RhcnQoZGF0YSk7XG4gICAgICAgIGNvbnN0IGF1ZGlvRmlsZU5hbWUgPSBkYXRhLmZpbGVzWzBdLm5hbWUuaW5jbHVkZXMoJ21wMycpXG4gICAgICAgICAgPyBkYXRhLmZpbGVzWzBdLm5hbWVcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmIChhdWRpb0ZpbGVOYW1lKSB7XG4gICAgICAgICAgZmlyZWhvc2VDbGllbnQucHV0UmVjb3JkKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdHVkeTogJ3NvdW5kLWRpYWxvZy0yJyxcbiAgICAgICAgICAgICAgc3R1ZHlfZ3JvdXA6ICdsaWJyYXJ5LWZpbGUnLFxuICAgICAgICAgICAgICBldmVudDogJ3VwbG9hZC1maWxlJyxcbiAgICAgICAgICAgICAgZGF0YV9qc29uOiBhdWRpb0ZpbGVOYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtpbmNsdWRlVXNlcklkOiB0cnVlfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICBwcm9wcy5vblVwbG9hZERvbmUoZGF0YS5yZXN1bHQpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICBpZiAocHJvcHMub25VcGxvYWRFcnJvcikge1xuICAgICAgICAgIHByb3BzLm9uVXBsb2FkRXJyb3IoZS5zdGF0dXMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgJCh0aGlzLnJlZnMudXBsb2FkZXIpLmZpbGV1cGxvYWQoJ2Rlc3Ryb3knKTtcbiAgfVxuXG4gIG9wZW5GaWxlQ2hvb3NlciA9ICgpID0+IHRoaXMucmVmcy51cGxvYWRlci5jbGljaygpO1xuXG4gIHJlbmRlcigpIHtcbiAgICAvLyBOT1RFOiBJRTkgd2lsbCBpZ25vcmUgYWNjZXB0LCB3aGljaCBtZWFucyBvbiB0aGlzIGJyb3dzZXIgd2UgY2FuIGVuZFxuICAgIC8vIHVwIHVwbG9hZGluZyBmaWxlcyB0aGF0IGRvbid0IG1hdGNoIGFsbG93ZWRFeHRlbnNpb25zOyBmb3IgdGhpcyByZWFzb24sXG4gICAgLy8gdGhlIHNlcnZlciBzaG91bGQgYWxzbyB2YWxpZGF0ZSBhbGxvd2VkIGZpbGUgdHlwZXMuXG4gICAgcmV0dXJuIChcbiAgICAgIDxpbnB1dFxuICAgICAgICByZWY9XCJ1cGxvYWRlclwiXG4gICAgICAgIGNsYXNzTmFtZT1cInVpdGVzdC1oaWRkZW4tdXBsb2FkZXJcIlxuICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgIHN0eWxlPXt7ZGlzcGxheTogJ25vbmUnfX1cbiAgICAgICAgYWNjZXB0PXt0aGlzLnByb3BzLmFsbG93ZWRFeHRlbnNpb25zIHx8ICcqJ31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG53aW5kb3cuZGFzaGJvYXJkID0gd2luZG93LmRhc2hib2FyZCB8fCB7fTtcbndpbmRvdy5kYXNoYm9hcmQuSGlkZGVuVXBsb2FkZXIgPSBIaWRkZW5VcGxvYWRlcjtcbiJdLCJuYW1lcyI6WyJfcHJvcFR5cGVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcmVhY3QiLCJfQnV0dG9uIiwiX2Jyb3dzZXJEZXRlY3RvciIsIl9sb2NhbGUiLCJfQXNzZXRVcGxvYWRlciIsImUiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsIm8iLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwiX3NldFByb3RvdHlwZU9mIiwidCIsIk9iamVjdCIsInNldFByb3RvdHlwZU9mIiwiYmluZCIsIl9fcHJvdG9fXyIsImFzc2V0QnV0dG9uU3R5bGVzIiwiZXhwb3J0cyIsImJ1dHRvbiIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwibWFyZ2luVG9wIiwiZm9udFNpemUiLCJmb250V2VpZ2h0IiwibWFyZ2luUmlnaHQiLCJidXR0b25Sb3ciLCJkaXNwbGF5IiwiZmxleEZsb3ciLCJhbGlnbkl0ZW1zIiwiUmVjb3JkQnV0dG9uIiwiX3JlZiIsIm9uU2VsZWN0UmVjb3JkIiwiZGlzYWJsZWQiLCJjcmVhdGVFbGVtZW50Iiwib25DbGljayIsImlkIiwiY2xhc3NOYW1lIiwidGV4dCIsImkxOG4iLCJyZWNvcmRBdWRpbyIsImljb24iLCJzdHlsZSIsInNpemUiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJmdW5jIiwiYm9vbCIsIl9kZWZpbmVQcm9wZXJ0eSIsInIiLCJfdG9Qcm9wZXJ0eUtleSIsImkiLCJfdG9QcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsImNhbGwiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX1JlYWN0JENvbXBvbmVudCIsIkFkZEFzc2V0QnV0dG9uUm93IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHNMb29zZSIsImNyZWF0ZSIsInJlbmRlciIsInNob3VsZFNob3dSZWNvcmRCdXR0b24iLCJ0aGlzIiwicHJvcHMiLCJoaWRlQXVkaW9SZWNvcmRpbmciLCJpc0lFMTEiLCJ1cGxvYWRzRW5hYmxlZCIsImFsbG93ZWRFeHRlbnNpb25zIiwiYXBpIiwib25VcGxvYWRTdGFydCIsIm9uVXBsb2FkRG9uZSIsIm9uVXBsb2FkRXJyb3IiLCJyZWNvcmREaXNhYmxlZCIsInN0YXR1c01lc3NhZ2UiLCJSZWFjdCIsIkNvbXBvbmVudCIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJvYmplY3QiLCJfYXNzZXRQcmVmaXgiLCJfY2xpZW50QXBpIiwiX2ZpcmVob3NlIiwiX2Fzc2V0TGlzdFN0b3JlIiwiX0FkZEFzc2V0QnV0dG9uUm93IiwiX0Fzc2V0Um93IiwiX0F1ZGlvUmVjb3JkZXIiLCJfcmVjb3JkZXJzIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJuIiwibGVuZ3RoIiwiaGFzT3duUHJvcGVydHkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJBcnJheSIsImlzQXJyYXkiLCJfYXJyYXlMaWtlVG9BcnJheSIsIl9pdGVyYWJsZVRvQXJyYXkiLCJmcm9tIiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiYSIsInRvU3RyaW5nIiwic2xpY2UiLCJuYW1lIiwidGVzdCIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIkF1ZGlvRXJyb3JUeXBlIiwiTk9ORSIsIklOSVRJQUxJWkUiLCJTQVZFIiwiZXJyb3JNZXNzYWdlcyIsIkZJTEUiLCJJQ09OIiwiVVJMIiwiREVGQVVMVCIsInVua25vd24iLCJnZXRFcnJvck1lc3NhZ2UiLCJzdGF0dXMiLCJBc3NldE1hbmFnZXIiLCJfdGhpcyIsInJlc3VsdCIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwic2V0U3RhdGUiLCJzdGFydGVyQXNzZXRzIiwic3RhcnRlcl9hc3NldHMiLCJ4aHIiLCJhc3NldExpc3RTdG9yZSIsInJlc2V0IiwiZmlsZXMiLCJhc3NldHMiLCJsaXN0IiwidXNlRmlsZXNBcGkiLCJvbkFzc2V0TGlzdFJlY2VpdmVkIiwiZGF0YSIsInN1Ym1pdCIsIm5ld1N0YXRlIiwiZmlsZW5hbWUiLCJpc1N0YXJ0TW9kZSIsImNvbmNhdCIsInN0YXRlIiwiYWRkIiwiYXNzZXRzQ2hhbmdlZCIsImZpcmVob3NlQ2xpZW50IiwicHV0UmVjb3JkIiwic3R1ZHkiLCJzdHVkeV9ncm91cCIsImV2ZW50IiwicHJvamVjdF9pZCIsInByb2plY3RJZCIsImRhdGFfaW50IiwicmVjb3JkaW5nQXVkaW8iLCJyZW1vdmUiLCJhc3NldENob3NlbiIsImRhdGFfanNvbiIsInN0cmluZ2lmeSIsImFzc2V0TmFtZSIsImVsZW1lbnRJZCIsImZpbHRlciIsImFzc2V0IiwiZXJyIiwiYXVkaW9FcnJvclR5cGUiLCJrZXkiLCJ0aW1lc3RhbXAiLCJ0eXBlIiwiY2F0ZWdvcnkiLCJzb3VuZFBsYXllciIsImltYWdlUGlja2VyIiwibGV2ZWxOYW1lIiwiYm91bmRBcGkiLCJzdGFydGVyQXNzZXRzQXBpIiwid2l0aExldmVsTmFtZSIsIm1hcCIsImRlZmF1bHRBc3NldFByb3BzIiwib25DaG9vc2UiLCJTVEFSVEVSX0FTU0VUX1BSRUZJWCIsIm9uRGVsZXRlIiwiZGVsZXRlU3RhcnRlckFzc2V0Um93IiwiaGlkZURlbGV0ZSIsImZpbGVzQXBpIiwiYXNzZXRzQXBpIiwiZGVsZXRlQXNzZXRSb3ciLCJnZXRQcm9qZWN0SWQiLCJ3aXRoUHJvamVjdElkIiwiX3Byb3RvIiwiY29tcG9uZW50RGlkTW91bnQiLCJnZXRTdGFydGVyQXNzZXRzIiwib25TdGFydGVyQXNzZXRzUmVjZWl2ZWQiLCJvblN0YXJ0ZXJBc3NldHNGYWlsdXJlIiwiZ2V0RmlsZXMiLCJvbkFzc2V0TGlzdEZhaWx1cmUiLCJhc3NldExpc3QiLCJkaXNwbGF5QXVkaW9SZWNvcmRlciIsImJ1dHRvbnMiLCJhdWRpb1NhdmVFcnJvciIsImF1ZGlvSW5pdGlhbGl6ZUVycm9yIiwiYWZ0ZXJBdWRpb1NhdmVkIiwicmVjb3JkaW5nRmlsZVR5cGUiLCJ1cGxvYWRBcGkiLCJkaXNhYmxlQXVkaW9SZWNvcmRpbmciLCJtYXJnaW4iLCJ0ZXh0QWxpZ24iLCJlbXB0eVRleHQiLCJtYW5hZ2VBc3NldHNTb3VuZExpYnJhcnlNZXNzYWdlIiwic291bmRMaWJyYXJ5QnV0dG9uVGV4dCIsInNvdW5kTGlicmFyeSIsIm1hbmFnZUFzc2V0c1NvdW5kVXBsb2FkTWVzc2FnZSIsImFzc2V0VXBsb2FkZXJCdXR0b25UZXh0IiwidXBsb2FkRmlsZSIsIm1hbmFnZUFzc2V0c0RlZmF1bHRNZXNzYWdlIiwic3R5bGVzIiwicm93cyIsImdldFN0YXJ0ZXJBc3NldFJvd3MiLCJnZXRBc3NldFJvd3MiLCJtYXhIZWlnaHQiLCJvdmVyZmxvd1kiLCJ3aWR0aCIsIm9uZU9mIiwidmFsdWVzIiwiUmVjb3JkaW5nRmlsZVR5cGUiLCJsaW5lSGVpZ2h0IiwiX2pxdWVyeSIsIl9jb2xvciIsIl9Bc3NldFRodW1ibmFpbCIsIkFzc2V0Um93IiwiX2xlbiIsImFyZ3MiLCJfa2V5IiwiYWN0aW9uIiwiYWN0aW9uVGV4dCIsImF0dGVtcHRlZFVzZWREZWxldGUiLCJkZWxldGVGaWxlIiwiZXJyb3JEZWxldGluZyIsImluY2x1ZGVVc2VySWQiLCJhY3Rpb25zIiwiZmxleCIsImNob29zZUFzc2V0IiwiY2hvb3NlIiwidG9GaXhlZCIsInVzYWdlIiwiJCIsImZpbmQiLCJlbmNvZGVVUklDb21wb25lbnQiLCJhdHRlbXB0QmFkRGVsZXRlIiwiY29uZmlybURlbGV0ZSIsImRlbGV0ZVdhcm5pbmciLCJjYW5ub3REZWxldGVVc2VkSW1hZ2UiLCJoYW5kbGVEZWxldGUiLCJjYW5jZWxEZWxldGUiLCJjb25maXJtRGVsZXRlRXhwbGFuYXRpb24iLCJvbkRvdWJsZUNsaWNrIiwibnVtYmVyIiwiY29sb3IiLCJyZWQiLCJtb2R1bGUiLCJkZWZhdWx0IiwiX0NsYXNzIiwiX0NsYXNzMiIsIl9DbGFzczMiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiZm9yRWFjaCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmYXVsdEljb25zIiwiaW1hZ2UiLCJhdWRpbyIsInZpZGVvIiwicGRmIiwiZG9jIiwiYXNzZXRUaHVtYm5haWxTdHlsZSIsIm1heFdpZHRoIiwiaGVpZ2h0IiwidHJhbnNmb3JtIiwibXNUcmFuc2Zvcm0iLCJXZWJraXRUcmFuc2Zvcm0iLCJhc3NldEljb25TdHlsZSIsIndyYXBwZXIiLCJiYWNrZ3JvdW5kIiwiYm9yZGVyIiwiYXVkaW9JY29uIiwicHVycGxlIiwibWFyZ2luTGVmdCIsImF1ZGlvV3JhcHBlciIsIkFzc2V0VGh1bWJuYWlsIiwiaXNQbGF5aW5nQXVkaW8iLCJzdG9wUGxheWluZ1VSTCIsInNyY1BhdGgiLCJwbGF5Iiwib25FbmRlZCIsImJhc2VQYXRoIiwiY2FjaGVCdXN0U3VmZml4IiwiZGF0ZSIsIkRhdGUiLCJ2YWx1ZU9mIiwicmVnaXN0ZXIiLCJtcDMiLCJfdGhpcyRwcm9wcyIsImljb25TdHlsZSIsIkF1ZGlvVGh1bWJuYWlsIiwiY2xpY2tTb3VuZENvbnRyb2wiLCJpc1BsYXlpbmciLCJJbWFnZVRodW1ibmFpbCIsInNyYyIsIkRlZmF1bHRUaHVtYm5haWwiLCJfUmVhY3QkQ29tcG9uZW50MiIsInBsYXlJY29uIiwiX1JlYWN0JENvbXBvbmVudDMiLCJocmVmIiwidGFyZ2V0IiwicmVsIiwiYWx0IiwiX1JlYWN0JENvbXBvbmVudDQiLCJfSGlkZGVuVXBsb2FkZXIiLCJBc3NldFVwbG9hZGVyIiwicmVmcyIsInVwbG9hZGVyIiwib3BlbkZpbGVDaG9vc2VyIiwidXJsIiwiZ2V0VXBsb2FkVXJsIiwidXBsb2FkRG9uZSIsIndyYXBVcGxvYWREb25lQ2FsbGJhY2siLCJ1cGxvYWRTdGFydCIsIndyYXBVcGxvYWRTdGFydENhbGxiYWNrIiwicmVmIiwidG9VcmwiLCJmaWxlVXBsb2FkQ2xpY2tlZCIsIl9Bc3NldE1hbmFnZXIiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImhhcyIsImdldCIsInUiLCJzZXQiLCJXZWFrTWFwIiwiQXVkaW9SZWNvcmRlciIsIm5hdmlnYXRvciIsIm1lZGlhRGV2aWNlcyIsImdldFVzZXJNZWRpYSIsInJlY29yZGVyIiwiZ2V0UmVjb3JkZXIiLCJ0aGVuIiwiaW5pdCIsImxvYWRpbmciLCJibG9iIiwicHV0QXNzZXQiLCJhdWRpb05hbWUiLCJnZXRFeHRlbnNpb24iLCJkZWNvZGVVUkkiLCJlcnJvciIsImNvbnNvbGUiLCJyZWNvcmRpbmciLCJpc1JlY29yZGluZyIsImNsZWFyVGltZW91dCIsInJlY29yZFRpbWVvdXQiLCJzdG9wUmVjb3JkaW5nIiwic3RvcFJlY29yZGluZ0FuZFNhdmUiLCJzdGFydFJlY29yZGluZyIsInN0dWR5R3JvdXAiLCJzZXRUaW1lb3V0Iiwic2F2ZUF1ZGlvIiwidGltZW91dCIsInBsYWNlaG9sZGVyIiwic291bmROYW1lIiwib25DaGFuZ2UiLCJvbk5hbWVDaGFuZ2UiLCJyZWNvcmRpbmdJY29uIiwic3Bpbm5lciIsInRvZ2dsZVJlY29yZCIsIkJ1dHRvbiIsIkJ1dHRvbkNvbG9yIiwiYmx1ZSIsInN0b3AiLCJyZWNvcmQiLCJvbkNhbmNlbCIsImdyYXkiLCJjYW5jZWwiLCJqdXN0aWZ5Q29udGVudCIsIndhcm5pbmciLCJ2ZXJ0aWNhbEFsaWduIiwiSGlkZGVuVXBsb2FkZXIiLCJjbGljayIsImZpbGV1cGxvYWQiLCJkYXRhVHlwZSIsInJlcGxhY2VGaWxlSW5wdXQiLCJhdWRpb0ZpbGVOYW1lIiwiaW5jbHVkZXMiLCJkb25lIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJhY2NlcHQiLCJ3aW5kb3ciLCJkYXNoYm9hcmQiXSwic291cmNlUm9vdCI6IiJ9