@shipload/sdk 2.0.0-rc13 → 2.0.0-rc15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/shipload.js CHANGED
@@ -213,7 +213,7 @@ var platform = /*#__PURE__*/Object.freeze({
213
213
  Contract: Contract$1
214
214
  });
215
215
 
216
- const abiBlob = antelope.Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDh0CWFkZG1vZHVsZQAFC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAxtb2R1bGVfaW5kZXgFdWludDgPbW9kdWxlX2NhcmdvX2lkBnVpbnQ2NA90YXJnZXRfY2FyZ29faWQGdWludDY0CGFkZG5leHVzAAMKbmV4dXNfbmFtZQZzdHJpbmcBeAVpbnQ2NAF5BWludDY0B2FkdmFuY2UAAgZyZXZlYWwGc3RyaW5nBmNvbW1pdAtjaGVja3N1bTI1NgVibGVuZAADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BmlucHV0cwxjYXJnb19pdGVtW10GY2FuY2VsAAMLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQFY291bnQGdWludDY0DmNhbmNlbF9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lD2NhbmNlbGxlZF9jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CmNhcmdvX2l0ZW0ABAdpdGVtX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIEc2VlZAd1aW50NjQ/B21vZHVsZXMObW9kdWxlX2VudHJ5W10JY2FyZ29fcm93AAYCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BHNlZWQGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10KY2FyZ29fc2VlZAACB2l0ZW1faWQGdWludDE2BHNlZWQGdWludDY0CWNsZWFucnN2cAACBWVwb2NoBnVpbnQ2NAhtYXhfcm93cwZ1aW50NjQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BmNvbW1pdAABBmNvbW1pdAtjaGVja3N1bTI1Ngljb25maWdsb2cAAQZjb25maWcLZ2FtZV9jb25maWcNY29udGFpbmVyX3JvdwAIAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzBnVpbnQzMghjYXBhY2l0eQZ1aW50MzIJY2FyZ29tYXNzBnVpbnQzMghzY2hlZHVsZQlzY2hlZHVsZT8LY29vcmRpbmF0ZXMAAwF4BWludDY0AXkFaW50NjQBegd1aW50MTY/BWNyYWZ0AAULZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQJcmVjaXBlX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIGaW5wdXRzDGNhcmdvX2l0ZW1bXQ1jcmFmdGVyX3N0YXRzAAIFc3BlZWQGdWludDE2BWRyYWluBnVpbnQxNgxjcmVhdGVlbnRpdHkABQVvd25lcgRuYW1lC2VudGl0eV90eXBlBG5hbWULZW50aXR5X25hbWUGc3RyaW5nAXgFaW50NjQBeQVpbnQ2NAZkZXBsb3kABQtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NA5wYWNrZWRfaXRlbV9pZAZ1aW50MTYEc2VlZAZ1aW50NjQLZW50aXR5X25hbWUGc3RyaW5nCmRlc2NlbnRpdHkABAdpdGVtX2lkBnVpbnQxNglodWxsX3NlZWQGdWludDY0DG1vZHVsZV9pdGVtcwh1aW50MTZbXQxtb2R1bGVfc2VlZHMIdWludDY0W10GZW5hYmxlAAEHZW5hYmxlZARib29sDGVuZXJneV9zdGF0cwACCGNhcGFjaXR5BnVpbnQxNghyZWNoYXJnZQZ1aW50MTYUZW50aXR5X2N1cnJlbnRfc3RhdGUAAgtjb29yZGluYXRlcwtjb29yZGluYXRlcwZlbmVyZ3kGdWludDE2D2VudGl0eV9kZWZhdWx0cwAFEndhcmVob3VzZV9jYXBhY2l0eQZ1aW50MzILd2FyZWhvdXNlX3oGdWludDE2EmNvbnRhaW5lcl9odWxsbWFzcwZ1aW50MzISY29udGFpbmVyX2NhcGFjaXR5BnVpbnQzMgtjb250YWluZXJfegZ1aW50MTYLZW50aXR5X2luZm8AGAR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCWNhcmdvbWFzcwZ1aW50MzIFY2FyZ28MY2FyZ29faXRlbVtdB2xvYWRlcnMNbG9hZGVyX3N0YXRzPwZlbmVyZ3kHdWludDE2PwhodWxsbWFzcwd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/CWdlbmVyYXRvcg1lbmVyZ3lfc3RhdHM/CGNhcGFjaXR5B3VpbnQzMj8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwdpc19pZGxlBGJvb2wMY3VycmVudF90YXNrBXRhc2s/FGN1cnJlbnRfdGFza19lbGFwc2VkBnVpbnQzMhZjdXJyZW50X3Rhc2tfcmVtYWluaW5nBnVpbnQzMg1wZW5kaW5nX3Rhc2tzBnRhc2tbXQdpZGxlX2F0C3RpbWVfcG9pbnQ/CHNjaGVkdWxlCXNjaGVkdWxlPwplbnRpdHlfcmVmAAILZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0DmVudGl0eV9zdW1tYXJ5AAgEdHlwZQRuYW1lAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwdpc19pZGxlBGJvb2wOcmVzb2x2ZWRfY291bnQGdWludDMyDXBlbmRpbmdfY291bnQGdWludDMyEGVudGl0eV90YXNrX2luZm8ABAllbnRpdHlfaWQGdWludDY0C2VudGl0eV90eXBlBG5hbWUKdGFza19jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkCnRpbWVfcG9pbnQPZW50aXR5Z3JvdXBfcm93AAICaWQGdWludDY0DHBhcnRpY2lwYW50cwxlbnRpdHlfcmVmW10LZ2FtZV9jb25maWcAAwd2ZXJzaW9uBnVpbnQzMghkZWZhdWx0cw9lbnRpdHlfZGVmYXVsdHMFaXRlbXMKaXRlbV9kZWZbXQZnYXRoZXIABAtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNghxdWFudGl0eQZ1aW50MzIOZ2F0aGVyZXJfc3RhdHMABAV5aWVsZAZ1aW50MTYFZHJhaW4GdWludDE2BWRlcHRoBnVpbnQxNgVzcGVlZAZ1aW50MTYJZ2V0Y29uZmlnAAALZ2V0ZW50aXRpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/CWdldGVudGl0eQACC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAtnZXRpdGVtZGF0YQAACGdldGl0ZW1zAAALZ2V0bG9jYXRpb24AAgF4BWludDY0AXkFaW50NjQKZ2V0bG9jZGF0YQACAXgFaW50NjQBeQVpbnQ2NApnZXRtb2R1bGVzAAAJZ2V0bmVhcmJ5AAMLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CHJlY2hhcmdlBGJvb2wKZ2V0bmZ0aW5mbwAACWdldHBsYXllcgABB2FjY291bnQEbmFtZQlnZXRyZWNpcGUAAQ5vdXRwdXRfaXRlbV9pZAZ1aW50MTYKZ2V0cmVjaXBlcwACC2xvd2VyX2JvdW5kBnVpbnQxNgVsaW1pdAV1aW50OAxnZXRyZXNvdXJjZXMAAApnZXRzdHJhdHVtAAMBeAVpbnQ2NAF5BWludDY0B3N0cmF0dW0GdWludDE2DGdldHN1bW1hcmllcwACBW93bmVyBG5hbWULZW50aXR5X3R5cGUFbmFtZT8LZ3JvdXB0cmF2ZWwABAhlbnRpdGllcwxlbnRpdHlfcmVmW10BeAVpbnQ2NAF5BWludDY0CHJlY2hhcmdlBGJvb2wEaGFzaAABBXZhbHVlBnN0cmluZwdoYXNoNTEyAAEFdmFsdWUGc3RyaW5nDGhhdWxlcl9zdGF0cwADCGNhcGFjaXR5BXVpbnQ4CmVmZmljaWVuY3kGdWludDE2BWRyYWluBnVpbnQxNgRpbml0AAEEc2VlZAtjaGVja3N1bTI1NghpdGVtX2RlZgAFAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgR0eXBlBXVpbnQ4B3N1YnR5cGUFdWludDgEdGllcgV1aW50OA9pdGVtZGF0YV9yZXN1bHQAAgVpdGVtcwppdGVtX2RlZltdB3JlY2lwZXMOcmVjaXBlc19yZXN1bHQKaXRlbXNfaW5mbwABBWl0ZW1zCml0ZW1fZGVmW10Eam9pbgABB2FjY291bnQEbmFtZQxsb2FkZXJfc3RhdHMAAwRtYXNzBnVpbnQzMgZ0aHJ1c3QGdWludDE2CHF1YW50aXR5BXVpbnQ4EGxvY2F0aW9uX2Rlcml2ZWQAAwxzdGF0aWNfcHJvcHMPbG9jYXRpb25fc3RhdGljC2Vwb2NoX3Byb3BzDmxvY2F0aW9uX2Vwb2NoBHNpemUGdWludDE2DmxvY2F0aW9uX2Vwb2NoAAMGYWN0aXZlBGJvb2wFc2VlZDAFdWludDgFc2VlZDEFdWludDgNbG9jYXRpb25faW5mbwACBmNvb3Jkcwtjb29yZGluYXRlcwlpc19zeXN0ZW0EYm9vbAxsb2NhdGlvbl9yb3cABgJpZAZ1aW50NjQFb3duZXIEbmFtZQtjb29yZGluYXRlcwtjb29yZGluYXRlcwljYXJnb21hc3MGdWludDMyBWNhcmdvDGNhcmdvX2l0ZW1bXQhzY2hlZHVsZQlzY2hlZHVsZT8PbG9jYXRpb25fc3RhdGljAAUGY29vcmRzC2Nvb3JkaW5hdGVzBHR5cGUNbG9jYXRpb25fdHlwZQdzdWJ0eXBlBXVpbnQ4BXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DG1vZHVsZV9lbnRyeQACBHR5cGUFdWludDgJaW5zdGFsbGVkC2NhcmdvX3NlZWQ/C21vZHVsZV9pbmZvAAQCaWQGdWludDE2BG1hc3MGdWludDMyC21vZHVsZV90eXBlBXVpbnQ4BHRpZXIFdWludDgObW9kdWxlc19yZXN1bHQAAQdtb2R1bGVzDW1vZHVsZV9pbmZvW10ObW92ZW1lbnRfc3RhdHMAAgZ0aHJ1c3QGdWludDMyBWRyYWluBnVpbnQxNgtuZWFyYnlfaW5mbwAFCmNhbl90cmF2ZWwEYm9vbAdjdXJyZW50FGVudGl0eV9jdXJyZW50X3N0YXRlCXByb2plY3RlZBRlbnRpdHlfY3VycmVudF9zdGF0ZQptYXhfZW5lcmd5BnVpbnQxNgdzeXN0ZW1zD25lYXJieV9zeXN0ZW1bXQ1uZWFyYnlfc3lzdGVtAAQIZGlzdGFuY2UGdWludDY0C2VuZXJneV9jb3N0BnVpbnQ2NAtmbGlnaHRfdGltZQZ1aW50MzIIbG9jYXRpb24NbG9jYXRpb25faW5mbwluZXh1c19yb3cABAJpZAZ1aW50NjQFb3duZXIEbmFtZQRuYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcw5uZnRfc2NoZW1hX2RlZgACC3NjaGVtYV9uYW1lBG5hbWUGZmllbGRzDnNjaGVtYV9maWVsZFtdEG5mdF90ZW1wbGF0ZV9kZWYAAgdpdGVtX2lkBnVpbnQxNgtzY2hlbWFfbmFtZQRuYW1lDW5mdGNvbmZpZ19yb3cAAwdpdGVtX2lkBnVpbnQxNgt0ZW1wbGF0ZV9pZAVpbnQzMgtzY2hlbWFfbmFtZQRuYW1lDm5mdGluZm9fcmVzdWx0AAIHc2NoZW1hcxBuZnRfc2NoZW1hX2RlZltdCXRlbXBsYXRlcxJuZnRfdGVtcGxhdGVfZGVmW10Gbm90aWZ5AAEFZXZlbnQKdGFza19ldmVudAtwbGF5ZXJfaW5mbwAGBW93bmVyBG5hbWUJaXNfcGxheWVyBGJvb2wMY29tcGFueV9uYW1lBnN0cmluZwpzaGlwX2NvdW50BnVpbnQ2NA93YXJlaG91c2VfY291bnQGdWludDY0D2NvbnRhaW5lcl9jb3VudAZ1aW50NjQKcGxheWVyX3JvdwABBW93bmVyBG5hbWUIcmVjaGFyZ2UAAgtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAxyZWNpcGVfaW5wdXQAAwdpdGVtX2lkBnVpbnQxNghjYXRlZ29yeQV1aW50OAhxdWFudGl0eQZ1aW50MzIQcmVjaXBlX2l0ZW1faW5mbwACAmlkBnVpbnQxNgRtYXNzBnVpbnQzMg9yZWNpcGVfcmVzcG9uc2UABw5vdXRwdXRfaXRlbV9pZAZ1aW50MTYLb3V0cHV0X21hc3MGdWludDMyBmlucHV0cw5yZWNpcGVfaW5wdXRbXQpzdGF0X3Nsb3RzFHN0YXRfc2xvdF9yZXNwb25zZVtdDWJsZW5kX3dlaWdodHMFYnl0ZXMLb3V0cHV0X2l0ZW0QcmVjaXBlX2l0ZW1faW5mbwtpbnB1dF9pdGVtcxJyZWNpcGVfaXRlbV9pbmZvW10OcmVjaXBlc19yZXN1bHQAAQdyZWNpcGVzEXJlY2lwZV9yZXNwb25zZVtdC3Jlc2VydmVfcm93AAICaWQGdWludDY0CXJlbWFpbmluZwZ1aW50MzIHcmVzb2x2ZQADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/DXJlc291cmNlX2luZm8ABAJpZAZ1aW50MTYEbWFzcwZ1aW50MzIIY2F0ZWdvcnkFdWludDgEdGllcgV1aW50OA5yZXNvdXJjZV9zdGF0cwADBXN0YXQxBnVpbnQxNgVzdGF0MgZ1aW50MTYFc3RhdDMGdWludDE2EHJlc291cmNlc19yZXN1bHQAAQlyZXNvdXJjZXMPcmVzb3VyY2VfaW5mb1tdCHJtbW9kdWxlAAQLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OA90YXJnZXRfY2FyZ29faWQGdWludDY0CHJtbmZ0Y2ZnAAEHaXRlbV9pZAZ1aW50MTYEc2FsdAABBHNhbHQGdWludDY0CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzY2hlbWFfZmllbGQAAgRuYW1lBnN0cmluZwpmaWVsZF90eXBlBnN0cmluZwxzZXF1ZW5jZV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQZ1aW50NjQJc2V0bmZ0Y2ZnAAMHaXRlbV9pZAZ1aW50MTYLdGVtcGxhdGVfaWQFaW50MzILc2NoZW1hX25hbWUEbmFtZQhzaGlwX3JvdwASAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nBHNlZWQGdWludDY0C2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzB3VpbnQzMj8IY2FwYWNpdHkHdWludDMyPwZlbmVyZ3kHdWludDE2PwljYXJnb21hc3MGdWludDMyB2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/CWdlbmVyYXRvcg1lbmVyZ3lfc3RhdHM/B2xvYWRlcnMNbG9hZGVyX3N0YXRzPwhnYXRoZXJlcg9nYXRoZXJlcl9zdGF0cz8Ed2FycAt3YXJwX3N0YXRzPwdjcmFmdGVyDmNyYWZ0ZXJfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/B21vZHVsZXMObW9kdWxlX2VudHJ5W10Ic2NoZWR1bGUJc2NoZWR1bGU/CnNwYXduY2FyZ28AAwllbnRpdHlfaWQGdWludDY0B2l0ZW1faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NAtzcGF3bnBhY2tlZAAECWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYJaHVsbF9zZWVkBnVpbnQ2NAlpbnN0YWxsZWQMY2FyZ29fc2VlZFtdC3NwYXduc2VlZGVkAAQJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQEc2VlZAZ1aW50NjQSc3RhdF9zbG90X3Jlc3BvbnNlAAEHc291cmNlcw1zdGF0X3NvdXJjZVtdC3N0YXRfc291cmNlAAILaW5wdXRfaW5kZXgFdWludDgQaW5wdXRfc3RhdF9pbmRleAV1aW50OAlzdGF0ZV9yb3cABgdlbmFibGVkBGJvb2wFZXBvY2gGdWludDMyBHNhbHQGdWludDY0BXNoaXBzBnVpbnQzMgRzZWVkC2NoZWNrc3VtMjU2BmNvbW1pdAtjaGVja3N1bTI1NgxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABAdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzIEdGFzawAIBHR5cGUFdWludDgIZHVyYXRpb24GdWludDMyCmNhbmNlbGFibGUFdWludDgLY29vcmRpbmF0ZXMMY29vcmRpbmF0ZXM/BWNhcmdvDGNhcmdvX2l0ZW1bXQxlbnRpdHl0YXJnZXQLZW50aXR5X3JlZj8LZW50aXR5Z3JvdXAHdWludDY0PwtlbmVyZ3lfY29zdAd1aW50MTY/CnRhc2tfZXZlbnQACQpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDE2Pwx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10IdHJhbnNmZXIABgtzb3VyY2VfdHlwZQRuYW1lCXNvdXJjZV9pZAZ1aW50NjQJZGVzdF90eXBlBG5hbWUHZGVzdF9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYIcXVhbnRpdHkGdWludDMyBnRyYXZlbAAFC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sCXR5cGVzX3JvdwADAmlkBnVpbnQ2NBNlbnRpdHlfc3VtbWFyeV90eXBlDmVudGl0eV9zdW1tYXJ5EGdhbWVfY29uZmlnX3R5cGULZ2FtZV9jb25maWcNd2FyZWhvdXNlX3JvdwALAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nBHNlZWQGdWludDY0C2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzB3VpbnQzMj8IY2FwYWNpdHkHdWludDMyPwljYXJnb21hc3MGdWludDMyB2xvYWRlcnMNbG9hZGVyX3N0YXRzPwdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHNjaGVkdWxlCXNjaGVkdWxlPwR3YXJwAAQLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQBeAVpbnQ2NAF5BWludDY0CndhcnBfc3RhdHMAAQVyYW5nZQZ1aW50MzIEd2lwZQAADHdpcGVzZXF1ZW5jZQAABHdyYXAABQVvd25lcgRuYW1lC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhjYXJnb19pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0NAAAUFEnKlMyCWFkZG1vZHVsZccDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGFkZG1vZHVsZQpzdW1tYXJ5OiAnSW5zdGFsbCBhIG1vZHVsZSBpbnRvIGEgc2xvdCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5zdGFsbCBhIG1vZHVsZSBmcm9tIGNhcmdvIGludG8gYSBtb2R1bGUgc2xvdCBvbiBhIGxpdmUgZW50aXR5IG9yIGEgcGFja2VkIGVudGl0eSBpbiBjYXJnby4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBubyBzY2hlZHVsZWQgdGFza3MuIFRoZSBtb2R1bGUgdHlwZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0IHNsb3QgdHlwZS4gVGhlIG1vZHVsZSBpdGVtIGlzIHJlbW92ZWQgZnJvbSBjYXJnbyB1cG9uIGluc3RhbGxhdGlvbi4AAABYdzVTMghhZGRuZXh1c6cDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGFkZG5leHVzCnN1bW1hcnk6ICdBZGQgYSBuZXh1cyBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ3JlYXRlIGEgbmV3IG5leHVzIGVudGl0eSBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuIE5leHVzZXMgYXJlIG93bmVkIGJ5IHRoZSBjb250cmFjdCBhbmQgc2VydmUgYXMgZml4ZWQgZ2F0aGVyaW5nIHBvaW50cyB3aGVyZSBwbGF5ZXJzIGNhbiB3cmFwLCB1bndyYXAsIGRlcGxveSwgYW5kIG90aGVyd2lzZSBpbnRlcmFjdCB3aXRoIE5GVC1iYWNrZWQgYXNzZXRzLiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAAAAQKFpdjIHYWR2YW5jZdMBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGFkdmFuY2UKc3VtbWFyeTogJ0FkdmFuY2UgdHVybicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQWR2YW5jZSB0aGUgZ2FtZSB0byB0aGUgbmV4dCB0dXJuLgAAAACANFU8BWJsZW5k/QItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYmxlbmQKc3VtbWFyeTogJ0JsZW5kIGNhcmdvIHN0YWNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ29tYmluZSBtdWx0aXBsZSBjYXJnbyBzdGFja3Mgb2YgdGhlIHNhbWUgaXRlbSB0eXBlIGludG8gYSBzaW5nbGUgc3RhY2sgd2l0aCBhIG5ldyBibGVuZGVkIHNlZWQuIEFsbCBpbnB1dCBzdGFja3MgbXVzdCBzaGFyZSB0aGUgc2FtZSBpdGVtIGlkLiBUaGUgb3V0cHV0IHN0YWNrIGhhcyB0aGUgY29tYmluZWQgcXVhbnRpdHkgb2YgYWxsIGlucHV0cy4AAAAARIWmQQZjYW5jZWzCAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjYW5jZWwKc3VtbWFyeTogJ0NhbmNlbCBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbmNlbCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0YXNrcyBmcm9tIHRoZSBlbmQgb2YgYW4gZW50aXR5J3Mgc2NoZWR1bGUuIFRhc2tzIHRoYXQgYXJlIGltbXV0YWJsZSBhbmQgaW4gcHJvZ3Jlc3MgY2Fubm90IGJlIGNhbmNlbGxlZC4AAKgb32lURAljbGVhbnJzdnDsAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjbGVhbnJzdnAKc3VtbWFyeTogJ0NsZWFuIHVwIHBhc3QgZXBvY2ggcmVzZXJ2ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVyYXNlIHJlc2VydmUgdGFibGUgcm93cyBmcm9tIGEgcGFzdCBlcG9jaC4gQ2Fubm90IGNsZWFuIHRoZSBjdXJyZW50IG9yIGZ1dHVyZSBlcG9jaHMuIFRoZSBtYXhfcm93cyBwYXJhbWV0ZXIgY2FwcyB0aGUgbnVtYmVyIG9mIHJvd3MgZXJhc2VkIHBlciBjYWxsIHRvIGxpbWl0IENQVSB1c2FnZS4AgIrH5GtURApjbGVhcnRhYmxlvgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYXJ0YWJsZQpzdW1tYXJ5OiAnREVCVUc6IGNsZWFydGFibGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAGQnJUUGY29tbWl07AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY29tbWl0CnN1bW1hcnk6ICdTZXQgY29tbWl0IHZhbHVlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTZXQgdGhlIGluaXRpYWwgY29tbWl0IHZhbHVlIGR1cmluZyBnYW1lIGluaXRpYWxpemF0aW9uLgAAYDQytyZFCWNvbmZpZ2xvZ90CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbmZpZ2xvZwpzdW1tYXJ5OiAnTG9nIGdhbWUgY29uZmlndXJhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIHRoYXQgbG9ncyB0aGUgY3VycmVudCBnYW1lIGNvbmZpZ3VyYXRpb24uIENhbGxlZCBpbmxpbmUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdG8gYnJvYWRjYXN0IGNvbmZpZyB2aWEgYWN0aW9uIHRyYWNlcy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAACAvMxFBWNyYWZ0yAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY3JhZnQKc3VtbWFyeTogJ0NyYWZ0IGl0ZW1zIGZyb20gYSByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRyYW5zZm9ybSBjYXJnbyBpdGVtcyBpbnRvIGEgbmV3IGl0ZW0gdXNpbmcgYSByZWNpcGUuIFRoZSBlbnRpdHkgbXVzdCBoYXZlIGEgY3JhZnRlciBtb2R1bGUgaW5zdGFsbGVkLiBDb25zdW1lcyBlbmVyZ3kgYW5kIHNjaGVkdWxlcyBhIGNyYWZ0aW5nIHRhc2sgd2l0aCBkdXJhdGlvbiBiYXNlZCBvbiB0b3RhbCBpbnB1dCBtYXNzIGFuZCBjcmFmdGVyIHNwZWVkLiBJbnB1dCBxdWFudGl0aWVzIG11c3QgZXhhY3RseSBtYXRjaCB0aGUgcmVjaXBlIHJlcXVpcmVtZW50cy7gs8tTqWzURQxjcmVhdGVlbnRpdHm/AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjcmVhdGVlbnRpdHkKc3VtbWFyeTogJ0RFQlVHOiBjcmVhdGUgYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAHgaq0oGZGVwbG957AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVwbG95CnN1bW1hcnk6ICdEZXBsb3kgYSBwYWNrZWQgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpVbnBhY2sgYSBwYWNrZWQgZW50aXR5IGl0ZW0gKHBhY2tlZCBzaGlwIG9yIHBhY2tlZCBjb250YWluZXIpIGZyb20gY2FyZ28sIHNjaGVkdWxpbmcgYSBkZXBsb3kgdGFzayB0aGF0IGNyZWF0ZXMgdGhlIG5ldyBlbnRpdHkgYXQgdGhlIGRlcGxveWluZyBlbnRpdHkncyBsb2NhdGlvbiB1cG9uIHJlc29sdXRpb24uAIDPLk+FsEoKZGVzY2VudGl0efwDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlc2NlbnRpdHkKc3VtbWFyeTogJ0Rlc2NyaWJlIGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIGEgcGFja2VkIGVudGl0eSwgZGVyaXZlZCBmcm9tIHRoZSBlbnRpdHkgaXRlbSBpZCwgaHVsbCBzZWVkLCBhbmQgdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIG1vZHVsZSBpdGVtIGlkcyBhbmQgc2VlZHMuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgYW5kIE5GVCByZW5kZXJlcnMgdG8gZGlzcGxheSBwYWNrZWQgZW50aXRpZXMuIENhbGxpbmcgdGhpcyBhY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGNvbnRyYWN0IHN0YXRlLgAAAACoeMxUBmVuYWJsZd0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC4AAAAAXNWyYQZnYXRoZXKXAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnYXRoZXIKc3VtbWFyeTogJ0dhdGhlciByZXNvdXJjZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkdhdGhlciByZXNvdXJjZXMgYXQgdGhlIHNoaXAncyBjdXJyZW50IGxvY2F0aW9uLiBPbmx5IHdvcmtzIGF0IGdhdGhlcmFibGUgbG9jYXRpb24gdHlwZXMuIFNjaGVkdWxlcyBhIGdhdGhlciB0YXNrIHRoYXQgY29uc3VtZXMgZW5lcmd5IGFuZCB5aWVsZHMgY2FyZ28gYmFzZWQgb24gdGhlIHNoaXAncyBnYXRoZXJlciBzdGF0cyBhbmQgdGhlIGxvY2F0aW9uJ3MgcmVzb3VyY2UgY29tcG9zaXRpb24uAABgbk2KsmIJZ2V0Y29uZmlnygItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0Y29uZmlnCnN1bW1hcnk6ICdHZXQgZ2FtZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSBnYW1lIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIGRlZmF1bHQgZW50aXR5IHN0YXRzIGZvciB3YXJlaG91c2VzIGFuZCBjb250YWluZXJzLCBhbmQgdGhlIGZ1bGwgaXRlbSBkZWZpbml0aW9ucyB0YWJsZS4AsHLZ5amyYgtnZXRlbnRpdGllc6QCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0aWVzCnN1bW1hcnk6ICdHZXQgYWxsIGVudGl0aWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBmdWxsIGVudGl0eSBpbmZvIGZvciBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgAA8NnlqbJiCWdldGVudGl0eaICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0eQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBlbnRpdHkgaW5jbHVkaW5nIGlkZW50aXR5LCBjYXJnbywgc2NoZWR1bGUgc3RhdGUsIGFuZCB0eXBlLXNwZWNpZmljIGZpZWxkcy4ATDZJquyyYgtnZXRpdGVtZGF0YdwDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1kYXRhCnN1bW1hcnk6ICdHZXQgZnVsbCBpdGVtIGNhdGFsb2cnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBjb21wbGV0ZSBpdGVtIGNhdGFsb2cgYXMgdGhlIGNvbnRyYWN0IHNlZXMgaXQsIGluY2x1ZGluZyB0eXBlLCBzdWJ0eXBlLCB0aWVyLCBtYXNzLCBhbmQgb3RoZXIgc3RhdGljIG1ldGFkYXRhLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBjbGllbnRzIHRvIG1pcnJvciB0aGUgY29udHJhY3QncyBpdGVtIGRlZmluaXRpb25zLiBDYWxsaW5nIHRoaXMgYWN0aW9uIGRvZXMgbm90IG1vZGlmeSBjb250cmFjdCBzdGF0ZS4AAABYquyyYghnZXRpdGVtc5oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1zCnN1bW1hcnk6ICdHZXQgYWxsIGF2YWlsYWJsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGl0ZW1zIGluIHRoZSBnYW1lIGluY2x1ZGluZyB0aGVpciBpZCwgYmFzZSBwcmljZSwgYW5kIG1hc3MuACZ12SAas2ILZ2V0bG9jYXRpb27iAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NhdGlvbgpzdW1tYXJ5OiAnR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jYXRpb24gaW5jbHVkaW5nIHdoZXRoZXIgYSBzeXN0ZW0gZXhpc3RzLCBhbmQgZm9yIGVhY2ggaXRlbTogcHJpY2UsIHN1cHBseSwgcmFyaXR5IG11bHRpcGxpZXIsIGFuZCBsb2NhdGlvbiBtdWx0aXBsaWVyLgCAySYhGrNiCmdldGxvY2RhdGH+Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NkYXRhCnN1bW1hcnk6ICdHZXQgZGVyaXZlZCBsb2NhdGlvbiBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGRlcml2ZWQgbG9jYXRpb24gZGF0YSBpbmNsdWRpbmcgc3RhdGljIHByb3BlcnRpZXMgKHR5cGUsIGRpZmZpY3VsdHksIHNlZWRzKSBmcm9tIHRoZSBnYW1lIHNlZWQgYW5kIGVwb2NoLXNwZWNpZmljIHByb3BlcnRpZXMgKGFjdGl2ZSwgc2VlZHMpIGZyb20gdGhlIGN1cnJlbnQgZXBvY2ggc2VlZC4AAFZRJyqzYgpnZXRtb2R1bGVztAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bW9kdWxlcwpzdW1tYXJ5OiAnR2V0IGFsbCBtb2R1bGUgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBzdWJzZXQgb2YgaXRlbXMgY2xhc3NpZmllZCBhcyBtb2R1bGVzLCBpbmNsdWRpbmcgZWFjaCBtb2R1bGUncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGluc3RhbGxhYmxlIGVxdWlwbWVudC4gQ2FsbGluZyB0aGlzIGFjdGlvbiBkb2VzIG5vdCBtb2RpZnkgY29udHJhY3Qgc3RhdGUuAADw5xo1s2IJZ2V0bmVhcmJ53gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bmVhcmJ5CnN1bW1hcnk6ICdHZXQgbmVhcmJ5IHJlYWNoYWJsZSBzeXN0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIG5lYXJieSBzeXN0ZW1zIHJlYWNoYWJsZSBieSBhbiBlbnRpdHkgZnJvbSBpdHMgcHJvamVjdGVkIGxvY2F0aW9uLiBSZXR1cm5zIGN1cnJlbnQgc3RhdGUgKHdpdGggY29tcGxldGVkIHRhc2tzIHJlc29sdmVkKSwgcHJvamVjdGVkIHN0YXRlIChhZnRlciBhbGwgc2NoZWR1bGVkIHRhc2tzKSwgYW5kIGEgbGlzdCBvZiByZWFjaGFibGUgc3lzdGVtcyB3aXRoIGRpc3RhbmNlLCBlbmVyZ3kgY29zdCwgZmxpZ2h0IHRpbWUsIGFuZCBtYXJrZXQgaW5mb3JtYXRpb24uAABd0+U1s2IKZ2V0bmZ0aW5mb6QELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5mdGluZm8Kc3VtbWFyeTogJ0dldCBORlQgc2NoZW1hIGFuZCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgQXRvbWljQXNzZXRzIHNjaGVtYXMgYW5kIHRlbXBsYXRlcyB0aGUgZ2FtZSBjb250cmFjdCBleHBlY3RzLCBwbHVzIHRoZSBjdXJyZW50IGBpdGVtX2lkIOKGkiAodGVtcGxhdGVfaWQsIHNjaGVtYV9uYW1lKWAgbWFwcGluZyBzdG9yZWQgaW4gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHN5bmMgYXRvbWljYXNzZXRzIHN0YXRlIHdpdGggdGhlIGNvbnRyYWN0LiBDYWxsaW5nIHRoaXMgYWN0aW9uIGRvZXMgbm90IG1vZGlmeSBjb250cmFjdCBzdGF0ZS4AALjKm1izYglnZXRwbGF5ZXL9Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRwbGF5ZXIKc3VtbWFyeTogJ0dldCBwbGF5ZXIgaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwbGF5ZXIgaW5jbHVkaW5nIGJhbGFuY2UsIGRlYnQsIG5ldHdvcnRoLCBlbnRpdHkgY291bnRzLCBhbmQgcHJpY2luZyBmb3IgbmV4dCBwdXJjaGFzZXMuIFJldHVybnMgaXNfcGxheWVyPWZhbHNlIGlmIHRoZSBhY2NvdW50IGhhcyBub3Qgam9pbmVkIHRoZSBnYW1lLgAAUNUhdbNiCWdldHJlY2lwZdoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZQpzdW1tYXJ5OiAnR2V0IGEgc2luZ2xlIGNyYWZ0aW5nIHJlY2lwZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHJlY2lwZSB3aG9zZSBvdXRwdXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaXRlbSBpZCwgaW5jbHVkaW5nIGl0cyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkaXNwbGF5IGNyYWZ0aW5nIHJlcXVpcmVtZW50cy4gQ2FsbGluZyB0aGlzIGFjdGlvbiBkb2VzIG5vdCBtb2RpZnkgY29udHJhY3Qgc3RhdGUuAABW1SF1s2IKZ2V0cmVjaXBlc+ADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4gQ2FsbGluZyB0aGlzIGFjdGlvbiBkb2VzIG5vdCBtb2RpZnkgY29udHJhY3Qgc3RhdGUugBW6mmJ1s2IMZ2V0cmVzb3VyY2VzuwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzb3VyY2VzCnN1bW1hcnk6ICdHZXQgYWxsIHJlc291cmNlIGl0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGNsYXNzaWZpZWQgYXMgcmVzb3VyY2VzLCBpbmNsdWRpbmcgZWFjaCByZXNvdXJjZSdzIGlkLCBtYXNzLCBzdWJ0eXBlLCBhbmQgdGllci4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBlbnVtZXJhdGUgZ2F0aGVyYWJsZSBtYXRlcmlhbHMuIENhbGxpbmcgdGhpcyBhY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGNvbnRyYWN0IHN0YXRlLgCA1NncjLNiCmdldHN0cmF0dW3SAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdHJhdHVtCnN1bW1hcnk6ICdHZXQgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHJlc291cmNlIHN0cmF0dW0gZGF0YSBmb3IgYSBzcGVjaWZpYyBkZXB0aCBsYXllciBhdCBhIGNvb3JkaW5hdGUsIGluY2x1ZGluZyB0aGUgc3RyYXR1bSBzZWVkIGluZm8gYW5kIGRlcml2ZWQgcmVzb3VyY2Ugc3RhdHMugJW7RkqNs2IMZ2V0c3VtbWFyaWVz6AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c3VtbWFyaWVzCnN1bW1hcnk6ICdHZXQgZW50aXR5IHN1bW1hcmllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgbGlnaHR3ZWlnaHQgc3VtbWFyaWVzIG9mIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllciBpbmNsdWRpbmcgdHlwZSwgaWQsIG93bmVyLCBuYW1lLCBsb2NhdGlvbiwgYW5kIGlkbGUgc3RhdHVzLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4Aotrm5qrpZQtncm91cHRyYXZlbJoELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdyb3VwdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIG11bHRpcGxlIGVudGl0aWVzIHRvZ2V0aGVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWF0ZSBncm91cCB0cmF2ZWwgZm9yIG11bHRpcGxlIGVudGl0aWVzIHRvIGEgZGVzdGluYXRpb24uIEFsbCBlbnRpdGllcyBtdXN0IGJlIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFuZCBvd25lZCBieSB0aGUgY2FsbGVyLiBBdCBsZWFzdCBvbmUgZW50aXR5IHdpdGggZW5naW5lcyBpcyByZXF1aXJlZCB0byBwcm92aWRlIHRocnVzdC4gRmxpZ2h0IGR1cmF0aW9uIGlzIGNhbGN1bGF0ZWQgZnJvbSBjb21iaW5lZCB0aHJ1c3QgYW5kIHRvdGFsIG1hc3Mgb2YgYWxsIGVudGl0aWVzLiBDcmVhdGVzIGFuIGVudGl0eWdyb3VwIGZvciBhdG9taWMgcmVzb2x1dGlvbiBhbmQgY2FuY2VsbGF0aW9uLgAAAAAA0LBpBGhhc2j4AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhMjU2IGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTI1NiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAQITSsGkHaGFzaDUxMvsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2g1MTIKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGE1MTIgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhNTEyIGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4AAAAAAJDddARpbml0+gEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaW5pdApzdW1tYXJ5OiAnSW5pdGlhbGl6ZSBnYW1lIHNlZWQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYWxpemUgYSB0aGUgZ2FtZXMgc2VlZCBhbmQgc2VlZCB2YWx1ZXMgdG8gYm9vdHN0cmFwIGdhbWUgc3RhdGUuAAAAAAAwHX0Eam9pbsQBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGpvaW4Kc3VtbWFyeTogJ0pvaW4gYSBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpKb2luIGEgZ2FtZSBvZiBTaGlwbG9hZAAAAAD45TKdBm5vdGlmeYoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5vdGlmeQpzdW1tYXJ5OiAnVGFzayBsaWZlY3ljbGUgbm90aWZpY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gdGhhdCBub3RpZmllcyBlbnRpdHkgb3duZXJzIG9mIHRhc2sgbGlmZWN5Y2xlIGV2ZW50cyAocmVzb2x2ZWQsIGNhbmNlbGxlZCkuIENhbGxlZCBpbmxpbmUgd2hlbiB0YXNrcyBjaGFuZ2Ugc3RhdGUuIFVzZXMgcmVxdWlyZV9yZWNpcGllbnQgdG8gZW5hYmxlIG9mZi1jaGFpbiBtb25pdG9yaW5nIHZpYSBhY3Rpb24gdHJhY2VzLgAAAIpd05C6CHJlY2hhcmdlzQItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVjaGFyZ2UKc3VtbWFyeTogJ1JlY2hhcmdlIHNoaXAgZW5lcmd5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTY2hlZHVsZSBhIHJlY2hhcmdlIHRhc2sgZm9yIGFuIGVudGl0eSB0byByZXN0b3JlIGVuZXJneSB0byBmdWxsIGNhcGFjaXR5LiBUaGUgcmVjaGFyZ2UgZHVyYXRpb24gZGVwZW5kcyBvbiBjdXJyZW50IGVuZXJneSBsZXZlbCBhbmQgcmVjaGFyZ2UgcmF0ZS4AAABA7UixugdyZXNvbHZl0AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVzb2x2ZQpzdW1tYXJ5OiAnQ29tcGxldGUgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXNvbHZlIGNvbXBsZXRlZCB0YXNrcyBpbiBhbiBlbnRpdHkncyBzY2hlZHVsZSwgYXBwbHlpbmcgdGhlaXIgZWZmZWN0cyAocmVjaGFyZ2UgZW5lcmd5LCB1cGRhdGUgbG9jYXRpb24sIGxvYWQvdW5sb2FkIGNhcmdvKS4gSWYgY291bnQgaXMgc3BlY2lmaWVkLCByZXNvbHZlIGV4YWN0bHkgdGhhdCBtYW55IHRhc2tzOyBvdGhlcndpc2UgcmVzb2x2ZSBhbGwgY29tcGxldGVkIHRhc2tzLiBGYWlscyBpZiBjb3VudCBleGNlZWRzIHRoZSBudW1iZXIgb2YgY29tcGxldGVkIHRhc2tzLgAAACrqRKW8CHJtbW9kdWxlvAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcm1tb2R1bGUKc3VtbWFyeTogJ1JlbW92ZSBhIG1vZHVsZSBmcm9tIGEgc2xvdCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVtb3ZlIGFuIGluc3RhbGxlZCBtb2R1bGUgZnJvbSBhIHNsb3Qgb24gYSBsaXZlIGVudGl0eSBvciBhIHBhY2tlZCBlbnRpdHkgaW4gY2FyZ28uIFRoZSBlbnRpdHkgbXVzdCBiZSBpZGxlIHdpdGggbm8gc2NoZWR1bGVkIHRhc2tzLiBUaGUgbW9kdWxlIGlzIHJldHVybmVkIHRvIGNhcmdvLiBGYWlscyBpZiB0aGUgZW50aXR5IGRvZXMgbm90IGhhdmUgZW5vdWdoIGNhcmdvIGNhcGFjaXR5IHRvIGhvbGQgdGhlIHJldHVybmVkIG1vZHVsZS4AAABsobymvAhybW5mdGNmZ6EDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJtbmZ0Y2ZnCnN1bW1hcnk6ICdSZW1vdmUgTkZUIHRlbXBsYXRlIG1hcHBpbmcgZm9yIGFuIGl0ZW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlbW92ZSB0aGUgQXRvbWljQXNzZXRzIHRlbXBsYXRlIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBpZCBmcm9tIHRoZSBgbmZ0Y29uZmlnYCB0YWJsZS4gQWZ0ZXIgcmVtb3ZhbCB0aGUgaXRlbSBjYW4gbm8gbG9uZ2VyIGJlIHdyYXBwZWQgb3IgdW53cmFwcGVkIHVudGlsIGEgbmV3IG1hcHBpbmcgaXMgc2V0LiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAAAAAACQo8EEc2FsdNgBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNhbHQKc3VtbWFyeTogJ0FwcGVuZCBTYWx0JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpBZGQgYWRkaXRpb25hbCBzYWx0IHRvIHRoZSBuZXh0IGVwb2NoIHNlZWQuAABgC+U1s8IJc2V0bmZ0Y2ZnxAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc2V0bmZ0Y2ZnCnN1bW1hcnk6ICdTZXQgTkZUIHRlbXBsYXRlIG1hcHBpbmcgZm9yIGFuIGl0ZW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkJpbmQgYW4gaXRlbSBpZCB0byBhbiBBdG9taWNBc3NldHMgdGVtcGxhdGUgaWQgYW5kIHNjaGVtYSBuYW1lLiBVc2VkIHRvIGNvbmZpZ3VyZSBob3cgdGhlIGNvbnRyYWN0IG1pbnRzIGFuZCByZWNvZ25pemVzIE5GVHMgZm9yIGEgZ2l2ZW4gaXRlbS4gSW5zZXJ0cyBhIG5ldyBtYXBwaW5nIGlmIG9uZSBkb2VzIG5vdCBleGlzdCwgb3IgdXBkYXRlcyB0aGUgZXhpc3RpbmcgbWFwcGluZy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAZdegyU3FCnNwYXduY2FyZ2/FAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzcGF3bmNhcmdvCnN1bW1hcnk6ICdERUJVRzogc3Bhd24gY2FyZ28gb24gYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAJKCyNTJTcULc3Bhd25wYWNrZWTnAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzcGF3bnBhY2tlZApzdW1tYXJ5OiAnREVCVUc6IHNwYXduIGEgcGFja2VkIGVudGl0eSB3aXRoIGluc3RhbGxlZCBtb2R1bGVzIG9uIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQCSSkrhyU3FC3NwYXduc2VlZGVkzQEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3Bhd25zZWVkZWQKc3VtbWFyeTogJ0RFQlVHOiBzcGF3biBzZWVkZWQgY2FyZ28gb24gYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAVy08zc0IdHJhbnNmZXLIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB0cmFuc2ZlcgpzdW1tYXJ5OiAnVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiBlbnRpdGllcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiB0d28gZW50aXRpZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24uIEJvdGggZW50aXRpZXMgbXVzdCBiZSBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBhdCBsZWFzdCBvbmUgbXVzdCBoYXZlIGxvYWRlcnMuIENyZWF0ZXMgbG9hZCBhbmQgdW5sb2FkIHRhc2tzIG9uIGJvdGggZW50aXRpZXMgd2l0aCBkdXJhdGlvbiBiYXNlZCBvbiBjb21iaW5lZCBsb2FkZXIgY2FwYWNpdHkgYW5kIFotZGlzdGFuY2UgYmV0d2VlbiB0aGVtLgAAAABEtc3NBnRyYXZlbPsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBhIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIHRyYXZlbCBvZiBhbiBlbnRpdHkgZnJvbSBpdHMgY3VycmVudCBsb2NhdGlvbiB0byBhIG5ldyBkZXN0aW5hdGlvbi4AAAAAAFCv4QR3YXJwnwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2FycApzdW1tYXJ5OiAnV2FycCB0byBhIGRlc3RpbmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YW50bHkgdGVsZXBvcnQgYW4gZW50aXR5IHRvIGEgZGVzdGluYXRpb24gc3lzdGVtLiBSZXF1aXJlcyB3YXJwIGNhcGFiaWxpdHksIGZ1bGwgZW5lcmd5LCBlbXB0eSBjYXJnbywgYW5kIGFuIGVtcHR5IHNjaGVkdWxlLiBUaGUgZGVzdGluYXRpb24gbXVzdCBiZSBhIHZhbGlkIHN5c3RlbSB3aXRoaW4gd2FycCByYW5nZS4gUmVzb2x2ZXMgaW1tZWRpYXRlbHkgYXMgYSB6ZXJvLWR1cmF0aW9uIHRhc2suAAAAAACgquMEd2lwZbIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGUKc3VtbWFyeTogJ0RFQlVHOiB3aXBlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLaDQVNoqrKrjDHdpcGVzZXF1ZW5jZcIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGVzZXF1ZW5jZQpzdW1tYXJ5OiAnREVCVUc6IHdpcGVzZXF1ZW5jZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAAAAAFDN5QR3cmFw/gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd3JhcApzdW1tYXJ5OiAnV3JhcCBjYXJnbyBpbnRvIGFuIE5GVCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKV3JhcCBhIHF1YW50aXR5IG9mIGNhcmdvIGZyb20gYW4gZW50aXR5IGludG8gYW4gQXRvbWljQXNzZXRzIE5GVCBtaW50ZWQgdG8gdGhlIHNwZWNpZmllZCBvd25lci4gVGhlIGVudGl0eSBtdXN0IGJlIGF0IGEgbmV4dXMsIGhhdmUgbG9hZGVycywgYW5kIGNvbnRhaW4gZW5vdWdoIG9mIHRoZSByZXF1ZXN0ZWQgY2FyZ28uIFNjaGVkdWxlcyBhIHdyYXAgdGFzayB0aGF0LCBvbiByZXNvbHV0aW9uLCByZW1vdmVzIHRoZSBjYXJnbyBmcm9tIHRoZSBlbnRpdHkgYW5kIG1pbnRzIHRoZSBORlQgdXNpbmcgdGhlIHRlbXBsYXRlIGNvbmZpZ3VyZWQgZm9yIHRoYXQgaXRlbSBpZC4NAAAAAADKrkEDaTY0AAAJY2FyZ29fcm93AAC4ajqTJ0UDaTY0AAANY29udGFpbmVyX3JvdwCqppf57PJUA2k2NAAAD2VudGl0eWdyb3VwX3JvdwAAAJO6bBCNA2k2NAAADGxvY2F0aW9uX3JvdwAAAAAArLuaA2k2NAAACW5leHVzX3JvdwAAYG5NivKaA2k2NAAADW5mdGNvbmZpZ19yb3cAAAAAXOVNrANpNjQAAApwbGF5ZXJfcm93AAAAQO2rsLoDaTY0AAALcmVzZXJ2ZV9yb3cAAAAKTaWtwgNpNjQAAAxzZXF1ZW5jZV9yb3cAAAAAAFBdwwNpNjQAAAhzaGlwX3JvdwAAAAAAlU3GA2k2NAAACXN0YXRlX3JvdwAAAAAArKrPA2k2NAAACXR5cGVzX3JvdwAAUFjTpq7hA2k2NAAADXdhcmVob3VzZV9yb3cBEVNoaXBsb2FkIChTZXJ2ZXIpEVNoaXBsb2FkIChTZXJ2ZXIpAAAAHgAAAABEhaZBDmNhbmNlbF9yZXN1bHRzAAAAAIC8zEUMdGFza19yZXN1bHRzAAAAAHgaq0oMdGFza19yZXN1bHRzAIDPLk+FsEoGc3RyaW5nAAAAAFzVsmEMdGFza19yZXN1bHRzAABgbk2KsmILZ2FtZV9jb25maWcAsHLZ5amyYg1lbnRpdHlfaW5mb1tdAADw2eWpsmILZW50aXR5X2luZm8ATDZJquyyYg9pdGVtZGF0YV9yZXN1bHQAAABYquyyYgppdGVtc19pbmZvACZ12SAas2INbG9jYXRpb25faW5mbwCAySYhGrNiEGxvY2F0aW9uX2Rlcml2ZWQAAFZRJyqzYg5tb2R1bGVzX3Jlc3VsdAAA8OcaNbNiC25lYXJieV9pbmZvAABd0+U1s2IObmZ0aW5mb19yZXN1bHQAALjKm1izYgtwbGF5ZXJfaW5mbwAAUNUhdbNiDnJlY2lwZXNfcmVzdWx0AABW1SF1s2IOcmVjaXBlc19yZXN1bHSAFbqaYnWzYhByZXNvdXJjZXNfcmVzdWx0AIDU2dyMs2IMc3RyYXR1bV9kYXRhgJW7RkqNs2IQZW50aXR5X3N1bW1hcnlbXQCi2ubmqullDHRhc2tfcmVzdWx0cwAAAAAA0LBpC2NoZWNrc3VtMjU2AAAAQITSsGkLY2hlY2tzdW01MTIAAACKXdOQugx0YXNrX3Jlc3VsdHMAAABA7Uixug9yZXNvbHZlX3Jlc3VsdHMAAABXLTzNzQx0YXNrX3Jlc3VsdHMAAAAARLXNzQx0YXNrX3Jlc3VsdHMAAAAAAFCv4Qx0YXNrX3Jlc3VsdHMAAAAAAFDN5Qx0YXNrX3Jlc3VsdHM=');
216
+ const abiBlob = antelope.Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDh0CWFkZG1vZHVsZQAFC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAxtb2R1bGVfaW5kZXgFdWludDgPbW9kdWxlX2NhcmdvX2lkBnVpbnQ2NA90YXJnZXRfY2FyZ29faWQGdWludDY0CGFkZG5leHVzAAMKbmV4dXNfbmFtZQZzdHJpbmcBeAVpbnQ2NAF5BWludDY0B2FkdmFuY2UAAgZyZXZlYWwGc3RyaW5nBmNvbW1pdAtjaGVja3N1bTI1NgVibGVuZAADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BmlucHV0cwxjYXJnb19pdGVtW10GY2FuY2VsAAMLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQFY291bnQGdWludDY0DmNhbmNlbF9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lD2NhbmNlbGxlZF9jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CmNhcmdvX2l0ZW0ABAdpdGVtX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10JY2FyZ29fcm93AAYCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCWNsZWFucnN2cAACBWVwb2NoBnVpbnQ2NAhtYXhfcm93cwZ1aW50NjQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BmNvbW1pdAABBmNvbW1pdAtjaGVja3N1bTI1Ngljb25maWdsb2cAAQZjb25maWcLZ2FtZV9jb25maWcNY29udGFpbmVyX3JvdwAIAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzBnVpbnQzMghjYXBhY2l0eQZ1aW50MzIJY2FyZ29tYXNzBnVpbnQzMghzY2hlZHVsZQlzY2hlZHVsZT8LY29vcmRpbmF0ZXMAAwF4BWludDY0AXkFaW50NjQBegd1aW50MTY/BWNyYWZ0AAULZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQJcmVjaXBlX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIGaW5wdXRzDGNhcmdvX2l0ZW1bXQ1jcmFmdGVyX3N0YXRzAAIFc3BlZWQGdWludDE2BWRyYWluBnVpbnQxNgxjcmVhdGVlbnRpdHkABQVvd25lcgRuYW1lC2VudGl0eV90eXBlBG5hbWULZW50aXR5X25hbWUGc3RyaW5nAXgFaW50NjQBeQVpbnQ2NAZkZXBsb3kABQtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NA5wYWNrZWRfaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0C2VudGl0eV9uYW1lBnN0cmluZwpkZXNjZW50aXR5AAQHaXRlbV9pZAZ1aW50MTYKaHVsbF9zdGF0cwZ1aW50NjQMbW9kdWxlX2l0ZW1zCHVpbnQxNltdDG1vZHVsZV9zdGF0cwh1aW50NjRbXQZlbmFibGUAAQdlbmFibGVkBGJvb2wMZW5lcmd5X3N0YXRzAAIIY2FwYWNpdHkGdWludDE2CHJlY2hhcmdlBnVpbnQxNhRlbnRpdHlfY3VycmVudF9zdGF0ZQACC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzBmVuZXJneQZ1aW50MTYPZW50aXR5X2RlZmF1bHRzAAUSd2FyZWhvdXNlX2NhcGFjaXR5BnVpbnQzMgt3YXJlaG91c2VfegZ1aW50MTYSY29udGFpbmVyX2h1bGxtYXNzBnVpbnQzMhJjb250YWluZXJfY2FwYWNpdHkGdWludDMyC2NvbnRhaW5lcl96BnVpbnQxNgtlbnRpdHlfaW5mbwAYBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb19pdGVtW10HbG9hZGVycw1sb2FkZXJfc3RhdHM/BmVuZXJneQd1aW50MTY/CGh1bGxtYXNzB3VpbnQzMj8HZW5naW5lcw9tb3ZlbWVudF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8IY2FwYWNpdHkHdWludDMyPwhnYXRoZXJlcg9nYXRoZXJlcl9zdGF0cz8GaGF1bGVyDWhhdWxlcl9zdGF0cz8Ed2FycAt3YXJwX3N0YXRzPwdjcmFmdGVyDmNyYWZ0ZXJfc3RhdHM/B2lzX2lkbGUEYm9vbAxjdXJyZW50X3Rhc2sFdGFzaz8UY3VycmVudF90YXNrX2VsYXBzZWQGdWludDMyFmN1cnJlbnRfdGFza19yZW1haW5pbmcGdWludDMyDXBlbmRpbmdfdGFza3MGdGFza1tdB2lkbGVfYXQLdGltZV9wb2ludD8Ic2NoZWR1bGUJc2NoZWR1bGU/CmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQOZW50aXR5X3N1bW1hcnkACAR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzB2lzX2lkbGUEYm9vbA5yZXNvbHZlZF9jb3VudAZ1aW50MzINcGVuZGluZ19jb3VudAZ1aW50MzIQZW50aXR5X3Rhc2tfaW5mbwAECWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQp0YXNrX2NvdW50BXVpbnQ4EHNjaGVkdWxlX3N0YXJ0ZWQKdGltZV9wb2ludA9lbnRpdHlncm91cF9yb3cAAgJpZAZ1aW50NjQMcGFydGljaXBhbnRzDGVudGl0eV9yZWZbXQtnYW1lX2NvbmZpZwADB3ZlcnNpb24GdWludDMyCGRlZmF1bHRzD2VudGl0eV9kZWZhdWx0cwVpdGVtcwppdGVtX2RlZltdBmdhdGhlcgAEBnNvdXJjZQplbnRpdHlfcmVmC2Rlc3RpbmF0aW9uCmVudGl0eV9yZWYHc3RyYXR1bQZ1aW50MTYIcXVhbnRpdHkGdWludDMyDmdhdGhlcmVyX3N0YXRzAAQFeWllbGQGdWludDE2BWRyYWluBnVpbnQxNgVkZXB0aAZ1aW50MTYFc3BlZWQGdWludDE2CWdldGNvbmZpZwAAC2dldGVudGl0aWVzAAIFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQVuYW1lPwlnZXRlbnRpdHkAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQLZ2V0aXRlbWRhdGEAAAhnZXRpdGVtcwAAC2dldGxvY2F0aW9uAAIBeAVpbnQ2NAF5BWludDY0CmdldGxvY2RhdGEAAgF4BWludDY0AXkFaW50NjQKZ2V0bW9kdWxlcwAACWdldG5lYXJieQADC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhyZWNoYXJnZQRib29sCmdldG5mdGluZm8AAAlnZXRwbGF5ZXIAAQdhY2NvdW50BG5hbWUJZ2V0cmVjaXBlAAEOb3V0cHV0X2l0ZW1faWQGdWludDE2CmdldHJlY2lwZXMAAgtsb3dlcl9ib3VuZAZ1aW50MTYFbGltaXQFdWludDgMZ2V0cmVzb3VyY2VzAAAKZ2V0c3RyYXR1bQADAXgFaW50NjQBeQVpbnQ2NAdzdHJhdHVtBnVpbnQxNgxnZXRzdW1tYXJpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/C2dyb3VwdHJhdmVsAAQIZW50aXRpZXMMZW50aXR5X3JlZltdAXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sBGhhc2gAAQV2YWx1ZQZzdHJpbmcHaGFzaDUxMgABBXZhbHVlBnN0cmluZwxoYXVsZXJfc3RhdHMAAwhjYXBhY2l0eQV1aW50OAplZmZpY2llbmN5BnVpbnQxNgVkcmFpbgZ1aW50MTYEaW5pdAABBHNlZWQLY2hlY2tzdW0yNTYIaXRlbV9kZWYABQJpZAZ1aW50MTYEbWFzcwZ1aW50MzIEdHlwZQV1aW50OAdzdWJ0eXBlBXVpbnQ4BHRpZXIFdWludDgPaXRlbWRhdGFfcmVzdWx0AAIFaXRlbXMKaXRlbV9kZWZbXQdyZWNpcGVzDnJlY2lwZXNfcmVzdWx0Cml0ZW1zX2luZm8AAQVpdGVtcwppdGVtX2RlZltdBGpvaW4AAQdhY2NvdW50BG5hbWUMbG9hZGVyX3N0YXRzAAMEbWFzcwZ1aW50MzIGdGhydXN0BnVpbnQxNghxdWFudGl0eQV1aW50OBBsb2NhdGlvbl9kZXJpdmVkAAMMc3RhdGljX3Byb3BzD2xvY2F0aW9uX3N0YXRpYwtlcG9jaF9wcm9wcw5sb2NhdGlvbl9lcG9jaARzaXplBnVpbnQxNg5sb2NhdGlvbl9lcG9jaAADBmFjdGl2ZQRib29sBXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DWxvY2F0aW9uX2luZm8AAgZjb29yZHMLY29vcmRpbmF0ZXMJaXNfc3lzdGVtBGJvb2wMbG9jYXRpb25fcm93AAYCaWQGdWludDY0BW93bmVyBG5hbWULY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb19pdGVtW10Ic2NoZWR1bGUJc2NoZWR1bGU/D2xvY2F0aW9uX3N0YXRpYwAFBmNvb3Jkcwtjb29yZGluYXRlcwR0eXBlDWxvY2F0aW9uX3R5cGUHc3VidHlwZQV1aW50OAVzZWVkMAV1aW50OAVzZWVkMQV1aW50OAxtb2R1bGVfZW50cnkAAgR0eXBlBXVpbnQ4CWluc3RhbGxlZA5wYWNrZWRfbW9kdWxlPwttb2R1bGVfaW5mbwAEAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgttb2R1bGVfdHlwZQV1aW50OAR0aWVyBXVpbnQ4Dm1vZHVsZXNfcmVzdWx0AAEHbW9kdWxlcw1tb2R1bGVfaW5mb1tdDm1vdmVtZW50X3N0YXRzAAIGdGhydXN0BnVpbnQzMgVkcmFpbgZ1aW50MTYLbmVhcmJ5X2luZm8ABQpjYW5fdHJhdmVsBGJvb2wHY3VycmVudBRlbnRpdHlfY3VycmVudF9zdGF0ZQlwcm9qZWN0ZWQUZW50aXR5X2N1cnJlbnRfc3RhdGUKbWF4X2VuZXJneQZ1aW50MTYHc3lzdGVtcw9uZWFyYnlfc3lzdGVtW10NbmVhcmJ5X3N5c3RlbQAECGRpc3RhbmNlBnVpbnQ2NAtlbmVyZ3lfY29zdAZ1aW50NjQLZmxpZ2h0X3RpbWUGdWludDMyCGxvY2F0aW9uDWxvY2F0aW9uX2luZm8JbmV4dXNfcm93AAQCaWQGdWludDY0BW93bmVyBG5hbWUEbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMObmZ0X3NjaGVtYV9kZWYAAgtzY2hlbWFfbmFtZQRuYW1lBmZpZWxkcw5zY2hlbWFfZmllbGRbXRBuZnRfdGVtcGxhdGVfZGVmAAIHaXRlbV9pZAZ1aW50MTYLc2NoZW1hX25hbWUEbmFtZQ1uZnRjb25maWdfcm93AAMHaXRlbV9pZAZ1aW50MTYLdGVtcGxhdGVfaWQFaW50MzILc2NoZW1hX25hbWUEbmFtZQ5uZnRpbmZvX3Jlc3VsdAACB3NjaGVtYXMQbmZ0X3NjaGVtYV9kZWZbXQl0ZW1wbGF0ZXMSbmZ0X3RlbXBsYXRlX2RlZltdBm5vdGlmeQABBWV2ZW50CnRhc2tfZXZlbnQNcGFja2VkX21vZHVsZQACB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAtwbGF5ZXJfaW5mbwAGBW93bmVyBG5hbWUJaXNfcGxheWVyBGJvb2wMY29tcGFueV9uYW1lBnN0cmluZwpzaGlwX2NvdW50BnVpbnQ2NA93YXJlaG91c2VfY291bnQGdWludDY0D2NvbnRhaW5lcl9jb3VudAZ1aW50NjQKcGxheWVyX3JvdwABBW93bmVyBG5hbWUIcmVjaGFyZ2UAAgtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAxyZWNpcGVfaW5wdXQAAwdpdGVtX2lkBnVpbnQxNghjYXRlZ29yeQV1aW50OAhxdWFudGl0eQZ1aW50MzIQcmVjaXBlX2l0ZW1faW5mbwACAmlkBnVpbnQxNgRtYXNzBnVpbnQzMg9yZWNpcGVfcmVzcG9uc2UABw5vdXRwdXRfaXRlbV9pZAZ1aW50MTYLb3V0cHV0X21hc3MGdWludDMyBmlucHV0cw5yZWNpcGVfaW5wdXRbXQpzdGF0X3Nsb3RzFHN0YXRfc2xvdF9yZXNwb25zZVtdDWJsZW5kX3dlaWdodHMFYnl0ZXMLb3V0cHV0X2l0ZW0QcmVjaXBlX2l0ZW1faW5mbwtpbnB1dF9pdGVtcxJyZWNpcGVfaXRlbV9pbmZvW10OcmVjaXBlc19yZXN1bHQAAQdyZWNpcGVzEXJlY2lwZV9yZXNwb25zZVtdC3Jlc2VydmVfcm93AAICaWQGdWludDY0CXJlbWFpbmluZwZ1aW50MzIHcmVzb2x2ZQADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/DXJlc291cmNlX2luZm8ABAJpZAZ1aW50MTYEbWFzcwZ1aW50MzIIY2F0ZWdvcnkFdWludDgEdGllcgV1aW50OA5yZXNvdXJjZV9zdGF0cwADBXN0YXQxBnVpbnQxNgVzdGF0MgZ1aW50MTYFc3RhdDMGdWludDE2EHJlc291cmNlc19yZXN1bHQAAQlyZXNvdXJjZXMPcmVzb3VyY2VfaW5mb1tdCHJtbW9kdWxlAAQLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OA90YXJnZXRfY2FyZ29faWQGdWludDY0CHJtbmZ0Y2ZnAAEHaXRlbV9pZAZ1aW50MTYEc2FsdAABBHNhbHQGdWludDY0CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzY2hlbWFfZmllbGQAAgRuYW1lBnN0cmluZwpmaWVsZF90eXBlBnN0cmluZwxzZXF1ZW5jZV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQZ1aW50NjQJc2V0bmZ0Y2ZnAAMHaXRlbV9pZAZ1aW50MTYLdGVtcGxhdGVfaWQFaW50MzILc2NoZW1hX25hbWUEbmFtZQhzaGlwX3JvdwASAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nBXN0YXRzBnVpbnQ2NAtjb29yZGluYXRlcwtjb29yZGluYXRlcwhodWxsbWFzcwd1aW50MzI/CGNhcGFjaXR5B3VpbnQzMj8GZW5lcmd5B3VpbnQxNj8JY2FyZ29tYXNzBnVpbnQzMgdlbmdpbmVzD21vdmVtZW50X3N0YXRzPwlnZW5lcmF0b3INZW5lcmd5X3N0YXRzPwdsb2FkZXJzDWxvYWRlcl9zdGF0cz8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwZoYXVsZXINaGF1bGVyX3N0YXRzPwdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHNjaGVkdWxlCXNjaGVkdWxlPwpzcGF3bmNhcmdvAAMJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQLc3Bhd25wYWNrZWQABAllbnRpdHlfaWQGdWludDY0B2l0ZW1faWQGdWludDE2Cmh1bGxfc3RhdHMGdWludDY0CWluc3RhbGxlZA9wYWNrZWRfbW9kdWxlW10Lc3Bhd25zZWVkZWQABAllbnRpdHlfaWQGdWludDY0B2l0ZW1faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NAVzdGF0cwZ1aW50NjQSc3RhdF9zbG90X3Jlc3BvbnNlAAEHc291cmNlcw1zdGF0X3NvdXJjZVtdC3N0YXRfc291cmNlAAILaW5wdXRfaW5kZXgFdWludDgQaW5wdXRfc3RhdF9pbmRleAV1aW50OAlzdGF0ZV9yb3cABgdlbmFibGVkBGJvb2wFZXBvY2gGdWludDMyBHNhbHQGdWludDY0BXNoaXBzBnVpbnQzMgRzZWVkC2NoZWNrc3VtMjU2BmNvbW1pdAtjaGVja3N1bTI1NgxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABAdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzIEdGFzawAIBHR5cGUFdWludDgIZHVyYXRpb24GdWludDMyCmNhbmNlbGFibGUFdWludDgLY29vcmRpbmF0ZXMMY29vcmRpbmF0ZXM/BWNhcmdvDGNhcmdvX2l0ZW1bXQxlbnRpdHl0YXJnZXQLZW50aXR5X3JlZj8LZW50aXR5Z3JvdXAHdWludDY0PwtlbmVyZ3lfY29zdAd1aW50MTY/CnRhc2tfZXZlbnQACQpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDE2Pwx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10IdHJhbnNmZXIABwtzb3VyY2VfdHlwZQRuYW1lCXNvdXJjZV9pZAZ1aW50NjQJZGVzdF90eXBlBG5hbWUHZGVzdF9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0CHF1YW50aXR5BnVpbnQzMgZ0cmF2ZWwABQtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQIcmVjaGFyZ2UEYm9vbAl0eXBlc19yb3cAAwJpZAZ1aW50NjQTZW50aXR5X3N1bW1hcnlfdHlwZQ5lbnRpdHlfc3VtbWFyeRBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnDXdhcmVob3VzZV9yb3cACwJpZAZ1aW50NjQFb3duZXIEbmFtZQRuYW1lBnN0cmluZwVzdGF0cwZ1aW50NjQLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMIaHVsbG1hc3MHdWludDMyPwhjYXBhY2l0eQd1aW50MzI/CWNhcmdvbWFzcwZ1aW50MzIHbG9hZGVycw1sb2FkZXJfc3RhdHM/B21vZHVsZXMObW9kdWxlX2VudHJ5W10Ic2NoZWR1bGUJc2NoZWR1bGU/BHdhcnAABAtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQKd2FycF9zdGF0cwABBXJhbmdlBnVpbnQzMgR3aXBlAAAMd2lwZXNlcXVlbmNlAAAEd3JhcAAFBW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CGNhcmdvX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQ0AABQUScqUzIJYWRkbW9kdWxlxwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbW9kdWxlCnN1bW1hcnk6ICdJbnN0YWxsIGEgbW9kdWxlIGludG8gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YWxsIGEgbW9kdWxlIGZyb20gY2FyZ28gaW50byBhIG1vZHVsZSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSB0eXBlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgc2xvdCB0eXBlLiBUaGUgbW9kdWxlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIGNhcmdvIHVwb24gaW5zdGFsbGF0aW9uLgAAAFh3NVMyCGFkZG5leHVzpwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbmV4dXMKc3VtbWFyeTogJ0FkZCBhIG5leHVzIGxvY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDcmVhdGUgYSBuZXcgbmV4dXMgZW50aXR5IGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy4gTmV4dXNlcyBhcmUgb3duZWQgYnkgdGhlIGNvbnRyYWN0IGFuZCBzZXJ2ZSBhcyBmaXhlZCBnYXRoZXJpbmcgcG9pbnRzIHdoZXJlIHBsYXllcnMgY2FuIHdyYXAsIHVud3JhcCwgZGVwbG95LCBhbmQgb3RoZXJ3aXNlIGludGVyYWN0IHdpdGggTkZULWJhY2tlZCBhc3NldHMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAABAoWl2MgdhZHZhbmNl0wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWR2YW5jZQpzdW1tYXJ5OiAnQWR2YW5jZSB0dXJuJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpBZHZhbmNlIHRoZSBnYW1lIHRvIHRoZSBuZXh0IHR1cm4uAAAAAIA0VTwFYmxlbmT8Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBibGVuZApzdW1tYXJ5OiAnQmxlbmQgY2FyZ28gc3RhY2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDb21iaW5lIG11bHRpcGxlIGNhcmdvIHN0YWNrcyBvZiB0aGUgc2FtZSBpdGVtIHR5cGUgaW50byBhIHNpbmdsZSBzdGFjayB3aXRoIG5ldyBibGVuZGVkIHN0YXRzLiBBbGwgaW5wdXQgc3RhY2tzIG11c3Qgc2hhcmUgdGhlIHNhbWUgaXRlbSBpZC4gVGhlIG91dHB1dCBzdGFjayBoYXMgdGhlIGNvbWJpbmVkIHF1YW50aXR5IG9mIGFsbCBpbnB1dHMuAAAAAESFpkEGY2FuY2VswgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2FuY2VsCnN1bW1hcnk6ICdDYW5jZWwgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYW5jZWwgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGFza3MgZnJvbSB0aGUgZW5kIG9mIGFuIGVudGl0eSdzIHNjaGVkdWxlLiBUYXNrcyB0aGF0IGFyZSBpbW11dGFibGUgYW5kIGluIHByb2dyZXNzIGNhbm5vdCBiZSBjYW5jZWxsZWQuAACoG99pVEQJY2xlYW5yc3Zw7AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYW5yc3ZwCnN1bW1hcnk6ICdDbGVhbiB1cCBwYXN0IGVwb2NoIHJlc2VydmVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFcmFzZSByZXNlcnZlIHRhYmxlIHJvd3MgZnJvbSBhIHBhc3QgZXBvY2guIENhbm5vdCBjbGVhbiB0aGUgY3VycmVudCBvciBmdXR1cmUgZXBvY2hzLiBUaGUgbWF4X3Jvd3MgcGFyYW1ldGVyIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIGVyYXNlZCBwZXIgY2FsbCB0byBsaW1pdCBDUFUgdXNhZ2UuAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABkJyVFBmNvbW1pdOwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbW1pdApzdW1tYXJ5OiAnU2V0IGNvbW1pdCB2YWx1ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2V0IHRoZSBpbml0aWFsIGNvbW1pdCB2YWx1ZSBkdXJpbmcgZ2FtZSBpbml0aWFsaXphdGlvbi4AAGA0MrcmRQljb25maWdsb2fdAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjb25maWdsb2cKc3VtbWFyeTogJ0xvZyBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IGxvZ3MgdGhlIGN1cnJlbnQgZ2FtZSBjb25maWd1cmF0aW9uLiBDYWxsZWQgaW5saW5lIGFmdGVyIGluaXRpYWxpemF0aW9uIHRvIGJyb2FkY2FzdCBjb25maWcgdmlhIGFjdGlvbiB0cmFjZXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAAAAgLzMRQVjcmFmdMgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNyYWZ0CnN1bW1hcnk6ICdDcmFmdCBpdGVtcyBmcm9tIGEgcmVjaXBlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2Zvcm0gY2FyZ28gaXRlbXMgaW50byBhIG5ldyBpdGVtIHVzaW5nIGEgcmVjaXBlLiBUaGUgZW50aXR5IG11c3QgaGF2ZSBhIGNyYWZ0ZXIgbW9kdWxlIGluc3RhbGxlZC4gQ29uc3VtZXMgZW5lcmd5IGFuZCBzY2hlZHVsZXMgYSBjcmFmdGluZyB0YXNrIHdpdGggZHVyYXRpb24gYmFzZWQgb24gdG90YWwgaW5wdXQgbWFzcyBhbmQgY3JhZnRlciBzcGVlZC4gSW5wdXQgcXVhbnRpdGllcyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlIHJlY2lwZSByZXF1aXJlbWVudHMu4LPLU6ls1EUMY3JlYXRlZW50aXR5vwEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY3JlYXRlZW50aXR5CnN1bW1hcnk6ICdERUJVRzogY3JlYXRlIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAAB4GqtKBmRlcGxveewCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlcGxveQpzdW1tYXJ5OiAnRGVwbG95IGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVW5wYWNrIGEgcGFja2VkIGVudGl0eSBpdGVtIChwYWNrZWQgc2hpcCBvciBwYWNrZWQgY29udGFpbmVyKSBmcm9tIGNhcmdvLCBzY2hlZHVsaW5nIGEgZGVwbG95IHRhc2sgdGhhdCBjcmVhdGVzIHRoZSBuZXcgZW50aXR5IGF0IHRoZSBkZXBsb3lpbmcgZW50aXR5J3MgbG9jYXRpb24gdXBvbiByZXNvbHV0aW9uLgCAzy5PhbBKCmRlc2NlbnRpdHn9Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBkZXNjZW50aXR5CnN1bW1hcnk6ICdEZXNjcmliZSBhIHBhY2tlZCBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gc3RyaW5nIGZvciBhIHBhY2tlZCBlbnRpdHksIGRlcml2ZWQgZnJvbSB0aGUgZW50aXR5IGl0ZW0gaWQsIGh1bGwgc3RhdHMsIGFuZCB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgbW9kdWxlIGl0ZW0gaWRzIGFuZCBzdGF0cy4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgTkZUIHJlbmRlcmVycyB0byBkaXNwbGF5IHBhY2tlZCBlbnRpdGllcy4gQ2FsbGluZyB0aGlzIGFjdGlvbiBkb2VzIG5vdCBtb2RpZnkgY29udHJhY3Qgc3RhdGUuAAAAAKh4zFQGZW5hYmxl3QEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZW5hYmxlCnN1bW1hcnk6ICdTZXQgZW5hYmxlZCBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRW5hYmxlIG9yIGRpc2FibGUgdGhpcyBnYW1lIG9mIFNoaXBsb2FkLgAAAABc1bJhBmdhdGhlcpcDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdhdGhlcgpzdW1tYXJ5OiAnR2F0aGVyIHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKR2F0aGVyIHJlc291cmNlcyBhdCB0aGUgc2hpcCdzIGN1cnJlbnQgbG9jYXRpb24uIE9ubHkgd29ya3MgYXQgZ2F0aGVyYWJsZSBsb2NhdGlvbiB0eXBlcy4gU2NoZWR1bGVzIGEgZ2F0aGVyIHRhc2sgdGhhdCBjb25zdW1lcyBlbmVyZ3kgYW5kIHlpZWxkcyBjYXJnbyBiYXNlZCBvbiB0aGUgc2hpcCdzIGdhdGhlcmVyIHN0YXRzIGFuZCB0aGUgbG9jYXRpb24ncyByZXNvdXJjZSBjb21wb3NpdGlvbi4AAGBuTYqyYglnZXRjb25maWfKAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRjb25maWcKc3VtbWFyeTogJ0dldCBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgdGhlIGdhbWUgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgZGVmYXVsdCBlbnRpdHkgc3RhdHMgZm9yIHdhcmVob3VzZXMgYW5kIGNvbnRhaW5lcnMsIGFuZCB0aGUgZnVsbCBpdGVtIGRlZmluaXRpb25zIHRhYmxlLgCwctnlqbJiC2dldGVudGl0aWVzpAItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0ZW50aXRpZXMKc3VtbWFyeTogJ0dldCBhbGwgZW50aXRpZXMgZm9yIGEgcGxheWVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXR1cm5zIGZ1bGwgZW50aXR5IGluZm8gZm9yIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllci4gT3B0aW9uYWxseSBmaWx0ZXIgYnkgZW50aXR5IHR5cGUuAADw2eWpsmIJZ2V0ZW50aXR5ogItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0ZW50aXR5CnN1bW1hcnk6ICdHZXQgZW50aXR5IHN0YXRlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFuIGVudGl0eSBpbmNsdWRpbmcgaWRlbnRpdHksIGNhcmdvLCBzY2hlZHVsZSBzdGF0ZSwgYW5kIHR5cGUtc3BlY2lmaWMgZmllbGRzLgBMNkmq7LJiC2dldGl0ZW1kYXRh3AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbWRhdGEKc3VtbWFyeTogJ0dldCBmdWxsIGl0ZW0gY2F0YWxvZycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGNvbXBsZXRlIGl0ZW0gY2F0YWxvZyBhcyB0aGUgY29udHJhY3Qgc2VlcyBpdCwgaW5jbHVkaW5nIHR5cGUsIHN1YnR5cGUsIHRpZXIsIG1hc3MsIGFuZCBvdGhlciBzdGF0aWMgbWV0YWRhdGEuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgYW5kIGNsaWVudHMgdG8gbWlycm9yIHRoZSBjb250cmFjdCdzIGl0ZW0gZGVmaW5pdGlvbnMuIENhbGxpbmcgdGhpcyBhY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGNvbnRyYWN0IHN0YXRlLgAAAFiq7LJiCGdldGl0ZW1zmgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXMKc3VtbWFyeTogJ0dldCBhbGwgYXZhaWxhYmxlIGl0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGEgbGlzdCBvZiBhbGwgaXRlbXMgaW4gdGhlIGdhbWUgaW5jbHVkaW5nIHRoZWlyIGlkLCBiYXNlIHByaWNlLCBhbmQgbWFzcy4AJnXZIBqzYgtnZXRsb2NhdGlvbuICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2F0aW9uCnN1bW1hcnk6ICdHZXQgbG9jYXRpb24gaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2NhdGlvbiBpbmNsdWRpbmcgd2hldGhlciBhIHN5c3RlbSBleGlzdHMsIGFuZCBmb3IgZWFjaCBpdGVtOiBwcmljZSwgc3VwcGx5LCByYXJpdHkgbXVsdGlwbGllciwgYW5kIGxvY2F0aW9uIG11bHRpcGxpZXIuAIDJJiEas2IKZ2V0bG9jZGF0Yf4CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2RhdGEKc3VtbWFyeTogJ0dldCBkZXJpdmVkIGxvY2F0aW9uIGRhdGEnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgZGVyaXZlZCBsb2NhdGlvbiBkYXRhIGluY2x1ZGluZyBzdGF0aWMgcHJvcGVydGllcyAodHlwZSwgZGlmZmljdWx0eSwgc2VlZHMpIGZyb20gdGhlIGdhbWUgc2VlZCBhbmQgZXBvY2gtc3BlY2lmaWMgcHJvcGVydGllcyAoYWN0aXZlLCBzZWVkcykgZnJvbSB0aGUgY3VycmVudCBlcG9jaCBzZWVkLgAAVlEnKrNiCmdldG1vZHVsZXO0Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRtb2R1bGVzCnN1bW1hcnk6ICdHZXQgYWxsIG1vZHVsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIG1vZHVsZXMsIGluY2x1ZGluZyBlYWNoIG1vZHVsZSdzIGlkLCBtYXNzLCBzdWJ0eXBlLCBhbmQgdGllci4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBlbnVtZXJhdGUgaW5zdGFsbGFibGUgZXF1aXBtZW50LiBDYWxsaW5nIHRoaXMgYWN0aW9uIGRvZXMgbm90IG1vZGlmeSBjb250cmFjdCBzdGF0ZS4AAPDnGjWzYglnZXRuZWFyYnneAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRuZWFyYnkKc3VtbWFyeTogJ0dldCBuZWFyYnkgcmVhY2hhYmxlIHN5c3RlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgbmVhcmJ5IHN5c3RlbXMgcmVhY2hhYmxlIGJ5IGFuIGVudGl0eSBmcm9tIGl0cyBwcm9qZWN0ZWQgbG9jYXRpb24uIFJldHVybnMgY3VycmVudCBzdGF0ZSAod2l0aCBjb21wbGV0ZWQgdGFza3MgcmVzb2x2ZWQpLCBwcm9qZWN0ZWQgc3RhdGUgKGFmdGVyIGFsbCBzY2hlZHVsZWQgdGFza3MpLCBhbmQgYSBsaXN0IG9mIHJlYWNoYWJsZSBzeXN0ZW1zIHdpdGggZGlzdGFuY2UsIGVuZXJneSBjb3N0LCBmbGlnaHQgdGltZSwgYW5kIG1hcmtldCBpbmZvcm1hdGlvbi4AAF3T5TWzYgpnZXRuZnRpbmZvpAQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bmZ0aW5mbwpzdW1tYXJ5OiAnR2V0IE5GVCBzY2hlbWEgYW5kIHRlbXBsYXRlIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBBdG9taWNBc3NldHMgc2NoZW1hcyBhbmQgdGVtcGxhdGVzIHRoZSBnYW1lIGNvbnRyYWN0IGV4cGVjdHMsIHBsdXMgdGhlIGN1cnJlbnQgYGl0ZW1faWQg4oaSICh0ZW1wbGF0ZV9pZCwgc2NoZW1hX25hbWUpYCBtYXBwaW5nIHN0b3JlZCBpbiB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gc3luYyBhdG9taWNhc3NldHMgc3RhdGUgd2l0aCB0aGUgY29udHJhY3QuIENhbGxpbmcgdGhpcyBhY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGNvbnRyYWN0IHN0YXRlLgAAuMqbWLNiCWdldHBsYXllcv0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHBsYXllcgpzdW1tYXJ5OiAnR2V0IHBsYXllciBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHBsYXllciBpbmNsdWRpbmcgYmFsYW5jZSwgZGVidCwgbmV0d29ydGgsIGVudGl0eSBjb3VudHMsIGFuZCBwcmljaW5nIGZvciBuZXh0IHB1cmNoYXNlcy4gUmV0dXJucyBpc19wbGF5ZXI9ZmFsc2UgaWYgdGhlIGFjY291bnQgaGFzIG5vdCBqb2luZWQgdGhlIGdhbWUuAABQ1SF1s2IJZ2V0cmVjaXBl2gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVjaXBlCnN1bW1hcnk6ICdHZXQgYSBzaW5nbGUgY3JhZnRpbmcgcmVjaXBlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgcmVjaXBlIHdob3NlIG91dHB1dCBtYXRjaGVzIHRoZSBnaXZlbiBpdGVtIGlkLCBpbmNsdWRpbmcgaXRzIGlucHV0cywgYmxlbmQgd2VpZ2h0cywgc3RhdCBzbG90cywgYW5kIHJlc29sdmVkIGl0ZW0gbWFzcyBpbmZvLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRpc3BsYXkgY3JhZnRpbmcgcmVxdWlyZW1lbnRzLiBDYWxsaW5nIHRoaXMgYWN0aW9uIGRvZXMgbm90IG1vZGlmeSBjb250cmFjdCBzdGF0ZS4AAFbVIXWzYgpnZXRyZWNpcGVz4AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVjaXBlcwpzdW1tYXJ5OiAnTGlzdCBjcmFmdGluZyByZWNpcGVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyBhIHBhZ2luYXRlZCBsaXN0IG9mIGNyYWZ0aW5nIHJlY2lwZXMgc3RhcnRpbmcgYXQgdGhlIHByb3ZpZGVkIGxvd2VyIGJvdW5kIG91dHB1dCBpdGVtIGlkLCB1cCB0byB0aGUgc3BlY2lmaWVkIGxpbWl0LiBFYWNoIGVudHJ5IGluY2x1ZGVzIGlucHV0cywgYmxlbmQgd2VpZ2h0cywgc3RhdCBzbG90cywgYW5kIHJlc29sdmVkIGl0ZW0gbWFzcyBpbmZvLiBDYWxsaW5nIHRoaXMgYWN0aW9uIGRvZXMgbm90IG1vZGlmeSBjb250cmFjdCBzdGF0ZS6AFbqaYnWzYgxnZXRyZXNvdXJjZXO7Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZXNvdXJjZXMKc3VtbWFyeTogJ0dldCBhbGwgcmVzb3VyY2UgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBzdWJzZXQgb2YgaXRlbXMgY2xhc3NpZmllZCBhcyByZXNvdXJjZXMsIGluY2x1ZGluZyBlYWNoIHJlc291cmNlJ3MgaWQsIG1hc3MsIHN1YnR5cGUsIGFuZCB0aWVyLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGVudW1lcmF0ZSBnYXRoZXJhYmxlIG1hdGVyaWFscy4gQ2FsbGluZyB0aGlzIGFjdGlvbiBkb2VzIG5vdCBtb2RpZnkgY29udHJhY3Qgc3RhdGUuAIDU2dyMs2IKZ2V0c3RyYXR1bdICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHN0cmF0dW0Kc3VtbWFyeTogJ0dldCByZXNvdXJjZSBzdHJhdHVtIGRhdGEnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhIGZvciBhIHNwZWNpZmljIGRlcHRoIGxheWVyIGF0IGEgY29vcmRpbmF0ZSwgaW5jbHVkaW5nIHRoZSBzdHJhdHVtIHNlZWQgaW5mbyBhbmQgZGVyaXZlZCByZXNvdXJjZSBzdGF0cy6AlbtGSo2zYgxnZXRzdW1tYXJpZXPoAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdW1tYXJpZXMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc3VtbWFyaWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBsaWdodHdlaWdodCBzdW1tYXJpZXMgb2YgYWxsIGVudGl0aWVzIG93bmVkIGJ5IGEgcGxheWVyIGluY2x1ZGluZyB0eXBlLCBpZCwgb3duZXIsIG5hbWUsIGxvY2F0aW9uLCBhbmQgaWRsZSBzdGF0dXMuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgCi2ubmqullC2dyb3VwdHJhdmVsmgQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ3JvdXB0cmF2ZWwKc3VtbWFyeTogJ01vdmUgbXVsdGlwbGUgZW50aXRpZXMgdG9nZXRoZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIGdyb3VwIHRyYXZlbCBmb3IgbXVsdGlwbGUgZW50aXRpZXMgdG8gYSBkZXN0aW5hdGlvbi4gQWxsIGVudGl0aWVzIG11c3QgYmUgYXQgdGhlIHNhbWUgbG9jYXRpb24gYW5kIG93bmVkIGJ5IHRoZSBjYWxsZXIuIEF0IGxlYXN0IG9uZSBlbnRpdHkgd2l0aCBlbmdpbmVzIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhydXN0LiBGbGlnaHQgZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBmcm9tIGNvbWJpbmVkIHRocnVzdCBhbmQgdG90YWwgbWFzcyBvZiBhbGwgZW50aXRpZXMuIENyZWF0ZXMgYW4gZW50aXR5Z3JvdXAgZm9yIGF0b21pYyByZXNvbHV0aW9uIGFuZCBjYW5jZWxsYXRpb24uAAAAAADQsGkEaGFzaPgBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2gKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGEyNTYgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhMjU2IGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4AAABAhNKwaQdoYXNoNTEy+wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaGFzaDUxMgpzdW1tYXJ5OiAnQ2FsY3VsYXRlIHNoYTUxMiBoYXNoJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYWxjdWxhdGVzIHRoZSBzaGE1MTIgaGFzaCBvZiBhIHN0cmluZyBiYXNlZCB1c2luZyB0aGUgZ2FtZSBzZWVkLgAAAAAAkN10BGluaXT6AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBpbml0CnN1bW1hcnk6ICdJbml0aWFsaXplIGdhbWUgc2VlZCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhbGl6ZSBhIHRoZSBnYW1lcyBzZWVkIGFuZCBzZWVkIHZhbHVlcyB0byBib290c3RyYXAgZ2FtZSBzdGF0ZS4AAAAAADAdfQRqb2luxAEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogam9pbgpzdW1tYXJ5OiAnSm9pbiBhIGdhbWUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkpvaW4gYSBnYW1lIG9mIFNoaXBsb2FkAAAAAPjlMp0Gbm90aWZ5igMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogbm90aWZ5CnN1bW1hcnk6ICdUYXNrIGxpZmVjeWNsZSBub3RpZmljYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IG5vdGlmaWVzIGVudGl0eSBvd25lcnMgb2YgdGFzayBsaWZlY3ljbGUgZXZlbnRzIChyZXNvbHZlZCwgY2FuY2VsbGVkKS4gQ2FsbGVkIGlubGluZSB3aGVuIHRhc2tzIGNoYW5nZSBzdGF0ZS4gVXNlcyByZXF1aXJlX3JlY2lwaWVudCB0byBlbmFibGUgb2ZmLWNoYWluIG1vbml0b3JpbmcgdmlhIGFjdGlvbiB0cmFjZXMuAAAAil3TkLoIcmVjaGFyZ2XNAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiByZWNoYXJnZQpzdW1tYXJ5OiAnUmVjaGFyZ2Ugc2hpcCBlbmVyZ3knCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClNjaGVkdWxlIGEgcmVjaGFyZ2UgdGFzayBmb3IgYW4gZW50aXR5IHRvIHJlc3RvcmUgZW5lcmd5IHRvIGZ1bGwgY2FwYWNpdHkuIFRoZSByZWNoYXJnZSBkdXJhdGlvbiBkZXBlbmRzIG9uIGN1cnJlbnQgZW5lcmd5IGxldmVsIGFuZCByZWNoYXJnZSByYXRlLgAAAEDtSLG6B3Jlc29sdmXQAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiByZXNvbHZlCnN1bW1hcnk6ICdDb21wbGV0ZSBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlc29sdmUgY29tcGxldGVkIHRhc2tzIGluIGFuIGVudGl0eSdzIHNjaGVkdWxlLCBhcHBseWluZyB0aGVpciBlZmZlY3RzIChyZWNoYXJnZSBlbmVyZ3ksIHVwZGF0ZSBsb2NhdGlvbiwgbG9hZC91bmxvYWQgY2FyZ28pLiBJZiBjb3VudCBpcyBzcGVjaWZpZWQsIHJlc29sdmUgZXhhY3RseSB0aGF0IG1hbnkgdGFza3M7IG90aGVyd2lzZSByZXNvbHZlIGFsbCBjb21wbGV0ZWQgdGFza3MuIEZhaWxzIGlmIGNvdW50IGV4Y2VlZHMgdGhlIG51bWJlciBvZiBjb21wbGV0ZWQgdGFza3MuAAAAKupEpbwIcm1tb2R1bGW8Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBybW1vZHVsZQpzdW1tYXJ5OiAnUmVtb3ZlIGEgbW9kdWxlIGZyb20gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZW1vdmUgYW4gaW5zdGFsbGVkIG1vZHVsZSBmcm9tIGEgc2xvdCBvbiBhIGxpdmUgZW50aXR5IG9yIGEgcGFja2VkIGVudGl0eSBpbiBjYXJnby4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBubyBzY2hlZHVsZWQgdGFza3MuIFRoZSBtb2R1bGUgaXMgcmV0dXJuZWQgdG8gY2FyZ28uIEZhaWxzIGlmIHRoZSBlbnRpdHkgZG9lcyBub3QgaGF2ZSBlbm91Z2ggY2FyZ28gY2FwYWNpdHkgdG8gaG9sZCB0aGUgcmV0dXJuZWQgbW9kdWxlLgAAAGyhvKa8CHJtbmZ0Y2ZnoQMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcm1uZnRjZmcKc3VtbWFyeTogJ1JlbW92ZSBORlQgdGVtcGxhdGUgbWFwcGluZyBmb3IgYW4gaXRlbScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVtb3ZlIHRoZSBBdG9taWNBc3NldHMgdGVtcGxhdGUgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIGlkIGZyb20gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBBZnRlciByZW1vdmFsIHRoZSBpdGVtIGNhbiBubyBsb25nZXIgYmUgd3JhcHBlZCBvciB1bndyYXBwZWQgdW50aWwgYSBuZXcgbWFwcGluZyBpcyBzZXQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAAAAAJCjwQRzYWx02AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc2FsdApzdW1tYXJ5OiAnQXBwZW5kIFNhbHQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkFkZCBhZGRpdGlvbmFsIHNhbHQgdG8gdGhlIG5leHQgZXBvY2ggc2VlZC4AAGAL5TWzwglzZXRuZnRjZmfEAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzZXRuZnRjZmcKc3VtbWFyeTogJ1NldCBORlQgdGVtcGxhdGUgbWFwcGluZyBmb3IgYW4gaXRlbScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQmluZCBhbiBpdGVtIGlkIHRvIGFuIEF0b21pY0Fzc2V0cyB0ZW1wbGF0ZSBpZCBhbmQgc2NoZW1hIG5hbWUuIFVzZWQgdG8gY29uZmlndXJlIGhvdyB0aGUgY29udHJhY3QgbWludHMgYW5kIHJlY29nbml6ZXMgTkZUcyBmb3IgYSBnaXZlbiBpdGVtLiBJbnNlcnRzIGEgbmV3IG1hcHBpbmcgaWYgb25lIGRvZXMgbm90IGV4aXN0LCBvciB1cGRhdGVzIHRoZSBleGlzdGluZyBtYXBwaW5nLiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAABl16DJTcUKc3Bhd25jYXJnb8UBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNwYXduY2FyZ28Kc3VtbWFyeTogJ0RFQlVHOiBzcGF3biBjYXJnbyBvbiBhbiBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AkoLI1MlNxQtzcGF3bnBhY2tlZOcBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNwYXducGFja2VkCnN1bW1hcnk6ICdERUJVRzogc3Bhd24gYSBwYWNrZWQgZW50aXR5IHdpdGggaW5zdGFsbGVkIG1vZHVsZXMgb24gYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAJJKSuHJTcULc3Bhd25zZWVkZWTNAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzcGF3bnNlZWRlZApzdW1tYXJ5OiAnREVCVUc6IHNwYXduIHNlZWRlZCBjYXJnbyBvbiBhbiBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAABXLTzNzQh0cmFuc2ZlcsgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYW5zZmVyCnN1bW1hcnk6ICdUcmFuc2ZlciBjYXJnbyBiZXR3ZWVuIGVudGl0aWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2ZlciBjYXJnbyBiZXR3ZWVuIHR3byBlbnRpdGllcyBhdCB0aGUgc2FtZSBsb2NhdGlvbi4gQm90aCBlbnRpdGllcyBtdXN0IGJlIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIGF0IGxlYXN0IG9uZSBtdXN0IGhhdmUgbG9hZGVycy4gQ3JlYXRlcyBsb2FkIGFuZCB1bmxvYWQgdGFza3Mgb24gYm90aCBlbnRpdGllcyB3aXRoIGR1cmF0aW9uIGJhc2VkIG9uIGNvbWJpbmVkIGxvYWRlciBjYXBhY2l0eSBhbmQgWi1kaXN0YW5jZSBiZXR3ZWVuIHRoZW0uAAAAAES1zc0GdHJhdmVs+wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIGEgc2hpcCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhdGUgdHJhdmVsIG9mIGFuIGVudGl0eSBmcm9tIGl0cyBjdXJyZW50IGxvY2F0aW9uIHRvIGEgbmV3IGRlc3RpbmF0aW9uLgAAAAAAUK/hBHdhcnCfAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3YXJwCnN1bW1hcnk6ICdXYXJwIHRvIGEgZGVzdGluYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluc3RhbnRseSB0ZWxlcG9ydCBhbiBlbnRpdHkgdG8gYSBkZXN0aW5hdGlvbiBzeXN0ZW0uIFJlcXVpcmVzIHdhcnAgY2FwYWJpbGl0eSwgZnVsbCBlbmVyZ3ksIGVtcHR5IGNhcmdvLCBhbmQgYW4gZW1wdHkgc2NoZWR1bGUuIFRoZSBkZXN0aW5hdGlvbiBtdXN0IGJlIGEgdmFsaWQgc3lzdGVtIHdpdGhpbiB3YXJwIHJhbmdlLiBSZXNvbHZlcyBpbW1lZGlhdGVseSBhcyBhIHplcm8tZHVyYXRpb24gdGFzay4AAAAAAKCq4wR3aXBlsgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2lwZQpzdW1tYXJ5OiAnREVCVUc6IHdpcGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0toNBU2iqsquMMd2lwZXNlcXVlbmNlwgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2lwZXNlcXVlbmNlCnN1bW1hcnk6ICdERUJVRzogd2lwZXNlcXVlbmNlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAAAAUM3lBHdyYXD+Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3cmFwCnN1bW1hcnk6ICdXcmFwIGNhcmdvIGludG8gYW4gTkZUJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpXcmFwIGEgcXVhbnRpdHkgb2YgY2FyZ28gZnJvbSBhbiBlbnRpdHkgaW50byBhbiBBdG9taWNBc3NldHMgTkZUIG1pbnRlZCB0byB0aGUgc3BlY2lmaWVkIG93bmVyLiBUaGUgZW50aXR5IG11c3QgYmUgYXQgYSBuZXh1cywgaGF2ZSBsb2FkZXJzLCBhbmQgY29udGFpbiBlbm91Z2ggb2YgdGhlIHJlcXVlc3RlZCBjYXJnby4gU2NoZWR1bGVzIGEgd3JhcCB0YXNrIHRoYXQsIG9uIHJlc29sdXRpb24sIHJlbW92ZXMgdGhlIGNhcmdvIGZyb20gdGhlIGVudGl0eSBhbmQgbWludHMgdGhlIE5GVCB1c2luZyB0aGUgdGVtcGxhdGUgY29uZmlndXJlZCBmb3IgdGhhdCBpdGVtIGlkLg0AAAAAAMquQQNpNjQAAAljYXJnb19yb3cAALhqOpMnRQNpNjQAAA1jb250YWluZXJfcm93AKqml/ns8lQDaTY0AAAPZW50aXR5Z3JvdXBfcm93AAAAk7psEI0DaTY0AAAMbG9jYXRpb25fcm93AAAAAACsu5oDaTY0AAAJbmV4dXNfcm93AABgbk2K8poDaTY0AAANbmZ0Y29uZmlnX3JvdwAAAABc5U2sA2k2NAAACnBsYXllcl9yb3cAAABA7auwugNpNjQAAAtyZXNlcnZlX3JvdwAAAApNpa3CA2k2NAAADHNlcXVlbmNlX3JvdwAAAAAAUF3DA2k2NAAACHNoaXBfcm93AAAAAACVTcYDaTY0AAAJc3RhdGVfcm93AAAAAACsqs8DaTY0AAAJdHlwZXNfcm93AABQWNOmruEDaTY0AAANd2FyZWhvdXNlX3JvdwERU2hpcGxvYWQgKFNlcnZlcikRU2hpcGxvYWQgKFNlcnZlcikAAAAeAAAAAESFpkEOY2FuY2VsX3Jlc3VsdHMAAAAAgLzMRQx0YXNrX3Jlc3VsdHMAAAAAeBqrSgx0YXNrX3Jlc3VsdHMAgM8uT4WwSgZzdHJpbmcAAAAAXNWyYQx0YXNrX3Jlc3VsdHMAAGBuTYqyYgtnYW1lX2NvbmZpZwCwctnlqbJiDWVudGl0eV9pbmZvW10AAPDZ5amyYgtlbnRpdHlfaW5mbwBMNkmq7LJiD2l0ZW1kYXRhX3Jlc3VsdAAAAFiq7LJiCml0ZW1zX2luZm8AJnXZIBqzYg1sb2NhdGlvbl9pbmZvAIDJJiEas2IQbG9jYXRpb25fZGVyaXZlZAAAVlEnKrNiDm1vZHVsZXNfcmVzdWx0AADw5xo1s2ILbmVhcmJ5X2luZm8AAF3T5TWzYg5uZnRpbmZvX3Jlc3VsdAAAuMqbWLNiC3BsYXllcl9pbmZvAABQ1SF1s2IOcmVjaXBlc19yZXN1bHQAAFbVIXWzYg5yZWNpcGVzX3Jlc3VsdIAVuppidbNiEHJlc291cmNlc19yZXN1bHQAgNTZ3IyzYgxzdHJhdHVtX2RhdGGAlbtGSo2zYhBlbnRpdHlfc3VtbWFyeVtdAKLa5uaq6WUMdGFza19yZXN1bHRzAAAAAADQsGkLY2hlY2tzdW0yNTYAAABAhNKwaQtjaGVja3N1bTUxMgAAAIpd05C6DHRhc2tfcmVzdWx0cwAAAEDtSLG6D3Jlc29sdmVfcmVzdWx0cwAAAFctPM3NDHRhc2tfcmVzdWx0cwAAAABEtc3NDHRhc2tfcmVzdWx0cwAAAAAAUK/hDHRhc2tfcmVzdWx0cwAAAAAAUM3lDHRhc2tfcmVzdWx0cw==');
217
217
  const abi = antelope.ABI.from(abiBlob);
218
218
  var Types;
219
219
  (function (Types) {
@@ -265,25 +265,25 @@ var Types;
265
265
  antelope.Struct.type('advance')
266
266
  ], advance);
267
267
  Types.advance = advance;
268
- let cargo_seed = class cargo_seed extends antelope.Struct {
268
+ let packed_module = class packed_module extends antelope.Struct {
269
269
  };
270
270
  tslib.__decorate([
271
271
  antelope.Struct.field(antelope.UInt16)
272
- ], cargo_seed.prototype, "item_id", void 0);
272
+ ], packed_module.prototype, "item_id", void 0);
273
273
  tslib.__decorate([
274
274
  antelope.Struct.field(antelope.UInt64)
275
- ], cargo_seed.prototype, "seed", void 0);
276
- cargo_seed = tslib.__decorate([
277
- antelope.Struct.type('cargo_seed')
278
- ], cargo_seed);
279
- Types.cargo_seed = cargo_seed;
275
+ ], packed_module.prototype, "stats", void 0);
276
+ packed_module = tslib.__decorate([
277
+ antelope.Struct.type('packed_module')
278
+ ], packed_module);
279
+ Types.packed_module = packed_module;
280
280
  let module_entry = class module_entry extends antelope.Struct {
281
281
  };
282
282
  tslib.__decorate([
283
283
  antelope.Struct.field(antelope.UInt8)
284
284
  ], module_entry.prototype, "type", void 0);
285
285
  tslib.__decorate([
286
- antelope.Struct.field(cargo_seed, { optional: true })
286
+ antelope.Struct.field(packed_module, { optional: true })
287
287
  ], module_entry.prototype, "installed", void 0);
288
288
  module_entry = tslib.__decorate([
289
289
  antelope.Struct.type('module_entry')
@@ -298,8 +298,8 @@ var Types;
298
298
  antelope.Struct.field(antelope.UInt32)
299
299
  ], cargo_item.prototype, "quantity", void 0);
300
300
  tslib.__decorate([
301
- antelope.Struct.field(antelope.UInt64, { optional: true })
302
- ], cargo_item.prototype, "seed", void 0);
301
+ antelope.Struct.field(antelope.UInt64)
302
+ ], cargo_item.prototype, "stats", void 0);
303
303
  tslib.__decorate([
304
304
  antelope.Struct.field(module_entry, { array: true })
305
305
  ], cargo_item.prototype, "modules", void 0);
@@ -389,7 +389,7 @@ var Types;
389
389
  ], cargo_row.prototype, "quantity", void 0);
390
390
  tslib.__decorate([
391
391
  antelope.Struct.field(antelope.UInt64)
392
- ], cargo_row.prototype, "seed", void 0);
392
+ ], cargo_row.prototype, "stats", void 0);
393
393
  tslib.__decorate([
394
394
  antelope.Struct.field(module_entry, { array: true })
395
395
  ], cargo_row.prototype, "modules", void 0);
@@ -653,7 +653,7 @@ var Types;
653
653
  ], deploy.prototype, "packed_item_id", void 0);
654
654
  tslib.__decorate([
655
655
  antelope.Struct.field(antelope.UInt64)
656
- ], deploy.prototype, "seed", void 0);
656
+ ], deploy.prototype, "stats", void 0);
657
657
  tslib.__decorate([
658
658
  antelope.Struct.field('string')
659
659
  ], deploy.prototype, "entity_name", void 0);
@@ -668,13 +668,13 @@ var Types;
668
668
  ], descentity.prototype, "item_id", void 0);
669
669
  tslib.__decorate([
670
670
  antelope.Struct.field(antelope.UInt64)
671
- ], descentity.prototype, "hull_seed", void 0);
671
+ ], descentity.prototype, "hull_stats", void 0);
672
672
  tslib.__decorate([
673
673
  antelope.Struct.field(antelope.UInt16, { array: true })
674
674
  ], descentity.prototype, "module_items", void 0);
675
675
  tslib.__decorate([
676
676
  antelope.Struct.field(antelope.UInt64, { array: true })
677
- ], descentity.prototype, "module_seeds", void 0);
677
+ ], descentity.prototype, "module_stats", void 0);
678
678
  descentity = tslib.__decorate([
679
679
  antelope.Struct.type('descentity')
680
680
  ], descentity);
@@ -922,11 +922,11 @@ var Types;
922
922
  let gather = class gather extends antelope.Struct {
923
923
  };
924
924
  tslib.__decorate([
925
- antelope.Struct.field(antelope.Name)
926
- ], gather.prototype, "entity_type", void 0);
925
+ antelope.Struct.field(entity_ref)
926
+ ], gather.prototype, "source", void 0);
927
927
  tslib.__decorate([
928
- antelope.Struct.field(antelope.UInt64)
929
- ], gather.prototype, "id", void 0);
928
+ antelope.Struct.field(entity_ref)
929
+ ], gather.prototype, "destination", void 0);
930
930
  tslib.__decorate([
931
931
  antelope.Struct.field(antelope.UInt16)
932
932
  ], gather.prototype, "stratum", void 0);
@@ -1742,7 +1742,7 @@ var Types;
1742
1742
  ], ship_row.prototype, "name", void 0);
1743
1743
  tslib.__decorate([
1744
1744
  antelope.Struct.field(antelope.UInt64)
1745
- ], ship_row.prototype, "seed", void 0);
1745
+ ], ship_row.prototype, "stats", void 0);
1746
1746
  tslib.__decorate([
1747
1747
  antelope.Struct.field(coordinates)
1748
1748
  ], ship_row.prototype, "coordinates", void 0);
@@ -1814,9 +1814,9 @@ var Types;
1814
1814
  ], spawnpacked.prototype, "item_id", void 0);
1815
1815
  tslib.__decorate([
1816
1816
  antelope.Struct.field(antelope.UInt64)
1817
- ], spawnpacked.prototype, "hull_seed", void 0);
1817
+ ], spawnpacked.prototype, "hull_stats", void 0);
1818
1818
  tslib.__decorate([
1819
- antelope.Struct.field(cargo_seed, { array: true })
1819
+ antelope.Struct.field(packed_module, { array: true })
1820
1820
  ], spawnpacked.prototype, "installed", void 0);
1821
1821
  spawnpacked = tslib.__decorate([
1822
1822
  antelope.Struct.type('spawnpacked')
@@ -1835,7 +1835,7 @@ var Types;
1835
1835
  ], spawnseeded.prototype, "quantity", void 0);
1836
1836
  tslib.__decorate([
1837
1837
  antelope.Struct.field(antelope.UInt64)
1838
- ], spawnseeded.prototype, "seed", void 0);
1838
+ ], spawnseeded.prototype, "stats", void 0);
1839
1839
  spawnseeded = tslib.__decorate([
1840
1840
  antelope.Struct.type('spawnseeded')
1841
1841
  ], spawnseeded);
@@ -1920,6 +1920,9 @@ var Types;
1920
1920
  tslib.__decorate([
1921
1921
  antelope.Struct.field(antelope.UInt16)
1922
1922
  ], transfer.prototype, "item_id", void 0);
1923
+ tslib.__decorate([
1924
+ antelope.Struct.field(antelope.UInt64)
1925
+ ], transfer.prototype, "stats", void 0);
1923
1926
  tslib.__decorate([
1924
1927
  antelope.Struct.field(antelope.UInt32)
1925
1928
  ], transfer.prototype, "quantity", void 0);
@@ -1976,7 +1979,7 @@ var Types;
1976
1979
  ], warehouse_row.prototype, "name", void 0);
1977
1980
  tslib.__decorate([
1978
1981
  antelope.Struct.field(antelope.UInt64)
1979
- ], warehouse_row.prototype, "seed", void 0);
1982
+ ], warehouse_row.prototype, "stats", void 0);
1980
1983
  tslib.__decorate([
1981
1984
  antelope.Struct.field(coordinates)
1982
1985
  ], warehouse_row.prototype, "coordinates", void 0);
@@ -2278,21 +2281,21 @@ const PLANET_SUBTYPE_ICY = 3;
2278
2281
  const PLANET_SUBTYPE_OCEAN = 4;
2279
2282
  const PLANET_SUBTYPE_INDUSTRIAL = 5;
2280
2283
  const RESOURCE_CATALOG = [
2281
- { id: 26, tier: 't1' },
2282
- { id: 13, tier: 't2' },
2283
- { id: 24, tier: 't3' },
2284
- { id: 29, tier: 't1' },
2285
- { id: 47, tier: 't2' },
2286
- { id: 79, tier: 't3' },
2287
- { id: 1, tier: 't1' },
2288
- { id: 2, tier: 't2' },
2289
- { id: 18, tier: 't3' },
2290
- { id: 14, tier: 't1' },
2291
- { id: 1000, tier: 't2' },
2292
- { id: 1001, tier: 't3' },
2293
- { id: 6, tier: 't1' },
2294
- { id: 1003, tier: 't2' },
2295
- { id: 1002, tier: 't3' },
2284
+ { id: 101, tier: 't1' },
2285
+ { id: 102, tier: 't2' },
2286
+ { id: 103, tier: 't3' },
2287
+ { id: 201, tier: 't1' },
2288
+ { id: 202, tier: 't2' },
2289
+ { id: 203, tier: 't3' },
2290
+ { id: 301, tier: 't1' },
2291
+ { id: 302, tier: 't2' },
2292
+ { id: 303, tier: 't3' },
2293
+ { id: 401, tier: 't1' },
2294
+ { id: 402, tier: 't2' },
2295
+ { id: 403, tier: 't3' },
2296
+ { id: 501, tier: 't1' },
2297
+ { id: 502, tier: 't2' },
2298
+ { id: 503, tier: 't3' },
2296
2299
  ];
2297
2300
  function getDepthThreshold(tier) {
2298
2301
  switch (tier) {
@@ -2349,14 +2352,14 @@ function getResourceWeight(itemId, stratum) {
2349
2352
  return 10;
2350
2353
  }
2351
2354
  }
2352
- const ASTEROID_RESOURCES = [26, 13, 24, 29, 47];
2353
- const NEBULA_RESOURCES = [47, 79, 1, 2, 18];
2354
- const GAS_GIANT_RESOURCES = [1, 2, 18, 14, 6];
2355
- const ROCKY_RESOURCES = [26, 13, 24, 14, 1000, 1001, 1002];
2356
- const TERRESTRIAL_RESOURCES = [29, 47, 14, 1000, 6, 1003, 1002];
2357
- const ICY_RESOURCES = [26, 1, 2, 14, 1001, 6, 1003];
2358
- const OCEAN_RESOURCES = [29, 79, 1, 18, 6, 1003, 1002];
2359
- const INDUSTRIAL_RESOURCES = [26, 13, 24, 29, 79, 1000, 1001];
2355
+ const ASTEROID_RESOURCES = [101, 102, 103, 201, 202];
2356
+ const NEBULA_RESOURCES = [202, 203, 301, 302, 303];
2357
+ const GAS_GIANT_RESOURCES = [301, 302, 303, 401, 501];
2358
+ const ROCKY_RESOURCES = [101, 102, 103, 401, 402, 403, 503];
2359
+ const TERRESTRIAL_RESOURCES = [201, 202, 401, 402, 501, 502, 503];
2360
+ const ICY_RESOURCES = [101, 301, 302, 401, 403, 501, 502];
2361
+ const OCEAN_RESOURCES = [201, 203, 301, 303, 501, 502, 503];
2362
+ const INDUSTRIAL_RESOURCES = [101, 102, 103, 201, 203, 402, 403];
2360
2363
  function getLocationCandidates(locationType, subtype) {
2361
2364
  if (locationType === 2)
2362
2365
  return ASTEROID_RESOURCES;
@@ -4777,139 +4780,139 @@ class BaseManager {
4777
4780
 
4778
4781
  var itemsData = [
4779
4782
  {
4780
- id: 26,
4781
- name: "Iron",
4782
- description: "A versatile metal used in hulls and structures.",
4783
+ id: 101,
4784
+ name: "",
4785
+ description: "",
4783
4786
  mass: 30000,
4784
- category: "metal",
4787
+ category: "ore",
4785
4788
  tier: "t1",
4786
- color: "#B7410E"
4789
+ color: "#C26D3F"
4787
4790
  },
4788
4791
  {
4789
- id: 13,
4790
- name: "Aluminum",
4791
- description: "A lightweight metal for structural components.",
4792
+ id: 102,
4793
+ name: "",
4794
+ description: "",
4792
4795
  mass: 27000,
4793
- category: "metal",
4796
+ category: "ore",
4794
4797
  tier: "t2",
4795
- color: "#A8B5C2"
4798
+ color: "#C26D3F"
4796
4799
  },
4797
4800
  {
4798
- id: 24,
4799
- name: "Chromium",
4800
- description: "A hard, corrosion-resistant alloy metal.",
4801
+ id: 103,
4802
+ name: "",
4803
+ description: "",
4801
4804
  mass: 52000,
4802
- category: "metal",
4805
+ category: "ore",
4803
4806
  tier: "t3",
4804
- color: "#D4E6F1"
4807
+ color: "#C26D3F"
4805
4808
  },
4806
4809
  {
4807
- id: 29,
4808
- name: "Copper",
4809
- description: "A conductive metal for electronics and wiring.",
4810
+ id: 201,
4811
+ name: "",
4812
+ description: "",
4810
4813
  mass: 40000,
4811
- category: "precious",
4814
+ category: "crystal",
4812
4815
  tier: "t1",
4813
- color: "#B87333"
4816
+ color: "#4ADBFF"
4814
4817
  },
4815
4818
  {
4816
- id: 47,
4817
- name: "Silver",
4818
- description: "A high-conductivity metal for precision components.",
4819
+ id: 202,
4820
+ name: "",
4821
+ description: "",
4819
4822
  mass: 55000,
4820
- category: "precious",
4823
+ category: "crystal",
4821
4824
  tier: "t2",
4822
- color: "#C0C0C0"
4825
+ color: "#4ADBFF"
4823
4826
  },
4824
4827
  {
4825
- id: 79,
4826
- name: "Gold",
4827
- description: "A corrosion-proof metal for advanced electronics.",
4828
+ id: 203,
4829
+ name: "",
4830
+ description: "",
4828
4831
  mass: 70000,
4829
- category: "precious",
4832
+ category: "crystal",
4830
4833
  tier: "t3",
4831
- color: "#FFD700"
4834
+ color: "#4ADBFF"
4832
4835
  },
4833
4836
  {
4834
- id: 1,
4835
- name: "Hydrogen",
4836
- description: "A lightweight gas used for fuel cells and propulsion.",
4837
+ id: 301,
4838
+ name: "",
4839
+ description: "",
4837
4840
  mass: 15000,
4838
4841
  category: "gas",
4839
4842
  tier: "t1",
4840
- color: "#7EC8E3"
4843
+ color: "#B8E4A0"
4841
4844
  },
4842
4845
  {
4843
- id: 2,
4844
- name: "Helium",
4845
- description: "An inert noble gas used in energy systems.",
4846
+ id: 302,
4847
+ name: "",
4848
+ description: "",
4846
4849
  mass: 2000,
4847
4850
  category: "gas",
4848
4851
  tier: "t2",
4849
- color: "#F5E6CC"
4852
+ color: "#B8E4A0"
4850
4853
  },
4851
4854
  {
4852
- id: 18,
4853
- name: "Argon",
4854
- description: "A noble gas used in industrial and energy applications.",
4855
+ id: 303,
4856
+ name: "",
4857
+ description: "",
4855
4858
  mass: 8000,
4856
4859
  category: "gas",
4857
4860
  tier: "t3",
4858
- color: "#9B59B6"
4861
+ color: "#B8E4A0"
4859
4862
  },
4860
4863
  {
4861
- id: 14,
4862
- name: "Silicon",
4863
- description: "A semiconductor used in sensors and computing.",
4864
+ id: 401,
4865
+ name: "",
4866
+ description: "",
4864
4867
  mass: 22000,
4865
- category: "mineral",
4868
+ category: "regolith",
4866
4869
  tier: "t1",
4867
- color: "#B8A9C9"
4870
+ color: "#C4A57B"
4868
4871
  },
4869
4872
  {
4870
- id: 1000,
4871
- name: "Quartz",
4872
- description: "A crystalline mineral for sensors and optics.",
4873
+ id: 402,
4874
+ name: "",
4875
+ description: "",
4873
4876
  mass: 35000,
4874
- category: "mineral",
4877
+ category: "regolith",
4875
4878
  tier: "t2",
4876
- color: "#E8D5B7"
4879
+ color: "#C4A57B"
4877
4880
  },
4878
4881
  {
4879
- id: 1001,
4880
- name: "Sapphire",
4881
- description: "A precious crystal for precision instruments.",
4882
+ id: 403,
4883
+ name: "",
4884
+ description: "",
4882
4885
  mass: 45000,
4883
- category: "mineral",
4886
+ category: "regolith",
4884
4887
  tier: "t3",
4885
- color: "#0F52BA"
4888
+ color: "#C4A57B"
4886
4889
  },
4887
4890
  {
4888
- id: 6,
4889
- name: "Carbon",
4890
- description: "A versatile element for life support and coatings.",
4891
+ id: 501,
4892
+ name: "",
4893
+ description: "",
4891
4894
  mass: 15000,
4892
- category: "organic",
4895
+ category: "biomass",
4893
4896
  tier: "t1",
4894
- color: "#4A4A4A"
4897
+ color: "#5A8B3E"
4895
4898
  },
4896
4899
  {
4897
- id: 1003,
4898
- name: "Biomass",
4899
- description: "Organic matter for life support systems.",
4900
+ id: 502,
4901
+ name: "",
4902
+ description: "",
4900
4903
  mass: 30000,
4901
- category: "organic",
4904
+ category: "biomass",
4902
4905
  tier: "t2",
4903
- color: "#8B4513"
4906
+ color: "#5A8B3E"
4904
4907
  },
4905
4908
  {
4906
- id: 1002,
4907
- name: "Resin",
4908
- description: "A fossilized organic compound for coatings and sealants.",
4909
+ id: 503,
4910
+ name: "",
4911
+ description: "",
4909
4912
  mass: 25000,
4910
- category: "organic",
4913
+ category: "biomass",
4911
4914
  tier: "t3",
4912
- color: "#DAA520"
4915
+ color: "#5A8B3E"
4913
4916
  }
4914
4917
  ];
4915
4918
 
@@ -4977,38 +4980,38 @@ const components = [
4977
4980
  {
4978
4981
  id: ITEM_HULL_PLATES,
4979
4982
  name: 'Hull Plates',
4980
- description: 'Structural plating formed from metal. Used in hulls, containers, and frames.',
4983
+ description: 'Structural plating formed from ore. Used in hulls, containers, and frames.',
4981
4984
  color: '#7B8D9E',
4982
4985
  mass: 50000,
4983
4986
  stats: [
4984
- { key: 'strength', source: 'metal' },
4985
- { key: 'density', source: 'metal' },
4987
+ { key: 'strength', source: 'ore' },
4988
+ { key: 'density', source: 'ore' },
4986
4989
  ],
4987
- recipe: [{ category: 'metal', quantity: 15 }],
4990
+ recipe: [{ category: 'ore', quantity: 15 }],
4988
4991
  usedIn: [
4989
4992
  { type: 'entity', name: 'Container' },
4990
- { type: 'entity', name: 'Warehouse T1' },
4991
- { type: 'entity', name: 'Ship T1' },
4993
+ { type: 'entity', name: 'Warehouse' },
4994
+ { type: 'entity', name: 'Ship' },
4992
4995
  ],
4993
4996
  },
4994
4997
  {
4995
4998
  id: ITEM_CARGO_LINING,
4996
4999
  name: 'Cargo Lining',
4997
- description: 'Precision-formed composite lining for cargo storage. Combines precious metal shaping with organic sealing.',
4998
- color: '#D4A843',
5000
+ description: 'Composite lining formed from fine regolith bound in biomass polymer. Dense enough to seal cargo holds, flexible enough to absorb vibration.',
5001
+ color: '#C4A57B',
4999
5002
  mass: 30000,
5000
5003
  stats: [
5001
- { key: 'ductility', source: 'precious' },
5002
- { key: 'purity', source: 'organic' },
5004
+ { key: 'fineness', source: 'regolith' },
5005
+ { key: 'saturation', source: 'biomass' },
5003
5006
  ],
5004
5007
  recipe: [
5005
- { category: 'precious', quantity: 6 },
5006
- { category: 'organic', quantity: 14 },
5008
+ { category: 'regolith', quantity: 10 },
5009
+ { category: 'biomass', quantity: 20 },
5007
5010
  ],
5008
5011
  usedIn: [
5009
5012
  { type: 'entity', name: 'Container' },
5010
- { type: 'entity', name: 'Warehouse T1' },
5011
- { type: 'entity', name: 'Ship T1' },
5013
+ { type: 'module', name: 'Loader' },
5014
+ { type: 'module', name: 'Storage' },
5012
5015
  ],
5013
5016
  },
5014
5017
  {
@@ -5027,73 +5030,76 @@ const components = [
5027
5030
  {
5028
5031
  id: ITEM_POWER_CELL,
5029
5032
  name: 'Power Cell',
5030
- description: 'Crystalline energy storage matrix formed from resonant minerals.',
5031
- color: '#7B5AE8',
5033
+ description: 'Crystalline energy storage matrix. Resonant lattices retain and release charge.',
5034
+ color: '#4ADBFF',
5032
5035
  mass: 30000,
5033
5036
  stats: [
5034
- { key: 'resonance', source: 'mineral' },
5035
- { key: 'clarity', source: 'mineral' },
5037
+ { key: 'resonance', source: 'crystal' },
5038
+ { key: 'reflectivity', source: 'crystal' },
5039
+ ],
5040
+ recipe: [{ category: 'crystal', quantity: 20 }],
5041
+ usedIn: [
5042
+ { type: 'module', name: 'Generator' },
5043
+ { type: 'module', name: 'Hauler' },
5036
5044
  ],
5037
- recipe: [{ category: 'mineral', quantity: 20 }],
5038
- usedIn: [{ type: 'module', name: 'Generator' }],
5039
5045
  },
5040
5046
  {
5041
5047
  id: ITEM_MATTER_CONDUIT,
5042
5048
  name: 'Matter Conduit',
5043
- description: 'Heavy-duty metal shaft used in gathering equipment.',
5049
+ description: 'Heavy-duty ore shaft used in gathering equipment.',
5044
5050
  color: '#7B8D9E',
5045
5051
  mass: 50000,
5046
5052
  stats: [
5047
- { key: 'strength', source: 'metal' },
5048
- { key: 'tolerance', source: 'metal' },
5053
+ { key: 'strength', source: 'ore' },
5054
+ { key: 'tolerance', source: 'ore' },
5049
5055
  ],
5050
- recipe: [{ category: 'metal', quantity: 15 }],
5056
+ recipe: [{ category: 'ore', quantity: 15 }],
5051
5057
  usedIn: [{ type: 'module', name: 'Gatherer' }],
5052
5058
  },
5053
5059
  {
5054
5060
  id: ITEM_SURVEY_PROBE,
5055
5061
  name: 'Survey Probe',
5056
- description: 'Precious metal sensor array for deep resource detection.',
5057
- color: '#D4A843',
5062
+ description: 'Crystal-lattice sensor array for deep resource detection.',
5063
+ color: '#4ADBFF',
5058
5064
  mass: 30000,
5059
5065
  stats: [
5060
- { key: 'conductivity', source: 'precious' },
5061
- { key: 'reflectivity', source: 'precious' },
5066
+ { key: 'conductivity', source: 'crystal' },
5067
+ { key: 'reflectivity', source: 'crystal' },
5062
5068
  ],
5063
- recipe: [{ category: 'precious', quantity: 10 }],
5069
+ recipe: [{ category: 'crystal', quantity: 10 }],
5064
5070
  usedIn: [{ type: 'module', name: 'Gatherer' }],
5065
5071
  },
5066
5072
  {
5067
5073
  id: ITEM_CARGO_ARM,
5068
5074
  name: 'Cargo Arm',
5069
- description: 'Flexible organic composite arm for cargo handling.',
5070
- color: '#6B8E5A',
5075
+ description: 'Flexible biomass composite arm for cargo handling.',
5076
+ color: '#5A8B3E',
5071
5077
  mass: 30000,
5072
5078
  stats: [
5073
- { key: 'plasticity', source: 'organic' },
5074
- { key: 'insulation', source: 'organic' },
5079
+ { key: 'plasticity', source: 'biomass' },
5080
+ { key: 'insulation', source: 'biomass' },
5075
5081
  ],
5076
- recipe: [{ category: 'organic', quantity: 32 }],
5082
+ recipe: [{ category: 'biomass', quantity: 32 }],
5077
5083
  usedIn: [{ type: 'module', name: 'Loader' }],
5078
5084
  },
5079
5085
  {
5080
5086
  id: ITEM_TOOL_BIT,
5081
5087
  name: 'Tool Bit',
5082
- description: 'Dense mineral cutting head for manufacturing operations.',
5083
- color: '#B8A9C9',
5088
+ description: 'Dense regolith cutting head for manufacturing operations.',
5089
+ color: '#C4A57B',
5084
5090
  mass: 30000,
5085
5091
  stats: [
5086
- { key: 'hardness', source: 'mineral' },
5087
- { key: 'clarity', source: 'mineral' },
5092
+ { key: 'hardness', source: 'regolith' },
5093
+ { key: 'composition', source: 'regolith' },
5088
5094
  ],
5089
- recipe: [{ category: 'mineral', quantity: 20 }],
5095
+ recipe: [{ category: 'regolith', quantity: 20 }],
5090
5096
  usedIn: [{ type: 'module', name: 'Manufacturing' }],
5091
5097
  },
5092
5098
  {
5093
5099
  id: ITEM_REACTION_CHAMBER,
5094
5100
  name: 'Reaction Chamber',
5095
5101
  description: 'Gas-pressurized vessel for controlled manufacturing reactions.',
5096
- color: '#7EC8E3',
5102
+ color: '#B8E4A0',
5097
5103
  mass: 50000,
5098
5104
  stats: [
5099
5105
  { key: 'reactivity', source: 'gas' },
@@ -5105,48 +5111,48 @@ const components = [
5105
5111
  {
5106
5112
  id: ITEM_FOCUSING_ARRAY,
5107
5113
  name: 'Focusing Array',
5108
- description: "Precision-formed precious-metal lens array. Routes the haul beam's energy efficiently to the target lock.",
5109
- color: '#D4A843',
5114
+ description: "Precision-formed crystal lens array. Routes the haul beam's energy efficiently to the target lock.",
5115
+ color: '#4ADBFF',
5110
5116
  mass: 40000,
5111
5117
  stats: [
5112
- { key: 'conductivity', source: 'precious' },
5113
- { key: 'ductility', source: 'precious' },
5118
+ { key: 'conductivity', source: 'crystal' },
5119
+ { key: 'resonance', source: 'crystal' },
5114
5120
  ],
5115
- recipe: [{ category: 'precious', quantity: 25 }],
5116
- usedIn: [{ type: 'module', name: 'Hauler Module T1' }],
5121
+ recipe: [{ category: 'crystal', quantity: 25 }],
5122
+ usedIn: [{ type: 'module', name: 'Hauler' }],
5117
5123
  },
5118
5124
  {
5119
5125
  id: ITEM_HULL_PLATES_T2,
5120
5126
  name: 'Hull Plates T2',
5121
- description: 'Advanced structural plating reinforced with tier 2 metals.',
5127
+ description: 'Advanced structural plating reinforced with tier 2 ore.',
5122
5128
  color: '#9BADB8',
5123
5129
  mass: 50000,
5124
5130
  stats: [
5125
- { key: 'strength', source: 'metal' },
5126
- { key: 'density', source: 'metal' },
5131
+ { key: 'strength', source: 'ore' },
5132
+ { key: 'density', source: 'ore' },
5127
5133
  ],
5128
5134
  recipe: [
5129
5135
  { itemId: ITEM_HULL_PLATES, quantity: 2 },
5130
- { category: 'metal', quantity: 15 },
5136
+ { category: 'ore', quantity: 15 },
5131
5137
  ],
5132
- usedIn: [{ type: 'entity', name: 'Container T2' }],
5138
+ usedIn: [{ type: 'entity', name: 'Container' }],
5133
5139
  },
5134
5140
  {
5135
5141
  id: ITEM_CARGO_LINING_T2,
5136
- name: 'Cargo Lining T2',
5137
- description: 'Advanced composite lining with improved storage properties.',
5138
- color: '#E0B84D',
5139
- mass: 30000,
5142
+ name: 'Cargo Lining',
5143
+ description: 'Advanced composite lining reinforced with tier 2 regolith and biomass polymer.',
5144
+ color: '#C4A57B',
5145
+ mass: 45000,
5140
5146
  stats: [
5141
- { key: 'ductility', source: 'precious' },
5142
- { key: 'purity', source: 'organic' },
5147
+ { key: 'fineness', source: 'regolith' },
5148
+ { key: 'saturation', source: 'biomass' },
5143
5149
  ],
5144
5150
  recipe: [
5145
5151
  { itemId: ITEM_CARGO_LINING, quantity: 2 },
5146
- { category: 'precious', quantity: 6 },
5147
- { category: 'organic', quantity: 14 },
5152
+ { category: 'regolith', quantity: 5 },
5153
+ { category: 'biomass', quantity: 10 },
5148
5154
  ],
5149
- usedIn: [{ type: 'entity', name: 'Container T2' }],
5155
+ usedIn: [{ type: 'entity', name: 'Container' }],
5150
5156
  },
5151
5157
  ];
5152
5158
  const entityRecipes = [
@@ -5163,13 +5169,13 @@ const entityRecipes = [
5163
5169
  stats: [
5164
5170
  { key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
5165
5171
  { key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
5166
- { key: 'ductility', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'ductility' },
5167
- { key: 'purity', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'purity' },
5172
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
5173
+ { key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
5168
5174
  ],
5169
5175
  },
5170
5176
  {
5171
5177
  id: 'ship-t1',
5172
- name: 'Ship T1',
5178
+ name: 'Ship',
5173
5179
  description: 'General-purpose vessel with 5 module slots.',
5174
5180
  color: '#4AE898',
5175
5181
  packedItemId: ITEM_SHIP_T1_PACKED,
@@ -5180,8 +5186,8 @@ const entityRecipes = [
5180
5186
  stats: [
5181
5187
  { key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
5182
5188
  { key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
5183
- { key: 'ductility', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'ductility' },
5184
- { key: 'purity', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'purity' },
5189
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
5190
+ { key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
5185
5191
  ],
5186
5192
  moduleSlots: [
5187
5193
  { type: MODULE_ANY },
@@ -5193,7 +5199,7 @@ const entityRecipes = [
5193
5199
  },
5194
5200
  {
5195
5201
  id: 'warehouse-t1',
5196
- name: 'Warehouse T1',
5202
+ name: 'Warehouse',
5197
5203
  description: 'Massive stationary storage facility with a single loader module slot.',
5198
5204
  color: '#EAB308',
5199
5205
  packedItemId: ITEM_WAREHOUSE_T1_PACKED,
@@ -5204,8 +5210,8 @@ const entityRecipes = [
5204
5210
  stats: [
5205
5211
  { key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
5206
5212
  { key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
5207
- { key: 'ductility', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'ductility' },
5208
- { key: 'purity', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'purity' },
5213
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
5214
+ { key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
5209
5215
  ],
5210
5216
  moduleSlots: [
5211
5217
  { type: MODULE_LOADER, label: 'Loader' },
@@ -5217,7 +5223,7 @@ const entityRecipes = [
5217
5223
  },
5218
5224
  {
5219
5225
  id: 'container-t2',
5220
- name: 'Container T2',
5226
+ name: 'Container',
5221
5227
  description: 'Advanced cargo container with improved capacity formulas.',
5222
5228
  color: '#9BADB8',
5223
5229
  packedItemId: ITEM_CONTAINER_T2_PACKED,
@@ -5228,8 +5234,12 @@ const entityRecipes = [
5228
5234
  stats: [
5229
5235
  { key: 'strength', sourceComponentId: ITEM_HULL_PLATES_T2, sourceStatKey: 'strength' },
5230
5236
  { key: 'density', sourceComponentId: ITEM_HULL_PLATES_T2, sourceStatKey: 'density' },
5231
- { key: 'ductility', sourceComponentId: ITEM_CARGO_LINING_T2, sourceStatKey: 'ductility' },
5232
- { key: 'purity', sourceComponentId: ITEM_CARGO_LINING_T2, sourceStatKey: 'purity' },
5237
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING_T2, sourceStatKey: 'fineness' },
5238
+ {
5239
+ key: 'saturation',
5240
+ sourceComponentId: ITEM_CARGO_LINING_T2,
5241
+ sourceStatKey: 'saturation',
5242
+ },
5233
5243
  ],
5234
5244
  },
5235
5245
  ];
@@ -5250,14 +5260,14 @@ const moduleRecipes = [
5250
5260
  {
5251
5261
  id: 'generator-t1',
5252
5262
  name: 'Generator',
5253
- description: 'Basic energy system. Stores and recharges energy from resonant minerals.',
5254
- color: '#7B5AE8',
5263
+ description: 'Basic energy system. Stores and recharges energy from resonant crystals.',
5264
+ color: '#4ADBFF',
5255
5265
  itemId: ITEM_GENERATOR_T1,
5256
5266
  moduleType: MODULE_GENERATOR,
5257
5267
  recipe: [{ itemId: ITEM_POWER_CELL, quantity: 5 }],
5258
5268
  stats: [
5259
5269
  { key: 'resonance', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'resonance' },
5260
- { key: 'clarity', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'clarity' },
5270
+ { key: 'reflectivity', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'reflectivity' },
5261
5271
  ],
5262
5272
  },
5263
5273
  {
@@ -5295,7 +5305,7 @@ const moduleRecipes = [
5295
5305
  id: 'loader-t1',
5296
5306
  name: 'Loader',
5297
5307
  description: 'Basic cargo handling system. Loads and unloads cargo with articulated arms.',
5298
- color: '#6B8E5A',
5308
+ color: '#5A8B3E',
5299
5309
  itemId: ITEM_LOADER_T1,
5300
5310
  moduleType: MODULE_LOADER,
5301
5311
  recipe: [
@@ -5303,7 +5313,7 @@ const moduleRecipes = [
5303
5313
  { itemId: ITEM_CARGO_ARM, quantity: 3 },
5304
5314
  ],
5305
5315
  stats: [
5306
- { key: 'ductility', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'ductility' },
5316
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
5307
5317
  { key: 'plasticity', sourceComponentId: ITEM_CARGO_ARM, sourceStatKey: 'plasticity' },
5308
5318
  ],
5309
5319
  },
@@ -5311,7 +5321,7 @@ const moduleRecipes = [
5311
5321
  id: 'manufacturing-t1',
5312
5322
  name: 'Manufacturing',
5313
5323
  description: 'Basic crafting system. Processes materials using reaction chambers and cutting tools.',
5314
- color: '#7EC8E3',
5324
+ color: '#B8E4A0',
5315
5325
  itemId: ITEM_MANUFACTURING_T1,
5316
5326
  moduleType: MODULE_CRAFTER,
5317
5327
  recipe: [
@@ -5324,7 +5334,7 @@ const moduleRecipes = [
5324
5334
  sourceComponentId: ITEM_REACTION_CHAMBER,
5325
5335
  sourceStatKey: 'reactivity',
5326
5336
  },
5327
- { key: 'clarity', sourceComponentId: ITEM_TOOL_BIT, sourceStatKey: 'clarity' },
5337
+ { key: 'composition', sourceComponentId: ITEM_TOOL_BIT, sourceStatKey: 'composition' },
5328
5338
  ],
5329
5339
  },
5330
5340
  {
@@ -5340,16 +5350,16 @@ const moduleRecipes = [
5340
5350
  ],
5341
5351
  stats: [
5342
5352
  { key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
5343
- { key: 'ductility', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'ductility' },
5344
- { key: 'purity', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'purity' },
5345
- { key: 'density', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'density' },
5353
+ { key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
5354
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
5355
+ { key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
5346
5356
  ],
5347
5357
  },
5348
5358
  {
5349
5359
  id: 'hauler-t1',
5350
- name: 'Hauler Module T1',
5360
+ name: 'Hauler',
5351
5361
  description: 'Projects a haul beam to lock onto and transport containers or warehouses through group travel.',
5352
- color: '#D4A843',
5362
+ color: '#4ADBFF',
5353
5363
  itemId: ITEM_HAULER_T1,
5354
5364
  moduleType: MODULE_HAULER,
5355
5365
  recipe: [
@@ -5357,14 +5367,13 @@ const moduleRecipes = [
5357
5367
  { itemId: ITEM_FOCUSING_ARRAY, quantity: 3 },
5358
5368
  ],
5359
5369
  stats: [
5360
- { key: 'capacity', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'resonance' },
5370
+ { key: 'resonance', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'resonance' },
5371
+ { key: 'reflectivity', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'reflectivity' },
5361
5372
  {
5362
- key: 'efficiency',
5373
+ key: 'conductivity',
5363
5374
  sourceComponentId: ITEM_FOCUSING_ARRAY,
5364
5375
  sourceStatKey: 'conductivity',
5365
5376
  },
5366
- { key: 'drain', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'clarity' },
5367
- { key: 'ductility', sourceComponentId: ITEM_FOCUSING_ARRAY, sourceStatKey: 'ductility' },
5368
5377
  ],
5369
5378
  },
5370
5379
  ];
@@ -5425,7 +5434,7 @@ function getComponentsForStat(statKey) {
5425
5434
  return components.filter((c) => c.stats.some((s) => s.key === statKey));
5426
5435
  }
5427
5436
 
5428
- const METAL_STATS = [
5437
+ const ORE_STATS = [
5429
5438
  {
5430
5439
  key: 'strength',
5431
5440
  label: 'Strength',
@@ -5446,24 +5455,24 @@ const METAL_STATS = [
5446
5455
  inverted: true,
5447
5456
  },
5448
5457
  ];
5449
- const PRECIOUS_STATS = [
5458
+ const CRYSTAL_STATS = [
5450
5459
  {
5451
5460
  key: 'conductivity',
5452
5461
  label: 'Conductivity',
5453
5462
  abbreviation: 'CON',
5454
- purpose: 'Efficiency of energy/signal transfer',
5463
+ purpose: 'Efficiency of energy/signal transfer through crystalline lattice',
5455
5464
  },
5456
5465
  {
5457
- key: 'ductility',
5458
- label: 'Ductility',
5459
- abbreviation: 'DUC',
5460
- purpose: 'Ability to be worked into fine, precise shapes',
5466
+ key: 'resonance',
5467
+ label: 'Resonance',
5468
+ abbreviation: 'RES',
5469
+ purpose: 'Frequency tuning and piezoelectric response storage and amplification',
5461
5470
  },
5462
5471
  {
5463
5472
  key: 'reflectivity',
5464
5473
  label: 'Reflectivity',
5465
5474
  abbreviation: 'REF',
5466
- purpose: 'Surface quality for heat management and precision optics',
5475
+ purpose: 'Optical refraction and reflection lenses, mirrors, focus',
5467
5476
  },
5468
5477
  ];
5469
5478
  const GAS_STATS = [
@@ -5486,52 +5495,52 @@ const GAS_STATS = [
5486
5495
  purpose: 'Heat capacity for thermal management',
5487
5496
  },
5488
5497
  ];
5489
- const MINERAL_STATS = [
5498
+ const REGOLITH_STATS = [
5490
5499
  {
5491
- key: 'resonance',
5492
- label: 'Resonance',
5493
- abbreviation: 'RES',
5494
- purpose: 'Energy field interaction storage, focusing, projection',
5500
+ key: 'composition',
5501
+ label: 'Composition',
5502
+ abbreviation: 'COM',
5503
+ purpose: 'Mineral/metal mixdrives sensor, chip, and optic crafting quality',
5495
5504
  },
5496
5505
  {
5497
5506
  key: 'hardness',
5498
5507
  label: 'Hardness',
5499
5508
  abbreviation: 'HRD',
5500
- purpose: 'Resistance to wear — cutting surfaces, penetration',
5509
+ purpose: 'Particle hardness — cutting surfaces, abrasives, wear resistance',
5501
5510
  },
5502
5511
  {
5503
- key: 'clarity',
5504
- label: 'Clarity',
5505
- abbreviation: 'CLR',
5506
- purpose: 'Crystalline perfectionprecision optics',
5512
+ key: 'fineness',
5513
+ label: 'Fineness',
5514
+ abbreviation: 'FIN',
5515
+ purpose: 'Grain sizefine powder for smooth composites and sintering',
5507
5516
  },
5508
5517
  ];
5509
- const ORGANIC_STATS = [
5518
+ const BIOMASS_STATS = [
5510
5519
  {
5511
5520
  key: 'plasticity',
5512
5521
  label: 'Plasticity',
5513
5522
  abbreviation: 'PLA',
5514
- purpose: 'Ease of reshaping speeds processing',
5523
+ purpose: 'Flexibility and deformation under load',
5515
5524
  },
5516
5525
  {
5517
5526
  key: 'insulation',
5518
5527
  label: 'Insulation',
5519
5528
  abbreviation: 'INS',
5520
- purpose: 'Energy containment reduces energy loss',
5529
+ purpose: 'Thermal and electrical blocking capacity',
5521
5530
  },
5522
5531
  {
5523
- key: 'purity',
5524
- label: 'Purity',
5525
- abbreviation: 'PUR',
5526
- purpose: 'Biological cleanliness better composites and lubricants',
5532
+ key: 'saturation',
5533
+ label: 'Saturation',
5534
+ abbreviation: 'SAT',
5535
+ purpose: 'Concentration of useful organic compounds per unit',
5527
5536
  },
5528
5537
  ];
5529
5538
  const STAT_MAP = {
5530
- metal: METAL_STATS,
5531
- precious: PRECIOUS_STATS,
5539
+ ore: ORE_STATS,
5540
+ crystal: CRYSTAL_STATS,
5532
5541
  gas: GAS_STATS,
5533
- mineral: MINERAL_STATS,
5534
- organic: ORGANIC_STATS,
5542
+ regolith: REGOLITH_STATS,
5543
+ biomass: BIOMASS_STATS,
5535
5544
  };
5536
5545
  function getStatDefinitions(category) {
5537
5546
  return STAT_MAP[category];
@@ -5676,40 +5685,40 @@ function deriveResourceStats(seed) {
5676
5685
  }
5677
5686
 
5678
5687
  function encodeStats(values) {
5679
- let seed = 0n;
5688
+ let stats = 0n;
5680
5689
  for (let i = 0; i < values.length && i < 6; i++) {
5681
- seed |= BigInt(values[i] & 0x3ff) << BigInt(i * 10);
5690
+ stats |= BigInt(values[i] & 0x3ff) << BigInt(i * 10);
5682
5691
  }
5683
- return seed;
5692
+ return stats;
5684
5693
  }
5685
- function decodeStat(seed, index) {
5686
- return Number((seed >> BigInt(index * 10)) & 0x3ffn);
5694
+ function decodeStat(stats, index) {
5695
+ return Number((stats >> BigInt(index * 10)) & 0x3ffn);
5687
5696
  }
5688
- function decodeStats(seed, count) {
5689
- const stats = [];
5697
+ function decodeStats(stats, count) {
5698
+ const result = [];
5690
5699
  for (let i = 0; i < count; i++) {
5691
- stats.push(decodeStat(seed, i));
5700
+ result.push(decodeStat(stats, i));
5692
5701
  }
5693
- return stats;
5702
+ return result;
5694
5703
  }
5695
- function mapStatsToKeys(seed, statDefs) {
5696
- const values = decodeStats(seed, statDefs.length);
5704
+ function mapStatsToKeys(stats, statDefs) {
5705
+ const values = decodeStats(stats, statDefs.length);
5697
5706
  const result = {};
5698
5707
  for (let i = 0; i < statDefs.length; i++) {
5699
5708
  result[statDefs[i].key] = values[i];
5700
5709
  }
5701
5710
  return result;
5702
5711
  }
5703
- function decodeCraftedItemStats(itemId, seed) {
5712
+ function decodeCraftedItemStats(itemId, stats) {
5704
5713
  const comp = getComponentById(itemId);
5705
5714
  if (comp)
5706
- return mapStatsToKeys(seed, comp.stats);
5715
+ return mapStatsToKeys(stats, comp.stats);
5707
5716
  const entityRecipe = entityRecipes.find((r) => r.packedItemId === itemId);
5708
5717
  if (entityRecipe)
5709
- return mapStatsToKeys(seed, entityRecipe.stats);
5718
+ return mapStatsToKeys(stats, entityRecipe.stats);
5710
5719
  const moduleRecipe = moduleRecipes.find((r) => r.itemId === itemId);
5711
5720
  if (moduleRecipe)
5712
- return mapStatsToKeys(seed, moduleRecipe.stats);
5721
+ return mapStatsToKeys(stats, moduleRecipe.stats);
5713
5722
  return {};
5714
5723
  }
5715
5724
  function blendStacks(stacks, statKey) {
@@ -5762,19 +5771,19 @@ function computeEntityStats(entityRecipeId, componentStacks) {
5762
5771
  return { key: stat.key, value: Math.max(1, Math.min(999, value)) };
5763
5772
  });
5764
5773
  }
5765
- function decodeStackStats(itemId, seed) {
5774
+ function decodeStackStats(itemId, stats) {
5766
5775
  if (itemId >= 10000) {
5767
- return decodeCraftedItemStats(itemId, BigInt(seed.toString()));
5776
+ return decodeCraftedItemStats(itemId, BigInt(stats.toString()));
5768
5777
  }
5769
- const raw = deriveResourceStats(BigInt(seed.toString()));
5770
- return { stat1: raw.stat1, stat2: raw.stat2, stat3: raw.stat3 };
5778
+ const s = BigInt(stats.toString());
5779
+ return { stat1: decodeStat(s, 0), stat2: decodeStat(s, 1), stat3: decodeStat(s, 2) };
5771
5780
  }
5772
5781
  const categoryItemMass = {
5773
- metal: 30000,
5774
- precious: 40000,
5782
+ ore: 30000,
5783
+ crystal: 40000,
5775
5784
  gas: 15000,
5776
- mineral: 22000,
5777
- organic: 15000,
5785
+ regolith: 22000,
5786
+ biomass: 15000,
5778
5787
  };
5779
5788
  function computeInputMass(itemId, itemType) {
5780
5789
  if (itemType === 'component') {
@@ -5821,25 +5830,24 @@ function blendCrossGroup(sources) {
5821
5830
  function blendCargoStacks(itemId, stacks) {
5822
5831
  const decoded = stacks.map((s) => ({
5823
5832
  quantity: s.quantity,
5824
- stats: decodeStackStats(itemId, s.seed),
5833
+ stats: decodeStackStats(itemId, s.stats),
5825
5834
  }));
5826
5835
  const allKeys = Object.keys(decoded[0]?.stats ?? {});
5827
5836
  const blended = allKeys.map((key) => Math.max(1, Math.min(999, blendStacks(decoded, key))));
5828
5837
  return antelope.UInt64.from(encodeStats(blended));
5829
5838
  }
5830
- function decodeRawStackToCategoryStats(seed, category) {
5831
- const raw = deriveResourceStats(seed);
5839
+ function decodeRawStackToCategoryStats(stats, category) {
5832
5840
  const defs = getStatDefinitions(category);
5833
5841
  const result = {};
5834
5842
  if (defs[0])
5835
- result[defs[0].key] = raw.stat1;
5843
+ result[defs[0].key] = decodeStat(stats, 0);
5836
5844
  if (defs[1])
5837
- result[defs[1].key] = raw.stat2;
5845
+ result[defs[1].key] = decodeStat(stats, 1);
5838
5846
  if (defs[2])
5839
- result[defs[2].key] = raw.stat3;
5847
+ result[defs[2].key] = decodeStat(stats, 2);
5840
5848
  return result;
5841
5849
  }
5842
- function computeCraftedOutputSeed(outputItemId, slotInputs) {
5850
+ function computeCraftedOutputStats(outputItemId, slotInputs) {
5843
5851
  var _a;
5844
5852
  const component = getComponentById(outputItemId);
5845
5853
  if (component) {
@@ -5851,8 +5859,8 @@ function computeCraftedOutputSeed(outputItemId, slotInputs) {
5851
5859
  const stacks = slot.stacks.map((s) => ({
5852
5860
  quantity: s.quantity,
5853
5861
  stats: slotIsComponent
5854
- ? decodeCraftedItemStats(slot.itemId, s.seed)
5855
- : decodeRawStackToCategoryStats(s.seed, slot.category),
5862
+ ? decodeCraftedItemStats(slot.itemId, s.stats)
5863
+ : decodeRawStackToCategoryStats(s.stats, slot.category),
5856
5864
  }));
5857
5865
  categoryStacks.push({ category: slot.category, stacks });
5858
5866
  }
@@ -5874,7 +5882,7 @@ function computeCraftedOutputSeed(outputItemId, slotInputs) {
5874
5882
  for (const s of slot.stacks) {
5875
5883
  list.push({
5876
5884
  quantity: s.quantity,
5877
- stats: decodeCraftedItemStats(slot.itemId, s.seed),
5885
+ stats: decodeCraftedItemStats(slot.itemId, s.stats),
5878
5886
  });
5879
5887
  }
5880
5888
  }
@@ -5885,7 +5893,11 @@ function computeCraftedOutputSeed(outputItemId, slotInputs) {
5885
5893
  });
5886
5894
  return antelope.UInt64.from(encodeStats(ordered));
5887
5895
  }
5888
- throw new Error(`computeCraftedOutputSeed: no recipe found for outputItemId=${outputItemId}`);
5896
+ throw new Error(`computeCraftedOutputStats: no recipe found for outputItemId=${outputItemId}`);
5897
+ }
5898
+ function encodeGatheredCargoStats(depositSeed) {
5899
+ const raw = deriveResourceStats(depositSeed);
5900
+ return antelope.UInt64.from(encodeStats([raw.stat1, raw.stat2, raw.stat3]));
5889
5901
  }
5890
5902
 
5891
5903
  const itemsById = new Map();
@@ -5909,7 +5921,7 @@ function synthesizeItem(id, source) {
5909
5921
  name: source.name,
5910
5922
  description: source.description,
5911
5923
  mass: source.mass,
5912
- category: 'metal',
5924
+ category: 'ore',
5913
5925
  tier: 't1',
5914
5926
  color: source.color,
5915
5927
  });
@@ -6259,6 +6271,9 @@ function capsHasGatherer(caps) {
6259
6271
  function capsHasMass(caps) {
6260
6272
  return caps.hullmass !== undefined;
6261
6273
  }
6274
+ function capsHasHauler(caps) {
6275
+ return caps.hauler !== undefined;
6276
+ }
6262
6277
 
6263
6278
  function calcCargoItemMass(item) {
6264
6279
  const itemDef = getItem(item.item_id);
@@ -6313,7 +6328,7 @@ function cargoItemToStack(item) {
6313
6328
  return {
6314
6329
  item_id: antelope.UInt16.from(item.item_id),
6315
6330
  quantity: antelope.UInt32.from(item.quantity),
6316
- seed: item.seed,
6331
+ stats: item.stats,
6317
6332
  modules: item.modules ?? [],
6318
6333
  };
6319
6334
  }
@@ -6321,23 +6336,18 @@ function stackToCargoItem(stack) {
6321
6336
  return Types.cargo_item.from({
6322
6337
  item_id: stack.item_id,
6323
6338
  quantity: stack.quantity,
6324
- seed: stack.seed,
6339
+ stats: stack.stats,
6325
6340
  modules: stack.modules,
6326
6341
  });
6327
6342
  }
6328
- function seedEquals(a, b) {
6329
- if (!a && !b)
6330
- return true;
6331
- if (!a || !b)
6332
- return false;
6343
+ function statsEquals(a, b) {
6333
6344
  return a.equals(b);
6334
6345
  }
6335
6346
  function stackIdentityEqual(a, b) {
6336
- return a.item_id.equals(b.item_id) && seedEquals(a.seed, b.seed);
6347
+ return a.item_id.equals(b.item_id) && statsEquals(a.stats, b.stats);
6337
6348
  }
6338
6349
  function stackKey(s) {
6339
- const seedVal = s.seed ? s.seed.toString() : '0';
6340
- return `${s.item_id.toNumber()}:${seedVal}`;
6350
+ return `${s.item_id.toNumber()}:${s.stats.toString()}`;
6341
6351
  }
6342
6352
  function stacksEqual(a, b) {
6343
6353
  return stackIdentityEqual(a, b) && a.quantity.equals(b.quantity);
@@ -6661,7 +6671,9 @@ function applyGatherTask(projected, task, options) {
6661
6671
  if (!options.complete)
6662
6672
  return;
6663
6673
  applyEnergyCost(projected, task);
6664
- applyAddCargoTask(projected, task);
6674
+ if (!task.entitytarget) {
6675
+ applyAddCargoTask(projected, task);
6676
+ }
6665
6677
  }
6666
6678
  function applyCraftTask(projected, task) {
6667
6679
  applyEnergyCost(projected, task);
@@ -6957,9 +6969,19 @@ function needsRecharge(entity) {
6957
6969
  }
6958
6970
 
6959
6971
  class Ship extends Types.entity_info {
6972
+ constructor() {
6973
+ super(...arguments);
6974
+ this._modules = [];
6975
+ }
6960
6976
  get name() {
6961
6977
  return this.entity_name;
6962
6978
  }
6979
+ get modules() {
6980
+ return this._modules;
6981
+ }
6982
+ setModules(modules) {
6983
+ this._modules = modules;
6984
+ }
6963
6985
  get inv() {
6964
6986
  return (this._inv ?? (this._inv = new InventoryAccessor(this)));
6965
6987
  }
@@ -7078,10 +7100,188 @@ class Ship extends Types.entity_info {
7078
7100
  }
7079
7101
  }
7080
7102
 
7103
+ function computeShipHullCapabilities(stats) {
7104
+ const density = stats.density ?? 500;
7105
+ const strength = stats.strength ?? 500;
7106
+ const fineness = stats.fineness ?? 500;
7107
+ const saturation = stats.saturation ?? 500;
7108
+ const hullmass = 25000 + 75 * density;
7109
+ const statSum = strength + fineness + saturation;
7110
+ const exponent = statSum / 2997.0;
7111
+ const capacity = Math.floor(1000000 * Math.pow(10, exponent));
7112
+ return { hullmass, capacity };
7113
+ }
7114
+ function computeEngineCapabilities(stats) {
7115
+ const vol = stats.volatility ?? 500;
7116
+ const thm = stats.thermal ?? 500;
7117
+ return {
7118
+ thrust: 400 + Math.floor((vol * 3) / 4),
7119
+ drain: Math.max(30, 50 - Math.floor(thm / 70)),
7120
+ };
7121
+ }
7122
+ function computeGeneratorCapabilities(stats) {
7123
+ const res = stats.resonance ?? 500;
7124
+ const ref = stats.reflectivity ?? 500;
7125
+ return {
7126
+ capacity: 300 + Math.floor(res / 6),
7127
+ recharge: 1 + Math.floor((ref * 3) / 1000),
7128
+ };
7129
+ }
7130
+ function computeGathererCapabilities(stats) {
7131
+ const str = stats.strength ?? 500;
7132
+ const con = stats.conductivity ?? 500;
7133
+ const ref = stats.reflectivity ?? 500;
7134
+ const tol = stats.tolerance ?? 500;
7135
+ return {
7136
+ yield: 200 + str,
7137
+ drain: Math.max(250, 1250 - Math.floor((con * 25) / 20)),
7138
+ depth: 200 + Math.floor((tol * 3) / 2),
7139
+ speed: 100 + Math.floor((ref * 4) / 5),
7140
+ };
7141
+ }
7142
+ function computeLoaderCapabilities(stats) {
7143
+ const fin = stats.fineness ?? 500;
7144
+ const pla = stats.plasticity ?? 500;
7145
+ return {
7146
+ mass: Math.max(200, 2000 - Math.floor(fin * 2)),
7147
+ thrust: 1 + Math.floor(pla / 500),
7148
+ quantity: 1,
7149
+ };
7150
+ }
7151
+ function computeManufacturingCapabilities(stats) {
7152
+ const rea = stats.reactivity ?? 500;
7153
+ const com = stats.composition ?? 500;
7154
+ return {
7155
+ speed: 100 + Math.floor((rea * 4) / 5),
7156
+ drain: Math.max(5, 30 - Math.floor(com / 33)),
7157
+ };
7158
+ }
7159
+ function computeHaulerCapabilities(stats) {
7160
+ const res = stats.resonance ?? 500;
7161
+ const con = stats.conductivity ?? 500;
7162
+ const ref = stats.reflectivity ?? 500;
7163
+ return {
7164
+ capacity: Math.max(1, 1 + Math.floor(res / 400)),
7165
+ efficiency: 2000 + con * 6,
7166
+ drain: Math.max(3, 15 - Math.floor(ref / 80)),
7167
+ };
7168
+ }
7169
+ function computeStorageCapabilities(stats, baseCapacity) {
7170
+ const strength = stats.strength ?? 500;
7171
+ const fineness = stats.fineness ?? 500;
7172
+ const saturation = stats.saturation ?? 500;
7173
+ const statSum = strength + fineness + saturation;
7174
+ const capacityBonus = Math.floor((baseCapacity * (10 + Math.floor((statSum * 10) / 2997))) / 100);
7175
+ return { capacityBonus };
7176
+ }
7177
+ function computeWarehouseHullCapabilities(stats) {
7178
+ const density = stats.density ?? 500;
7179
+ const strength = stats.strength ?? 500;
7180
+ const fineness = stats.fineness ?? 500;
7181
+ const saturation = stats.saturation ?? 500;
7182
+ const hullmass = 25000 + 75 * density;
7183
+ const statSum = strength + fineness + saturation;
7184
+ const exponent = statSum / 2997.0;
7185
+ const capacity = Math.floor(20000000 * Math.pow(10, exponent));
7186
+ return { hullmass, capacity };
7187
+ }
7188
+ function computeShipCapabilities(modules) {
7189
+ const ship = {};
7190
+ const engineModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_ENGINE);
7191
+ if (engineModules.length > 0) {
7192
+ let totalThrust = 0;
7193
+ let totalDrain = 0;
7194
+ for (const m of engineModules) {
7195
+ const caps = computeEngineCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7196
+ totalThrust += caps.thrust;
7197
+ totalDrain += caps.drain;
7198
+ }
7199
+ ship.engines = { thrust: totalThrust, drain: totalDrain };
7200
+ }
7201
+ const generatorModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GENERATOR);
7202
+ if (generatorModules.length > 0) {
7203
+ let totalCapacity = 0;
7204
+ let totalRecharge = 0;
7205
+ for (const m of generatorModules) {
7206
+ const caps = computeGeneratorCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7207
+ totalCapacity += caps.capacity;
7208
+ totalRecharge += caps.recharge;
7209
+ }
7210
+ ship.generator = { capacity: totalCapacity, recharge: totalRecharge };
7211
+ }
7212
+ const gathererModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GATHERER);
7213
+ if (gathererModules.length > 0) {
7214
+ let totalYield = 0;
7215
+ let totalDrain = 0;
7216
+ let totalDepth = 0;
7217
+ let totalSpeed = 0;
7218
+ for (const m of gathererModules) {
7219
+ const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7220
+ totalYield += caps.yield;
7221
+ totalDrain += caps.drain;
7222
+ totalDepth += caps.depth;
7223
+ totalSpeed += caps.speed;
7224
+ }
7225
+ ship.gatherer = { yield: totalYield, drain: totalDrain, depth: totalDepth, speed: totalSpeed };
7226
+ }
7227
+ const haulerModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_HAULER);
7228
+ if (haulerModules.length > 0) {
7229
+ let totalCapacity = 0;
7230
+ let weightedEffNum = 0;
7231
+ let totalDrain = 0;
7232
+ for (const m of haulerModules) {
7233
+ const caps = computeHaulerCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7234
+ totalCapacity += caps.capacity;
7235
+ weightedEffNum += caps.efficiency * caps.capacity;
7236
+ totalDrain += caps.drain;
7237
+ }
7238
+ ship.hauler = {
7239
+ capacity: totalCapacity,
7240
+ efficiency: totalCapacity > 0 ? Math.floor(weightedEffNum / totalCapacity) : 0,
7241
+ drain: totalDrain,
7242
+ };
7243
+ }
7244
+ const loaderModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_LOADER);
7245
+ if (loaderModules.length > 0) {
7246
+ let totalMass = 0;
7247
+ let totalThrust = 0;
7248
+ let totalQuantity = 0;
7249
+ for (const m of loaderModules) {
7250
+ const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7251
+ totalMass += caps.mass;
7252
+ totalThrust += caps.thrust;
7253
+ totalQuantity += caps.quantity;
7254
+ }
7255
+ ship.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
7256
+ }
7257
+ const crafterModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_CRAFTER);
7258
+ if (crafterModules.length > 0) {
7259
+ let totalSpeed = 0;
7260
+ let totalDrain = 0;
7261
+ for (const m of crafterModules) {
7262
+ const caps = computeManufacturingCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7263
+ totalSpeed += caps.speed;
7264
+ totalDrain += caps.drain;
7265
+ }
7266
+ ship.crafter = { speed: totalSpeed, drain: totalDrain };
7267
+ }
7268
+ return ship;
7269
+ }
7270
+
7081
7271
  class Warehouse extends Types.entity_info {
7272
+ constructor() {
7273
+ super(...arguments);
7274
+ this._modules = [];
7275
+ }
7082
7276
  get name() {
7083
7277
  return this.entity_name;
7084
7278
  }
7279
+ get modules() {
7280
+ return this._modules;
7281
+ }
7282
+ setModules(modules) {
7283
+ this._modules = modules;
7284
+ }
7085
7285
  get inv() {
7086
7286
  return (this._inv ?? (this._inv = new InventoryAccessor(this)));
7087
7287
  }
@@ -7130,6 +7330,23 @@ class Warehouse extends Types.entity_info {
7130
7330
  return hull.adding(this.totalCargoMass);
7131
7331
  }
7132
7332
  }
7333
+ function computeWarehouseCapabilities(modules) {
7334
+ const warehouse = {};
7335
+ const loaderModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_LOADER);
7336
+ if (loaderModules.length > 0) {
7337
+ let totalMass = 0;
7338
+ let totalThrust = 0;
7339
+ let totalQuantity = 0;
7340
+ for (const m of loaderModules) {
7341
+ const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7342
+ totalMass += caps.mass;
7343
+ totalThrust += caps.thrust;
7344
+ totalQuantity += caps.quantity;
7345
+ }
7346
+ warehouse.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
7347
+ }
7348
+ return warehouse;
7349
+ }
7133
7350
 
7134
7351
  class Container extends Types.entity_info {
7135
7352
  get name() {
@@ -7173,10 +7390,10 @@ class Container extends Types.entity_info {
7173
7390
  function computeContainerCapabilities(stats) {
7174
7391
  const density = stats['density'] ?? 500;
7175
7392
  const strength = stats['strength'] ?? 500;
7176
- const ductility = stats['ductility'] ?? 500;
7177
- const purity = stats['purity'] ?? 500;
7393
+ const fineness = stats['fineness'] ?? 500;
7394
+ const saturation = stats['saturation'] ?? 500;
7178
7395
  const hullmass = 25000 + 75 * density;
7179
- const statSum = strength + ductility + purity;
7396
+ const statSum = strength + fineness + saturation;
7180
7397
  const exponent = statSum / 2997;
7181
7398
  const capacity = Math.floor(1000000 * Math.pow(10, exponent));
7182
7399
  return { hullmass, capacity };
@@ -7184,10 +7401,10 @@ function computeContainerCapabilities(stats) {
7184
7401
  function computeContainerT2Capabilities(stats) {
7185
7402
  const strength = stats['strength'] ?? 0;
7186
7403
  const density = stats['density'] ?? 0;
7187
- const ductility = stats['ductility'] ?? 0;
7188
- const purity = stats['purity'] ?? 0;
7404
+ const fineness = stats['fineness'] ?? 0;
7405
+ const saturation = stats['saturation'] ?? 0;
7189
7406
  const hullmass = 20000 + 50 * density;
7190
- const statSum = strength + ductility + purity;
7407
+ const statSum = strength + fineness + saturation;
7191
7408
  const exponent = statSum / 2500;
7192
7409
  const capacity = Math.floor(1500000 * Math.pow(10, exponent));
7193
7410
  return { hullmass, capacity };
@@ -7390,13 +7607,14 @@ class ActionsManager extends BaseManager {
7390
7607
  id: antelope.UInt64.from(shipId),
7391
7608
  });
7392
7609
  }
7393
- transfer(sourceType, sourceId, destType, destId, goodId, quantity) {
7610
+ transfer(sourceType, sourceId, destType, destId, itemId, stats, quantity) {
7394
7611
  return this.server.action('transfer', {
7395
7612
  source_type: sourceType,
7396
7613
  source_id: antelope.UInt64.from(sourceId),
7397
7614
  dest_type: destType,
7398
7615
  dest_id: antelope.UInt64.from(destId),
7399
- item_id: antelope.UInt16.from(goodId),
7616
+ item_id: antelope.UInt16.from(itemId),
7617
+ stats: antelope.UInt64.from(stats),
7400
7618
  quantity: antelope.UInt32.from(quantity),
7401
7619
  });
7402
7620
  }
@@ -7411,10 +7629,16 @@ class ActionsManager extends BaseManager {
7411
7629
  account: antelope.Name.from(account),
7412
7630
  });
7413
7631
  }
7414
- gather(shipId, stratum, quantity) {
7632
+ gather(source, destination, stratum, quantity) {
7415
7633
  return this.server.action('gather', {
7416
- entity_type: EntityType.SHIP,
7417
- id: antelope.UInt64.from(shipId),
7634
+ source: Types.entity_ref.from({
7635
+ entity_type: source.entityType,
7636
+ entity_id: antelope.UInt64.from(source.entityId),
7637
+ }),
7638
+ destination: Types.entity_ref.from({
7639
+ entity_type: destination.entityType,
7640
+ entity_id: antelope.UInt64.from(destination.entityId),
7641
+ }),
7418
7642
  stratum: antelope.UInt16.from(stratum),
7419
7643
  quantity: antelope.UInt32.from(quantity),
7420
7644
  });
@@ -7447,12 +7671,12 @@ class ActionsManager extends BaseManager {
7447
7671
  inputs: cargoInputs,
7448
7672
  });
7449
7673
  }
7450
- deploy(entityType, entityId, packedItemId, seed, entityName) {
7674
+ deploy(entityType, entityId, packedItemId, stats, entityName) {
7451
7675
  return this.server.action('deploy', {
7452
7676
  entity_type: entityType,
7453
7677
  id: antelope.UInt64.from(entityId),
7454
7678
  packed_item_id: antelope.UInt16.from(packedItemId),
7455
- seed: antelope.UInt64.from(seed),
7679
+ stats: antelope.UInt64.from(stats),
7456
7680
  entity_name: entityName,
7457
7681
  });
7458
7682
  }
@@ -7473,6 +7697,15 @@ class ActionsManager extends BaseManager {
7473
7697
  target_cargo_id: antelope.UInt64.from(targetCargoId),
7474
7698
  });
7475
7699
  }
7700
+ wrap(owner, entityType, entityId, cargoId, quantity) {
7701
+ return this.server.action('wrap', {
7702
+ owner: antelope.Name.from(owner),
7703
+ entity_type: entityType,
7704
+ entity_id: antelope.UInt64.from(entityId),
7705
+ cargo_id: antelope.UInt64.from(cargoId),
7706
+ quantity: antelope.UInt64.from(quantity),
7707
+ });
7708
+ }
7476
7709
  joinGame(account, companyName) {
7477
7710
  return [this.foundCompany(account, companyName), this.join(account)];
7478
7711
  }
@@ -7612,6 +7845,51 @@ class Shipload {
7612
7845
  }
7613
7846
  }
7614
7847
 
7848
+ function assignModulesToSlots(packedEntityItemId, modules, entityLabel) {
7849
+ const slots = getEntitySlotLayout(packedEntityItemId);
7850
+ const result = slots.map((s) => ({ type: s.type, installed: undefined }));
7851
+ for (const mod of modules) {
7852
+ const itemId = Number(antelope.UInt16.from(mod.itemId).value.toString());
7853
+ const modType = getModuleCapabilityType(itemId);
7854
+ const slotIdx = result.findIndex((r) => !r.installed && moduleAccepts(r.type, modType));
7855
+ if (slotIdx === -1) {
7856
+ const recipe = getModuleRecipeByItemId(itemId);
7857
+ const modName = recipe?.name ?? `item ${itemId}`;
7858
+ throw new Error(`No compatible slot for module ${modName} (type ${modType}) on ${entityLabel}`);
7859
+ }
7860
+ result[slotIdx].installed = Types.packed_module.from({
7861
+ item_id: antelope.UInt16.from(mod.itemId),
7862
+ stats: antelope.UInt64.from(mod.stats),
7863
+ });
7864
+ }
7865
+ return result.map((r) => Types.module_entry.from({
7866
+ type: antelope.UInt8.from(r.type),
7867
+ installed: r.installed,
7868
+ }));
7869
+ }
7870
+ function decodePackedInput(m) {
7871
+ return {
7872
+ itemId: Number(antelope.UInt16.from(m.itemId).value.toString()),
7873
+ stats: BigInt(antelope.UInt64.from(m.stats).toString()),
7874
+ };
7875
+ }
7876
+ function computeStorageBonus(decoded, baseCapacity) {
7877
+ let totalBonus = 0;
7878
+ for (const m of decoded) {
7879
+ if (getModuleCapabilityType(m.itemId) !== MODULE_STORAGE)
7880
+ continue;
7881
+ const stats = decodeCraftedItemStats(m.itemId, m.stats);
7882
+ const { capacityBonus } = computeStorageCapabilities(stats, baseCapacity);
7883
+ totalBonus += capacityBonus;
7884
+ }
7885
+ return totalBonus;
7886
+ }
7887
+ function deriveShipFromModules(modules, baseCapacity) {
7888
+ const decoded = modules.map(decodePackedInput);
7889
+ const capabilities = computeShipCapabilities(decoded);
7890
+ const totalBonus = computeStorageBonus(decoded, baseCapacity);
7891
+ return { capabilities, finalCapacity: baseCapacity + totalBonus };
7892
+ }
7615
7893
  function makeShip(state) {
7616
7894
  const info = {
7617
7895
  type: antelope.Name.from('ship'),
@@ -7628,20 +7906,38 @@ function makeShip(state) {
7628
7906
  };
7629
7907
  if (state.hullmass !== undefined)
7630
7908
  info.hullmass = antelope.UInt32.from(state.hullmass);
7631
- if (state.capacity !== undefined)
7632
- info.capacity = antelope.UInt32.from(state.capacity);
7633
7909
  if (state.energy !== undefined)
7634
7910
  info.energy = antelope.UInt16.from(state.energy);
7635
- if (state.engines)
7636
- info.engines = state.engines;
7637
- if (state.generator)
7638
- info.generator = state.generator;
7639
- if (state.loaders)
7640
- info.loaders = state.loaders;
7641
7911
  if (state.schedule)
7642
7912
  info.schedule = state.schedule;
7913
+ let moduleEntries = [];
7914
+ if (state.modules && state.modules.length > 0) {
7915
+ moduleEntries = assignModulesToSlots(ITEM_SHIP_T1_PACKED, state.modules, 'Ship T1');
7916
+ const { capabilities, finalCapacity } = deriveShipFromModules(state.modules, state.capacity ?? 0);
7917
+ if (capabilities.engines)
7918
+ info.engines = capabilities.engines;
7919
+ if (capabilities.generator)
7920
+ info.generator = capabilities.generator;
7921
+ if (capabilities.gatherer)
7922
+ info.gatherer = capabilities.gatherer;
7923
+ if (capabilities.hauler)
7924
+ info.hauler = capabilities.hauler;
7925
+ if (capabilities.loaders)
7926
+ info.loaders = capabilities.loaders;
7927
+ if (capabilities.crafter)
7928
+ info.crafter = capabilities.crafter;
7929
+ if (state.capacity !== undefined)
7930
+ info.capacity = antelope.UInt32.from(finalCapacity);
7931
+ }
7932
+ else {
7933
+ moduleEntries = assignModulesToSlots(ITEM_SHIP_T1_PACKED, [], 'Ship T1');
7934
+ if (state.capacity !== undefined)
7935
+ info.capacity = antelope.UInt32.from(state.capacity);
7936
+ }
7643
7937
  const entityInfo = Types.entity_info.from(info);
7644
- return new Ship(entityInfo);
7938
+ const ship = new Ship(entityInfo);
7939
+ ship.setModules(moduleEntries);
7940
+ return ship;
7645
7941
  }
7646
7942
  function makeWarehouse(state) {
7647
7943
  const info = {
@@ -7660,12 +7956,25 @@ function makeWarehouse(state) {
7660
7956
  };
7661
7957
  if (state.hullmass !== undefined)
7662
7958
  info.hullmass = antelope.UInt32.from(state.hullmass);
7663
- if (state.loaders)
7664
- info.loaders = state.loaders;
7665
7959
  if (state.schedule)
7666
7960
  info.schedule = state.schedule;
7961
+ let moduleEntries = [];
7962
+ if (state.modules && state.modules.length > 0) {
7963
+ moduleEntries = assignModulesToSlots(ITEM_WAREHOUSE_T1_PACKED, state.modules, 'Warehouse T1');
7964
+ const decoded = state.modules.map(decodePackedInput);
7965
+ const capabilities = computeWarehouseCapabilities(decoded);
7966
+ if (capabilities.loaders)
7967
+ info.loaders = capabilities.loaders;
7968
+ const totalBonus = computeStorageBonus(decoded, state.capacity);
7969
+ info.capacity = antelope.UInt32.from(state.capacity + totalBonus);
7970
+ }
7971
+ else {
7972
+ moduleEntries = assignModulesToSlots(ITEM_WAREHOUSE_T1_PACKED, [], 'Warehouse T1');
7973
+ }
7667
7974
  const entityInfo = Types.entity_info.from(info);
7668
- return new Warehouse(entityInfo);
7975
+ const warehouse = new Warehouse(entityInfo);
7976
+ warehouse.setModules(moduleEntries);
7977
+ return warehouse;
7669
7978
  }
7670
7979
  function makeContainer(state) {
7671
7980
  const entityInfo = Types.entity_info.from({
@@ -7677,7 +7986,7 @@ function makeContainer(state) {
7677
7986
  hullmass: antelope.UInt32.from(state.hullmass),
7678
7987
  capacity: antelope.UInt32.from(state.capacity),
7679
7988
  cargomass: antelope.UInt32.from(state.cargomass || 0),
7680
- cargo: [],
7989
+ cargo: state.cargo || [],
7681
7990
  is_idle: !state.schedule,
7682
7991
  current_task_elapsed: antelope.UInt32.from(0),
7683
7992
  current_task_remaining: antelope.UInt32.from(0),
@@ -7824,11 +8133,11 @@ function computeHaulerDrain(distance, drain, haulCount) {
7824
8133
  }
7825
8134
 
7826
8135
  const categoryColors = {
7827
- metal: '#5B9BD5',
7828
- precious: '#D4A843',
7829
- gas: '#7EC8E3',
7830
- mineral: '#B8A9C9',
7831
- organic: '#6B8E5A',
8136
+ ore: '#C26D3F',
8137
+ crystal: '#4ADBFF',
8138
+ gas: '#B8E4A0',
8139
+ regolith: '#C4A57B',
8140
+ biomass: '#5A8B3E',
7832
8141
  };
7833
8142
  const tierColors = {
7834
8143
  t1: '#8b8b8b',
@@ -7837,16 +8146,30 @@ const tierColors = {
7837
8146
  t4: '#c084fc',
7838
8147
  t5: '#fbbf24',
7839
8148
  };
8149
+ const tierLabels = {
8150
+ t1: 'Common',
8151
+ t2: 'Uncommon',
8152
+ t3: 'Rare',
8153
+ t4: 'Epic',
8154
+ t5: 'Legendary',
8155
+ };
7840
8156
  const categoryIcons = {
7841
- metal: '⬡',
7842
- precious: '◈',
8157
+ ore: '⬡',
8158
+ crystal: '◈',
7843
8159
  gas: '◎',
7844
- mineral: '',
7845
- organic: '❋',
8160
+ regolith: '',
8161
+ biomass: '❋',
8162
+ };
8163
+ const categoryIconShapes = {
8164
+ ore: 'hex',
8165
+ crystal: 'diamond',
8166
+ gas: 'circle',
8167
+ regolith: 'square',
8168
+ biomass: 'star',
7846
8169
  };
7847
8170
  const componentIcon = '▣';
7848
8171
  const moduleIcon = '⬢';
7849
- const itemIcons = {
8172
+ const itemAbbreviations = {
7850
8173
  10001: 'HP',
7851
8174
  10002: 'CL',
7852
8175
  10003: 'TC',
@@ -7916,39 +8239,39 @@ function isCraftedItem(id) {
7916
8239
 
7917
8240
  const categories = [
7918
8241
  {
7919
- id: 'metal',
7920
- name: 'Metals',
7921
- label: 'Metal',
7922
- description: 'Structural, strong, heavy — hulls, frames, load-bearing components',
7923
- color: categoryColors.metal,
8242
+ id: 'ore',
8243
+ name: 'Ore',
8244
+ label: 'Ore',
8245
+ description: 'Structural metal-bearing rock — hulls, frames, load-bearing components',
8246
+ color: categoryColors.ore,
7924
8247
  },
7925
8248
  {
7926
- id: 'precious',
7927
- name: 'Precious Metals',
7928
- label: 'Precious Metal',
7929
- description: 'Conductive, corrosion-resistantelectronics, energy systems, precision components',
7930
- color: categoryColors.precious,
8249
+ id: 'crystal',
8250
+ name: 'Crystal',
8251
+ label: 'Crystal',
8252
+ description: 'Crystalline latticeconductors, energy storage, resonant systems',
8253
+ color: categoryColors.crystal,
7931
8254
  },
7932
8255
  {
7933
8256
  id: 'gas',
7934
- name: 'Gases',
8257
+ name: 'Gas',
7935
8258
  label: 'Gas',
7936
- description: 'Energy, fuel, volatile/reactive — propulsion, thermal processing, chemical reactions',
8259
+ description: 'Atmospheric volatile — propulsion, thermal processing, chemical reactions',
7937
8260
  color: categoryColors.gas,
7938
8261
  },
7939
8262
  {
7940
- id: 'mineral',
7941
- name: 'Minerals',
7942
- label: 'Mineral',
7943
- description: 'Crystalline, hard, precise — sensors, optics, energy storage, cutting surfaces',
7944
- color: categoryColors.mineral,
8263
+ id: 'regolith',
8264
+ name: 'Regolith',
8265
+ label: 'Regolith',
8266
+ description: 'Surface mineral dust — sensors, optics, computation, cutting surfaces',
8267
+ color: categoryColors.regolith,
7945
8268
  },
7946
8269
  {
7947
- id: 'organic',
7948
- name: 'Organics',
7949
- label: 'Organic',
7950
- description: 'Adaptive, biological, polymer — insulation, composites, bio-processes',
7951
- color: categoryColors.organic,
8270
+ id: 'biomass',
8271
+ name: 'Biomass',
8272
+ label: 'Biomass',
8273
+ description: 'Organic polymer — insulation, composites, bio-processes',
8274
+ color: categoryColors.biomass,
7952
8275
  },
7953
8276
  ];
7954
8277
  function getCategoryInfo(id) {
@@ -8388,194 +8711,21 @@ function getStatMappingsForCapability(capability) {
8388
8711
  return statMappings.filter((m) => m.capability === capability);
8389
8712
  }
8390
8713
 
8391
- function computeShipHullCapabilities(stats) {
8392
- const density = stats.density ?? 500;
8393
- const strength = stats.strength ?? 500;
8394
- const ductility = stats.ductility ?? 500;
8395
- const purity = stats.purity ?? 500;
8396
- const hullmass = 25000 + 75 * density;
8397
- const statSum = strength + ductility + purity;
8398
- const exponent = statSum / 2997.0;
8399
- const capacity = Math.floor(1000000 * Math.pow(10, exponent));
8400
- return { hullmass, capacity };
8401
- }
8402
- function computeEngineCapabilities(stats) {
8403
- const vol = stats.volatility ?? 500;
8404
- const thm = stats.thermal ?? 500;
8405
- return {
8406
- thrust: 400 + Math.floor((vol * 3) / 4),
8407
- drain: Math.max(30, 50 - Math.floor(thm / 70)),
8408
- };
8409
- }
8410
- function computeGeneratorCapabilities(stats) {
8411
- const res = stats.resonance ?? 500;
8412
- const clr = stats.clarity ?? 500;
8413
- return {
8414
- capacity: 300 + Math.floor(res / 6),
8415
- recharge: 5 + Math.floor((clr * 15) / 1000),
8416
- };
8417
- }
8418
- function computeGathererCapabilities(stats) {
8419
- const str = stats.strength ?? 500;
8420
- const con = stats.conductivity ?? 500;
8421
- const ref = stats.reflectivity ?? 500;
8422
- const tol = stats.tolerance ?? 500;
8423
- return {
8424
- yield: 200 + str,
8425
- drain: Math.max(10, 50 - Math.floor(con / 20)),
8426
- depth: 200 + Math.floor((tol * 3) / 2),
8427
- speed: 100 + Math.floor((ref * 4) / 5),
8428
- };
8429
- }
8430
- function computeLoaderCapabilities(stats) {
8431
- const duc = stats.ductility ?? 500;
8432
- const pla = stats.plasticity ?? 500;
8433
- return {
8434
- mass: Math.max(200, 2000 - Math.floor(duc * 2)),
8435
- thrust: 1 + Math.floor(pla / 500),
8436
- quantity: 1,
8437
- };
8438
- }
8439
- function computeManufacturingCapabilities(stats) {
8440
- const rea = stats.reactivity ?? 500;
8441
- const clr = stats.clarity ?? 500;
8442
- return {
8443
- speed: 100 + Math.floor((rea * 4) / 5),
8444
- drain: Math.max(5, 30 - Math.floor(clr / 33)),
8445
- };
8446
- }
8447
- function computeHaulerCapabilities(stats) {
8448
- const res = stats.resonance ?? 500;
8449
- const con = stats.conductivity ?? 500;
8450
- const clr = stats.clarity ?? 500;
8451
- return {
8452
- capacity: Math.max(1, 1 + Math.floor(res / 400)),
8453
- efficiency: 2000 + con * 6,
8454
- drain: Math.max(3, 15 - Math.floor(clr / 80)),
8455
- };
8456
- }
8457
- function computeStorageCapabilities(stats, baseCapacity) {
8458
- const strength = stats.strength ?? 500;
8459
- const ductility = stats.ductility ?? 500;
8460
- const purity = stats.purity ?? 500;
8461
- const statSum = strength + ductility + purity;
8462
- const capacityBonus = Math.floor((baseCapacity * (10 + Math.floor((statSum * 10) / 2997))) / 100);
8463
- return { capacityBonus };
8464
- }
8465
- function computeWarehouseHullCapabilities(stats) {
8466
- const density = stats.density ?? 500;
8467
- const strength = stats.strength ?? 500;
8468
- const ductility = stats.ductility ?? 500;
8469
- const purity = stats.purity ?? 500;
8470
- const hullmass = 25000 + 75 * density;
8471
- const statSum = strength + ductility + purity;
8472
- const exponent = statSum / 2997.0;
8473
- const capacity = Math.floor(20000000 * Math.pow(10, exponent));
8474
- return { hullmass, capacity };
8475
- }
8476
- function computeShipCapabilities(modules) {
8477
- const ship = {};
8478
- const engineModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_ENGINE);
8479
- if (engineModules.length > 0) {
8480
- let totalThrust = 0;
8481
- let totalDrain = 0;
8482
- for (const m of engineModules) {
8483
- const caps = computeEngineCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
8484
- totalThrust += caps.thrust;
8485
- totalDrain += caps.drain;
8486
- }
8487
- ship.engines = { thrust: totalThrust, drain: totalDrain };
8488
- }
8489
- const generatorModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GENERATOR);
8490
- if (generatorModules.length > 0) {
8491
- let totalCapacity = 0;
8492
- let totalRecharge = 0;
8493
- for (const m of generatorModules) {
8494
- const caps = computeGeneratorCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
8495
- totalCapacity += caps.capacity;
8496
- totalRecharge += caps.recharge;
8497
- }
8498
- ship.generator = { capacity: totalCapacity, recharge: totalRecharge };
8499
- }
8500
- const gathererModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GATHERER);
8501
- if (gathererModules.length > 0) {
8502
- let totalYield = 0;
8503
- let totalDrain = 0;
8504
- let totalDepth = 0;
8505
- let totalSpeed = 0;
8506
- for (const m of gathererModules) {
8507
- const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
8508
- totalYield += caps.yield;
8509
- totalDrain += caps.drain;
8510
- totalDepth += caps.depth;
8511
- totalSpeed += caps.speed;
8512
- }
8513
- ship.gatherer = { yield: totalYield, drain: totalDrain, depth: totalDepth, speed: totalSpeed };
8514
- }
8515
- const haulerModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_HAULER);
8516
- if (haulerModules.length > 0) {
8517
- let totalCapacity = 0;
8518
- let weightedEffNum = 0;
8519
- let totalDrain = 0;
8520
- for (const m of haulerModules) {
8521
- const decoded = decodeCraftedItemStats(m.itemId, m.seed);
8522
- const caps = computeHaulerCapabilities({
8523
- resonance: decoded.capacity,
8524
- conductivity: decoded.efficiency,
8525
- clarity: decoded.drain,
8526
- });
8527
- totalCapacity += caps.capacity;
8528
- weightedEffNum += caps.efficiency * caps.capacity;
8529
- totalDrain += caps.drain;
8530
- }
8531
- ship.hauler = {
8532
- capacity: totalCapacity,
8533
- efficiency: totalCapacity > 0 ? Math.floor(weightedEffNum / totalCapacity) : 0,
8534
- drain: totalDrain,
8535
- };
8536
- }
8537
- const loaderModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_LOADER);
8538
- if (loaderModules.length > 0) {
8539
- let totalMass = 0;
8540
- let totalThrust = 0;
8541
- let totalQuantity = 0;
8542
- for (const m of loaderModules) {
8543
- const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
8544
- totalMass += caps.mass;
8545
- totalThrust += caps.thrust;
8546
- totalQuantity += caps.quantity;
8547
- }
8548
- ship.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
8549
- }
8550
- const crafterModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_CRAFTER);
8551
- if (crafterModules.length > 0) {
8552
- let totalSpeed = 0;
8553
- let totalDrain = 0;
8554
- for (const m of crafterModules) {
8555
- const caps = computeManufacturingCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
8556
- totalSpeed += caps.speed;
8557
- totalDrain += caps.drain;
8558
- }
8559
- ship.crafter = { speed: totalSpeed, drain: totalDrain };
8560
- }
8561
- return ship;
8562
- }
8563
-
8564
8714
  function toNum(v) {
8565
8715
  return Number(antelope.UInt16.from(v).value.toString());
8566
8716
  }
8567
- function toBigSeed(v) {
8717
+ function toBigStats(v) {
8568
8718
  return BigInt(antelope.UInt64.from(v).toString());
8569
8719
  }
8570
- function resolveResource(id, seed) {
8720
+ function resolveResource(id, stats) {
8571
8721
  const item = getItem(id);
8572
8722
  const cat = item.category;
8573
- let stats;
8574
- if (seed !== undefined) {
8575
- const derived = deriveResourceStats(toBigSeed(seed));
8723
+ let resolvedStats;
8724
+ if (stats !== undefined) {
8725
+ const bigStats = toBigStats(stats);
8576
8726
  const defs = getStatDefinitions(cat);
8577
- const values = [derived.stat1, derived.stat2, derived.stat3];
8578
- stats = defs.map((d, i) => ({
8727
+ const values = [decodeStat(bigStats, 0), decodeStat(bigStats, 1), decodeStat(bigStats, 2)];
8728
+ resolvedStats = defs.map((d, i) => ({
8579
8729
  key: d.key,
8580
8730
  label: d.label,
8581
8731
  abbreviation: d.abbreviation,
@@ -8589,27 +8739,28 @@ function resolveResource(id, seed) {
8589
8739
  itemId: id,
8590
8740
  name: String(item.name),
8591
8741
  icon: categoryIcons[cat] ?? '⬡',
8742
+ abbreviation: null,
8592
8743
  category: cat,
8593
8744
  tier: item.tier,
8594
8745
  mass: Number(item.mass.value.toString()),
8595
8746
  itemType: 'resource',
8596
- stats,
8747
+ stats: resolvedStats,
8597
8748
  };
8598
8749
  }
8599
- function resolveComponent(id, seed) {
8750
+ function resolveComponent(id, stats) {
8600
8751
  const comp = getComponentById(id);
8601
- let stats;
8602
- if (seed !== undefined) {
8603
- const decoded = decodeCraftedItemStats(id, toBigSeed(seed));
8604
- stats = Object.entries(decoded).map(([key, value]) => {
8605
- const allDefs = getStatDefinitions('metal')
8606
- .concat(getStatDefinitions('precious'))
8752
+ let resolvedStats;
8753
+ if (stats !== undefined) {
8754
+ const decoded = decodeCraftedItemStats(id, toBigStats(stats));
8755
+ resolvedStats = Object.entries(decoded).map(([key, value]) => {
8756
+ const allDefs = getStatDefinitions('ore')
8757
+ .concat(getStatDefinitions('crystal'))
8607
8758
  .concat(getStatDefinitions('gas'))
8608
- .concat(getStatDefinitions('mineral'))
8609
- .concat(getStatDefinitions('organic'));
8759
+ .concat(getStatDefinitions('regolith'))
8760
+ .concat(getStatDefinitions('biomass'));
8610
8761
  const def = allDefs.find((d) => d.key === key);
8611
8762
  const statDef = comp.stats.find((s) => s.key === key);
8612
- const cat = (statDef?.source ?? 'metal');
8763
+ const cat = (statDef?.source ?? 'ore');
8613
8764
  return {
8614
8765
  key,
8615
8766
  label: def?.label ?? key,
@@ -8624,11 +8775,12 @@ function resolveComponent(id, seed) {
8624
8775
  return {
8625
8776
  itemId: id,
8626
8777
  name: comp.name,
8627
- icon: itemIcons[id] ?? componentIcon,
8778
+ icon: itemAbbreviations[id] ?? componentIcon,
8779
+ abbreviation: itemAbbreviations[id] ?? null,
8628
8780
  tier: 't1',
8629
8781
  mass: comp.mass,
8630
8782
  itemType: 'component',
8631
- stats,
8783
+ stats: resolvedStats,
8632
8784
  };
8633
8785
  }
8634
8786
  function computeCapabilityGroup(moduleType, stats) {
@@ -8686,11 +8838,22 @@ function computeCapabilityGroup(moduleType, stats) {
8686
8838
  ],
8687
8839
  };
8688
8840
  }
8841
+ case MODULE_HAULER: {
8842
+ const caps = computeHaulerCapabilities(stats);
8843
+ return {
8844
+ capability: 'Hauler',
8845
+ attributes: [
8846
+ { label: 'Capacity', value: caps.capacity },
8847
+ { label: 'Efficiency', value: caps.efficiency },
8848
+ { label: 'Drain', value: caps.drain },
8849
+ ],
8850
+ };
8851
+ }
8689
8852
  case MODULE_STORAGE: {
8690
8853
  const str = stats.strength ?? 500;
8691
- const duc = stats.ductility ?? 500;
8692
- const pur = stats.purity ?? 500;
8693
- const statSum = str + duc + pur;
8854
+ const fin = stats.fineness ?? 500;
8855
+ const sat = stats.saturation ?? 500;
8856
+ const statSum = str + fin + sat;
8694
8857
  const pct = 10 + Math.floor((statSum * 10) / 2997);
8695
8858
  return { capability: 'Storage', attributes: [{ label: 'Capacity Bonus', value: pct }] };
8696
8859
  }
@@ -8698,36 +8861,37 @@ function computeCapabilityGroup(moduleType, stats) {
8698
8861
  return undefined;
8699
8862
  }
8700
8863
  }
8701
- function resolveModule(id, seed) {
8864
+ function resolveModule(id, stats) {
8702
8865
  const recipe = getModuleRecipeByItemId(id);
8703
8866
  let attributes;
8704
- if (seed !== undefined) {
8705
- const stats = decodeCraftedItemStats(id, toBigSeed(seed));
8867
+ if (stats !== undefined) {
8868
+ const decoded = decodeCraftedItemStats(id, toBigStats(stats));
8706
8869
  const modType = getModuleCapabilityType(id);
8707
- const group = computeCapabilityGroup(modType, stats);
8870
+ const group = computeCapabilityGroup(modType, decoded);
8708
8871
  if (group)
8709
8872
  attributes = [group];
8710
8873
  }
8711
8874
  return {
8712
8875
  itemId: id,
8713
8876
  name: recipe.name,
8714
- icon: itemIcons[id] ?? moduleIcon,
8877
+ icon: itemAbbreviations[id] ?? moduleIcon,
8878
+ abbreviation: itemAbbreviations[id] ?? null,
8715
8879
  tier: 't1',
8716
8880
  mass: 0,
8717
8881
  itemType: 'module',
8718
8882
  attributes,
8719
8883
  };
8720
8884
  }
8721
- function resolveEntity(id, seed, modules) {
8885
+ function resolveEntity(id, stats, modules) {
8722
8886
  const recipe = getEntityRecipeByItemId(id);
8723
8887
  let attributes;
8724
8888
  let moduleSlots;
8725
- if (seed !== undefined) {
8726
- const stats = decodeCraftedItemStats(id, toBigSeed(seed));
8889
+ if (stats !== undefined) {
8890
+ const decoded = decodeCraftedItemStats(id, toBigStats(stats));
8727
8891
  attributes = [];
8728
8892
  const isShip = recipe.id === 'ship-t1';
8729
8893
  if (isShip) {
8730
- const hullCaps = computeShipHullCapabilities(stats);
8894
+ const hullCaps = computeShipHullCapabilities(decoded);
8731
8895
  attributes.push({
8732
8896
  capability: 'Hull',
8733
8897
  attributes: [
@@ -8737,7 +8901,7 @@ function resolveEntity(id, seed, modules) {
8737
8901
  });
8738
8902
  }
8739
8903
  else {
8740
- const containerCaps = computeContainerCapabilities(stats);
8904
+ const containerCaps = computeContainerCapabilities(decoded);
8741
8905
  attributes.push({
8742
8906
  capability: 'Hull',
8743
8907
  attributes: [
@@ -8752,10 +8916,10 @@ function resolveEntity(id, seed, modules) {
8752
8916
  const mod = modules?.[i];
8753
8917
  if (mod?.installed) {
8754
8918
  const modItemId = Number(mod.installed.item_id.value.toString());
8755
- const modSeed = BigInt(mod.installed.seed.toString());
8756
- const modStats = decodeCraftedItemStats(modItemId, modSeed);
8919
+ const modStats = BigInt(mod.installed.stats.toString());
8920
+ const decodedStats = decodeCraftedItemStats(modItemId, modStats);
8757
8921
  const modType = getModuleCapabilityType(modItemId);
8758
- const group = computeCapabilityGroup(modType, modStats);
8922
+ const group = computeCapabilityGroup(modType, decodedStats);
8759
8923
  const modRecipe = getModuleRecipeByItemId(modItemId);
8760
8924
  return {
8761
8925
  name: modRecipe?.name ?? 'Module',
@@ -8769,7 +8933,8 @@ function resolveEntity(id, seed, modules) {
8769
8933
  return {
8770
8934
  itemId: id,
8771
8935
  name: recipe.name,
8772
- icon: itemIcons[id] ?? componentIcon,
8936
+ icon: itemAbbreviations[id] ?? componentIcon,
8937
+ abbreviation: itemAbbreviations[id] ?? null,
8773
8938
  tier: 't1',
8774
8939
  mass: 0,
8775
8940
  itemType: 'entity',
@@ -8777,28 +8942,157 @@ function resolveEntity(id, seed, modules) {
8777
8942
  moduleSlots,
8778
8943
  };
8779
8944
  }
8780
- function resolveItem(itemId, seed, modules) {
8945
+ function resolveItem(itemId, stats, modules) {
8781
8946
  const id = toNum(itemId);
8782
8947
  if (isModuleItem(id))
8783
- return resolveModule(id, seed);
8948
+ return resolveModule(id, stats);
8784
8949
  if (getComponentById(id))
8785
- return resolveComponent(id, seed);
8950
+ return resolveComponent(id, stats);
8786
8951
  if (getEntityRecipeByItemId(id))
8787
- return resolveEntity(id, seed, modules);
8788
- return resolveResource(id, seed);
8952
+ return resolveEntity(id, stats, modules);
8953
+ return resolveResource(id, stats);
8954
+ }
8955
+
8956
+ const TEMPLATES = {
8957
+ engine: {
8958
+ id: 'module.engine.description',
8959
+ template: 'generates {thrust} thrust for travel while draining {drain} energy per distance travelled',
8960
+ params: [
8961
+ ['thrust', 'Thrust'],
8962
+ ['drain', 'Drain'],
8963
+ ],
8964
+ highlightKeys: ['thrust', 'drain'],
8965
+ },
8966
+ generator: {
8967
+ id: 'module.generator.description',
8968
+ template: 'holds {capacity} maximum energy and restores {recharge} per second while recharging',
8969
+ params: [
8970
+ ['capacity', 'Capacity'],
8971
+ ['recharge', 'Recharge'],
8972
+ ],
8973
+ highlightKeys: ['capacity', 'recharge'],
8974
+ },
8975
+ gatherer: {
8976
+ id: 'module.gatherer.description',
8977
+ template: 'mines resources at {yield} speed to a max depth of {depth} with {speed} gather speed while draining {drain} energy per second',
8978
+ params: [
8979
+ ['yield', 'Yield'],
8980
+ ['drain', 'Drain'],
8981
+ ['depth', 'Depth'],
8982
+ ['speed', 'Speed'],
8983
+ ],
8984
+ highlightKeys: ['yield', 'depth', 'speed', 'drain'],
8985
+ },
8986
+ loader: {
8987
+ id: 'module.loader.description',
8988
+ template: '{quantity} loader that generates {thrust} thrust with a weight of {mass} per unit',
8989
+ params: [
8990
+ ['quantity', 'Quantity'],
8991
+ ['thrust', 'Thrust'],
8992
+ ['mass', 'Mass'],
8993
+ ],
8994
+ highlightKeys: ['quantity', 'thrust', 'mass'],
8995
+ },
8996
+ manufacturing: {
8997
+ id: 'module.manufacturing.description',
8998
+ template: 'manufactures items at {speed} speed while draining {drain} energy per second',
8999
+ params: [
9000
+ ['speed', 'Speed'],
9001
+ ['drain', 'Drain'],
9002
+ ],
9003
+ highlightKeys: ['speed', 'drain'],
9004
+ },
9005
+ storage: {
9006
+ id: 'module.storage.description',
9007
+ template: 'boosts cargo capacity by {bonus}%',
9008
+ params: [['bonus', 'Capacity Bonus']],
9009
+ highlightKeys: ['bonus'],
9010
+ },
9011
+ hauler: {
9012
+ id: 'module.hauler.description',
9013
+ template: 'locks onto up to {capacity} targets at {efficiency} efficiency while draining {drain} energy per distance travelled per target',
9014
+ params: [
9015
+ ['capacity', 'Capacity'],
9016
+ ['efficiency', 'Efficiency'],
9017
+ ['drain', 'Drain'],
9018
+ ],
9019
+ highlightKeys: ['capacity', 'efficiency', 'drain'],
9020
+ },
9021
+ };
9022
+ function describeModule(input) {
9023
+ if (!input.attributes || input.attributes.length === 0)
9024
+ return null;
9025
+ const key = input.capability.toLowerCase();
9026
+ const spec = TEMPLATES[key];
9027
+ if (!spec)
9028
+ return null;
9029
+ const params = {};
9030
+ for (const [paramName, attrLabel] of spec.params) {
9031
+ const attr = input.attributes.find((a) => a.label === attrLabel);
9032
+ if (attr)
9033
+ params[paramName] = attr.value;
9034
+ }
9035
+ return {
9036
+ id: spec.id,
9037
+ template: spec.template,
9038
+ params,
9039
+ highlightKeys: spec.highlightKeys,
9040
+ };
9041
+ }
9042
+ function describeModuleForItem(resolved) {
9043
+ if (resolved.itemType !== 'module')
9044
+ return null;
9045
+ const group = resolved.attributes?.[0];
9046
+ if (!group)
9047
+ return null;
9048
+ return describeModule({ capability: group.capability, attributes: group.attributes });
9049
+ }
9050
+ function describeModuleForSlot(slot) {
9051
+ if (!slot.installed || !slot.name || !slot.attributes)
9052
+ return null;
9053
+ return describeModule({ capability: slot.name, attributes: slot.attributes });
9054
+ }
9055
+ function renderDescription(desc, options) {
9056
+ const translate = options?.translate ?? ((_id, fallback) => fallback);
9057
+ const formatNumber = options?.formatNumber ?? ((n) => n.toLocaleString('en-US'));
9058
+ const tpl = translate(desc.id, desc.template);
9059
+ const spans = [];
9060
+ const regex = /\{([A-Za-z_][A-Za-z0-9_]*)\}/g;
9061
+ let lastIndex = 0;
9062
+ let m;
9063
+ while ((m = regex.exec(tpl)) !== null) {
9064
+ if (m.index > lastIndex) {
9065
+ spans.push({ text: tpl.slice(lastIndex, m.index) });
9066
+ }
9067
+ const paramName = m[1] ?? '';
9068
+ const raw = desc.params[paramName];
9069
+ if (raw === undefined) {
9070
+ spans.push({ text: `{${paramName}}` });
9071
+ }
9072
+ else {
9073
+ const formatted = typeof raw === 'number' ? formatNumber(raw) : raw;
9074
+ const highlight = desc.highlightKeys.includes(paramName);
9075
+ spans.push(highlight ? { text: formatted, highlight: true } : { text: formatted });
9076
+ }
9077
+ lastIndex = m.index + m[0].length;
9078
+ }
9079
+ if (lastIndex < tpl.length) {
9080
+ spans.push({ text: tpl.slice(lastIndex) });
9081
+ }
9082
+ return spans;
8789
9083
  }
8790
9084
 
8791
9085
  function readCommonBase(data) {
8792
9086
  return {
8793
9087
  quantity: Number(data.quantity),
8794
- seed: String(data.seed),
9088
+ stats: String(data.stats),
8795
9089
  origin_x: String(data.origin_x),
8796
9090
  origin_y: String(data.origin_y),
8797
9091
  };
8798
9092
  }
8799
9093
  function deserializeScalar(data, itemId) {
8800
9094
  const base = readCommonBase(data);
8801
- return { item_id: itemId, quantity: base.quantity, seed: base.seed };
9095
+ return { item_id: itemId, quantity: base.quantity, stats: base.stats };
8802
9096
  }
8803
9097
  const deserializeResource = deserializeScalar;
8804
9098
  const deserializeComponent = deserializeScalar;
@@ -8806,15 +9100,15 @@ const deserializeModule = deserializeScalar;
8806
9100
  function deserializeEntity(data, itemId) {
8807
9101
  const base = readCommonBase(data);
8808
9102
  const moduleItems = (data.module_items ?? []).map((v) => Number(v));
8809
- const moduleSeeds = (data.module_seeds ?? []).map((v) => String(v));
9103
+ const moduleStats = (data.module_stats ?? []).map((v) => String(v));
8810
9104
  const layout = getEntitySlotLayout(itemId);
8811
9105
  const modules = layout.map((slot, i) => ({
8812
9106
  type: slot.type,
8813
9107
  installed: moduleItems[i] && moduleItems[i] !== 0
8814
- ? { item_id: moduleItems[i], seed: moduleSeeds[i] }
9108
+ ? { item_id: moduleItems[i], stats: moduleStats[i] }
8815
9109
  : undefined,
8816
9110
  }));
8817
- return { item_id: itemId, quantity: base.quantity, seed: base.seed, modules };
9111
+ return { item_id: itemId, quantity: base.quantity, stats: base.stats, modules };
8818
9112
  }
8819
9113
  function deserializeAsset(data, itemId) {
8820
9114
  const type = itemTypeCode(itemId);
@@ -8833,40 +9127,40 @@ function deserializeAsset(data, itemId) {
8833
9127
  function idiv(a, b) {
8834
9128
  return Math.floor(a / b);
8835
9129
  }
8836
- function computeBaseHullmass(seed) {
8837
- const density = decodeStat(seed, 1);
9130
+ function computeBaseHullmass(stats) {
9131
+ const density = decodeStat(stats, 1);
8838
9132
  return 25000 + 75 * density;
8839
9133
  }
8840
- function computeBaseCapacityShip(seed) {
8841
- const s = decodeStat(seed, 0) + decodeStat(seed, 2) + decodeStat(seed, 3);
9134
+ function computeBaseCapacityShip(stats) {
9135
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
8842
9136
  return Math.floor(1000000 * Math.pow(10, s / 2997));
8843
9137
  }
8844
- function computeBaseCapacityWarehouse(seed) {
8845
- const s = decodeStat(seed, 0) + decodeStat(seed, 2) + decodeStat(seed, 3);
9138
+ function computeBaseCapacityWarehouse(stats) {
9139
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
8846
9140
  return Math.floor(20000000 * Math.pow(10, s / 2997));
8847
9141
  }
8848
9142
  const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
8849
9143
  const computeEngineDrain = (thm) => Math.max(30, 50 - idiv(thm, 70));
8850
9144
  const computeGeneratorCap = (res) => 300 + idiv(res, 6);
8851
- const computeGeneratorRech = (clr) => 5 + idiv(clr * 15, 1000);
9145
+ const computeGeneratorRech = (ref) => 1 + idiv(ref * 3, 1000);
8852
9146
  const computeGathererYield = (str) => 200 + str;
8853
- const computeGathererDrain = (con) => Math.max(10, 50 - idiv(con, 20));
9147
+ const computeGathererDrain = (con) => Math.max(250, 1250 - idiv(con * 25, 20));
8854
9148
  const computeGathererDepth = (tol) => 200 + idiv(tol * 3, 2);
8855
9149
  const computeGathererSpeed = (ref) => 100 + idiv(ref * 4, 5);
8856
- const computeLoaderMass = (duc) => Math.max(200, 2000 - duc * 2);
9150
+ const computeLoaderMass = (fin) => Math.max(200, 2000 - fin * 2);
8857
9151
  const computeLoaderThrust = (pla) => 1 + idiv(pla, 500);
8858
9152
  const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
8859
- const computeCrafterDrain = (clr) => Math.max(5, 30 - idiv(clr, 33));
9153
+ const computeCrafterDrain = (com) => Math.max(5, 30 - idiv(com, 33));
8860
9154
  function entityDisplayName(itemId) {
8861
9155
  switch (itemId) {
8862
9156
  case ITEM_SHIP_T1_PACKED:
8863
- return 'Ship T1';
9157
+ return 'Ship';
8864
9158
  case ITEM_WAREHOUSE_T1_PACKED:
8865
- return 'Warehouse T1';
9159
+ return 'Warehouse';
8866
9160
  case ITEM_CONTAINER_T1_PACKED:
8867
- return 'Container T1';
9161
+ return 'Container';
8868
9162
  case ITEM_CONTAINER_T2_PACKED:
8869
- return 'Container T2';
9163
+ return 'Container';
8870
9164
  default:
8871
9165
  return 'Entity';
8872
9166
  }
@@ -8874,22 +9168,22 @@ function entityDisplayName(itemId) {
8874
9168
  function moduleDisplayName(itemId) {
8875
9169
  switch (itemId) {
8876
9170
  case ITEM_ENGINE_T1:
8877
- return 'Engine T1';
9171
+ return 'Engine';
8878
9172
  case ITEM_GENERATOR_T1:
8879
- return 'Generator T1';
9173
+ return 'Generator';
8880
9174
  case ITEM_GATHERER_T1:
8881
- return 'Gatherer T1';
9175
+ return 'Gatherer';
8882
9176
  case ITEM_LOADER_T1:
8883
- return 'Loader T1';
9177
+ return 'Loader';
8884
9178
  case ITEM_MANUFACTURING_T1:
8885
- return 'Manufacturing T1';
9179
+ return 'Manufacturing';
8886
9180
  case ITEM_STORAGE_T1:
8887
- return 'Storage T1';
9181
+ return 'Storage';
8888
9182
  default:
8889
9183
  return 'Module';
8890
9184
  }
8891
9185
  }
8892
- function formatModuleLine(slot, itemId, seed) {
9186
+ function formatModuleLine(slot, itemId, stats) {
8893
9187
  let out = `Slot ${slot} - `;
8894
9188
  if (itemId === 0) {
8895
9189
  out += '(empty)';
@@ -8899,42 +9193,42 @@ function formatModuleLine(slot, itemId, seed) {
8899
9193
  const subtype = getModuleCapabilityType(itemId);
8900
9194
  switch (subtype) {
8901
9195
  case MODULE_ENGINE: {
8902
- const vol = decodeStat(seed, 0);
8903
- const thm = decodeStat(seed, 1);
9196
+ const vol = decodeStat(stats, 0);
9197
+ const thm = decodeStat(stats, 1);
8904
9198
  out += ` Thrust ${computeEngineThrust(vol)} Drain ${computeEngineDrain(thm)}`;
8905
9199
  break;
8906
9200
  }
8907
9201
  case MODULE_GENERATOR: {
8908
- const res = decodeStat(seed, 0);
8909
- const clr = decodeStat(seed, 1);
8910
- out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(clr)}`;
9202
+ const res = decodeStat(stats, 0);
9203
+ const ref = decodeStat(stats, 1);
9204
+ out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(ref)}`;
8911
9205
  break;
8912
9206
  }
8913
9207
  case MODULE_GATHERER: {
8914
- const str = decodeStat(seed, 0);
8915
- const tol = decodeStat(seed, 1);
8916
- const con = decodeStat(seed, 3);
8917
- const ref = decodeStat(seed, 4);
9208
+ const str = decodeStat(stats, 0);
9209
+ const tol = decodeStat(stats, 1);
9210
+ const con = decodeStat(stats, 3);
9211
+ const ref = decodeStat(stats, 4);
8918
9212
  out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol)} Speed ${computeGathererSpeed(ref)} Drain ${computeGathererDrain(con)}`;
8919
9213
  break;
8920
9214
  }
8921
9215
  case MODULE_LOADER: {
8922
- const duc = decodeStat(seed, 0);
8923
- const pla = decodeStat(seed, 1);
8924
- out += ` Mass ${computeLoaderMass(duc)} Thrust ${computeLoaderThrust(pla)}`;
9216
+ const fin = decodeStat(stats, 0);
9217
+ const pla = decodeStat(stats, 1);
9218
+ out += ` Mass ${computeLoaderMass(fin)} Thrust ${computeLoaderThrust(pla)}`;
8925
9219
  break;
8926
9220
  }
8927
9221
  case MODULE_CRAFTER: {
8928
- const rea = decodeStat(seed, 0);
8929
- const clr = decodeStat(seed, 1);
8930
- out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(clr)}`;
9222
+ const rea = decodeStat(stats, 0);
9223
+ const com = decodeStat(stats, 1);
9224
+ out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(com)}`;
8931
9225
  break;
8932
9226
  }
8933
9227
  case MODULE_STORAGE: {
8934
- const str = decodeStat(seed, 0);
8935
- const duc = decodeStat(seed, 1);
8936
- const pur = decodeStat(seed, 2);
8937
- const sum = str + duc + pur;
9228
+ const str = decodeStat(stats, 0);
9229
+ const fin = decodeStat(stats, 2);
9230
+ const sat = decodeStat(stats, 3);
9231
+ const sum = str + fin + sat;
8938
9232
  const pct = 10 + idiv(sum * 10, 2997);
8939
9233
  out += ` +${pct}% capacity`;
8940
9234
  break;
@@ -8942,14 +9236,14 @@ function formatModuleLine(slot, itemId, seed) {
8942
9236
  }
8943
9237
  return out;
8944
9238
  }
8945
- function buildEntityDescription(itemId, hullSeed, moduleItems, moduleSeeds) {
8946
- const hullMass = computeBaseHullmass(hullSeed);
9239
+ function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
9240
+ const hullMass = computeBaseHullmass(hullStats);
8947
9241
  let baseCapacity = 0;
8948
9242
  if (itemId === ITEM_SHIP_T1_PACKED) {
8949
- baseCapacity = computeBaseCapacityShip(hullSeed);
9243
+ baseCapacity = computeBaseCapacityShip(hullStats);
8950
9244
  }
8951
9245
  else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
8952
- baseCapacity = computeBaseCapacityWarehouse(hullSeed);
9246
+ baseCapacity = computeBaseCapacityWarehouse(hullStats);
8953
9247
  }
8954
9248
  let out = entityDisplayName(itemId);
8955
9249
  out += ` - Hull ${hullMass} mass`;
@@ -8958,7 +9252,7 @@ function buildEntityDescription(itemId, hullSeed, moduleItems, moduleSeeds) {
8958
9252
  }
8959
9253
  out += '\n\n';
8960
9254
  for (let i = 0; i < moduleItems.length; i++) {
8961
- out += formatModuleLine(i, moduleItems[i], moduleSeeds[i] ?? 0n);
9255
+ out += formatModuleLine(i, moduleItems[i], moduleStats[i] ?? 0n);
8962
9256
  out += '\n';
8963
9257
  }
8964
9258
  return out;
@@ -8994,6 +9288,63 @@ var index = /*#__PURE__*/Object.freeze({
8994
9288
  buildEntityDescription: buildEntityDescription
8995
9289
  });
8996
9290
 
9291
+ function formatMass(kg) {
9292
+ const t = kg / 1000;
9293
+ const fixed = t.toFixed(2);
9294
+ const trimmed = fixed.replace(/\.?0+$/, '');
9295
+ return `${trimmed} t`;
9296
+ }
9297
+ function formatMassDelta(kg) {
9298
+ if (kg === 0)
9299
+ return '0 t';
9300
+ const sign = kg > 0 ? '+' : '-';
9301
+ return `${sign}${formatMass(Math.abs(kg))}`;
9302
+ }
9303
+
9304
+ const TIER_ADJECTIVES = {
9305
+ 1: 'Crude',
9306
+ 2: 'Dense',
9307
+ 3: 'Pure',
9308
+ 4: 'Prime',
9309
+ 5: 'Pristine',
9310
+ 6: 'Radiant',
9311
+ 7: 'Exotic',
9312
+ 8: 'Mythic',
9313
+ 9: 'Cosmic',
9314
+ 10: 'Ascendant',
9315
+ };
9316
+ const CATEGORY_LABELS = {
9317
+ ore: 'Ore',
9318
+ crystal: 'Crystal',
9319
+ gas: 'Gas',
9320
+ regolith: 'Regolith',
9321
+ biomass: 'Biomass',
9322
+ };
9323
+ function tierNumber(tier) {
9324
+ return Number(String(tier).replace(/^t/i, ''));
9325
+ }
9326
+ function displayName(resolved) {
9327
+ if (resolved.itemType === 'resource') {
9328
+ const tierNum = tierNumber(resolved.tier);
9329
+ const adj = TIER_ADJECTIVES[tierNum] ?? 'Unknown';
9330
+ const cat = resolved.category ? CATEGORY_LABELS[resolved.category] : 'Resource';
9331
+ return `${adj} ${cat}`;
9332
+ }
9333
+ return resolved.name;
9334
+ }
9335
+ function describeItem(resolved, opts) {
9336
+ const massFmt = opts?.formatMass ?? formatMass;
9337
+ const mass = massFmt(resolved.mass);
9338
+ const tier = `T${tierNumber(resolved.tier)}`;
9339
+ if (resolved.itemType === 'resource') {
9340
+ const cat = resolved.category ? CATEGORY_LABELS[resolved.category] : 'Resource';
9341
+ const header = `${tier} ${cat}`;
9342
+ const stats = resolved.stats?.map((s) => `${s.label} ${s.value}`).join(', ');
9343
+ return [header, stats, mass].filter(Boolean).join(' · ');
9344
+ }
9345
+ return `${tier} ${resolved.name} · ${mass}`;
9346
+ }
9347
+
8997
9348
  exports.ActionsManager = ActionsManager;
8998
9349
  exports.BASE_ORBITAL_MASS = BASE_ORBITAL_MASS;
8999
9350
  exports.COMMIT_ALREADY_SET = COMMIT_ALREADY_SET;
@@ -9162,6 +9513,7 @@ exports.capabilityAttributes = capabilityAttributes;
9162
9513
  exports.capabilityNames = capabilityNames;
9163
9514
  exports.capsHasCrafter = capsHasCrafter;
9164
9515
  exports.capsHasGatherer = capsHasGatherer;
9516
+ exports.capsHasHauler = capsHasHauler;
9165
9517
  exports.capsHasLoaders = capsHasLoaders;
9166
9518
  exports.capsHasMass = capsHasMass;
9167
9519
  exports.capsHasMovement = capsHasMovement;
@@ -9169,6 +9521,7 @@ exports.capsHasStorage = capsHasStorage;
9169
9521
  exports.cargoItemToStack = cargoItemToStack;
9170
9522
  exports.cargoUtils = cargoUtils;
9171
9523
  exports.categoryColors = categoryColors;
9524
+ exports.categoryIconShapes = categoryIconShapes;
9172
9525
  exports.categoryIcons = categoryIcons;
9173
9526
  exports.categoryItemMass = categoryItemMass;
9174
9527
  exports.componentIcon = componentIcon;
@@ -9179,7 +9532,7 @@ exports.computeBaseHullmass = computeBaseHullmass;
9179
9532
  exports.computeComponentStats = computeComponentStats;
9180
9533
  exports.computeContainerCapabilities = computeContainerCapabilities;
9181
9534
  exports.computeContainerT2Capabilities = computeContainerT2Capabilities;
9182
- exports.computeCraftedOutputSeed = computeCraftedOutputSeed;
9535
+ exports.computeCraftedOutputStats = computeCraftedOutputStats;
9183
9536
  exports.computeCrafterDrain = computeCrafterDrain;
9184
9537
  exports.computeCrafterSpeed = computeCrafterSpeed;
9185
9538
  exports.computeEngineCapabilities = computeEngineCapabilities;
@@ -9205,6 +9558,7 @@ exports.computeManufacturingCapabilities = computeManufacturingCapabilities;
9205
9558
  exports.computeShipCapabilities = computeShipCapabilities;
9206
9559
  exports.computeShipHullCapabilities = computeShipHullCapabilities;
9207
9560
  exports.computeStorageCapabilities = computeStorageCapabilities;
9561
+ exports.computeWarehouseCapabilities = computeWarehouseCapabilities;
9208
9562
  exports.computeWarehouseHullCapabilities = computeWarehouseHullCapabilities;
9209
9563
  exports.coordsToLocationId = coordsToLocationId;
9210
9564
  exports.createInventoryAccessor = createInventoryAccessor;
@@ -9220,13 +9574,19 @@ exports.deriveLocationSize = deriveLocationSize;
9220
9574
  exports.deriveLocationStatic = deriveLocationStatic;
9221
9575
  exports.deriveResourceStats = deriveResourceStats;
9222
9576
  exports.deriveStratum = deriveStratum;
9577
+ exports.describeItem = describeItem;
9578
+ exports.describeModule = describeModule;
9579
+ exports.describeModuleForItem = describeModuleForItem;
9580
+ exports.describeModuleForSlot = describeModuleForSlot;
9223
9581
  exports.deserializeAsset = deserializeAsset;
9224
9582
  exports.deserializeComponent = deserializeComponent;
9225
9583
  exports.deserializeEntity = deserializeEntity;
9226
9584
  exports.deserializeModule = deserializeModule;
9227
9585
  exports.deserializeResource = deserializeResource;
9586
+ exports.displayName = displayName;
9228
9587
  exports.distanceBetweenCoordinates = distanceBetweenCoordinates;
9229
9588
  exports.distanceBetweenPoints = distanceBetweenPoints;
9589
+ exports.encodeGatheredCargoStats = encodeGatheredCargoStats;
9230
9590
  exports.encodeStats = encodeStats;
9231
9591
  exports.energyPercent = energyPercent;
9232
9592
  exports.entityDisplayName = entityDisplayName;
@@ -9234,6 +9594,8 @@ exports.entityRecipes = entityRecipes;
9234
9594
  exports.estimateDealTravelTime = estimateDealTravelTime;
9235
9595
  exports.estimateTravelTime = estimateTravelTime;
9236
9596
  exports.findNearbyPlanets = findNearbyPlanets;
9597
+ exports.formatMass = formatMass;
9598
+ exports.formatMassDelta = formatMassDelta;
9237
9599
  exports.formatModuleLine = formatModuleLine;
9238
9600
  exports.getAllCraftableItems = getAllCraftableItems;
9239
9601
  exports.getCapabilityAttributes = getCapabilityAttributes;
@@ -9288,8 +9650,8 @@ exports.isGatherableLocation = isGatherableLocation;
9288
9650
  exports.isInvertedAttribute = isInvertedAttribute;
9289
9651
  exports.isModuleItem = isModuleItem;
9290
9652
  exports.isRelatedItem = isRelatedItem;
9653
+ exports.itemAbbreviations = itemAbbreviations;
9291
9654
  exports.itemCategory = itemCategory;
9292
- exports.itemIcons = itemIcons;
9293
9655
  exports.itemIds = itemIds;
9294
9656
  exports.itemOffset = itemOffset;
9295
9657
  exports.itemTier = itemTier;
@@ -9309,6 +9671,7 @@ exports.projectEntity = projectEntity;
9309
9671
  exports.projectEntityAt = projectEntityAt;
9310
9672
  exports.readCommonBase = readCommonBase;
9311
9673
  exports.removeFromStacks = removeFromStacks;
9674
+ exports.renderDescription = renderDescription;
9312
9675
  exports.resolveItem = resolveItem;
9313
9676
  exports.resolveStats = resolveStats;
9314
9677
  exports.rollTier = rollTier;
@@ -9320,6 +9683,7 @@ exports.stackToCargoItem = stackToCargoItem;
9320
9683
  exports.stacksEqual = stacksEqual;
9321
9684
  exports.statMappings = statMappings;
9322
9685
  exports.tierColors = tierColors;
9686
+ exports.tierLabels = tierLabels;
9323
9687
  exports.toLocation = toLocation;
9324
9688
  exports.validateSchedule = validateSchedule;
9325
9689
  //# sourceMappingURL=shipload.js.map