react-lightning-design-components
Version:
Salesforce Lightning Design System components built with React 16
238 lines (182 loc) • 34.2 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _classnames2 = require('classnames');
var _classnames3 = _interopRequireDefault(_classnames2);
var _svg4everybody = require('svg4everybody');
var _svg4everybody2 = _interopRequireDefault(_svg4everybody);
var _util = require('./util');
var _util2 = _interopRequireDefault(_util);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
(0, _svg4everybody2.default)();
/* eslint-disable max-len */
var STANDARD_ICONS = '\naccount,announcement,answer_best,answer_private,answer_public,approval,apps,apps_admin,\narticle,avatar,avatar_loading,calibration,call,call_history,campaign,campaign_members,\ncanvas,case,case_change_status,case_comment,case_email,case_log_a_call,case_transcript,\nclient,coaching,connected_apps,contact,contract,custom,dashboard,default,document,\ndrafts,email,email_IQ,email_chatter,empty,endorsement,environment_hub,event,feed,feedback,\nfile,flow,folder,generic_loading,goals,group_loading,groups,hierarchy,home,household,insights,investment_account,\nlead,link,log_a_call,marketing_actions,metrics,news,note,opportunity,\norders,people,performance,person_account,photo,poll,portal,post,pricebook,process,product,question_best,\nquestion_feed,quotes,recent,record,related_list,report,reward,scan_card,skill_entity,\nsocial,solution,sossession,task,task2,team_member,thanks,thanks_loading,today,topic,\nunmatched,user,work_order,work_order_item\n'.replace(/^\s+|\s+$/g, '').split(/[\s,]+/);
var CUSTOM_ICONS = new Array(101).join('_').split('').map(function (a, i) {
return 'custom' + (i + 1);
});
var ACTION_ICONS = '\nadd_contact,announcement,apex,approval,back,call,canvas,change_owner,change_record_type,\ncheck,clone,close,defer,delete,description,dial_in,download,edit,edit_groups,edit_relationship,\nemail,fallback,filter,flow,follow,following,freeze_user,goal,google_news,info,join_group,\nlead_convert,leave_group,log_a_call,log_event,manage_perm_sets,map,more,new,new_account,\nnew_campaign,new_case,new_child_case,new_contact,new_event,new_group,new_lead,new_note,\nnew_notebook,new_opportunity,new_person_account,new_task,password_unlock,preview,priority,question_post_action,\nquote,record,refresh,reject,remove,reset_password,share,share_file,share_link,share_poll,\nshare_post,share_thanks,sort,submit_for_approval,update,update_status,upload,user,user_activation,\nweb_link,\nnew_custom7,new_custom8,new_custom9,new_custom10,new_custom11,new_custom12,new_custom13,\nnew_custom14,new_custom15,new_custom16,new_custom17,new_custom18,new_custom19,new_custom20,\nnew_custom21,new_custom22,new_custom23,new_custom24,new_custom25,new_custom26,new_custom27,\nnew_custom28,new_custom29,new_custom30,new_custom31,new_custom32,new_custom33,new_custom34,\nnew_custom35,new_custom36,new_custom37,new_custom38,new_custom39,new_custom40,new_custom41,\nnew_custom42,new_custom43,new_custom44,new_custom45,new_custom46,new_custom47,new_custom48,\nnew_custom49,new_custom50,new_custom51,new_custom52,new_custom53,new_custom54,new_custom55,\nnew_custom56,new_custom57,new_custom58,new_custom59,new_custom60,new_custom61,new_custom62,\nnew_custom63,new_custom64,new_custom65,new_custom66,new_custom67,new_custom68,new_custom69,\nnew_custom70,new_custom71,new_custom72,new_custom73,new_custom74,new_custom75,new_custom76,\nnew_custom77,new_custom78,new_custom79,new_custom80,new_custom81,new_custom82,new_custom83,\nnew_custom84,new_custom85,new_custom86,new_custom87,new_custom88,new_custom89,new_custom90,\nnew_custom91,new_custom92,new_custom93,new_custom94,new_custom95,new_custom96,new_custom97,\nnew_custom98,new_custom99,new_custom100\n'.replace(/^\s+|\s+$/g, '').split(/[\s,]+/);
var DOCTYPE_ICONS = '\nai,attachment,audio,box_notes,csv,eps,excel,exe,flash,gdoc,gdocs,gpres,gsheet,html,image,keynote,\nlink,mp4,overlay,pack,pages,pdf,ppt,psd,rtf,slide,stypi,txt,unknown,video,visio,\nwebex,word,xml,zip\n'.replace(/^\s+|\s+$/g, '').split(/[\s,]+/);
var UTILITY_ICONS = '\nadd,adduser,announcement,answer,apps,arrowdown,arrowup,attach,back,ban,bold,bookmark,brush,\nbucket,builder,call,capslock,cases,center_align_text,chart,chat,check,checkin,chevrondown,\nchevronleft,chevronright,chevronup,clear,clock,close,comments,company,connected_apps,\ncontract,contract_alt,copy,crossfilter,custom_apps,cut,dash,datadotcom,dayview,delete,deprecate,\ndescription,desktop,down,download,edit,edit_form,email,end_call,erect_window,error,event,expand,\nexpand_alt,favorite,feed,file,filter,filterList,forward,frozen,groups,help,home,identity,image,inbox,info,\ninsert_tag_field,insert_template,italic,justify_text,kanban,knowledge_base,layers,layout,\nleft,left_align_text,like,link,list,location,lock,log_a_call,logout,magicwand,matrix,metrics,minimize_window,\nmoneybag,monthlyview,move,muted,new,new_window,news,note,notebook,notification,office365,offline,\nopen,open_folder,opened_folder,overflow,package,package_org,package_org_beta,page,palette,paste,\npeople,phone_landscape,phone_portrait,photo,picklist,power,preview,priority,process,push,puzzle,\nquestion,questions_and_answers,record,redo,refresh,relate,remove_formatting,remove_link,\nreplace,reply,reset_password,retweet,richtextbulletedlist,richtextindent,richtextnumberedlist,\nrichtextoutdent,right,right_align_text,rotate,rows,salesforce1,search,settings,setup,setup_assistant_guide,\nshare,share_post,shield,side_list,signpost,sms,snippet,socialshare,sort,spinner,standard_objects,\nstop,strikethrough,success,summary,summarydetail,switch,table,tablet_landscape,tablet_portrait,\ntabset,task,text_background_color,text_color,threedots,tile_card_list,topic,touch_action,trail,undelete,undeprecate,\nunderline,undo,unlock,unmuted,up,upload,user,user_role,volume_high,volume_low,volume_off,warning,\nweeklyview,world,zoomin,zoomout\n'.replace(/^\s+|\s+$/g, '').split(/[\s,]+/);
/* eslint-enable max-len */
var Icon = function (_React$Component) {
(0, _inherits3.default)(Icon, _React$Component);
function Icon(props) {
(0, _classCallCheck3.default)(this, Icon);
var _this = (0, _possibleConstructorReturn3.default)(this, (Icon.__proto__ || (0, _getPrototypeOf2.default)(Icon)).call(this, props));
_this.state = {};
_this.svgIconRef = _this.svgIconRef.bind(_this);
_this.iconContainerRef = _this.iconContainerRef.bind(_this);
return _this;
}
(0, _createClass3.default)(Icon, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.checkIconColor();
var svgEl = _reactDom2.default.findDOMNode(this.svgIcon);
svgEl.setAttribute('focusable', this.props.tabIndex >= 0);
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate() {
this.checkIconColor();
}
}, {
key: 'getIconColor',
value: function getIconColor(fillColor, category, icon) {
/* eslint-disable no-unneeded-ternary */
return this.state.iconColor ? this.state.iconColor : category === 'doctype' ? null : fillColor === 'none' ? null : fillColor ? fillColor : category === 'utility' ? null : category === 'custom' ? icon.replace(/^custom/, 'custom-') : category === 'action' && /^new_custom/.test(icon) ? icon.replace(/^new_custom/, 'custom-') : category + '-' + (icon || '').replace(/_/g, '-');
}
}, {
key: 'checkIconColor',
value: function checkIconColor() {
var _props = this.props,
fillColor = _props.fillColor,
_props$category = _props.category,
category = _props$category === undefined ? 'utility' : _props$category,
container = _props.container;
if (fillColor === 'none' || category === 'doctype' || !fillColor && category === 'utility') {
return;
}
var el = _reactDom2.default.findDOMNode(container ? this.iconContainer : this.svgIcon);
if (!(el && getComputedStyle(el))) {
return;
}
var bgColorStyle = getComputedStyle(el)['background-color'];
// if no background color set to the icon
if (/^(transparent|rgba\(0,\s*0,\s*0,\s*0\))$/.test(bgColorStyle)) {
this.setState({ iconColor: 'standard-default' });
}
}
}, {
key: 'svgIconRef',
value: function svgIconRef(ref) {
this.svgIcon = ref;
}
}, {
key: 'iconContainerRef',
value: function iconContainerRef(ref) {
this.iconContainer = ref;
}
}, {
key: 'renderSVG',
value: function renderSVG(_ref) {
var _classnames;
var className = _ref.className,
_ref$category = _ref.category,
category = _ref$category === undefined ? 'utility' : _ref$category,
icon = _ref.icon,
size = _ref.size,
align = _ref.align,
fillColor = _ref.fillColor,
container = _ref.container,
_ref$textColor = _ref.textColor,
textColor = _ref$textColor === undefined ? 'default' : _ref$textColor,
props = (0, _objectWithoutProperties3.default)(_ref, ['className', 'category', 'icon', 'size', 'align', 'fillColor', 'container', 'textColor']);
var iconColor = this.getIconColor(fillColor, category, icon);
var iconClassNames = (0, _classnames3.default)((_classnames = {
'slds-icon': !/slds\-button__icon/.test(className)
}, (0, _defineProperty3.default)(_classnames, 'slds-icon--' + size, /^(x-small|small|large)$/.test(size)), (0, _defineProperty3.default)(_classnames, 'slds-icon-text-' + textColor, /^(default|warning|error)$/.test(textColor) && !container && !iconColor), (0, _defineProperty3.default)(_classnames, 'slds-icon-' + iconColor, !container && iconColor), (0, _defineProperty3.default)(_classnames, 'slds-m-left--x-small', align === 'right'), (0, _defineProperty3.default)(_classnames, 'slds-m-right--x-small', align === 'left'), _classnames), className);
/* eslint-disable max-len */
var useHtml = '<use xlink:href="' + _util2.default.getAssetRoot() + '/icons/' + category + '-sprite/svg/symbols.svg#' + icon + '"></use>';
return _react2.default.createElement('svg', (0, _extends3.default)({
className: iconClassNames,
'aria-hidden': true,
dangerouslySetInnerHTML: { __html: useHtml },
ref: this.svgIconRef
}, props));
}
}, {
key: 'render',
value: function render() {
var _props2 = this.props,
container = _props2.container,
props = (0, _objectWithoutProperties3.default)(_props2, ['container']);
var category = props.category,
icon = props.icon;
if (icon.indexOf(':') > 0) {
var _icon$split = icon.split(':');
var _icon$split2 = (0, _slicedToArray3.default)(_icon$split, 2);
category = _icon$split2[0];
icon = _icon$split2[1];
}
if (container) {
var className = props.className,
fillColor = props.fillColor,
pprops = (0, _objectWithoutProperties3.default)(props, ['className', 'fillColor']);
var iconColor = this.getIconColor(fillColor, category, icon);
var containerClassName = (0, _classnames3.default)('slds-icon__container', container === 'circle' ? 'slds-icon__container--circle' : null, iconColor ? 'slds-icon-' + iconColor : null, className);
return _react2.default.createElement(
'span',
{ className: containerClassName, ref: this.iconContainerRef },
this.renderSVG((0, _extends3.default)({ category: category, icon: icon, fillColor: iconColor, container: container }, pprops))
);
}
return this.renderSVG((0, _extends3.default)({}, props, { category: category, icon: icon }));
}
}]);
return Icon;
}(_react2.default.Component);
exports.default = Icon;
Icon.propTypes = {
className: _propTypes2.default.string,
category: _propTypes2.default.oneOf(['action', 'custom', 'doctype', 'samanage', 'standard', 'utility']),
icon: _propTypes2.default.string,
container: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.oneOf(['default', 'circle'])]),
color: _propTypes2.default.string,
textColor: _propTypes2.default.oneOf(['default', 'warning', 'error']),
tabIndex: _propTypes2.default.number,
fillColor: _propTypes2.default.string
};
Icon.ICONS = {
STANDARD_ICONS: STANDARD_ICONS,
CUSTOM_ICONS: CUSTOM_ICONS,
ACTION_ICONS: ACTION_ICONS,
DOCTYPE_ICONS: DOCTYPE_ICONS,
UTILITY_ICONS: UTILITY_ICONS
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL0ljb24uanMiXSwibmFtZXMiOlsiU1RBTkRBUkRfSUNPTlMiLCJyZXBsYWNlIiwic3BsaXQiLCJDVVNUT01fSUNPTlMiLCJBcnJheSIsImpvaW4iLCJtYXAiLCJhIiwiaSIsIkFDVElPTl9JQ09OUyIsIkRPQ1RZUEVfSUNPTlMiLCJVVElMSVRZX0lDT05TIiwiSWNvbiIsInByb3BzIiwic3RhdGUiLCJzdmdJY29uUmVmIiwiYmluZCIsImljb25Db250YWluZXJSZWYiLCJjaGVja0ljb25Db2xvciIsInN2Z0VsIiwiZmluZERPTU5vZGUiLCJzdmdJY29uIiwic2V0QXR0cmlidXRlIiwidGFiSW5kZXgiLCJmaWxsQ29sb3IiLCJjYXRlZ29yeSIsImljb24iLCJpY29uQ29sb3IiLCJ0ZXN0IiwiY29udGFpbmVyIiwiZWwiLCJpY29uQ29udGFpbmVyIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImJnQ29sb3JTdHlsZSIsInNldFN0YXRlIiwicmVmIiwiY2xhc3NOYW1lIiwic2l6ZSIsImFsaWduIiwidGV4dENvbG9yIiwiZ2V0SWNvbkNvbG9yIiwiaWNvbkNsYXNzTmFtZXMiLCJ1c2VIdG1sIiwiZ2V0QXNzZXRSb290IiwiX19odG1sIiwiaW5kZXhPZiIsInBwcm9wcyIsImNvbnRhaW5lckNsYXNzTmFtZSIsInJlbmRlclNWRyIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsInN0cmluZyIsIm9uZU9mIiwib25lT2ZUeXBlIiwiYm9vbCIsImNvbG9yIiwibnVtYmVyIiwiSUNPTlMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUE7O0FBRUE7QUFDQSxJQUFNQSxpQkFBaUIsMjdCQWF0QkMsT0Fic0IsQ0FhZCxZQWJjLEVBYUEsRUFiQSxFQWFJQyxLQWJKLENBYVUsUUFiVixDQUF2Qjs7QUFl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MkJZLGtCQUEzQixFQUFxQ0MsVUFBckMsSUFBUDtBQUNEOzs7RUE1RytCLGdCQUFNdUIsUzs7a0JBQW5CckMsSTs7O0FBK0dyQkEsS0FBS3NDLFNBQUwsR0FBaUI7QUFDZmQsYUFBVyxvQkFBVWUsTUFETjtBQUVmMUIsWUFBVSxvQkFBVTJCLEtBQVYsQ0FBZ0IsQ0FBQyxRQUFELEVBQVcsUUFBWCxFQUFxQixTQUFyQixFQUFnQyxVQUFoQyxFQUE0QyxVQUE1QyxFQUF3RCxTQUF4RCxDQUFoQixDQUZLO0FBR2YxQixRQUFNLG9CQUFVeUIsTUFIRDtBQUlmdEIsYUFBVyxvQkFBVXdCLFNBQVYsQ0FBb0IsQ0FDN0Isb0JBQVVDLElBRG1CLEVBRTdCLG9CQUFVRixLQUFWLENBQWdCLENBQUMsU0FBRCxFQUFZLFFBQVosQ0FBaEIsQ0FGNkIsQ0FBcEIsQ0FKSTtBQVFmRyxTQUFPLG9CQUFVSixNQVJGO0FBU2ZaLGFBQVcsb0JBQVVhLEtBQVYsQ0FBZ0IsQ0FBQyxTQUFELEVBQVksU0FBWixFQUF1QixPQUF2QixDQUFoQixDQVRJO0FBVWY3QixZQUFVLG9CQUFVaUMsTUFWTDtBQVdmaEMsYUFBVyxvQkFBVTJCO0FBWE4sQ0FBakI7O0FBY0F2QyxLQUFLNkMsS0FBTCxHQUFhO0FBQ1h6RCxnQ0FEVztBQUVYRyw0QkFGVztBQUdYTSw0QkFIVztBQUlYQyw4QkFKVztBQUtYQztBQUxXLENBQWIiLCJmaWxlIjoiSWNvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHN2ZzRldmVyeWJvZHkgZnJvbSAnc3ZnNGV2ZXJ5Ym9keSc7XG5pbXBvcnQgdXRpbCBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuc3ZnNGV2ZXJ5Ym9keSgpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5jb25zdCBTVEFOREFSRF9JQ09OUyA9IGBcbmFjY291bnQsYW5ub3VuY2VtZW50LGFuc3dlcl9iZXN0LGFuc3dlcl9wcml2YXRlLGFuc3dlcl9wdWJsaWMsYXBwcm92YWwsYXBwcyxhcHBzX2FkbWluLFxuYXJ0aWNsZSxhdmF0YXIsYXZhdGFyX2xvYWRpbmcsY2FsaWJyYXRpb24sY2FsbCxjYWxsX2hpc3RvcnksY2FtcGFpZ24sY2FtcGFpZ25fbWVtYmVycyxcbmNhbnZhcyxjYXNlLGNhc2VfY2hhbmdlX3N0YXR1cyxjYXNlX2NvbW1lbnQsY2FzZV9lbWFpbCxjYXNlX2xvZ19hX2NhbGwsY2FzZV90cmFuc2NyaXB0LFxuY2xpZW50LGNvYWNoaW5nLGNvbm5lY3RlZF9hcHBzLGNvbnRhY3QsY29udHJhY3QsY3VzdG9tLGRhc2hib2FyZCxkZWZhdWx0LGRvY3VtZW50LFxuZHJhZnRzLGVtYWlsLGVtYWlsX0lRLGVtYWlsX2NoYXR0ZXIsZW1wdHksZW5kb3JzZW1lbnQsZW52aXJvbm1lbnRfaHViLGV2ZW50LGZlZWQsZmVlZGJhY2ssXG5maWxlLGZsb3csZm9sZGVyLGdlbmVyaWNfbG9hZGluZyxnb2Fscyxncm91cF9sb2FkaW5nLGdyb3VwcyxoaWVyYXJjaHksaG9tZSxob3VzZWhvbGQsaW5zaWdodHMsaW52ZXN0bWVudF9hY2NvdW50LFxubGVhZCxsaW5rLGxvZ19hX2NhbGwsbWFya2V0aW5nX2FjdGlvbnMsbWV0cmljcyxuZXdzLG5vdGUsb3Bwb3J0dW5pdHksXG5vcmRlcnMscGVvcGxlLHBlcmZvcm1hbmNlLHBlcnNvbl9hY2NvdW50LHBob3RvLHBvbGwscG9ydGFsLHBvc3QscHJpY2Vib29rLHByb2Nlc3MscHJvZHVjdCxxdWVzdGlvbl9iZXN0LFxucXVlc3Rpb25fZmVlZCxxdW90ZXMscmVjZW50LHJlY29yZCxyZWxhdGVkX2xpc3QscmVwb3J0LHJld2FyZCxzY2FuX2NhcmQsc2tpbGxfZW50aXR5LFxuc29jaWFsLHNvbHV0aW9uLHNvc3Nlc3Npb24sdGFzayx0YXNrMix0ZWFtX21lbWJlcix0aGFua3MsdGhhbmtzX2xvYWRpbmcsdG9kYXksdG9waWMsXG51bm1hdGNoZWQsdXNlcix3b3JrX29yZGVyLHdvcmtfb3JkZXJfaXRlbVxuYFxuLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuXG5jb25zdCBDVVNUT01fSUNPTlMgPVxuICBuZXcgQXJyYXkoMTAxKS5qb2luKCdfJykuc3BsaXQoJycpXG4gICAgLm1hcCgoYSwgaSkgPT4gYGN1c3RvbSR7KGkgKyAxKX1gKTtcblxuY29uc3QgQUNUSU9OX0lDT05TID0gYFxuYWRkX2NvbnRhY3QsYW5ub3VuY2VtZW50LGFwZXgsYXBwcm92YWwsYmFjayxjYWxsLGNhbnZhcyxjaGFuZ2Vfb3duZXIsY2hhbmdlX3JlY29yZF90eXBlLFxuY2hlY2ssY2xvbmUsY2xvc2UsZGVmZXIsZGVsZXRlLGRlc2NyaXB0aW9uLGRpYWxfaW4sZG93bmxvYWQsZWRpdCxlZGl0X2dyb3VwcyxlZGl0X3JlbGF0aW9uc2hpcCxcbmVtYWlsLGZhbGxiYWNrLGZpbHRlcixmbG93LGZvbGxvdyxmb2xsb3dpbmcsZnJlZXplX3VzZXIsZ29hbCxnb29nbGVfbmV3cyxpbmZvLGpvaW5fZ3JvdXAsXG5sZWFkX2NvbnZlcnQsbGVhdmVfZ3JvdXAsbG9nX2FfY2FsbCxsb2dfZXZlbnQsbWFuYWdlX3Blcm1fc2V0cyxtYXAsbW9yZSxuZXcsbmV3X2FjY291bnQsXG5uZXdfY2FtcGFpZ24sbmV3X2Nhc2UsbmV3X2NoaWxkX2Nhc2UsbmV3X2NvbnRhY3QsbmV3X2V2ZW50LG5ld19ncm91cCxuZXdfbGVhZCxuZXdfbm90ZSxcbm5ld19ub3RlYm9vayxuZXdfb3Bwb3J0dW5pdHksbmV3X3BlcnNvbl9hY2NvdW50LG5ld190YXNrLHBhc3N3b3JkX3VubG9jayxwcmV2aWV3LHByaW9yaXR5LHF1ZXN0aW9uX3Bvc3RfYWN0aW9uLFxucXVvdGUscmVjb3JkLHJlZnJlc2gscmVqZWN0LHJlbW92ZSxyZXNldF9wYXNzd29yZCxzaGFyZSxzaGFyZV9maWxlLHNoYXJlX2xpbmssc2hhcmVfcG9sbCxcbnNoYXJlX3Bvc3Qsc2hhcmVfdGhhbmtzLHNvcnQsc3VibWl0X2Zvcl9hcHByb3ZhbCx1cGRhdGUsdXBkYXRlX3N0YXR1cyx1cGxvYWQsdXNlcix1c2VyX2FjdGl2YXRpb24sXG53ZWJfbGluayxcbm5ld19jdXN0b203LG5ld19jdXN0b204LG5ld19jdXN0b205LG5ld19jdXN0b20xMCxuZXdfY3VzdG9tMTEsbmV3X2N1c3RvbTEyLG5ld19jdXN0b20xMyxcbm5ld19jdXN0b20xNCxuZXdfY3VzdG9tMTUsbmV3X2N1c3RvbTE2LG5ld19jdXN0b20xNyxuZXdfY3VzdG9tMTgsbmV3X2N1c3RvbTE5LG5ld19jdXN0b20yMCxcbm5ld19jdXN0b20yMSxuZXdfY3VzdG9tMjIsbmV3X2N1c3RvbTIzLG5ld19jdXN0b20yNCxuZXdfY3VzdG9tMjUsbmV3X2N1c3RvbTI2LG5ld19jdXN0b20yNyxcbm5ld19jdXN0b20yOCxuZXdfY3VzdG9tMjksbmV3X2N1c3RvbTMwLG5ld19jdXN0b20zMSxuZXdfY3VzdG9tMzIsbmV3X2N1c3RvbTMzLG5ld19jdXN0b20zNCxcbm5ld19jdXN0b20zNSxuZXdfY3VzdG9tMzYsbmV3X2N1c3RvbTM3LG5ld19jdXN0b20zOCxuZXdfY3VzdG9tMzksbmV3X2N1c3RvbTQwLG5ld19jdXN0b200MSxcbm5ld19jdXN0b200MixuZXdfY3VzdG9tNDMsbmV3X2N1c3RvbTQ0LG5ld19jdXN0b200NSxuZXdfY3VzdG9tNDYsbmV3X2N1c3RvbTQ3LG5ld19jdXN0b200OCxcbm5ld19jdXN0b200OSxuZXdfY3VzdG9tNTAsbmV3X2N1c3RvbTUxLG5ld19jdXN0b201MixuZXdfY3VzdG9tNTMsbmV3X2N1c3RvbTU0LG5ld19jdXN0b201NSxcbm5ld19jdXN0b201NixuZXdfY3VzdG9tNTcsbmV3X2N1c3RvbTU4LG5ld19jdXN0b201OSxuZXdfY3VzdG9tNjAsbmV3X2N1c3RvbTYxLG5ld19jdXN0b202Mixcbm5ld19jdXN0b202MyxuZXdfY3VzdG9tNjQsbmV3X2N1c3RvbTY1LG5ld19jdXN0b202NixuZXdfY3VzdG9tNjcsbmV3X2N1c3RvbTY4LG5ld19jdXN0b202OSxcbm5ld19jdXN0b203MCxuZXdfY3VzdG9tNzEsbmV3X2N1c3RvbTcyLG5ld19jdXN0b203MyxuZXdfY3VzdG9tNzQsbmV3X2N1c3RvbTc1LG5ld19jdXN0b203Nixcbm5ld19jdXN0b203NyxuZXdfY3VzdG9tNzgsbmV3X2N1c3RvbTc5LG5ld19jdXN0b204MCxuZXdfY3VzdG9tODEsbmV3X2N1c3RvbTgyLG5ld19jdXN0b204Myxcbm5ld19jdXN0b204NCxuZXdfY3VzdG9tODUsbmV3X2N1c3RvbTg2LG5ld19jdXN0b204NyxuZXdfY3VzdG9tODgsbmV3X2N1c3RvbTg5LG5ld19jdXN0b205MCxcbm5ld19jdXN0b205MSxuZXdfY3VzdG9tOTIsbmV3X2N1c3RvbTkzLG5ld19jdXN0b205NCxuZXdfY3VzdG9tOTUsbmV3X2N1c3RvbTk2LG5ld19jdXN0b205Nyxcbm5ld19jdXN0b205OCxuZXdfY3VzdG9tOTksbmV3X2N1c3RvbTEwMFxuYFxuLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuXG5cbmNvbnN0IERPQ1RZUEVfSUNPTlMgPSBgXG5haSxhdHRhY2htZW50LGF1ZGlvLGJveF9ub3Rlcyxjc3YsZXBzLGV4Y2VsLGV4ZSxmbGFzaCxnZG9jLGdkb2NzLGdwcmVzLGdzaGVldCxodG1sLGltYWdlLGtleW5vdGUsXG5saW5rLG1wNCxvdmVybGF5LHBhY2sscGFnZXMscGRmLHBwdCxwc2QscnRmLHNsaWRlLHN0eXBpLHR4dCx1bmtub3duLHZpZGVvLHZpc2lvLFxud2ViZXgsd29yZCx4bWwsemlwXG5gXG4ucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cblxuY29uc3QgVVRJTElUWV9JQ09OUyA9IGBcbmFkZCxhZGR1c2VyLGFubm91bmNlbWVudCxhbnN3ZXIsYXBwcyxhcnJvd2Rvd24sYXJyb3d1cCxhdHRhY2gsYmFjayxiYW4sYm9sZCxib29rbWFyayxicnVzaCxcbmJ1Y2tldCxidWlsZGVyLGNhbGwsY2Fwc2xvY2ssY2FzZXMsY2VudGVyX2FsaWduX3RleHQsY2hhcnQsY2hhdCxjaGVjayxjaGVja2luLGNoZXZyb25kb3duLFxuY2hldnJvbmxlZnQsY2hldnJvbnJpZ2h0LGNoZXZyb251cCxjbGVhcixjbG9jayxjbG9zZSxjb21tZW50cyxjb21wYW55LGNvbm5lY3RlZF9hcHBzLFxuY29udHJhY3QsY29udHJhY3RfYWx0LGNvcHksY3Jvc3NmaWx0ZXIsY3VzdG9tX2FwcHMsY3V0LGRhc2gsZGF0YWRvdGNvbSxkYXl2aWV3LGRlbGV0ZSxkZXByZWNhdGUsXG5kZXNjcmlwdGlvbixkZXNrdG9wLGRvd24sZG93bmxvYWQsZWRpdCxlZGl0X2Zvcm0sZW1haWwsZW5kX2NhbGwsZXJlY3Rfd2luZG93LGVycm9yLGV2ZW50LGV4cGFuZCxcbmV4cGFuZF9hbHQsZmF2b3JpdGUsZmVlZCxmaWxlLGZpbHRlcixmaWx0ZXJMaXN0LGZvcndhcmQsZnJvemVuLGdyb3VwcyxoZWxwLGhvbWUsaWRlbnRpdHksaW1hZ2UsaW5ib3gsaW5mbyxcbmluc2VydF90YWdfZmllbGQsaW5zZXJ0X3RlbXBsYXRlLGl0YWxpYyxqdXN0aWZ5X3RleHQsa2FuYmFuLGtub3dsZWRnZV9iYXNlLGxheWVycyxsYXlvdXQsXG5sZWZ0LGxlZnRfYWxpZ25fdGV4dCxsaWtlLGxpbmssbGlzdCxsb2NhdGlvbixsb2NrLGxvZ19hX2NhbGwsbG9nb3V0LG1hZ2ljd2FuZCxtYXRyaXgsbWV0cmljcyxtaW5pbWl6ZV93aW5kb3csXG5tb25leWJhZyxtb250aGx5dmlldyxtb3ZlLG11dGVkLG5ldyxuZXdfd2luZG93LG5ld3Msbm90ZSxub3RlYm9vayxub3RpZmljYXRpb24sb2ZmaWNlMzY1LG9mZmxpbmUsXG5vcGVuLG9wZW5fZm9sZGVyLG9wZW5lZF9mb2xkZXIsb3ZlcmZsb3cscGFja2FnZSxwYWNrYWdlX29yZyxwYWNrYWdlX29yZ19iZXRhLHBhZ2UscGFsZXR0ZSxwYXN0ZSxcbnBlb3BsZSxwaG9uZV9sYW5kc2NhcGUscGhvbmVfcG9ydHJhaXQscGhvdG8scGlja2xpc3QscG93ZXIscHJldmlldyxwcmlvcml0eSxwcm9jZXNzLHB1c2gscHV6emxlLFxucXVlc3Rpb24scXVlc3Rpb25zX2FuZF9hbnN3ZXJzLHJlY29yZCxyZWRvLHJlZnJlc2gscmVsYXRlLHJlbW92ZV9mb3JtYXR0aW5nLHJlbW92ZV9saW5rLFxucmVwbGFjZSxyZXBseSxyZXNldF9wYXNzd29yZCxyZXR3ZWV0LHJpY2h0ZXh0YnVsbGV0ZWRsaXN0LHJpY2h0ZXh0aW5kZW50LHJpY2h0ZXh0bnVtYmVyZWRsaXN0LFxucmljaHRleHRvdXRkZW50LHJpZ2h0LHJpZ2h0X2FsaWduX3RleHQscm90YXRlLHJvd3Msc2FsZXNmb3JjZTEsc2VhcmNoLHNldHRpbmdzLHNldHVwLHNldHVwX2Fzc2lzdGFudF9ndWlkZSxcbnNoYXJlLHNoYXJlX3Bvc3Qsc2hpZWxkLHNpZGVfbGlzdCxzaWducG9zdCxzbXMsc25pcHBldCxzb2NpYWxzaGFyZSxzb3J0LHNwaW5uZXIsc3RhbmRhcmRfb2JqZWN0cyxcbnN0b3Asc3RyaWtldGhyb3VnaCxzdWNjZXNzLHN1bW1hcnksc3VtbWFyeWRldGFpbCxzd2l0Y2gsdGFibGUsdGFibGV0X2xhbmRzY2FwZSx0YWJsZXRfcG9ydHJhaXQsXG50YWJzZXQsdGFzayx0ZXh0X2JhY2tncm91bmRfY29sb3IsdGV4dF9jb2xvcix0aHJlZWRvdHMsdGlsZV9jYXJkX2xpc3QsdG9waWMsdG91Y2hfYWN0aW9uLHRyYWlsLHVuZGVsZXRlLHVuZGVwcmVjYXRlLFxudW5kZXJsaW5lLHVuZG8sdW5sb2NrLHVubXV0ZWQsdXAsdXBsb2FkLHVzZXIsdXNlcl9yb2xlLHZvbHVtZV9oaWdoLHZvbHVtZV9sb3csdm9sdW1lX29mZix3YXJuaW5nLFxud2Vla2x5dmlldyx3b3JsZCx6b29taW4sem9vbW91dFxuYFxuLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEljb24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge307XG4gICAgdGhpcy5zdmdJY29uUmVmID0gdGhpcy5zdmdJY29uUmVmLmJpbmQodGhpcyk7XG4gICAgdGhpcy5pY29uQ29udGFpbmVyUmVmID0gdGhpcy5pY29uQ29udGFpbmVyUmVmLmJpbmQodGhpcyk7XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLmNoZWNrSWNvbkNvbG9yKCk7XG4gICAgY29uc3Qgc3ZnRWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLnN2Z0ljb24pO1xuICAgIHN2Z0VsLnNldEF0dHJpYnV0ZSgnZm9jdXNhYmxlJywgdGhpcy5wcm9wcy50YWJJbmRleCA+PSAwKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB0aGlzLmNoZWNrSWNvbkNvbG9yKCk7XG4gIH1cblxuICBnZXRJY29uQ29sb3IoZmlsbENvbG9yLCBjYXRlZ29yeSwgaWNvbikge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVubmVlZGVkLXRlcm5hcnkgKi9cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdGF0ZS5pY29uQ29sb3IgPyB0aGlzLnN0YXRlLmljb25Db2xvciA6XG4gICAgICBjYXRlZ29yeSA9PT0gJ2RvY3R5cGUnID8gbnVsbCA6XG4gICAgICBmaWxsQ29sb3IgPT09ICdub25lJyA/IG51bGwgOlxuICAgICAgZmlsbENvbG9yID8gZmlsbENvbG9yIDpcbiAgICAgIGNhdGVnb3J5ID09PSAndXRpbGl0eScgPyBudWxsIDpcbiAgICAgIGNhdGVnb3J5ID09PSAnY3VzdG9tJyA/IGljb24ucmVwbGFjZSgvXmN1c3RvbS8sICdjdXN0b20tJykgOlxuICAgICAgY2F0ZWdvcnkgPT09ICdhY3Rpb24nICYmIC9ebmV3X2N1c3RvbS8udGVzdChpY29uKSA/IGljb24ucmVwbGFjZSgvXm5ld19jdXN0b20vLCAnY3VzdG9tLScpIDpcbiAgICAgIGAke2NhdGVnb3J5fS0keyhpY29uIHx8ICcnKS5yZXBsYWNlKC9fL2csICctJyl9YFxuICAgICk7XG4gIH1cblxuICBjaGVja0ljb25Db2xvcigpIHtcbiAgICBjb25zdCB7IGZpbGxDb2xvciwgY2F0ZWdvcnkgPSAndXRpbGl0eScsIGNvbnRhaW5lciB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoZmlsbENvbG9yID09PSAnbm9uZScgfHwgY2F0ZWdvcnkgPT09ICdkb2N0eXBlJyB8fCAoIWZpbGxDb2xvciAmJiBjYXRlZ29yeSA9PT0gJ3V0aWxpdHknKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKGNvbnRhaW5lciA/IHRoaXMuaWNvbkNvbnRhaW5lciA6IHRoaXMuc3ZnSWNvbik7XG4gICAgaWYgKCEoZWwgJiYgZ2V0Q29tcHV0ZWRTdHlsZShlbCkpKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IGJnQ29sb3JTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWwpWydiYWNrZ3JvdW5kLWNvbG9yJ107XG4gICAgLy8gaWYgbm8gYmFja2dyb3VuZCBjb2xvciBzZXQgdG8gdGhlIGljb25cbiAgICBpZiAoL14odHJhbnNwYXJlbnR8cmdiYVxcKDAsXFxzKjAsXFxzKjAsXFxzKjBcXCkpJC8udGVzdChiZ0NvbG9yU3R5bGUpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaWNvbkNvbG9yOiAnc3RhbmRhcmQtZGVmYXVsdCcgfSk7XG4gICAgfVxuICB9XG5cbiAgc3ZnSWNvblJlZihyZWYpIHtcbiAgICB0aGlzLnN2Z0ljb24gPSByZWY7XG4gIH1cblxuICBpY29uQ29udGFpbmVyUmVmKHJlZikge1xuICAgIHRoaXMuaWNvbkNvbnRhaW5lciA9IHJlZjtcbiAgfVxuXG4gIHJlbmRlclNWRyh7XG4gICAgY2xhc3NOYW1lLCBjYXRlZ29yeSA9ICd1dGlsaXR5JywgaWNvbiwgc2l6ZSwgYWxpZ24sIGZpbGxDb2xvciwgY29udGFpbmVyLFxuICAgIHRleHRDb2xvciA9ICdkZWZhdWx0JywgLi4ucHJvcHMsXG4gIH0pIHtcbiAgICBjb25zdCBpY29uQ29sb3IgPSB0aGlzLmdldEljb25Db2xvcihmaWxsQ29sb3IsIGNhdGVnb3J5LCBpY29uKTtcbiAgICBjb25zdCBpY29uQ2xhc3NOYW1lcyA9IGNsYXNzbmFtZXMoXG4gICAgICB7XG4gICAgICAgICdzbGRzLWljb24nOiAhL3NsZHNcXC1idXR0b25fX2ljb24vLnRlc3QoY2xhc3NOYW1lKSxcbiAgICAgICAgW2BzbGRzLWljb24tLSR7c2l6ZX1gXTogL14oeC1zbWFsbHxzbWFsbHxsYXJnZSkkLy50ZXN0KHNpemUpLFxuICAgICAgICBbYHNsZHMtaWNvbi10ZXh0LSR7dGV4dENvbG9yfWBdOiAvXihkZWZhdWx0fHdhcm5pbmd8ZXJyb3IpJC8udGVzdCh0ZXh0Q29sb3IpICYmXG4gICAgICAgICAgIWNvbnRhaW5lciAmJiAhaWNvbkNvbG9yLFxuICAgICAgICBbYHNsZHMtaWNvbi0ke2ljb25Db2xvcn1gXTogIWNvbnRhaW5lciAmJiBpY29uQ29sb3IsXG4gICAgICAgICdzbGRzLW0tbGVmdC0teC1zbWFsbCc6IGFsaWduID09PSAncmlnaHQnLFxuICAgICAgICAnc2xkcy1tLXJpZ2h0LS14LXNtYWxsJzogYWxpZ24gPT09ICdsZWZ0JyxcbiAgICAgIH0sXG4gICAgICBjbGFzc05hbWVcbiAgICApO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbiAgICBjb25zdCB1c2VIdG1sID0gYDx1c2UgeGxpbms6aHJlZj1cIiR7dXRpbC5nZXRBc3NldFJvb3QoKX0vaWNvbnMvJHtjYXRlZ29yeX0tc3ByaXRlL3N2Zy9zeW1ib2xzLnN2ZyMke2ljb259XCI+PC91c2U+YDtcbiAgICByZXR1cm4gKFxuICAgICAgPHN2Z1xuICAgICAgICBjbGFzc05hbWU9eyBpY29uQ2xhc3NOYW1lcyB9XG4gICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXsgeyBfX2h0bWw6IHVzZUh0bWwgfSB9XG4gICAgICAgIHJlZj17dGhpcy5zdmdJY29uUmVmfVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBjb250YWluZXIsIC4uLnByb3BzIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB7IGNhdGVnb3J5LCBpY29uIH0gPSBwcm9wcztcblxuICAgIGlmIChpY29uLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIFtjYXRlZ29yeSwgaWNvbl0gPSBpY29uLnNwbGl0KCc6Jyk7XG4gICAgfVxuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IHsgY2xhc3NOYW1lLCBmaWxsQ29sb3IsIC4uLnBwcm9wcyB9ID0gcHJvcHM7XG4gICAgICBjb25zdCBpY29uQ29sb3IgPSB0aGlzLmdldEljb25Db2xvcihmaWxsQ29sb3IsIGNhdGVnb3J5LCBpY29uKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckNsYXNzTmFtZSA9IGNsYXNzbmFtZXMoXG4gICAgICAgICdzbGRzLWljb25fX2NvbnRhaW5lcicsXG4gICAgICAgIGNvbnRhaW5lciA9PT0gJ2NpcmNsZScgPyAnc2xkcy1pY29uX19jb250YWluZXItLWNpcmNsZScgOiBudWxsLFxuICAgICAgICBpY29uQ29sb3IgPyBgc2xkcy1pY29uLSR7aWNvbkNvbG9yfWAgOiBudWxsLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9eyBjb250YWluZXJDbGFzc05hbWUgfSByZWY9e3RoaXMuaWNvbkNvbnRhaW5lclJlZn0+XG4gICAgICAgICAgeyB0aGlzLnJlbmRlclNWRyh7IGNhdGVnb3J5LCBpY29uLCBmaWxsQ29sb3I6IGljb25Db2xvciwgY29udGFpbmVyLCAuLi5wcHJvcHMgfSkgfVxuICAgICAgICA8L3NwYW4+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlbmRlclNWRyh7IC4uLnByb3BzLCBjYXRlZ29yeSwgaWNvbiB9KTtcbiAgfVxufVxuXG5JY29uLnByb3BUeXBlcyA9IHtcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjYXRlZ29yeTogUHJvcFR5cGVzLm9uZU9mKFsnYWN0aW9uJywgJ2N1c3RvbScsICdkb2N0eXBlJywgJ3NhbWFuYWdlJywgJ3N0YW5kYXJkJywgJ3V0aWxpdHknXSksXG4gIGljb246IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNvbnRhaW5lcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgUHJvcFR5cGVzLm9uZU9mKFsnZGVmYXVsdCcsICdjaXJjbGUnXSksXG4gIF0pLFxuICBjb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgdGV4dENvbG9yOiBQcm9wVHlwZXMub25lT2YoWydkZWZhdWx0JywgJ3dhcm5pbmcnLCAnZXJyb3InXSksXG4gIHRhYkluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuICBmaWxsQ29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG59O1xuXG5JY29uLklDT05TID0ge1xuICBTVEFOREFSRF9JQ09OUyxcbiAgQ1VTVE9NX0lDT05TLFxuICBBQ1RJT05fSUNPTlMsXG4gIERPQ1RZUEVfSUNPTlMsXG4gIFVUSUxJVFlfSUNPTlMsXG59O1xuIl19