@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.d.ts +148 -60
- package/lib/shipload.js +970 -606
- package/lib/shipload.js.map +1 -1
- package/lib/shipload.m.js +956 -605
- package/lib/shipload.m.js.map +1 -1
- package/package.json +1 -1
- package/src/capabilities/modules.ts +3 -3
- package/src/capabilities/storage.ts +6 -9
- package/src/contracts/server.ts +37 -34
- package/src/data/categories.ts +22 -25
- package/src/data/colors.ts +28 -10
- package/src/data/items.json +15 -15
- package/src/data/recipes.ts +93 -87
- package/src/derivation/crafting.ts +50 -36
- package/src/derivation/resources.ts +23 -23
- package/src/derivation/stats.ts +29 -29
- package/src/derivation/stratum.ts +12 -0
- package/src/entities/container.ts +7 -6
- package/src/entities/makers.ts +126 -11
- package/src/entities/ship-deploy.ts +25 -30
- package/src/entities/ship.ts +16 -4
- package/src/entities/warehouse.ts +36 -1
- package/src/format.ts +12 -0
- package/src/index-module.ts +26 -4
- package/src/managers/actions.ts +48 -8
- package/src/market/items.ts +1 -1
- package/src/nft/description.ts +47 -46
- package/src/nft/deserializers.ts +8 -8
- package/src/resolution/describe-module.ts +165 -0
- package/src/resolution/display-name.ts +57 -0
- package/src/resolution/resolve-item.ts +68 -45
- package/src/scheduling/projection.ts +3 -1
- package/src/types/capabilities.ts +5 -0
- package/src/types.ts +1 -1
package/lib/shipload.m.js
CHANGED
|
@@ -205,7 +205,7 @@ var platform = /*#__PURE__*/Object.freeze({
|
|
|
205
205
|
Contract: Contract$1
|
|
206
206
|
});
|
|
207
207
|
|
|
208
|
-
const abiBlob = 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=');
|
|
208
|
+
const abiBlob = 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==');
|
|
209
209
|
const abi = ABI.from(abiBlob);
|
|
210
210
|
var Types;
|
|
211
211
|
(function (Types) {
|
|
@@ -257,25 +257,25 @@ var Types;
|
|
|
257
257
|
Struct.type('advance')
|
|
258
258
|
], advance);
|
|
259
259
|
Types.advance = advance;
|
|
260
|
-
let
|
|
260
|
+
let packed_module = class packed_module extends Struct {
|
|
261
261
|
};
|
|
262
262
|
__decorate([
|
|
263
263
|
Struct.field(UInt16)
|
|
264
|
-
],
|
|
264
|
+
], packed_module.prototype, "item_id", void 0);
|
|
265
265
|
__decorate([
|
|
266
266
|
Struct.field(UInt64)
|
|
267
|
-
],
|
|
268
|
-
|
|
269
|
-
Struct.type('
|
|
270
|
-
],
|
|
271
|
-
Types.
|
|
267
|
+
], packed_module.prototype, "stats", void 0);
|
|
268
|
+
packed_module = __decorate([
|
|
269
|
+
Struct.type('packed_module')
|
|
270
|
+
], packed_module);
|
|
271
|
+
Types.packed_module = packed_module;
|
|
272
272
|
let module_entry = class module_entry extends Struct {
|
|
273
273
|
};
|
|
274
274
|
__decorate([
|
|
275
275
|
Struct.field(UInt8)
|
|
276
276
|
], module_entry.prototype, "type", void 0);
|
|
277
277
|
__decorate([
|
|
278
|
-
Struct.field(
|
|
278
|
+
Struct.field(packed_module, { optional: true })
|
|
279
279
|
], module_entry.prototype, "installed", void 0);
|
|
280
280
|
module_entry = __decorate([
|
|
281
281
|
Struct.type('module_entry')
|
|
@@ -290,8 +290,8 @@ var Types;
|
|
|
290
290
|
Struct.field(UInt32)
|
|
291
291
|
], cargo_item.prototype, "quantity", void 0);
|
|
292
292
|
__decorate([
|
|
293
|
-
Struct.field(UInt64
|
|
294
|
-
], cargo_item.prototype, "
|
|
293
|
+
Struct.field(UInt64)
|
|
294
|
+
], cargo_item.prototype, "stats", void 0);
|
|
295
295
|
__decorate([
|
|
296
296
|
Struct.field(module_entry, { array: true })
|
|
297
297
|
], cargo_item.prototype, "modules", void 0);
|
|
@@ -381,7 +381,7 @@ var Types;
|
|
|
381
381
|
], cargo_row.prototype, "quantity", void 0);
|
|
382
382
|
__decorate([
|
|
383
383
|
Struct.field(UInt64)
|
|
384
|
-
], cargo_row.prototype, "
|
|
384
|
+
], cargo_row.prototype, "stats", void 0);
|
|
385
385
|
__decorate([
|
|
386
386
|
Struct.field(module_entry, { array: true })
|
|
387
387
|
], cargo_row.prototype, "modules", void 0);
|
|
@@ -645,7 +645,7 @@ var Types;
|
|
|
645
645
|
], deploy.prototype, "packed_item_id", void 0);
|
|
646
646
|
__decorate([
|
|
647
647
|
Struct.field(UInt64)
|
|
648
|
-
], deploy.prototype, "
|
|
648
|
+
], deploy.prototype, "stats", void 0);
|
|
649
649
|
__decorate([
|
|
650
650
|
Struct.field('string')
|
|
651
651
|
], deploy.prototype, "entity_name", void 0);
|
|
@@ -660,13 +660,13 @@ var Types;
|
|
|
660
660
|
], descentity.prototype, "item_id", void 0);
|
|
661
661
|
__decorate([
|
|
662
662
|
Struct.field(UInt64)
|
|
663
|
-
], descentity.prototype, "
|
|
663
|
+
], descentity.prototype, "hull_stats", void 0);
|
|
664
664
|
__decorate([
|
|
665
665
|
Struct.field(UInt16, { array: true })
|
|
666
666
|
], descentity.prototype, "module_items", void 0);
|
|
667
667
|
__decorate([
|
|
668
668
|
Struct.field(UInt64, { array: true })
|
|
669
|
-
], descentity.prototype, "
|
|
669
|
+
], descentity.prototype, "module_stats", void 0);
|
|
670
670
|
descentity = __decorate([
|
|
671
671
|
Struct.type('descentity')
|
|
672
672
|
], descentity);
|
|
@@ -914,11 +914,11 @@ var Types;
|
|
|
914
914
|
let gather = class gather extends Struct {
|
|
915
915
|
};
|
|
916
916
|
__decorate([
|
|
917
|
-
Struct.field(
|
|
918
|
-
], gather.prototype, "
|
|
917
|
+
Struct.field(entity_ref)
|
|
918
|
+
], gather.prototype, "source", void 0);
|
|
919
919
|
__decorate([
|
|
920
|
-
Struct.field(
|
|
921
|
-
], gather.prototype, "
|
|
920
|
+
Struct.field(entity_ref)
|
|
921
|
+
], gather.prototype, "destination", void 0);
|
|
922
922
|
__decorate([
|
|
923
923
|
Struct.field(UInt16)
|
|
924
924
|
], gather.prototype, "stratum", void 0);
|
|
@@ -1734,7 +1734,7 @@ var Types;
|
|
|
1734
1734
|
], ship_row.prototype, "name", void 0);
|
|
1735
1735
|
__decorate([
|
|
1736
1736
|
Struct.field(UInt64)
|
|
1737
|
-
], ship_row.prototype, "
|
|
1737
|
+
], ship_row.prototype, "stats", void 0);
|
|
1738
1738
|
__decorate([
|
|
1739
1739
|
Struct.field(coordinates)
|
|
1740
1740
|
], ship_row.prototype, "coordinates", void 0);
|
|
@@ -1806,9 +1806,9 @@ var Types;
|
|
|
1806
1806
|
], spawnpacked.prototype, "item_id", void 0);
|
|
1807
1807
|
__decorate([
|
|
1808
1808
|
Struct.field(UInt64)
|
|
1809
|
-
], spawnpacked.prototype, "
|
|
1809
|
+
], spawnpacked.prototype, "hull_stats", void 0);
|
|
1810
1810
|
__decorate([
|
|
1811
|
-
Struct.field(
|
|
1811
|
+
Struct.field(packed_module, { array: true })
|
|
1812
1812
|
], spawnpacked.prototype, "installed", void 0);
|
|
1813
1813
|
spawnpacked = __decorate([
|
|
1814
1814
|
Struct.type('spawnpacked')
|
|
@@ -1827,7 +1827,7 @@ var Types;
|
|
|
1827
1827
|
], spawnseeded.prototype, "quantity", void 0);
|
|
1828
1828
|
__decorate([
|
|
1829
1829
|
Struct.field(UInt64)
|
|
1830
|
-
], spawnseeded.prototype, "
|
|
1830
|
+
], spawnseeded.prototype, "stats", void 0);
|
|
1831
1831
|
spawnseeded = __decorate([
|
|
1832
1832
|
Struct.type('spawnseeded')
|
|
1833
1833
|
], spawnseeded);
|
|
@@ -1912,6 +1912,9 @@ var Types;
|
|
|
1912
1912
|
__decorate([
|
|
1913
1913
|
Struct.field(UInt16)
|
|
1914
1914
|
], transfer.prototype, "item_id", void 0);
|
|
1915
|
+
__decorate([
|
|
1916
|
+
Struct.field(UInt64)
|
|
1917
|
+
], transfer.prototype, "stats", void 0);
|
|
1915
1918
|
__decorate([
|
|
1916
1919
|
Struct.field(UInt32)
|
|
1917
1920
|
], transfer.prototype, "quantity", void 0);
|
|
@@ -1968,7 +1971,7 @@ var Types;
|
|
|
1968
1971
|
], warehouse_row.prototype, "name", void 0);
|
|
1969
1972
|
__decorate([
|
|
1970
1973
|
Struct.field(UInt64)
|
|
1971
|
-
], warehouse_row.prototype, "
|
|
1974
|
+
], warehouse_row.prototype, "stats", void 0);
|
|
1972
1975
|
__decorate([
|
|
1973
1976
|
Struct.field(coordinates)
|
|
1974
1977
|
], warehouse_row.prototype, "coordinates", void 0);
|
|
@@ -2270,21 +2273,21 @@ const PLANET_SUBTYPE_ICY = 3;
|
|
|
2270
2273
|
const PLANET_SUBTYPE_OCEAN = 4;
|
|
2271
2274
|
const PLANET_SUBTYPE_INDUSTRIAL = 5;
|
|
2272
2275
|
const RESOURCE_CATALOG = [
|
|
2273
|
-
{ id:
|
|
2274
|
-
{ id:
|
|
2275
|
-
{ id:
|
|
2276
|
-
{ id:
|
|
2277
|
-
{ id:
|
|
2278
|
-
{ id:
|
|
2279
|
-
{ id:
|
|
2280
|
-
{ id:
|
|
2281
|
-
{ id:
|
|
2282
|
-
{ id:
|
|
2283
|
-
{ id:
|
|
2284
|
-
{ id:
|
|
2285
|
-
{ id:
|
|
2286
|
-
{ id:
|
|
2287
|
-
{ id:
|
|
2276
|
+
{ id: 101, tier: 't1' },
|
|
2277
|
+
{ id: 102, tier: 't2' },
|
|
2278
|
+
{ id: 103, tier: 't3' },
|
|
2279
|
+
{ id: 201, tier: 't1' },
|
|
2280
|
+
{ id: 202, tier: 't2' },
|
|
2281
|
+
{ id: 203, tier: 't3' },
|
|
2282
|
+
{ id: 301, tier: 't1' },
|
|
2283
|
+
{ id: 302, tier: 't2' },
|
|
2284
|
+
{ id: 303, tier: 't3' },
|
|
2285
|
+
{ id: 401, tier: 't1' },
|
|
2286
|
+
{ id: 402, tier: 't2' },
|
|
2287
|
+
{ id: 403, tier: 't3' },
|
|
2288
|
+
{ id: 501, tier: 't1' },
|
|
2289
|
+
{ id: 502, tier: 't2' },
|
|
2290
|
+
{ id: 503, tier: 't3' },
|
|
2288
2291
|
];
|
|
2289
2292
|
function getDepthThreshold(tier) {
|
|
2290
2293
|
switch (tier) {
|
|
@@ -2341,14 +2344,14 @@ function getResourceWeight(itemId, stratum) {
|
|
|
2341
2344
|
return 10;
|
|
2342
2345
|
}
|
|
2343
2346
|
}
|
|
2344
|
-
const ASTEROID_RESOURCES = [
|
|
2345
|
-
const NEBULA_RESOURCES = [
|
|
2346
|
-
const GAS_GIANT_RESOURCES = [
|
|
2347
|
-
const ROCKY_RESOURCES = [
|
|
2348
|
-
const TERRESTRIAL_RESOURCES = [
|
|
2349
|
-
const ICY_RESOURCES = [
|
|
2350
|
-
const OCEAN_RESOURCES = [
|
|
2351
|
-
const INDUSTRIAL_RESOURCES = [
|
|
2347
|
+
const ASTEROID_RESOURCES = [101, 102, 103, 201, 202];
|
|
2348
|
+
const NEBULA_RESOURCES = [202, 203, 301, 302, 303];
|
|
2349
|
+
const GAS_GIANT_RESOURCES = [301, 302, 303, 401, 501];
|
|
2350
|
+
const ROCKY_RESOURCES = [101, 102, 103, 401, 402, 403, 503];
|
|
2351
|
+
const TERRESTRIAL_RESOURCES = [201, 202, 401, 402, 501, 502, 503];
|
|
2352
|
+
const ICY_RESOURCES = [101, 301, 302, 401, 403, 501, 502];
|
|
2353
|
+
const OCEAN_RESOURCES = [201, 203, 301, 303, 501, 502, 503];
|
|
2354
|
+
const INDUSTRIAL_RESOURCES = [101, 102, 103, 201, 203, 402, 403];
|
|
2352
2355
|
function getLocationCandidates(locationType, subtype) {
|
|
2353
2356
|
if (locationType === 2)
|
|
2354
2357
|
return ASTEROID_RESOURCES;
|
|
@@ -4769,139 +4772,139 @@ class BaseManager {
|
|
|
4769
4772
|
|
|
4770
4773
|
var itemsData = [
|
|
4771
4774
|
{
|
|
4772
|
-
id:
|
|
4773
|
-
name: "
|
|
4774
|
-
description: "
|
|
4775
|
+
id: 101,
|
|
4776
|
+
name: "",
|
|
4777
|
+
description: "",
|
|
4775
4778
|
mass: 30000,
|
|
4776
|
-
category: "
|
|
4779
|
+
category: "ore",
|
|
4777
4780
|
tier: "t1",
|
|
4778
|
-
color: "#
|
|
4781
|
+
color: "#C26D3F"
|
|
4779
4782
|
},
|
|
4780
4783
|
{
|
|
4781
|
-
id:
|
|
4782
|
-
name: "
|
|
4783
|
-
description: "
|
|
4784
|
+
id: 102,
|
|
4785
|
+
name: "",
|
|
4786
|
+
description: "",
|
|
4784
4787
|
mass: 27000,
|
|
4785
|
-
category: "
|
|
4788
|
+
category: "ore",
|
|
4786
4789
|
tier: "t2",
|
|
4787
|
-
color: "#
|
|
4790
|
+
color: "#C26D3F"
|
|
4788
4791
|
},
|
|
4789
4792
|
{
|
|
4790
|
-
id:
|
|
4791
|
-
name: "
|
|
4792
|
-
description: "
|
|
4793
|
+
id: 103,
|
|
4794
|
+
name: "",
|
|
4795
|
+
description: "",
|
|
4793
4796
|
mass: 52000,
|
|
4794
|
-
category: "
|
|
4797
|
+
category: "ore",
|
|
4795
4798
|
tier: "t3",
|
|
4796
|
-
color: "#
|
|
4799
|
+
color: "#C26D3F"
|
|
4797
4800
|
},
|
|
4798
4801
|
{
|
|
4799
|
-
id:
|
|
4800
|
-
name: "
|
|
4801
|
-
description: "
|
|
4802
|
+
id: 201,
|
|
4803
|
+
name: "",
|
|
4804
|
+
description: "",
|
|
4802
4805
|
mass: 40000,
|
|
4803
|
-
category: "
|
|
4806
|
+
category: "crystal",
|
|
4804
4807
|
tier: "t1",
|
|
4805
|
-
color: "#
|
|
4808
|
+
color: "#4ADBFF"
|
|
4806
4809
|
},
|
|
4807
4810
|
{
|
|
4808
|
-
id:
|
|
4809
|
-
name: "
|
|
4810
|
-
description: "
|
|
4811
|
+
id: 202,
|
|
4812
|
+
name: "",
|
|
4813
|
+
description: "",
|
|
4811
4814
|
mass: 55000,
|
|
4812
|
-
category: "
|
|
4815
|
+
category: "crystal",
|
|
4813
4816
|
tier: "t2",
|
|
4814
|
-
color: "#
|
|
4817
|
+
color: "#4ADBFF"
|
|
4815
4818
|
},
|
|
4816
4819
|
{
|
|
4817
|
-
id:
|
|
4818
|
-
name: "
|
|
4819
|
-
description: "
|
|
4820
|
+
id: 203,
|
|
4821
|
+
name: "",
|
|
4822
|
+
description: "",
|
|
4820
4823
|
mass: 70000,
|
|
4821
|
-
category: "
|
|
4824
|
+
category: "crystal",
|
|
4822
4825
|
tier: "t3",
|
|
4823
|
-
color: "#
|
|
4826
|
+
color: "#4ADBFF"
|
|
4824
4827
|
},
|
|
4825
4828
|
{
|
|
4826
|
-
id:
|
|
4827
|
-
name: "
|
|
4828
|
-
description: "
|
|
4829
|
+
id: 301,
|
|
4830
|
+
name: "",
|
|
4831
|
+
description: "",
|
|
4829
4832
|
mass: 15000,
|
|
4830
4833
|
category: "gas",
|
|
4831
4834
|
tier: "t1",
|
|
4832
|
-
color: "#
|
|
4835
|
+
color: "#B8E4A0"
|
|
4833
4836
|
},
|
|
4834
4837
|
{
|
|
4835
|
-
id:
|
|
4836
|
-
name: "
|
|
4837
|
-
description: "
|
|
4838
|
+
id: 302,
|
|
4839
|
+
name: "",
|
|
4840
|
+
description: "",
|
|
4838
4841
|
mass: 2000,
|
|
4839
4842
|
category: "gas",
|
|
4840
4843
|
tier: "t2",
|
|
4841
|
-
color: "#
|
|
4844
|
+
color: "#B8E4A0"
|
|
4842
4845
|
},
|
|
4843
4846
|
{
|
|
4844
|
-
id:
|
|
4845
|
-
name: "
|
|
4846
|
-
description: "
|
|
4847
|
+
id: 303,
|
|
4848
|
+
name: "",
|
|
4849
|
+
description: "",
|
|
4847
4850
|
mass: 8000,
|
|
4848
4851
|
category: "gas",
|
|
4849
4852
|
tier: "t3",
|
|
4850
|
-
color: "#
|
|
4853
|
+
color: "#B8E4A0"
|
|
4851
4854
|
},
|
|
4852
4855
|
{
|
|
4853
|
-
id:
|
|
4854
|
-
name: "
|
|
4855
|
-
description: "
|
|
4856
|
+
id: 401,
|
|
4857
|
+
name: "",
|
|
4858
|
+
description: "",
|
|
4856
4859
|
mass: 22000,
|
|
4857
|
-
category: "
|
|
4860
|
+
category: "regolith",
|
|
4858
4861
|
tier: "t1",
|
|
4859
|
-
color: "#
|
|
4862
|
+
color: "#C4A57B"
|
|
4860
4863
|
},
|
|
4861
4864
|
{
|
|
4862
|
-
id:
|
|
4863
|
-
name: "
|
|
4864
|
-
description: "
|
|
4865
|
+
id: 402,
|
|
4866
|
+
name: "",
|
|
4867
|
+
description: "",
|
|
4865
4868
|
mass: 35000,
|
|
4866
|
-
category: "
|
|
4869
|
+
category: "regolith",
|
|
4867
4870
|
tier: "t2",
|
|
4868
|
-
color: "#
|
|
4871
|
+
color: "#C4A57B"
|
|
4869
4872
|
},
|
|
4870
4873
|
{
|
|
4871
|
-
id:
|
|
4872
|
-
name: "
|
|
4873
|
-
description: "
|
|
4874
|
+
id: 403,
|
|
4875
|
+
name: "",
|
|
4876
|
+
description: "",
|
|
4874
4877
|
mass: 45000,
|
|
4875
|
-
category: "
|
|
4878
|
+
category: "regolith",
|
|
4876
4879
|
tier: "t3",
|
|
4877
|
-
color: "#
|
|
4880
|
+
color: "#C4A57B"
|
|
4878
4881
|
},
|
|
4879
4882
|
{
|
|
4880
|
-
id:
|
|
4881
|
-
name: "
|
|
4882
|
-
description: "
|
|
4883
|
+
id: 501,
|
|
4884
|
+
name: "",
|
|
4885
|
+
description: "",
|
|
4883
4886
|
mass: 15000,
|
|
4884
|
-
category: "
|
|
4887
|
+
category: "biomass",
|
|
4885
4888
|
tier: "t1",
|
|
4886
|
-
color: "#
|
|
4889
|
+
color: "#5A8B3E"
|
|
4887
4890
|
},
|
|
4888
4891
|
{
|
|
4889
|
-
id:
|
|
4890
|
-
name: "
|
|
4891
|
-
description: "
|
|
4892
|
+
id: 502,
|
|
4893
|
+
name: "",
|
|
4894
|
+
description: "",
|
|
4892
4895
|
mass: 30000,
|
|
4893
|
-
category: "
|
|
4896
|
+
category: "biomass",
|
|
4894
4897
|
tier: "t2",
|
|
4895
|
-
color: "#
|
|
4898
|
+
color: "#5A8B3E"
|
|
4896
4899
|
},
|
|
4897
4900
|
{
|
|
4898
|
-
id:
|
|
4899
|
-
name: "
|
|
4900
|
-
description: "
|
|
4901
|
+
id: 503,
|
|
4902
|
+
name: "",
|
|
4903
|
+
description: "",
|
|
4901
4904
|
mass: 25000,
|
|
4902
|
-
category: "
|
|
4905
|
+
category: "biomass",
|
|
4903
4906
|
tier: "t3",
|
|
4904
|
-
color: "#
|
|
4907
|
+
color: "#5A8B3E"
|
|
4905
4908
|
}
|
|
4906
4909
|
];
|
|
4907
4910
|
|
|
@@ -4969,38 +4972,38 @@ const components = [
|
|
|
4969
4972
|
{
|
|
4970
4973
|
id: ITEM_HULL_PLATES,
|
|
4971
4974
|
name: 'Hull Plates',
|
|
4972
|
-
description: 'Structural plating formed from
|
|
4975
|
+
description: 'Structural plating formed from ore. Used in hulls, containers, and frames.',
|
|
4973
4976
|
color: '#7B8D9E',
|
|
4974
4977
|
mass: 50000,
|
|
4975
4978
|
stats: [
|
|
4976
|
-
{ key: 'strength', source: '
|
|
4977
|
-
{ key: 'density', source: '
|
|
4979
|
+
{ key: 'strength', source: 'ore' },
|
|
4980
|
+
{ key: 'density', source: 'ore' },
|
|
4978
4981
|
],
|
|
4979
|
-
recipe: [{ category: '
|
|
4982
|
+
recipe: [{ category: 'ore', quantity: 15 }],
|
|
4980
4983
|
usedIn: [
|
|
4981
4984
|
{ type: 'entity', name: 'Container' },
|
|
4982
|
-
{ type: 'entity', name: 'Warehouse
|
|
4983
|
-
{ type: 'entity', name: 'Ship
|
|
4985
|
+
{ type: 'entity', name: 'Warehouse' },
|
|
4986
|
+
{ type: 'entity', name: 'Ship' },
|
|
4984
4987
|
],
|
|
4985
4988
|
},
|
|
4986
4989
|
{
|
|
4987
4990
|
id: ITEM_CARGO_LINING,
|
|
4988
4991
|
name: 'Cargo Lining',
|
|
4989
|
-
description: '
|
|
4990
|
-
color: '#
|
|
4992
|
+
description: 'Composite lining formed from fine regolith bound in biomass polymer. Dense enough to seal cargo holds, flexible enough to absorb vibration.',
|
|
4993
|
+
color: '#C4A57B',
|
|
4991
4994
|
mass: 30000,
|
|
4992
4995
|
stats: [
|
|
4993
|
-
{ key: '
|
|
4994
|
-
{ key: '
|
|
4996
|
+
{ key: 'fineness', source: 'regolith' },
|
|
4997
|
+
{ key: 'saturation', source: 'biomass' },
|
|
4995
4998
|
],
|
|
4996
4999
|
recipe: [
|
|
4997
|
-
{ category: '
|
|
4998
|
-
{ category: '
|
|
5000
|
+
{ category: 'regolith', quantity: 10 },
|
|
5001
|
+
{ category: 'biomass', quantity: 20 },
|
|
4999
5002
|
],
|
|
5000
5003
|
usedIn: [
|
|
5001
5004
|
{ type: 'entity', name: 'Container' },
|
|
5002
|
-
{ type: '
|
|
5003
|
-
{ type: '
|
|
5005
|
+
{ type: 'module', name: 'Loader' },
|
|
5006
|
+
{ type: 'module', name: 'Storage' },
|
|
5004
5007
|
],
|
|
5005
5008
|
},
|
|
5006
5009
|
{
|
|
@@ -5019,73 +5022,76 @@ const components = [
|
|
|
5019
5022
|
{
|
|
5020
5023
|
id: ITEM_POWER_CELL,
|
|
5021
5024
|
name: 'Power Cell',
|
|
5022
|
-
description: 'Crystalline energy storage matrix
|
|
5023
|
-
color: '#
|
|
5025
|
+
description: 'Crystalline energy storage matrix. Resonant lattices retain and release charge.',
|
|
5026
|
+
color: '#4ADBFF',
|
|
5024
5027
|
mass: 30000,
|
|
5025
5028
|
stats: [
|
|
5026
|
-
{ key: 'resonance', source: '
|
|
5027
|
-
{ key: '
|
|
5029
|
+
{ key: 'resonance', source: 'crystal' },
|
|
5030
|
+
{ key: 'reflectivity', source: 'crystal' },
|
|
5031
|
+
],
|
|
5032
|
+
recipe: [{ category: 'crystal', quantity: 20 }],
|
|
5033
|
+
usedIn: [
|
|
5034
|
+
{ type: 'module', name: 'Generator' },
|
|
5035
|
+
{ type: 'module', name: 'Hauler' },
|
|
5028
5036
|
],
|
|
5029
|
-
recipe: [{ category: 'mineral', quantity: 20 }],
|
|
5030
|
-
usedIn: [{ type: 'module', name: 'Generator' }],
|
|
5031
5037
|
},
|
|
5032
5038
|
{
|
|
5033
5039
|
id: ITEM_MATTER_CONDUIT,
|
|
5034
5040
|
name: 'Matter Conduit',
|
|
5035
|
-
description: 'Heavy-duty
|
|
5041
|
+
description: 'Heavy-duty ore shaft used in gathering equipment.',
|
|
5036
5042
|
color: '#7B8D9E',
|
|
5037
5043
|
mass: 50000,
|
|
5038
5044
|
stats: [
|
|
5039
|
-
{ key: 'strength', source: '
|
|
5040
|
-
{ key: 'tolerance', source: '
|
|
5045
|
+
{ key: 'strength', source: 'ore' },
|
|
5046
|
+
{ key: 'tolerance', source: 'ore' },
|
|
5041
5047
|
],
|
|
5042
|
-
recipe: [{ category: '
|
|
5048
|
+
recipe: [{ category: 'ore', quantity: 15 }],
|
|
5043
5049
|
usedIn: [{ type: 'module', name: 'Gatherer' }],
|
|
5044
5050
|
},
|
|
5045
5051
|
{
|
|
5046
5052
|
id: ITEM_SURVEY_PROBE,
|
|
5047
5053
|
name: 'Survey Probe',
|
|
5048
|
-
description: '
|
|
5049
|
-
color: '#
|
|
5054
|
+
description: 'Crystal-lattice sensor array for deep resource detection.',
|
|
5055
|
+
color: '#4ADBFF',
|
|
5050
5056
|
mass: 30000,
|
|
5051
5057
|
stats: [
|
|
5052
|
-
{ key: 'conductivity', source: '
|
|
5053
|
-
{ key: 'reflectivity', source: '
|
|
5058
|
+
{ key: 'conductivity', source: 'crystal' },
|
|
5059
|
+
{ key: 'reflectivity', source: 'crystal' },
|
|
5054
5060
|
],
|
|
5055
|
-
recipe: [{ category: '
|
|
5061
|
+
recipe: [{ category: 'crystal', quantity: 10 }],
|
|
5056
5062
|
usedIn: [{ type: 'module', name: 'Gatherer' }],
|
|
5057
5063
|
},
|
|
5058
5064
|
{
|
|
5059
5065
|
id: ITEM_CARGO_ARM,
|
|
5060
5066
|
name: 'Cargo Arm',
|
|
5061
|
-
description: 'Flexible
|
|
5062
|
-
color: '#
|
|
5067
|
+
description: 'Flexible biomass composite arm for cargo handling.',
|
|
5068
|
+
color: '#5A8B3E',
|
|
5063
5069
|
mass: 30000,
|
|
5064
5070
|
stats: [
|
|
5065
|
-
{ key: 'plasticity', source: '
|
|
5066
|
-
{ key: 'insulation', source: '
|
|
5071
|
+
{ key: 'plasticity', source: 'biomass' },
|
|
5072
|
+
{ key: 'insulation', source: 'biomass' },
|
|
5067
5073
|
],
|
|
5068
|
-
recipe: [{ category: '
|
|
5074
|
+
recipe: [{ category: 'biomass', quantity: 32 }],
|
|
5069
5075
|
usedIn: [{ type: 'module', name: 'Loader' }],
|
|
5070
5076
|
},
|
|
5071
5077
|
{
|
|
5072
5078
|
id: ITEM_TOOL_BIT,
|
|
5073
5079
|
name: 'Tool Bit',
|
|
5074
|
-
description: 'Dense
|
|
5075
|
-
color: '#
|
|
5080
|
+
description: 'Dense regolith cutting head for manufacturing operations.',
|
|
5081
|
+
color: '#C4A57B',
|
|
5076
5082
|
mass: 30000,
|
|
5077
5083
|
stats: [
|
|
5078
|
-
{ key: 'hardness', source: '
|
|
5079
|
-
{ key: '
|
|
5084
|
+
{ key: 'hardness', source: 'regolith' },
|
|
5085
|
+
{ key: 'composition', source: 'regolith' },
|
|
5080
5086
|
],
|
|
5081
|
-
recipe: [{ category: '
|
|
5087
|
+
recipe: [{ category: 'regolith', quantity: 20 }],
|
|
5082
5088
|
usedIn: [{ type: 'module', name: 'Manufacturing' }],
|
|
5083
5089
|
},
|
|
5084
5090
|
{
|
|
5085
5091
|
id: ITEM_REACTION_CHAMBER,
|
|
5086
5092
|
name: 'Reaction Chamber',
|
|
5087
5093
|
description: 'Gas-pressurized vessel for controlled manufacturing reactions.',
|
|
5088
|
-
color: '#
|
|
5094
|
+
color: '#B8E4A0',
|
|
5089
5095
|
mass: 50000,
|
|
5090
5096
|
stats: [
|
|
5091
5097
|
{ key: 'reactivity', source: 'gas' },
|
|
@@ -5097,48 +5103,48 @@ const components = [
|
|
|
5097
5103
|
{
|
|
5098
5104
|
id: ITEM_FOCUSING_ARRAY,
|
|
5099
5105
|
name: 'Focusing Array',
|
|
5100
|
-
description: "Precision-formed
|
|
5101
|
-
color: '#
|
|
5106
|
+
description: "Precision-formed crystal lens array. Routes the haul beam's energy efficiently to the target lock.",
|
|
5107
|
+
color: '#4ADBFF',
|
|
5102
5108
|
mass: 40000,
|
|
5103
5109
|
stats: [
|
|
5104
|
-
{ key: 'conductivity', source: '
|
|
5105
|
-
{ key: '
|
|
5110
|
+
{ key: 'conductivity', source: 'crystal' },
|
|
5111
|
+
{ key: 'resonance', source: 'crystal' },
|
|
5106
5112
|
],
|
|
5107
|
-
recipe: [{ category: '
|
|
5108
|
-
usedIn: [{ type: 'module', name: 'Hauler
|
|
5113
|
+
recipe: [{ category: 'crystal', quantity: 25 }],
|
|
5114
|
+
usedIn: [{ type: 'module', name: 'Hauler' }],
|
|
5109
5115
|
},
|
|
5110
5116
|
{
|
|
5111
5117
|
id: ITEM_HULL_PLATES_T2,
|
|
5112
5118
|
name: 'Hull Plates T2',
|
|
5113
|
-
description: 'Advanced structural plating reinforced with tier 2
|
|
5119
|
+
description: 'Advanced structural plating reinforced with tier 2 ore.',
|
|
5114
5120
|
color: '#9BADB8',
|
|
5115
5121
|
mass: 50000,
|
|
5116
5122
|
stats: [
|
|
5117
|
-
{ key: 'strength', source: '
|
|
5118
|
-
{ key: 'density', source: '
|
|
5123
|
+
{ key: 'strength', source: 'ore' },
|
|
5124
|
+
{ key: 'density', source: 'ore' },
|
|
5119
5125
|
],
|
|
5120
5126
|
recipe: [
|
|
5121
5127
|
{ itemId: ITEM_HULL_PLATES, quantity: 2 },
|
|
5122
|
-
{ category: '
|
|
5128
|
+
{ category: 'ore', quantity: 15 },
|
|
5123
5129
|
],
|
|
5124
|
-
usedIn: [{ type: 'entity', name: 'Container
|
|
5130
|
+
usedIn: [{ type: 'entity', name: 'Container' }],
|
|
5125
5131
|
},
|
|
5126
5132
|
{
|
|
5127
5133
|
id: ITEM_CARGO_LINING_T2,
|
|
5128
|
-
name: 'Cargo Lining
|
|
5129
|
-
description: 'Advanced composite lining with
|
|
5130
|
-
color: '#
|
|
5131
|
-
mass:
|
|
5134
|
+
name: 'Cargo Lining',
|
|
5135
|
+
description: 'Advanced composite lining reinforced with tier 2 regolith and biomass polymer.',
|
|
5136
|
+
color: '#C4A57B',
|
|
5137
|
+
mass: 45000,
|
|
5132
5138
|
stats: [
|
|
5133
|
-
{ key: '
|
|
5134
|
-
{ key: '
|
|
5139
|
+
{ key: 'fineness', source: 'regolith' },
|
|
5140
|
+
{ key: 'saturation', source: 'biomass' },
|
|
5135
5141
|
],
|
|
5136
5142
|
recipe: [
|
|
5137
5143
|
{ itemId: ITEM_CARGO_LINING, quantity: 2 },
|
|
5138
|
-
{ category: '
|
|
5139
|
-
{ category: '
|
|
5144
|
+
{ category: 'regolith', quantity: 5 },
|
|
5145
|
+
{ category: 'biomass', quantity: 10 },
|
|
5140
5146
|
],
|
|
5141
|
-
usedIn: [{ type: 'entity', name: 'Container
|
|
5147
|
+
usedIn: [{ type: 'entity', name: 'Container' }],
|
|
5142
5148
|
},
|
|
5143
5149
|
];
|
|
5144
5150
|
const entityRecipes = [
|
|
@@ -5155,13 +5161,13 @@ const entityRecipes = [
|
|
|
5155
5161
|
stats: [
|
|
5156
5162
|
{ key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
|
|
5157
5163
|
{ key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
|
|
5158
|
-
{ key: '
|
|
5159
|
-
{ key: '
|
|
5164
|
+
{ key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
|
|
5165
|
+
{ key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
|
|
5160
5166
|
],
|
|
5161
5167
|
},
|
|
5162
5168
|
{
|
|
5163
5169
|
id: 'ship-t1',
|
|
5164
|
-
name: 'Ship
|
|
5170
|
+
name: 'Ship',
|
|
5165
5171
|
description: 'General-purpose vessel with 5 module slots.',
|
|
5166
5172
|
color: '#4AE898',
|
|
5167
5173
|
packedItemId: ITEM_SHIP_T1_PACKED,
|
|
@@ -5172,8 +5178,8 @@ const entityRecipes = [
|
|
|
5172
5178
|
stats: [
|
|
5173
5179
|
{ key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
|
|
5174
5180
|
{ key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
|
|
5175
|
-
{ key: '
|
|
5176
|
-
{ key: '
|
|
5181
|
+
{ key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
|
|
5182
|
+
{ key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
|
|
5177
5183
|
],
|
|
5178
5184
|
moduleSlots: [
|
|
5179
5185
|
{ type: MODULE_ANY },
|
|
@@ -5185,7 +5191,7 @@ const entityRecipes = [
|
|
|
5185
5191
|
},
|
|
5186
5192
|
{
|
|
5187
5193
|
id: 'warehouse-t1',
|
|
5188
|
-
name: 'Warehouse
|
|
5194
|
+
name: 'Warehouse',
|
|
5189
5195
|
description: 'Massive stationary storage facility with a single loader module slot.',
|
|
5190
5196
|
color: '#EAB308',
|
|
5191
5197
|
packedItemId: ITEM_WAREHOUSE_T1_PACKED,
|
|
@@ -5196,8 +5202,8 @@ const entityRecipes = [
|
|
|
5196
5202
|
stats: [
|
|
5197
5203
|
{ key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
|
|
5198
5204
|
{ key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
|
|
5199
|
-
{ key: '
|
|
5200
|
-
{ key: '
|
|
5205
|
+
{ key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
|
|
5206
|
+
{ key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
|
|
5201
5207
|
],
|
|
5202
5208
|
moduleSlots: [
|
|
5203
5209
|
{ type: MODULE_LOADER, label: 'Loader' },
|
|
@@ -5209,7 +5215,7 @@ const entityRecipes = [
|
|
|
5209
5215
|
},
|
|
5210
5216
|
{
|
|
5211
5217
|
id: 'container-t2',
|
|
5212
|
-
name: 'Container
|
|
5218
|
+
name: 'Container',
|
|
5213
5219
|
description: 'Advanced cargo container with improved capacity formulas.',
|
|
5214
5220
|
color: '#9BADB8',
|
|
5215
5221
|
packedItemId: ITEM_CONTAINER_T2_PACKED,
|
|
@@ -5220,8 +5226,12 @@ const entityRecipes = [
|
|
|
5220
5226
|
stats: [
|
|
5221
5227
|
{ key: 'strength', sourceComponentId: ITEM_HULL_PLATES_T2, sourceStatKey: 'strength' },
|
|
5222
5228
|
{ key: 'density', sourceComponentId: ITEM_HULL_PLATES_T2, sourceStatKey: 'density' },
|
|
5223
|
-
{ key: '
|
|
5224
|
-
{
|
|
5229
|
+
{ key: 'fineness', sourceComponentId: ITEM_CARGO_LINING_T2, sourceStatKey: 'fineness' },
|
|
5230
|
+
{
|
|
5231
|
+
key: 'saturation',
|
|
5232
|
+
sourceComponentId: ITEM_CARGO_LINING_T2,
|
|
5233
|
+
sourceStatKey: 'saturation',
|
|
5234
|
+
},
|
|
5225
5235
|
],
|
|
5226
5236
|
},
|
|
5227
5237
|
];
|
|
@@ -5242,14 +5252,14 @@ const moduleRecipes = [
|
|
|
5242
5252
|
{
|
|
5243
5253
|
id: 'generator-t1',
|
|
5244
5254
|
name: 'Generator',
|
|
5245
|
-
description: 'Basic energy system. Stores and recharges energy from resonant
|
|
5246
|
-
color: '#
|
|
5255
|
+
description: 'Basic energy system. Stores and recharges energy from resonant crystals.',
|
|
5256
|
+
color: '#4ADBFF',
|
|
5247
5257
|
itemId: ITEM_GENERATOR_T1,
|
|
5248
5258
|
moduleType: MODULE_GENERATOR,
|
|
5249
5259
|
recipe: [{ itemId: ITEM_POWER_CELL, quantity: 5 }],
|
|
5250
5260
|
stats: [
|
|
5251
5261
|
{ key: 'resonance', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'resonance' },
|
|
5252
|
-
{ key: '
|
|
5262
|
+
{ key: 'reflectivity', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'reflectivity' },
|
|
5253
5263
|
],
|
|
5254
5264
|
},
|
|
5255
5265
|
{
|
|
@@ -5287,7 +5297,7 @@ const moduleRecipes = [
|
|
|
5287
5297
|
id: 'loader-t1',
|
|
5288
5298
|
name: 'Loader',
|
|
5289
5299
|
description: 'Basic cargo handling system. Loads and unloads cargo with articulated arms.',
|
|
5290
|
-
color: '#
|
|
5300
|
+
color: '#5A8B3E',
|
|
5291
5301
|
itemId: ITEM_LOADER_T1,
|
|
5292
5302
|
moduleType: MODULE_LOADER,
|
|
5293
5303
|
recipe: [
|
|
@@ -5295,7 +5305,7 @@ const moduleRecipes = [
|
|
|
5295
5305
|
{ itemId: ITEM_CARGO_ARM, quantity: 3 },
|
|
5296
5306
|
],
|
|
5297
5307
|
stats: [
|
|
5298
|
-
{ key: '
|
|
5308
|
+
{ key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
|
|
5299
5309
|
{ key: 'plasticity', sourceComponentId: ITEM_CARGO_ARM, sourceStatKey: 'plasticity' },
|
|
5300
5310
|
],
|
|
5301
5311
|
},
|
|
@@ -5303,7 +5313,7 @@ const moduleRecipes = [
|
|
|
5303
5313
|
id: 'manufacturing-t1',
|
|
5304
5314
|
name: 'Manufacturing',
|
|
5305
5315
|
description: 'Basic crafting system. Processes materials using reaction chambers and cutting tools.',
|
|
5306
|
-
color: '#
|
|
5316
|
+
color: '#B8E4A0',
|
|
5307
5317
|
itemId: ITEM_MANUFACTURING_T1,
|
|
5308
5318
|
moduleType: MODULE_CRAFTER,
|
|
5309
5319
|
recipe: [
|
|
@@ -5316,7 +5326,7 @@ const moduleRecipes = [
|
|
|
5316
5326
|
sourceComponentId: ITEM_REACTION_CHAMBER,
|
|
5317
5327
|
sourceStatKey: 'reactivity',
|
|
5318
5328
|
},
|
|
5319
|
-
{ key: '
|
|
5329
|
+
{ key: 'composition', sourceComponentId: ITEM_TOOL_BIT, sourceStatKey: 'composition' },
|
|
5320
5330
|
],
|
|
5321
5331
|
},
|
|
5322
5332
|
{
|
|
@@ -5332,16 +5342,16 @@ const moduleRecipes = [
|
|
|
5332
5342
|
],
|
|
5333
5343
|
stats: [
|
|
5334
5344
|
{ key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
|
|
5335
|
-
{ key: '
|
|
5336
|
-
{ key: '
|
|
5337
|
-
{ key: '
|
|
5345
|
+
{ key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
|
|
5346
|
+
{ key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
|
|
5347
|
+
{ key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
|
|
5338
5348
|
],
|
|
5339
5349
|
},
|
|
5340
5350
|
{
|
|
5341
5351
|
id: 'hauler-t1',
|
|
5342
|
-
name: 'Hauler
|
|
5352
|
+
name: 'Hauler',
|
|
5343
5353
|
description: 'Projects a haul beam to lock onto and transport containers or warehouses through group travel.',
|
|
5344
|
-
color: '#
|
|
5354
|
+
color: '#4ADBFF',
|
|
5345
5355
|
itemId: ITEM_HAULER_T1,
|
|
5346
5356
|
moduleType: MODULE_HAULER,
|
|
5347
5357
|
recipe: [
|
|
@@ -5349,14 +5359,13 @@ const moduleRecipes = [
|
|
|
5349
5359
|
{ itemId: ITEM_FOCUSING_ARRAY, quantity: 3 },
|
|
5350
5360
|
],
|
|
5351
5361
|
stats: [
|
|
5352
|
-
{ key: '
|
|
5362
|
+
{ key: 'resonance', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'resonance' },
|
|
5363
|
+
{ key: 'reflectivity', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'reflectivity' },
|
|
5353
5364
|
{
|
|
5354
|
-
key: '
|
|
5365
|
+
key: 'conductivity',
|
|
5355
5366
|
sourceComponentId: ITEM_FOCUSING_ARRAY,
|
|
5356
5367
|
sourceStatKey: 'conductivity',
|
|
5357
5368
|
},
|
|
5358
|
-
{ key: 'drain', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'clarity' },
|
|
5359
|
-
{ key: 'ductility', sourceComponentId: ITEM_FOCUSING_ARRAY, sourceStatKey: 'ductility' },
|
|
5360
5369
|
],
|
|
5361
5370
|
},
|
|
5362
5371
|
];
|
|
@@ -5417,7 +5426,7 @@ function getComponentsForStat(statKey) {
|
|
|
5417
5426
|
return components.filter((c) => c.stats.some((s) => s.key === statKey));
|
|
5418
5427
|
}
|
|
5419
5428
|
|
|
5420
|
-
const
|
|
5429
|
+
const ORE_STATS = [
|
|
5421
5430
|
{
|
|
5422
5431
|
key: 'strength',
|
|
5423
5432
|
label: 'Strength',
|
|
@@ -5438,24 +5447,24 @@ const METAL_STATS = [
|
|
|
5438
5447
|
inverted: true,
|
|
5439
5448
|
},
|
|
5440
5449
|
];
|
|
5441
|
-
const
|
|
5450
|
+
const CRYSTAL_STATS = [
|
|
5442
5451
|
{
|
|
5443
5452
|
key: 'conductivity',
|
|
5444
5453
|
label: 'Conductivity',
|
|
5445
5454
|
abbreviation: 'CON',
|
|
5446
|
-
purpose: 'Efficiency of energy/signal transfer',
|
|
5455
|
+
purpose: 'Efficiency of energy/signal transfer through crystalline lattice',
|
|
5447
5456
|
},
|
|
5448
5457
|
{
|
|
5449
|
-
key: '
|
|
5450
|
-
label: '
|
|
5451
|
-
abbreviation: '
|
|
5452
|
-
purpose: '
|
|
5458
|
+
key: 'resonance',
|
|
5459
|
+
label: 'Resonance',
|
|
5460
|
+
abbreviation: 'RES',
|
|
5461
|
+
purpose: 'Frequency tuning and piezoelectric response — storage and amplification',
|
|
5453
5462
|
},
|
|
5454
5463
|
{
|
|
5455
5464
|
key: 'reflectivity',
|
|
5456
5465
|
label: 'Reflectivity',
|
|
5457
5466
|
abbreviation: 'REF',
|
|
5458
|
-
purpose: '
|
|
5467
|
+
purpose: 'Optical refraction and reflection — lenses, mirrors, focus',
|
|
5459
5468
|
},
|
|
5460
5469
|
];
|
|
5461
5470
|
const GAS_STATS = [
|
|
@@ -5478,52 +5487,52 @@ const GAS_STATS = [
|
|
|
5478
5487
|
purpose: 'Heat capacity for thermal management',
|
|
5479
5488
|
},
|
|
5480
5489
|
];
|
|
5481
|
-
const
|
|
5490
|
+
const REGOLITH_STATS = [
|
|
5482
5491
|
{
|
|
5483
|
-
key: '
|
|
5484
|
-
label: '
|
|
5485
|
-
abbreviation: '
|
|
5486
|
-
purpose: '
|
|
5492
|
+
key: 'composition',
|
|
5493
|
+
label: 'Composition',
|
|
5494
|
+
abbreviation: 'COM',
|
|
5495
|
+
purpose: 'Mineral/metal mix — drives sensor, chip, and optic crafting quality',
|
|
5487
5496
|
},
|
|
5488
5497
|
{
|
|
5489
5498
|
key: 'hardness',
|
|
5490
5499
|
label: 'Hardness',
|
|
5491
5500
|
abbreviation: 'HRD',
|
|
5492
|
-
purpose: '
|
|
5501
|
+
purpose: 'Particle hardness — cutting surfaces, abrasives, wear resistance',
|
|
5493
5502
|
},
|
|
5494
5503
|
{
|
|
5495
|
-
key: '
|
|
5496
|
-
label: '
|
|
5497
|
-
abbreviation: '
|
|
5498
|
-
purpose: '
|
|
5504
|
+
key: 'fineness',
|
|
5505
|
+
label: 'Fineness',
|
|
5506
|
+
abbreviation: 'FIN',
|
|
5507
|
+
purpose: 'Grain size — fine powder for smooth composites and sintering',
|
|
5499
5508
|
},
|
|
5500
5509
|
];
|
|
5501
|
-
const
|
|
5510
|
+
const BIOMASS_STATS = [
|
|
5502
5511
|
{
|
|
5503
5512
|
key: 'plasticity',
|
|
5504
5513
|
label: 'Plasticity',
|
|
5505
5514
|
abbreviation: 'PLA',
|
|
5506
|
-
purpose: '
|
|
5515
|
+
purpose: 'Flexibility and deformation under load',
|
|
5507
5516
|
},
|
|
5508
5517
|
{
|
|
5509
5518
|
key: 'insulation',
|
|
5510
5519
|
label: 'Insulation',
|
|
5511
5520
|
abbreviation: 'INS',
|
|
5512
|
-
purpose: '
|
|
5521
|
+
purpose: 'Thermal and electrical blocking capacity',
|
|
5513
5522
|
},
|
|
5514
5523
|
{
|
|
5515
|
-
key: '
|
|
5516
|
-
label: '
|
|
5517
|
-
abbreviation: '
|
|
5518
|
-
purpose: '
|
|
5524
|
+
key: 'saturation',
|
|
5525
|
+
label: 'Saturation',
|
|
5526
|
+
abbreviation: 'SAT',
|
|
5527
|
+
purpose: 'Concentration of useful organic compounds per unit',
|
|
5519
5528
|
},
|
|
5520
5529
|
];
|
|
5521
5530
|
const STAT_MAP = {
|
|
5522
|
-
|
|
5523
|
-
|
|
5531
|
+
ore: ORE_STATS,
|
|
5532
|
+
crystal: CRYSTAL_STATS,
|
|
5524
5533
|
gas: GAS_STATS,
|
|
5525
|
-
|
|
5526
|
-
|
|
5534
|
+
regolith: REGOLITH_STATS,
|
|
5535
|
+
biomass: BIOMASS_STATS,
|
|
5527
5536
|
};
|
|
5528
5537
|
function getStatDefinitions(category) {
|
|
5529
5538
|
return STAT_MAP[category];
|
|
@@ -5668,40 +5677,40 @@ function deriveResourceStats(seed) {
|
|
|
5668
5677
|
}
|
|
5669
5678
|
|
|
5670
5679
|
function encodeStats(values) {
|
|
5671
|
-
let
|
|
5680
|
+
let stats = 0n;
|
|
5672
5681
|
for (let i = 0; i < values.length && i < 6; i++) {
|
|
5673
|
-
|
|
5682
|
+
stats |= BigInt(values[i] & 0x3ff) << BigInt(i * 10);
|
|
5674
5683
|
}
|
|
5675
|
-
return
|
|
5684
|
+
return stats;
|
|
5676
5685
|
}
|
|
5677
|
-
function decodeStat(
|
|
5678
|
-
return Number((
|
|
5686
|
+
function decodeStat(stats, index) {
|
|
5687
|
+
return Number((stats >> BigInt(index * 10)) & 0x3ffn);
|
|
5679
5688
|
}
|
|
5680
|
-
function decodeStats(
|
|
5681
|
-
const
|
|
5689
|
+
function decodeStats(stats, count) {
|
|
5690
|
+
const result = [];
|
|
5682
5691
|
for (let i = 0; i < count; i++) {
|
|
5683
|
-
|
|
5692
|
+
result.push(decodeStat(stats, i));
|
|
5684
5693
|
}
|
|
5685
|
-
return
|
|
5694
|
+
return result;
|
|
5686
5695
|
}
|
|
5687
|
-
function mapStatsToKeys(
|
|
5688
|
-
const values = decodeStats(
|
|
5696
|
+
function mapStatsToKeys(stats, statDefs) {
|
|
5697
|
+
const values = decodeStats(stats, statDefs.length);
|
|
5689
5698
|
const result = {};
|
|
5690
5699
|
for (let i = 0; i < statDefs.length; i++) {
|
|
5691
5700
|
result[statDefs[i].key] = values[i];
|
|
5692
5701
|
}
|
|
5693
5702
|
return result;
|
|
5694
5703
|
}
|
|
5695
|
-
function decodeCraftedItemStats(itemId,
|
|
5704
|
+
function decodeCraftedItemStats(itemId, stats) {
|
|
5696
5705
|
const comp = getComponentById(itemId);
|
|
5697
5706
|
if (comp)
|
|
5698
|
-
return mapStatsToKeys(
|
|
5707
|
+
return mapStatsToKeys(stats, comp.stats);
|
|
5699
5708
|
const entityRecipe = entityRecipes.find((r) => r.packedItemId === itemId);
|
|
5700
5709
|
if (entityRecipe)
|
|
5701
|
-
return mapStatsToKeys(
|
|
5710
|
+
return mapStatsToKeys(stats, entityRecipe.stats);
|
|
5702
5711
|
const moduleRecipe = moduleRecipes.find((r) => r.itemId === itemId);
|
|
5703
5712
|
if (moduleRecipe)
|
|
5704
|
-
return mapStatsToKeys(
|
|
5713
|
+
return mapStatsToKeys(stats, moduleRecipe.stats);
|
|
5705
5714
|
return {};
|
|
5706
5715
|
}
|
|
5707
5716
|
function blendStacks(stacks, statKey) {
|
|
@@ -5754,19 +5763,19 @@ function computeEntityStats(entityRecipeId, componentStacks) {
|
|
|
5754
5763
|
return { key: stat.key, value: Math.max(1, Math.min(999, value)) };
|
|
5755
5764
|
});
|
|
5756
5765
|
}
|
|
5757
|
-
function decodeStackStats(itemId,
|
|
5766
|
+
function decodeStackStats(itemId, stats) {
|
|
5758
5767
|
if (itemId >= 10000) {
|
|
5759
|
-
return decodeCraftedItemStats(itemId, BigInt(
|
|
5768
|
+
return decodeCraftedItemStats(itemId, BigInt(stats.toString()));
|
|
5760
5769
|
}
|
|
5761
|
-
const
|
|
5762
|
-
return { stat1:
|
|
5770
|
+
const s = BigInt(stats.toString());
|
|
5771
|
+
return { stat1: decodeStat(s, 0), stat2: decodeStat(s, 1), stat3: decodeStat(s, 2) };
|
|
5763
5772
|
}
|
|
5764
5773
|
const categoryItemMass = {
|
|
5765
|
-
|
|
5766
|
-
|
|
5774
|
+
ore: 30000,
|
|
5775
|
+
crystal: 40000,
|
|
5767
5776
|
gas: 15000,
|
|
5768
|
-
|
|
5769
|
-
|
|
5777
|
+
regolith: 22000,
|
|
5778
|
+
biomass: 15000,
|
|
5770
5779
|
};
|
|
5771
5780
|
function computeInputMass(itemId, itemType) {
|
|
5772
5781
|
if (itemType === 'component') {
|
|
@@ -5813,25 +5822,24 @@ function blendCrossGroup(sources) {
|
|
|
5813
5822
|
function blendCargoStacks(itemId, stacks) {
|
|
5814
5823
|
const decoded = stacks.map((s) => ({
|
|
5815
5824
|
quantity: s.quantity,
|
|
5816
|
-
stats: decodeStackStats(itemId, s.
|
|
5825
|
+
stats: decodeStackStats(itemId, s.stats),
|
|
5817
5826
|
}));
|
|
5818
5827
|
const allKeys = Object.keys(decoded[0]?.stats ?? {});
|
|
5819
5828
|
const blended = allKeys.map((key) => Math.max(1, Math.min(999, blendStacks(decoded, key))));
|
|
5820
5829
|
return UInt64.from(encodeStats(blended));
|
|
5821
5830
|
}
|
|
5822
|
-
function decodeRawStackToCategoryStats(
|
|
5823
|
-
const raw = deriveResourceStats(seed);
|
|
5831
|
+
function decodeRawStackToCategoryStats(stats, category) {
|
|
5824
5832
|
const defs = getStatDefinitions(category);
|
|
5825
5833
|
const result = {};
|
|
5826
5834
|
if (defs[0])
|
|
5827
|
-
result[defs[0].key] =
|
|
5835
|
+
result[defs[0].key] = decodeStat(stats, 0);
|
|
5828
5836
|
if (defs[1])
|
|
5829
|
-
result[defs[1].key] =
|
|
5837
|
+
result[defs[1].key] = decodeStat(stats, 1);
|
|
5830
5838
|
if (defs[2])
|
|
5831
|
-
result[defs[2].key] =
|
|
5839
|
+
result[defs[2].key] = decodeStat(stats, 2);
|
|
5832
5840
|
return result;
|
|
5833
5841
|
}
|
|
5834
|
-
function
|
|
5842
|
+
function computeCraftedOutputStats(outputItemId, slotInputs) {
|
|
5835
5843
|
var _a;
|
|
5836
5844
|
const component = getComponentById(outputItemId);
|
|
5837
5845
|
if (component) {
|
|
@@ -5843,8 +5851,8 @@ function computeCraftedOutputSeed(outputItemId, slotInputs) {
|
|
|
5843
5851
|
const stacks = slot.stacks.map((s) => ({
|
|
5844
5852
|
quantity: s.quantity,
|
|
5845
5853
|
stats: slotIsComponent
|
|
5846
|
-
? decodeCraftedItemStats(slot.itemId, s.
|
|
5847
|
-
: decodeRawStackToCategoryStats(s.
|
|
5854
|
+
? decodeCraftedItemStats(slot.itemId, s.stats)
|
|
5855
|
+
: decodeRawStackToCategoryStats(s.stats, slot.category),
|
|
5848
5856
|
}));
|
|
5849
5857
|
categoryStacks.push({ category: slot.category, stacks });
|
|
5850
5858
|
}
|
|
@@ -5866,7 +5874,7 @@ function computeCraftedOutputSeed(outputItemId, slotInputs) {
|
|
|
5866
5874
|
for (const s of slot.stacks) {
|
|
5867
5875
|
list.push({
|
|
5868
5876
|
quantity: s.quantity,
|
|
5869
|
-
stats: decodeCraftedItemStats(slot.itemId, s.
|
|
5877
|
+
stats: decodeCraftedItemStats(slot.itemId, s.stats),
|
|
5870
5878
|
});
|
|
5871
5879
|
}
|
|
5872
5880
|
}
|
|
@@ -5877,7 +5885,11 @@ function computeCraftedOutputSeed(outputItemId, slotInputs) {
|
|
|
5877
5885
|
});
|
|
5878
5886
|
return UInt64.from(encodeStats(ordered));
|
|
5879
5887
|
}
|
|
5880
|
-
throw new Error(`
|
|
5888
|
+
throw new Error(`computeCraftedOutputStats: no recipe found for outputItemId=${outputItemId}`);
|
|
5889
|
+
}
|
|
5890
|
+
function encodeGatheredCargoStats(depositSeed) {
|
|
5891
|
+
const raw = deriveResourceStats(depositSeed);
|
|
5892
|
+
return UInt64.from(encodeStats([raw.stat1, raw.stat2, raw.stat3]));
|
|
5881
5893
|
}
|
|
5882
5894
|
|
|
5883
5895
|
const itemsById = new Map();
|
|
@@ -5901,7 +5913,7 @@ function synthesizeItem(id, source) {
|
|
|
5901
5913
|
name: source.name,
|
|
5902
5914
|
description: source.description,
|
|
5903
5915
|
mass: source.mass,
|
|
5904
|
-
category: '
|
|
5916
|
+
category: 'ore',
|
|
5905
5917
|
tier: 't1',
|
|
5906
5918
|
color: source.color,
|
|
5907
5919
|
});
|
|
@@ -6251,6 +6263,9 @@ function capsHasGatherer(caps) {
|
|
|
6251
6263
|
function capsHasMass(caps) {
|
|
6252
6264
|
return caps.hullmass !== undefined;
|
|
6253
6265
|
}
|
|
6266
|
+
function capsHasHauler(caps) {
|
|
6267
|
+
return caps.hauler !== undefined;
|
|
6268
|
+
}
|
|
6254
6269
|
|
|
6255
6270
|
function calcCargoItemMass(item) {
|
|
6256
6271
|
const itemDef = getItem(item.item_id);
|
|
@@ -6305,7 +6320,7 @@ function cargoItemToStack(item) {
|
|
|
6305
6320
|
return {
|
|
6306
6321
|
item_id: UInt16.from(item.item_id),
|
|
6307
6322
|
quantity: UInt32.from(item.quantity),
|
|
6308
|
-
|
|
6323
|
+
stats: item.stats,
|
|
6309
6324
|
modules: item.modules ?? [],
|
|
6310
6325
|
};
|
|
6311
6326
|
}
|
|
@@ -6313,23 +6328,18 @@ function stackToCargoItem(stack) {
|
|
|
6313
6328
|
return Types.cargo_item.from({
|
|
6314
6329
|
item_id: stack.item_id,
|
|
6315
6330
|
quantity: stack.quantity,
|
|
6316
|
-
|
|
6331
|
+
stats: stack.stats,
|
|
6317
6332
|
modules: stack.modules,
|
|
6318
6333
|
});
|
|
6319
6334
|
}
|
|
6320
|
-
function
|
|
6321
|
-
if (!a && !b)
|
|
6322
|
-
return true;
|
|
6323
|
-
if (!a || !b)
|
|
6324
|
-
return false;
|
|
6335
|
+
function statsEquals(a, b) {
|
|
6325
6336
|
return a.equals(b);
|
|
6326
6337
|
}
|
|
6327
6338
|
function stackIdentityEqual(a, b) {
|
|
6328
|
-
return a.item_id.equals(b.item_id) &&
|
|
6339
|
+
return a.item_id.equals(b.item_id) && statsEquals(a.stats, b.stats);
|
|
6329
6340
|
}
|
|
6330
6341
|
function stackKey(s) {
|
|
6331
|
-
|
|
6332
|
-
return `${s.item_id.toNumber()}:${seedVal}`;
|
|
6342
|
+
return `${s.item_id.toNumber()}:${s.stats.toString()}`;
|
|
6333
6343
|
}
|
|
6334
6344
|
function stacksEqual(a, b) {
|
|
6335
6345
|
return stackIdentityEqual(a, b) && a.quantity.equals(b.quantity);
|
|
@@ -6653,7 +6663,9 @@ function applyGatherTask(projected, task, options) {
|
|
|
6653
6663
|
if (!options.complete)
|
|
6654
6664
|
return;
|
|
6655
6665
|
applyEnergyCost(projected, task);
|
|
6656
|
-
|
|
6666
|
+
if (!task.entitytarget) {
|
|
6667
|
+
applyAddCargoTask(projected, task);
|
|
6668
|
+
}
|
|
6657
6669
|
}
|
|
6658
6670
|
function applyCraftTask(projected, task) {
|
|
6659
6671
|
applyEnergyCost(projected, task);
|
|
@@ -6949,9 +6961,19 @@ function needsRecharge(entity) {
|
|
|
6949
6961
|
}
|
|
6950
6962
|
|
|
6951
6963
|
class Ship extends Types.entity_info {
|
|
6964
|
+
constructor() {
|
|
6965
|
+
super(...arguments);
|
|
6966
|
+
this._modules = [];
|
|
6967
|
+
}
|
|
6952
6968
|
get name() {
|
|
6953
6969
|
return this.entity_name;
|
|
6954
6970
|
}
|
|
6971
|
+
get modules() {
|
|
6972
|
+
return this._modules;
|
|
6973
|
+
}
|
|
6974
|
+
setModules(modules) {
|
|
6975
|
+
this._modules = modules;
|
|
6976
|
+
}
|
|
6955
6977
|
get inv() {
|
|
6956
6978
|
return (this._inv ?? (this._inv = new InventoryAccessor(this)));
|
|
6957
6979
|
}
|
|
@@ -7070,10 +7092,188 @@ class Ship extends Types.entity_info {
|
|
|
7070
7092
|
}
|
|
7071
7093
|
}
|
|
7072
7094
|
|
|
7095
|
+
function computeShipHullCapabilities(stats) {
|
|
7096
|
+
const density = stats.density ?? 500;
|
|
7097
|
+
const strength = stats.strength ?? 500;
|
|
7098
|
+
const fineness = stats.fineness ?? 500;
|
|
7099
|
+
const saturation = stats.saturation ?? 500;
|
|
7100
|
+
const hullmass = 25000 + 75 * density;
|
|
7101
|
+
const statSum = strength + fineness + saturation;
|
|
7102
|
+
const exponent = statSum / 2997.0;
|
|
7103
|
+
const capacity = Math.floor(1000000 * Math.pow(10, exponent));
|
|
7104
|
+
return { hullmass, capacity };
|
|
7105
|
+
}
|
|
7106
|
+
function computeEngineCapabilities(stats) {
|
|
7107
|
+
const vol = stats.volatility ?? 500;
|
|
7108
|
+
const thm = stats.thermal ?? 500;
|
|
7109
|
+
return {
|
|
7110
|
+
thrust: 400 + Math.floor((vol * 3) / 4),
|
|
7111
|
+
drain: Math.max(30, 50 - Math.floor(thm / 70)),
|
|
7112
|
+
};
|
|
7113
|
+
}
|
|
7114
|
+
function computeGeneratorCapabilities(stats) {
|
|
7115
|
+
const res = stats.resonance ?? 500;
|
|
7116
|
+
const ref = stats.reflectivity ?? 500;
|
|
7117
|
+
return {
|
|
7118
|
+
capacity: 300 + Math.floor(res / 6),
|
|
7119
|
+
recharge: 1 + Math.floor((ref * 3) / 1000),
|
|
7120
|
+
};
|
|
7121
|
+
}
|
|
7122
|
+
function computeGathererCapabilities(stats) {
|
|
7123
|
+
const str = stats.strength ?? 500;
|
|
7124
|
+
const con = stats.conductivity ?? 500;
|
|
7125
|
+
const ref = stats.reflectivity ?? 500;
|
|
7126
|
+
const tol = stats.tolerance ?? 500;
|
|
7127
|
+
return {
|
|
7128
|
+
yield: 200 + str,
|
|
7129
|
+
drain: Math.max(250, 1250 - Math.floor((con * 25) / 20)),
|
|
7130
|
+
depth: 200 + Math.floor((tol * 3) / 2),
|
|
7131
|
+
speed: 100 + Math.floor((ref * 4) / 5),
|
|
7132
|
+
};
|
|
7133
|
+
}
|
|
7134
|
+
function computeLoaderCapabilities(stats) {
|
|
7135
|
+
const fin = stats.fineness ?? 500;
|
|
7136
|
+
const pla = stats.plasticity ?? 500;
|
|
7137
|
+
return {
|
|
7138
|
+
mass: Math.max(200, 2000 - Math.floor(fin * 2)),
|
|
7139
|
+
thrust: 1 + Math.floor(pla / 500),
|
|
7140
|
+
quantity: 1,
|
|
7141
|
+
};
|
|
7142
|
+
}
|
|
7143
|
+
function computeManufacturingCapabilities(stats) {
|
|
7144
|
+
const rea = stats.reactivity ?? 500;
|
|
7145
|
+
const com = stats.composition ?? 500;
|
|
7146
|
+
return {
|
|
7147
|
+
speed: 100 + Math.floor((rea * 4) / 5),
|
|
7148
|
+
drain: Math.max(5, 30 - Math.floor(com / 33)),
|
|
7149
|
+
};
|
|
7150
|
+
}
|
|
7151
|
+
function computeHaulerCapabilities(stats) {
|
|
7152
|
+
const res = stats.resonance ?? 500;
|
|
7153
|
+
const con = stats.conductivity ?? 500;
|
|
7154
|
+
const ref = stats.reflectivity ?? 500;
|
|
7155
|
+
return {
|
|
7156
|
+
capacity: Math.max(1, 1 + Math.floor(res / 400)),
|
|
7157
|
+
efficiency: 2000 + con * 6,
|
|
7158
|
+
drain: Math.max(3, 15 - Math.floor(ref / 80)),
|
|
7159
|
+
};
|
|
7160
|
+
}
|
|
7161
|
+
function computeStorageCapabilities(stats, baseCapacity) {
|
|
7162
|
+
const strength = stats.strength ?? 500;
|
|
7163
|
+
const fineness = stats.fineness ?? 500;
|
|
7164
|
+
const saturation = stats.saturation ?? 500;
|
|
7165
|
+
const statSum = strength + fineness + saturation;
|
|
7166
|
+
const capacityBonus = Math.floor((baseCapacity * (10 + Math.floor((statSum * 10) / 2997))) / 100);
|
|
7167
|
+
return { capacityBonus };
|
|
7168
|
+
}
|
|
7169
|
+
function computeWarehouseHullCapabilities(stats) {
|
|
7170
|
+
const density = stats.density ?? 500;
|
|
7171
|
+
const strength = stats.strength ?? 500;
|
|
7172
|
+
const fineness = stats.fineness ?? 500;
|
|
7173
|
+
const saturation = stats.saturation ?? 500;
|
|
7174
|
+
const hullmass = 25000 + 75 * density;
|
|
7175
|
+
const statSum = strength + fineness + saturation;
|
|
7176
|
+
const exponent = statSum / 2997.0;
|
|
7177
|
+
const capacity = Math.floor(20000000 * Math.pow(10, exponent));
|
|
7178
|
+
return { hullmass, capacity };
|
|
7179
|
+
}
|
|
7180
|
+
function computeShipCapabilities(modules) {
|
|
7181
|
+
const ship = {};
|
|
7182
|
+
const engineModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_ENGINE);
|
|
7183
|
+
if (engineModules.length > 0) {
|
|
7184
|
+
let totalThrust = 0;
|
|
7185
|
+
let totalDrain = 0;
|
|
7186
|
+
for (const m of engineModules) {
|
|
7187
|
+
const caps = computeEngineCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
|
|
7188
|
+
totalThrust += caps.thrust;
|
|
7189
|
+
totalDrain += caps.drain;
|
|
7190
|
+
}
|
|
7191
|
+
ship.engines = { thrust: totalThrust, drain: totalDrain };
|
|
7192
|
+
}
|
|
7193
|
+
const generatorModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GENERATOR);
|
|
7194
|
+
if (generatorModules.length > 0) {
|
|
7195
|
+
let totalCapacity = 0;
|
|
7196
|
+
let totalRecharge = 0;
|
|
7197
|
+
for (const m of generatorModules) {
|
|
7198
|
+
const caps = computeGeneratorCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
|
|
7199
|
+
totalCapacity += caps.capacity;
|
|
7200
|
+
totalRecharge += caps.recharge;
|
|
7201
|
+
}
|
|
7202
|
+
ship.generator = { capacity: totalCapacity, recharge: totalRecharge };
|
|
7203
|
+
}
|
|
7204
|
+
const gathererModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GATHERER);
|
|
7205
|
+
if (gathererModules.length > 0) {
|
|
7206
|
+
let totalYield = 0;
|
|
7207
|
+
let totalDrain = 0;
|
|
7208
|
+
let totalDepth = 0;
|
|
7209
|
+
let totalSpeed = 0;
|
|
7210
|
+
for (const m of gathererModules) {
|
|
7211
|
+
const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
|
|
7212
|
+
totalYield += caps.yield;
|
|
7213
|
+
totalDrain += caps.drain;
|
|
7214
|
+
totalDepth += caps.depth;
|
|
7215
|
+
totalSpeed += caps.speed;
|
|
7216
|
+
}
|
|
7217
|
+
ship.gatherer = { yield: totalYield, drain: totalDrain, depth: totalDepth, speed: totalSpeed };
|
|
7218
|
+
}
|
|
7219
|
+
const haulerModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_HAULER);
|
|
7220
|
+
if (haulerModules.length > 0) {
|
|
7221
|
+
let totalCapacity = 0;
|
|
7222
|
+
let weightedEffNum = 0;
|
|
7223
|
+
let totalDrain = 0;
|
|
7224
|
+
for (const m of haulerModules) {
|
|
7225
|
+
const caps = computeHaulerCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
|
|
7226
|
+
totalCapacity += caps.capacity;
|
|
7227
|
+
weightedEffNum += caps.efficiency * caps.capacity;
|
|
7228
|
+
totalDrain += caps.drain;
|
|
7229
|
+
}
|
|
7230
|
+
ship.hauler = {
|
|
7231
|
+
capacity: totalCapacity,
|
|
7232
|
+
efficiency: totalCapacity > 0 ? Math.floor(weightedEffNum / totalCapacity) : 0,
|
|
7233
|
+
drain: totalDrain,
|
|
7234
|
+
};
|
|
7235
|
+
}
|
|
7236
|
+
const loaderModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_LOADER);
|
|
7237
|
+
if (loaderModules.length > 0) {
|
|
7238
|
+
let totalMass = 0;
|
|
7239
|
+
let totalThrust = 0;
|
|
7240
|
+
let totalQuantity = 0;
|
|
7241
|
+
for (const m of loaderModules) {
|
|
7242
|
+
const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
|
|
7243
|
+
totalMass += caps.mass;
|
|
7244
|
+
totalThrust += caps.thrust;
|
|
7245
|
+
totalQuantity += caps.quantity;
|
|
7246
|
+
}
|
|
7247
|
+
ship.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
|
|
7248
|
+
}
|
|
7249
|
+
const crafterModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_CRAFTER);
|
|
7250
|
+
if (crafterModules.length > 0) {
|
|
7251
|
+
let totalSpeed = 0;
|
|
7252
|
+
let totalDrain = 0;
|
|
7253
|
+
for (const m of crafterModules) {
|
|
7254
|
+
const caps = computeManufacturingCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
|
|
7255
|
+
totalSpeed += caps.speed;
|
|
7256
|
+
totalDrain += caps.drain;
|
|
7257
|
+
}
|
|
7258
|
+
ship.crafter = { speed: totalSpeed, drain: totalDrain };
|
|
7259
|
+
}
|
|
7260
|
+
return ship;
|
|
7261
|
+
}
|
|
7262
|
+
|
|
7073
7263
|
class Warehouse extends Types.entity_info {
|
|
7264
|
+
constructor() {
|
|
7265
|
+
super(...arguments);
|
|
7266
|
+
this._modules = [];
|
|
7267
|
+
}
|
|
7074
7268
|
get name() {
|
|
7075
7269
|
return this.entity_name;
|
|
7076
7270
|
}
|
|
7271
|
+
get modules() {
|
|
7272
|
+
return this._modules;
|
|
7273
|
+
}
|
|
7274
|
+
setModules(modules) {
|
|
7275
|
+
this._modules = modules;
|
|
7276
|
+
}
|
|
7077
7277
|
get inv() {
|
|
7078
7278
|
return (this._inv ?? (this._inv = new InventoryAccessor(this)));
|
|
7079
7279
|
}
|
|
@@ -7122,6 +7322,23 @@ class Warehouse extends Types.entity_info {
|
|
|
7122
7322
|
return hull.adding(this.totalCargoMass);
|
|
7123
7323
|
}
|
|
7124
7324
|
}
|
|
7325
|
+
function computeWarehouseCapabilities(modules) {
|
|
7326
|
+
const warehouse = {};
|
|
7327
|
+
const loaderModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_LOADER);
|
|
7328
|
+
if (loaderModules.length > 0) {
|
|
7329
|
+
let totalMass = 0;
|
|
7330
|
+
let totalThrust = 0;
|
|
7331
|
+
let totalQuantity = 0;
|
|
7332
|
+
for (const m of loaderModules) {
|
|
7333
|
+
const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
|
|
7334
|
+
totalMass += caps.mass;
|
|
7335
|
+
totalThrust += caps.thrust;
|
|
7336
|
+
totalQuantity += caps.quantity;
|
|
7337
|
+
}
|
|
7338
|
+
warehouse.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
|
|
7339
|
+
}
|
|
7340
|
+
return warehouse;
|
|
7341
|
+
}
|
|
7125
7342
|
|
|
7126
7343
|
class Container extends Types.entity_info {
|
|
7127
7344
|
get name() {
|
|
@@ -7165,10 +7382,10 @@ class Container extends Types.entity_info {
|
|
|
7165
7382
|
function computeContainerCapabilities(stats) {
|
|
7166
7383
|
const density = stats['density'] ?? 500;
|
|
7167
7384
|
const strength = stats['strength'] ?? 500;
|
|
7168
|
-
const
|
|
7169
|
-
const
|
|
7385
|
+
const fineness = stats['fineness'] ?? 500;
|
|
7386
|
+
const saturation = stats['saturation'] ?? 500;
|
|
7170
7387
|
const hullmass = 25000 + 75 * density;
|
|
7171
|
-
const statSum = strength +
|
|
7388
|
+
const statSum = strength + fineness + saturation;
|
|
7172
7389
|
const exponent = statSum / 2997;
|
|
7173
7390
|
const capacity = Math.floor(1000000 * Math.pow(10, exponent));
|
|
7174
7391
|
return { hullmass, capacity };
|
|
@@ -7176,10 +7393,10 @@ function computeContainerCapabilities(stats) {
|
|
|
7176
7393
|
function computeContainerT2Capabilities(stats) {
|
|
7177
7394
|
const strength = stats['strength'] ?? 0;
|
|
7178
7395
|
const density = stats['density'] ?? 0;
|
|
7179
|
-
const
|
|
7180
|
-
const
|
|
7396
|
+
const fineness = stats['fineness'] ?? 0;
|
|
7397
|
+
const saturation = stats['saturation'] ?? 0;
|
|
7181
7398
|
const hullmass = 20000 + 50 * density;
|
|
7182
|
-
const statSum = strength +
|
|
7399
|
+
const statSum = strength + fineness + saturation;
|
|
7183
7400
|
const exponent = statSum / 2500;
|
|
7184
7401
|
const capacity = Math.floor(1500000 * Math.pow(10, exponent));
|
|
7185
7402
|
return { hullmass, capacity };
|
|
@@ -7382,13 +7599,14 @@ class ActionsManager extends BaseManager {
|
|
|
7382
7599
|
id: UInt64.from(shipId),
|
|
7383
7600
|
});
|
|
7384
7601
|
}
|
|
7385
|
-
transfer(sourceType, sourceId, destType, destId,
|
|
7602
|
+
transfer(sourceType, sourceId, destType, destId, itemId, stats, quantity) {
|
|
7386
7603
|
return this.server.action('transfer', {
|
|
7387
7604
|
source_type: sourceType,
|
|
7388
7605
|
source_id: UInt64.from(sourceId),
|
|
7389
7606
|
dest_type: destType,
|
|
7390
7607
|
dest_id: UInt64.from(destId),
|
|
7391
|
-
item_id: UInt16.from(
|
|
7608
|
+
item_id: UInt16.from(itemId),
|
|
7609
|
+
stats: UInt64.from(stats),
|
|
7392
7610
|
quantity: UInt32.from(quantity),
|
|
7393
7611
|
});
|
|
7394
7612
|
}
|
|
@@ -7403,10 +7621,16 @@ class ActionsManager extends BaseManager {
|
|
|
7403
7621
|
account: Name.from(account),
|
|
7404
7622
|
});
|
|
7405
7623
|
}
|
|
7406
|
-
gather(
|
|
7624
|
+
gather(source, destination, stratum, quantity) {
|
|
7407
7625
|
return this.server.action('gather', {
|
|
7408
|
-
|
|
7409
|
-
|
|
7626
|
+
source: Types.entity_ref.from({
|
|
7627
|
+
entity_type: source.entityType,
|
|
7628
|
+
entity_id: UInt64.from(source.entityId),
|
|
7629
|
+
}),
|
|
7630
|
+
destination: Types.entity_ref.from({
|
|
7631
|
+
entity_type: destination.entityType,
|
|
7632
|
+
entity_id: UInt64.from(destination.entityId),
|
|
7633
|
+
}),
|
|
7410
7634
|
stratum: UInt16.from(stratum),
|
|
7411
7635
|
quantity: UInt32.from(quantity),
|
|
7412
7636
|
});
|
|
@@ -7439,12 +7663,12 @@ class ActionsManager extends BaseManager {
|
|
|
7439
7663
|
inputs: cargoInputs,
|
|
7440
7664
|
});
|
|
7441
7665
|
}
|
|
7442
|
-
deploy(entityType, entityId, packedItemId,
|
|
7666
|
+
deploy(entityType, entityId, packedItemId, stats, entityName) {
|
|
7443
7667
|
return this.server.action('deploy', {
|
|
7444
7668
|
entity_type: entityType,
|
|
7445
7669
|
id: UInt64.from(entityId),
|
|
7446
7670
|
packed_item_id: UInt16.from(packedItemId),
|
|
7447
|
-
|
|
7671
|
+
stats: UInt64.from(stats),
|
|
7448
7672
|
entity_name: entityName,
|
|
7449
7673
|
});
|
|
7450
7674
|
}
|
|
@@ -7465,6 +7689,15 @@ class ActionsManager extends BaseManager {
|
|
|
7465
7689
|
target_cargo_id: UInt64.from(targetCargoId),
|
|
7466
7690
|
});
|
|
7467
7691
|
}
|
|
7692
|
+
wrap(owner, entityType, entityId, cargoId, quantity) {
|
|
7693
|
+
return this.server.action('wrap', {
|
|
7694
|
+
owner: Name.from(owner),
|
|
7695
|
+
entity_type: entityType,
|
|
7696
|
+
entity_id: UInt64.from(entityId),
|
|
7697
|
+
cargo_id: UInt64.from(cargoId),
|
|
7698
|
+
quantity: UInt64.from(quantity),
|
|
7699
|
+
});
|
|
7700
|
+
}
|
|
7468
7701
|
joinGame(account, companyName) {
|
|
7469
7702
|
return [this.foundCompany(account, companyName), this.join(account)];
|
|
7470
7703
|
}
|
|
@@ -7604,6 +7837,51 @@ class Shipload {
|
|
|
7604
7837
|
}
|
|
7605
7838
|
}
|
|
7606
7839
|
|
|
7840
|
+
function assignModulesToSlots(packedEntityItemId, modules, entityLabel) {
|
|
7841
|
+
const slots = getEntitySlotLayout(packedEntityItemId);
|
|
7842
|
+
const result = slots.map((s) => ({ type: s.type, installed: undefined }));
|
|
7843
|
+
for (const mod of modules) {
|
|
7844
|
+
const itemId = Number(UInt16.from(mod.itemId).value.toString());
|
|
7845
|
+
const modType = getModuleCapabilityType(itemId);
|
|
7846
|
+
const slotIdx = result.findIndex((r) => !r.installed && moduleAccepts(r.type, modType));
|
|
7847
|
+
if (slotIdx === -1) {
|
|
7848
|
+
const recipe = getModuleRecipeByItemId(itemId);
|
|
7849
|
+
const modName = recipe?.name ?? `item ${itemId}`;
|
|
7850
|
+
throw new Error(`No compatible slot for module ${modName} (type ${modType}) on ${entityLabel}`);
|
|
7851
|
+
}
|
|
7852
|
+
result[slotIdx].installed = Types.packed_module.from({
|
|
7853
|
+
item_id: UInt16.from(mod.itemId),
|
|
7854
|
+
stats: UInt64.from(mod.stats),
|
|
7855
|
+
});
|
|
7856
|
+
}
|
|
7857
|
+
return result.map((r) => Types.module_entry.from({
|
|
7858
|
+
type: UInt8.from(r.type),
|
|
7859
|
+
installed: r.installed,
|
|
7860
|
+
}));
|
|
7861
|
+
}
|
|
7862
|
+
function decodePackedInput(m) {
|
|
7863
|
+
return {
|
|
7864
|
+
itemId: Number(UInt16.from(m.itemId).value.toString()),
|
|
7865
|
+
stats: BigInt(UInt64.from(m.stats).toString()),
|
|
7866
|
+
};
|
|
7867
|
+
}
|
|
7868
|
+
function computeStorageBonus(decoded, baseCapacity) {
|
|
7869
|
+
let totalBonus = 0;
|
|
7870
|
+
for (const m of decoded) {
|
|
7871
|
+
if (getModuleCapabilityType(m.itemId) !== MODULE_STORAGE)
|
|
7872
|
+
continue;
|
|
7873
|
+
const stats = decodeCraftedItemStats(m.itemId, m.stats);
|
|
7874
|
+
const { capacityBonus } = computeStorageCapabilities(stats, baseCapacity);
|
|
7875
|
+
totalBonus += capacityBonus;
|
|
7876
|
+
}
|
|
7877
|
+
return totalBonus;
|
|
7878
|
+
}
|
|
7879
|
+
function deriveShipFromModules(modules, baseCapacity) {
|
|
7880
|
+
const decoded = modules.map(decodePackedInput);
|
|
7881
|
+
const capabilities = computeShipCapabilities(decoded);
|
|
7882
|
+
const totalBonus = computeStorageBonus(decoded, baseCapacity);
|
|
7883
|
+
return { capabilities, finalCapacity: baseCapacity + totalBonus };
|
|
7884
|
+
}
|
|
7607
7885
|
function makeShip(state) {
|
|
7608
7886
|
const info = {
|
|
7609
7887
|
type: Name.from('ship'),
|
|
@@ -7620,20 +7898,38 @@ function makeShip(state) {
|
|
|
7620
7898
|
};
|
|
7621
7899
|
if (state.hullmass !== undefined)
|
|
7622
7900
|
info.hullmass = UInt32.from(state.hullmass);
|
|
7623
|
-
if (state.capacity !== undefined)
|
|
7624
|
-
info.capacity = UInt32.from(state.capacity);
|
|
7625
7901
|
if (state.energy !== undefined)
|
|
7626
7902
|
info.energy = UInt16.from(state.energy);
|
|
7627
|
-
if (state.engines)
|
|
7628
|
-
info.engines = state.engines;
|
|
7629
|
-
if (state.generator)
|
|
7630
|
-
info.generator = state.generator;
|
|
7631
|
-
if (state.loaders)
|
|
7632
|
-
info.loaders = state.loaders;
|
|
7633
7903
|
if (state.schedule)
|
|
7634
7904
|
info.schedule = state.schedule;
|
|
7905
|
+
let moduleEntries = [];
|
|
7906
|
+
if (state.modules && state.modules.length > 0) {
|
|
7907
|
+
moduleEntries = assignModulesToSlots(ITEM_SHIP_T1_PACKED, state.modules, 'Ship T1');
|
|
7908
|
+
const { capabilities, finalCapacity } = deriveShipFromModules(state.modules, state.capacity ?? 0);
|
|
7909
|
+
if (capabilities.engines)
|
|
7910
|
+
info.engines = capabilities.engines;
|
|
7911
|
+
if (capabilities.generator)
|
|
7912
|
+
info.generator = capabilities.generator;
|
|
7913
|
+
if (capabilities.gatherer)
|
|
7914
|
+
info.gatherer = capabilities.gatherer;
|
|
7915
|
+
if (capabilities.hauler)
|
|
7916
|
+
info.hauler = capabilities.hauler;
|
|
7917
|
+
if (capabilities.loaders)
|
|
7918
|
+
info.loaders = capabilities.loaders;
|
|
7919
|
+
if (capabilities.crafter)
|
|
7920
|
+
info.crafter = capabilities.crafter;
|
|
7921
|
+
if (state.capacity !== undefined)
|
|
7922
|
+
info.capacity = UInt32.from(finalCapacity);
|
|
7923
|
+
}
|
|
7924
|
+
else {
|
|
7925
|
+
moduleEntries = assignModulesToSlots(ITEM_SHIP_T1_PACKED, [], 'Ship T1');
|
|
7926
|
+
if (state.capacity !== undefined)
|
|
7927
|
+
info.capacity = UInt32.from(state.capacity);
|
|
7928
|
+
}
|
|
7635
7929
|
const entityInfo = Types.entity_info.from(info);
|
|
7636
|
-
|
|
7930
|
+
const ship = new Ship(entityInfo);
|
|
7931
|
+
ship.setModules(moduleEntries);
|
|
7932
|
+
return ship;
|
|
7637
7933
|
}
|
|
7638
7934
|
function makeWarehouse(state) {
|
|
7639
7935
|
const info = {
|
|
@@ -7652,12 +7948,25 @@ function makeWarehouse(state) {
|
|
|
7652
7948
|
};
|
|
7653
7949
|
if (state.hullmass !== undefined)
|
|
7654
7950
|
info.hullmass = UInt32.from(state.hullmass);
|
|
7655
|
-
if (state.loaders)
|
|
7656
|
-
info.loaders = state.loaders;
|
|
7657
7951
|
if (state.schedule)
|
|
7658
7952
|
info.schedule = state.schedule;
|
|
7953
|
+
let moduleEntries = [];
|
|
7954
|
+
if (state.modules && state.modules.length > 0) {
|
|
7955
|
+
moduleEntries = assignModulesToSlots(ITEM_WAREHOUSE_T1_PACKED, state.modules, 'Warehouse T1');
|
|
7956
|
+
const decoded = state.modules.map(decodePackedInput);
|
|
7957
|
+
const capabilities = computeWarehouseCapabilities(decoded);
|
|
7958
|
+
if (capabilities.loaders)
|
|
7959
|
+
info.loaders = capabilities.loaders;
|
|
7960
|
+
const totalBonus = computeStorageBonus(decoded, state.capacity);
|
|
7961
|
+
info.capacity = UInt32.from(state.capacity + totalBonus);
|
|
7962
|
+
}
|
|
7963
|
+
else {
|
|
7964
|
+
moduleEntries = assignModulesToSlots(ITEM_WAREHOUSE_T1_PACKED, [], 'Warehouse T1');
|
|
7965
|
+
}
|
|
7659
7966
|
const entityInfo = Types.entity_info.from(info);
|
|
7660
|
-
|
|
7967
|
+
const warehouse = new Warehouse(entityInfo);
|
|
7968
|
+
warehouse.setModules(moduleEntries);
|
|
7969
|
+
return warehouse;
|
|
7661
7970
|
}
|
|
7662
7971
|
function makeContainer(state) {
|
|
7663
7972
|
const entityInfo = Types.entity_info.from({
|
|
@@ -7669,7 +7978,7 @@ function makeContainer(state) {
|
|
|
7669
7978
|
hullmass: UInt32.from(state.hullmass),
|
|
7670
7979
|
capacity: UInt32.from(state.capacity),
|
|
7671
7980
|
cargomass: UInt32.from(state.cargomass || 0),
|
|
7672
|
-
cargo: [],
|
|
7981
|
+
cargo: state.cargo || [],
|
|
7673
7982
|
is_idle: !state.schedule,
|
|
7674
7983
|
current_task_elapsed: UInt32.from(0),
|
|
7675
7984
|
current_task_remaining: UInt32.from(0),
|
|
@@ -7816,11 +8125,11 @@ function computeHaulerDrain(distance, drain, haulCount) {
|
|
|
7816
8125
|
}
|
|
7817
8126
|
|
|
7818
8127
|
const categoryColors = {
|
|
7819
|
-
|
|
7820
|
-
|
|
7821
|
-
gas: '#
|
|
7822
|
-
|
|
7823
|
-
|
|
8128
|
+
ore: '#C26D3F',
|
|
8129
|
+
crystal: '#4ADBFF',
|
|
8130
|
+
gas: '#B8E4A0',
|
|
8131
|
+
regolith: '#C4A57B',
|
|
8132
|
+
biomass: '#5A8B3E',
|
|
7824
8133
|
};
|
|
7825
8134
|
const tierColors = {
|
|
7826
8135
|
t1: '#8b8b8b',
|
|
@@ -7829,16 +8138,30 @@ const tierColors = {
|
|
|
7829
8138
|
t4: '#c084fc',
|
|
7830
8139
|
t5: '#fbbf24',
|
|
7831
8140
|
};
|
|
8141
|
+
const tierLabels = {
|
|
8142
|
+
t1: 'Common',
|
|
8143
|
+
t2: 'Uncommon',
|
|
8144
|
+
t3: 'Rare',
|
|
8145
|
+
t4: 'Epic',
|
|
8146
|
+
t5: 'Legendary',
|
|
8147
|
+
};
|
|
7832
8148
|
const categoryIcons = {
|
|
7833
|
-
|
|
7834
|
-
|
|
8149
|
+
ore: '⬡',
|
|
8150
|
+
crystal: '◈',
|
|
7835
8151
|
gas: '◎',
|
|
7836
|
-
|
|
7837
|
-
|
|
8152
|
+
regolith: '■',
|
|
8153
|
+
biomass: '❋',
|
|
8154
|
+
};
|
|
8155
|
+
const categoryIconShapes = {
|
|
8156
|
+
ore: 'hex',
|
|
8157
|
+
crystal: 'diamond',
|
|
8158
|
+
gas: 'circle',
|
|
8159
|
+
regolith: 'square',
|
|
8160
|
+
biomass: 'star',
|
|
7838
8161
|
};
|
|
7839
8162
|
const componentIcon = '▣';
|
|
7840
8163
|
const moduleIcon = '⬢';
|
|
7841
|
-
const
|
|
8164
|
+
const itemAbbreviations = {
|
|
7842
8165
|
10001: 'HP',
|
|
7843
8166
|
10002: 'CL',
|
|
7844
8167
|
10003: 'TC',
|
|
@@ -7908,39 +8231,39 @@ function isCraftedItem(id) {
|
|
|
7908
8231
|
|
|
7909
8232
|
const categories = [
|
|
7910
8233
|
{
|
|
7911
|
-
id: '
|
|
7912
|
-
name: '
|
|
7913
|
-
label: '
|
|
7914
|
-
description: 'Structural
|
|
7915
|
-
color: categoryColors.
|
|
8234
|
+
id: 'ore',
|
|
8235
|
+
name: 'Ore',
|
|
8236
|
+
label: 'Ore',
|
|
8237
|
+
description: 'Structural metal-bearing rock — hulls, frames, load-bearing components',
|
|
8238
|
+
color: categoryColors.ore,
|
|
7916
8239
|
},
|
|
7917
8240
|
{
|
|
7918
|
-
id: '
|
|
7919
|
-
name: '
|
|
7920
|
-
label: '
|
|
7921
|
-
description: '
|
|
7922
|
-
color: categoryColors.
|
|
8241
|
+
id: 'crystal',
|
|
8242
|
+
name: 'Crystal',
|
|
8243
|
+
label: 'Crystal',
|
|
8244
|
+
description: 'Crystalline lattice — conductors, energy storage, resonant systems',
|
|
8245
|
+
color: categoryColors.crystal,
|
|
7923
8246
|
},
|
|
7924
8247
|
{
|
|
7925
8248
|
id: 'gas',
|
|
7926
|
-
name: '
|
|
8249
|
+
name: 'Gas',
|
|
7927
8250
|
label: 'Gas',
|
|
7928
|
-
description: '
|
|
8251
|
+
description: 'Atmospheric volatile — propulsion, thermal processing, chemical reactions',
|
|
7929
8252
|
color: categoryColors.gas,
|
|
7930
8253
|
},
|
|
7931
8254
|
{
|
|
7932
|
-
id: '
|
|
7933
|
-
name: '
|
|
7934
|
-
label: '
|
|
7935
|
-
description: '
|
|
7936
|
-
color: categoryColors.
|
|
8255
|
+
id: 'regolith',
|
|
8256
|
+
name: 'Regolith',
|
|
8257
|
+
label: 'Regolith',
|
|
8258
|
+
description: 'Surface mineral dust — sensors, optics, computation, cutting surfaces',
|
|
8259
|
+
color: categoryColors.regolith,
|
|
7937
8260
|
},
|
|
7938
8261
|
{
|
|
7939
|
-
id: '
|
|
7940
|
-
name: '
|
|
7941
|
-
label: '
|
|
7942
|
-
description: '
|
|
7943
|
-
color: categoryColors.
|
|
8262
|
+
id: 'biomass',
|
|
8263
|
+
name: 'Biomass',
|
|
8264
|
+
label: 'Biomass',
|
|
8265
|
+
description: 'Organic polymer — insulation, composites, bio-processes',
|
|
8266
|
+
color: categoryColors.biomass,
|
|
7944
8267
|
},
|
|
7945
8268
|
];
|
|
7946
8269
|
function getCategoryInfo(id) {
|
|
@@ -8380,194 +8703,21 @@ function getStatMappingsForCapability(capability) {
|
|
|
8380
8703
|
return statMappings.filter((m) => m.capability === capability);
|
|
8381
8704
|
}
|
|
8382
8705
|
|
|
8383
|
-
function computeShipHullCapabilities(stats) {
|
|
8384
|
-
const density = stats.density ?? 500;
|
|
8385
|
-
const strength = stats.strength ?? 500;
|
|
8386
|
-
const ductility = stats.ductility ?? 500;
|
|
8387
|
-
const purity = stats.purity ?? 500;
|
|
8388
|
-
const hullmass = 25000 + 75 * density;
|
|
8389
|
-
const statSum = strength + ductility + purity;
|
|
8390
|
-
const exponent = statSum / 2997.0;
|
|
8391
|
-
const capacity = Math.floor(1000000 * Math.pow(10, exponent));
|
|
8392
|
-
return { hullmass, capacity };
|
|
8393
|
-
}
|
|
8394
|
-
function computeEngineCapabilities(stats) {
|
|
8395
|
-
const vol = stats.volatility ?? 500;
|
|
8396
|
-
const thm = stats.thermal ?? 500;
|
|
8397
|
-
return {
|
|
8398
|
-
thrust: 400 + Math.floor((vol * 3) / 4),
|
|
8399
|
-
drain: Math.max(30, 50 - Math.floor(thm / 70)),
|
|
8400
|
-
};
|
|
8401
|
-
}
|
|
8402
|
-
function computeGeneratorCapabilities(stats) {
|
|
8403
|
-
const res = stats.resonance ?? 500;
|
|
8404
|
-
const clr = stats.clarity ?? 500;
|
|
8405
|
-
return {
|
|
8406
|
-
capacity: 300 + Math.floor(res / 6),
|
|
8407
|
-
recharge: 5 + Math.floor((clr * 15) / 1000),
|
|
8408
|
-
};
|
|
8409
|
-
}
|
|
8410
|
-
function computeGathererCapabilities(stats) {
|
|
8411
|
-
const str = stats.strength ?? 500;
|
|
8412
|
-
const con = stats.conductivity ?? 500;
|
|
8413
|
-
const ref = stats.reflectivity ?? 500;
|
|
8414
|
-
const tol = stats.tolerance ?? 500;
|
|
8415
|
-
return {
|
|
8416
|
-
yield: 200 + str,
|
|
8417
|
-
drain: Math.max(10, 50 - Math.floor(con / 20)),
|
|
8418
|
-
depth: 200 + Math.floor((tol * 3) / 2),
|
|
8419
|
-
speed: 100 + Math.floor((ref * 4) / 5),
|
|
8420
|
-
};
|
|
8421
|
-
}
|
|
8422
|
-
function computeLoaderCapabilities(stats) {
|
|
8423
|
-
const duc = stats.ductility ?? 500;
|
|
8424
|
-
const pla = stats.plasticity ?? 500;
|
|
8425
|
-
return {
|
|
8426
|
-
mass: Math.max(200, 2000 - Math.floor(duc * 2)),
|
|
8427
|
-
thrust: 1 + Math.floor(pla / 500),
|
|
8428
|
-
quantity: 1,
|
|
8429
|
-
};
|
|
8430
|
-
}
|
|
8431
|
-
function computeManufacturingCapabilities(stats) {
|
|
8432
|
-
const rea = stats.reactivity ?? 500;
|
|
8433
|
-
const clr = stats.clarity ?? 500;
|
|
8434
|
-
return {
|
|
8435
|
-
speed: 100 + Math.floor((rea * 4) / 5),
|
|
8436
|
-
drain: Math.max(5, 30 - Math.floor(clr / 33)),
|
|
8437
|
-
};
|
|
8438
|
-
}
|
|
8439
|
-
function computeHaulerCapabilities(stats) {
|
|
8440
|
-
const res = stats.resonance ?? 500;
|
|
8441
|
-
const con = stats.conductivity ?? 500;
|
|
8442
|
-
const clr = stats.clarity ?? 500;
|
|
8443
|
-
return {
|
|
8444
|
-
capacity: Math.max(1, 1 + Math.floor(res / 400)),
|
|
8445
|
-
efficiency: 2000 + con * 6,
|
|
8446
|
-
drain: Math.max(3, 15 - Math.floor(clr / 80)),
|
|
8447
|
-
};
|
|
8448
|
-
}
|
|
8449
|
-
function computeStorageCapabilities(stats, baseCapacity) {
|
|
8450
|
-
const strength = stats.strength ?? 500;
|
|
8451
|
-
const ductility = stats.ductility ?? 500;
|
|
8452
|
-
const purity = stats.purity ?? 500;
|
|
8453
|
-
const statSum = strength + ductility + purity;
|
|
8454
|
-
const capacityBonus = Math.floor((baseCapacity * (10 + Math.floor((statSum * 10) / 2997))) / 100);
|
|
8455
|
-
return { capacityBonus };
|
|
8456
|
-
}
|
|
8457
|
-
function computeWarehouseHullCapabilities(stats) {
|
|
8458
|
-
const density = stats.density ?? 500;
|
|
8459
|
-
const strength = stats.strength ?? 500;
|
|
8460
|
-
const ductility = stats.ductility ?? 500;
|
|
8461
|
-
const purity = stats.purity ?? 500;
|
|
8462
|
-
const hullmass = 25000 + 75 * density;
|
|
8463
|
-
const statSum = strength + ductility + purity;
|
|
8464
|
-
const exponent = statSum / 2997.0;
|
|
8465
|
-
const capacity = Math.floor(20000000 * Math.pow(10, exponent));
|
|
8466
|
-
return { hullmass, capacity };
|
|
8467
|
-
}
|
|
8468
|
-
function computeShipCapabilities(modules) {
|
|
8469
|
-
const ship = {};
|
|
8470
|
-
const engineModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_ENGINE);
|
|
8471
|
-
if (engineModules.length > 0) {
|
|
8472
|
-
let totalThrust = 0;
|
|
8473
|
-
let totalDrain = 0;
|
|
8474
|
-
for (const m of engineModules) {
|
|
8475
|
-
const caps = computeEngineCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
|
|
8476
|
-
totalThrust += caps.thrust;
|
|
8477
|
-
totalDrain += caps.drain;
|
|
8478
|
-
}
|
|
8479
|
-
ship.engines = { thrust: totalThrust, drain: totalDrain };
|
|
8480
|
-
}
|
|
8481
|
-
const generatorModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GENERATOR);
|
|
8482
|
-
if (generatorModules.length > 0) {
|
|
8483
|
-
let totalCapacity = 0;
|
|
8484
|
-
let totalRecharge = 0;
|
|
8485
|
-
for (const m of generatorModules) {
|
|
8486
|
-
const caps = computeGeneratorCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
|
|
8487
|
-
totalCapacity += caps.capacity;
|
|
8488
|
-
totalRecharge += caps.recharge;
|
|
8489
|
-
}
|
|
8490
|
-
ship.generator = { capacity: totalCapacity, recharge: totalRecharge };
|
|
8491
|
-
}
|
|
8492
|
-
const gathererModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GATHERER);
|
|
8493
|
-
if (gathererModules.length > 0) {
|
|
8494
|
-
let totalYield = 0;
|
|
8495
|
-
let totalDrain = 0;
|
|
8496
|
-
let totalDepth = 0;
|
|
8497
|
-
let totalSpeed = 0;
|
|
8498
|
-
for (const m of gathererModules) {
|
|
8499
|
-
const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
|
|
8500
|
-
totalYield += caps.yield;
|
|
8501
|
-
totalDrain += caps.drain;
|
|
8502
|
-
totalDepth += caps.depth;
|
|
8503
|
-
totalSpeed += caps.speed;
|
|
8504
|
-
}
|
|
8505
|
-
ship.gatherer = { yield: totalYield, drain: totalDrain, depth: totalDepth, speed: totalSpeed };
|
|
8506
|
-
}
|
|
8507
|
-
const haulerModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_HAULER);
|
|
8508
|
-
if (haulerModules.length > 0) {
|
|
8509
|
-
let totalCapacity = 0;
|
|
8510
|
-
let weightedEffNum = 0;
|
|
8511
|
-
let totalDrain = 0;
|
|
8512
|
-
for (const m of haulerModules) {
|
|
8513
|
-
const decoded = decodeCraftedItemStats(m.itemId, m.seed);
|
|
8514
|
-
const caps = computeHaulerCapabilities({
|
|
8515
|
-
resonance: decoded.capacity,
|
|
8516
|
-
conductivity: decoded.efficiency,
|
|
8517
|
-
clarity: decoded.drain,
|
|
8518
|
-
});
|
|
8519
|
-
totalCapacity += caps.capacity;
|
|
8520
|
-
weightedEffNum += caps.efficiency * caps.capacity;
|
|
8521
|
-
totalDrain += caps.drain;
|
|
8522
|
-
}
|
|
8523
|
-
ship.hauler = {
|
|
8524
|
-
capacity: totalCapacity,
|
|
8525
|
-
efficiency: totalCapacity > 0 ? Math.floor(weightedEffNum / totalCapacity) : 0,
|
|
8526
|
-
drain: totalDrain,
|
|
8527
|
-
};
|
|
8528
|
-
}
|
|
8529
|
-
const loaderModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_LOADER);
|
|
8530
|
-
if (loaderModules.length > 0) {
|
|
8531
|
-
let totalMass = 0;
|
|
8532
|
-
let totalThrust = 0;
|
|
8533
|
-
let totalQuantity = 0;
|
|
8534
|
-
for (const m of loaderModules) {
|
|
8535
|
-
const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
|
|
8536
|
-
totalMass += caps.mass;
|
|
8537
|
-
totalThrust += caps.thrust;
|
|
8538
|
-
totalQuantity += caps.quantity;
|
|
8539
|
-
}
|
|
8540
|
-
ship.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
|
|
8541
|
-
}
|
|
8542
|
-
const crafterModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_CRAFTER);
|
|
8543
|
-
if (crafterModules.length > 0) {
|
|
8544
|
-
let totalSpeed = 0;
|
|
8545
|
-
let totalDrain = 0;
|
|
8546
|
-
for (const m of crafterModules) {
|
|
8547
|
-
const caps = computeManufacturingCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
|
|
8548
|
-
totalSpeed += caps.speed;
|
|
8549
|
-
totalDrain += caps.drain;
|
|
8550
|
-
}
|
|
8551
|
-
ship.crafter = { speed: totalSpeed, drain: totalDrain };
|
|
8552
|
-
}
|
|
8553
|
-
return ship;
|
|
8554
|
-
}
|
|
8555
|
-
|
|
8556
8706
|
function toNum(v) {
|
|
8557
8707
|
return Number(UInt16.from(v).value.toString());
|
|
8558
8708
|
}
|
|
8559
|
-
function
|
|
8709
|
+
function toBigStats(v) {
|
|
8560
8710
|
return BigInt(UInt64.from(v).toString());
|
|
8561
8711
|
}
|
|
8562
|
-
function resolveResource(id,
|
|
8712
|
+
function resolveResource(id, stats) {
|
|
8563
8713
|
const item = getItem(id);
|
|
8564
8714
|
const cat = item.category;
|
|
8565
|
-
let
|
|
8566
|
-
if (
|
|
8567
|
-
const
|
|
8715
|
+
let resolvedStats;
|
|
8716
|
+
if (stats !== undefined) {
|
|
8717
|
+
const bigStats = toBigStats(stats);
|
|
8568
8718
|
const defs = getStatDefinitions(cat);
|
|
8569
|
-
const values = [
|
|
8570
|
-
|
|
8719
|
+
const values = [decodeStat(bigStats, 0), decodeStat(bigStats, 1), decodeStat(bigStats, 2)];
|
|
8720
|
+
resolvedStats = defs.map((d, i) => ({
|
|
8571
8721
|
key: d.key,
|
|
8572
8722
|
label: d.label,
|
|
8573
8723
|
abbreviation: d.abbreviation,
|
|
@@ -8581,27 +8731,28 @@ function resolveResource(id, seed) {
|
|
|
8581
8731
|
itemId: id,
|
|
8582
8732
|
name: String(item.name),
|
|
8583
8733
|
icon: categoryIcons[cat] ?? '⬡',
|
|
8734
|
+
abbreviation: null,
|
|
8584
8735
|
category: cat,
|
|
8585
8736
|
tier: item.tier,
|
|
8586
8737
|
mass: Number(item.mass.value.toString()),
|
|
8587
8738
|
itemType: 'resource',
|
|
8588
|
-
stats,
|
|
8739
|
+
stats: resolvedStats,
|
|
8589
8740
|
};
|
|
8590
8741
|
}
|
|
8591
|
-
function resolveComponent(id,
|
|
8742
|
+
function resolveComponent(id, stats) {
|
|
8592
8743
|
const comp = getComponentById(id);
|
|
8593
|
-
let
|
|
8594
|
-
if (
|
|
8595
|
-
const decoded = decodeCraftedItemStats(id,
|
|
8596
|
-
|
|
8597
|
-
const allDefs = getStatDefinitions('
|
|
8598
|
-
.concat(getStatDefinitions('
|
|
8744
|
+
let resolvedStats;
|
|
8745
|
+
if (stats !== undefined) {
|
|
8746
|
+
const decoded = decodeCraftedItemStats(id, toBigStats(stats));
|
|
8747
|
+
resolvedStats = Object.entries(decoded).map(([key, value]) => {
|
|
8748
|
+
const allDefs = getStatDefinitions('ore')
|
|
8749
|
+
.concat(getStatDefinitions('crystal'))
|
|
8599
8750
|
.concat(getStatDefinitions('gas'))
|
|
8600
|
-
.concat(getStatDefinitions('
|
|
8601
|
-
.concat(getStatDefinitions('
|
|
8751
|
+
.concat(getStatDefinitions('regolith'))
|
|
8752
|
+
.concat(getStatDefinitions('biomass'));
|
|
8602
8753
|
const def = allDefs.find((d) => d.key === key);
|
|
8603
8754
|
const statDef = comp.stats.find((s) => s.key === key);
|
|
8604
|
-
const cat = (statDef?.source ?? '
|
|
8755
|
+
const cat = (statDef?.source ?? 'ore');
|
|
8605
8756
|
return {
|
|
8606
8757
|
key,
|
|
8607
8758
|
label: def?.label ?? key,
|
|
@@ -8616,11 +8767,12 @@ function resolveComponent(id, seed) {
|
|
|
8616
8767
|
return {
|
|
8617
8768
|
itemId: id,
|
|
8618
8769
|
name: comp.name,
|
|
8619
|
-
icon:
|
|
8770
|
+
icon: itemAbbreviations[id] ?? componentIcon,
|
|
8771
|
+
abbreviation: itemAbbreviations[id] ?? null,
|
|
8620
8772
|
tier: 't1',
|
|
8621
8773
|
mass: comp.mass,
|
|
8622
8774
|
itemType: 'component',
|
|
8623
|
-
stats,
|
|
8775
|
+
stats: resolvedStats,
|
|
8624
8776
|
};
|
|
8625
8777
|
}
|
|
8626
8778
|
function computeCapabilityGroup(moduleType, stats) {
|
|
@@ -8678,11 +8830,22 @@ function computeCapabilityGroup(moduleType, stats) {
|
|
|
8678
8830
|
],
|
|
8679
8831
|
};
|
|
8680
8832
|
}
|
|
8833
|
+
case MODULE_HAULER: {
|
|
8834
|
+
const caps = computeHaulerCapabilities(stats);
|
|
8835
|
+
return {
|
|
8836
|
+
capability: 'Hauler',
|
|
8837
|
+
attributes: [
|
|
8838
|
+
{ label: 'Capacity', value: caps.capacity },
|
|
8839
|
+
{ label: 'Efficiency', value: caps.efficiency },
|
|
8840
|
+
{ label: 'Drain', value: caps.drain },
|
|
8841
|
+
],
|
|
8842
|
+
};
|
|
8843
|
+
}
|
|
8681
8844
|
case MODULE_STORAGE: {
|
|
8682
8845
|
const str = stats.strength ?? 500;
|
|
8683
|
-
const
|
|
8684
|
-
const
|
|
8685
|
-
const statSum = str +
|
|
8846
|
+
const fin = stats.fineness ?? 500;
|
|
8847
|
+
const sat = stats.saturation ?? 500;
|
|
8848
|
+
const statSum = str + fin + sat;
|
|
8686
8849
|
const pct = 10 + Math.floor((statSum * 10) / 2997);
|
|
8687
8850
|
return { capability: 'Storage', attributes: [{ label: 'Capacity Bonus', value: pct }] };
|
|
8688
8851
|
}
|
|
@@ -8690,36 +8853,37 @@ function computeCapabilityGroup(moduleType, stats) {
|
|
|
8690
8853
|
return undefined;
|
|
8691
8854
|
}
|
|
8692
8855
|
}
|
|
8693
|
-
function resolveModule(id,
|
|
8856
|
+
function resolveModule(id, stats) {
|
|
8694
8857
|
const recipe = getModuleRecipeByItemId(id);
|
|
8695
8858
|
let attributes;
|
|
8696
|
-
if (
|
|
8697
|
-
const
|
|
8859
|
+
if (stats !== undefined) {
|
|
8860
|
+
const decoded = decodeCraftedItemStats(id, toBigStats(stats));
|
|
8698
8861
|
const modType = getModuleCapabilityType(id);
|
|
8699
|
-
const group = computeCapabilityGroup(modType,
|
|
8862
|
+
const group = computeCapabilityGroup(modType, decoded);
|
|
8700
8863
|
if (group)
|
|
8701
8864
|
attributes = [group];
|
|
8702
8865
|
}
|
|
8703
8866
|
return {
|
|
8704
8867
|
itemId: id,
|
|
8705
8868
|
name: recipe.name,
|
|
8706
|
-
icon:
|
|
8869
|
+
icon: itemAbbreviations[id] ?? moduleIcon,
|
|
8870
|
+
abbreviation: itemAbbreviations[id] ?? null,
|
|
8707
8871
|
tier: 't1',
|
|
8708
8872
|
mass: 0,
|
|
8709
8873
|
itemType: 'module',
|
|
8710
8874
|
attributes,
|
|
8711
8875
|
};
|
|
8712
8876
|
}
|
|
8713
|
-
function resolveEntity(id,
|
|
8877
|
+
function resolveEntity(id, stats, modules) {
|
|
8714
8878
|
const recipe = getEntityRecipeByItemId(id);
|
|
8715
8879
|
let attributes;
|
|
8716
8880
|
let moduleSlots;
|
|
8717
|
-
if (
|
|
8718
|
-
const
|
|
8881
|
+
if (stats !== undefined) {
|
|
8882
|
+
const decoded = decodeCraftedItemStats(id, toBigStats(stats));
|
|
8719
8883
|
attributes = [];
|
|
8720
8884
|
const isShip = recipe.id === 'ship-t1';
|
|
8721
8885
|
if (isShip) {
|
|
8722
|
-
const hullCaps = computeShipHullCapabilities(
|
|
8886
|
+
const hullCaps = computeShipHullCapabilities(decoded);
|
|
8723
8887
|
attributes.push({
|
|
8724
8888
|
capability: 'Hull',
|
|
8725
8889
|
attributes: [
|
|
@@ -8729,7 +8893,7 @@ function resolveEntity(id, seed, modules) {
|
|
|
8729
8893
|
});
|
|
8730
8894
|
}
|
|
8731
8895
|
else {
|
|
8732
|
-
const containerCaps = computeContainerCapabilities(
|
|
8896
|
+
const containerCaps = computeContainerCapabilities(decoded);
|
|
8733
8897
|
attributes.push({
|
|
8734
8898
|
capability: 'Hull',
|
|
8735
8899
|
attributes: [
|
|
@@ -8744,10 +8908,10 @@ function resolveEntity(id, seed, modules) {
|
|
|
8744
8908
|
const mod = modules?.[i];
|
|
8745
8909
|
if (mod?.installed) {
|
|
8746
8910
|
const modItemId = Number(mod.installed.item_id.value.toString());
|
|
8747
|
-
const
|
|
8748
|
-
const
|
|
8911
|
+
const modStats = BigInt(mod.installed.stats.toString());
|
|
8912
|
+
const decodedStats = decodeCraftedItemStats(modItemId, modStats);
|
|
8749
8913
|
const modType = getModuleCapabilityType(modItemId);
|
|
8750
|
-
const group = computeCapabilityGroup(modType,
|
|
8914
|
+
const group = computeCapabilityGroup(modType, decodedStats);
|
|
8751
8915
|
const modRecipe = getModuleRecipeByItemId(modItemId);
|
|
8752
8916
|
return {
|
|
8753
8917
|
name: modRecipe?.name ?? 'Module',
|
|
@@ -8761,7 +8925,8 @@ function resolveEntity(id, seed, modules) {
|
|
|
8761
8925
|
return {
|
|
8762
8926
|
itemId: id,
|
|
8763
8927
|
name: recipe.name,
|
|
8764
|
-
icon:
|
|
8928
|
+
icon: itemAbbreviations[id] ?? componentIcon,
|
|
8929
|
+
abbreviation: itemAbbreviations[id] ?? null,
|
|
8765
8930
|
tier: 't1',
|
|
8766
8931
|
mass: 0,
|
|
8767
8932
|
itemType: 'entity',
|
|
@@ -8769,28 +8934,157 @@ function resolveEntity(id, seed, modules) {
|
|
|
8769
8934
|
moduleSlots,
|
|
8770
8935
|
};
|
|
8771
8936
|
}
|
|
8772
|
-
function resolveItem(itemId,
|
|
8937
|
+
function resolveItem(itemId, stats, modules) {
|
|
8773
8938
|
const id = toNum(itemId);
|
|
8774
8939
|
if (isModuleItem(id))
|
|
8775
|
-
return resolveModule(id,
|
|
8940
|
+
return resolveModule(id, stats);
|
|
8776
8941
|
if (getComponentById(id))
|
|
8777
|
-
return resolveComponent(id,
|
|
8942
|
+
return resolveComponent(id, stats);
|
|
8778
8943
|
if (getEntityRecipeByItemId(id))
|
|
8779
|
-
return resolveEntity(id,
|
|
8780
|
-
return resolveResource(id,
|
|
8944
|
+
return resolveEntity(id, stats, modules);
|
|
8945
|
+
return resolveResource(id, stats);
|
|
8946
|
+
}
|
|
8947
|
+
|
|
8948
|
+
const TEMPLATES = {
|
|
8949
|
+
engine: {
|
|
8950
|
+
id: 'module.engine.description',
|
|
8951
|
+
template: 'generates {thrust} thrust for travel while draining {drain} energy per distance travelled',
|
|
8952
|
+
params: [
|
|
8953
|
+
['thrust', 'Thrust'],
|
|
8954
|
+
['drain', 'Drain'],
|
|
8955
|
+
],
|
|
8956
|
+
highlightKeys: ['thrust', 'drain'],
|
|
8957
|
+
},
|
|
8958
|
+
generator: {
|
|
8959
|
+
id: 'module.generator.description',
|
|
8960
|
+
template: 'holds {capacity} maximum energy and restores {recharge} per second while recharging',
|
|
8961
|
+
params: [
|
|
8962
|
+
['capacity', 'Capacity'],
|
|
8963
|
+
['recharge', 'Recharge'],
|
|
8964
|
+
],
|
|
8965
|
+
highlightKeys: ['capacity', 'recharge'],
|
|
8966
|
+
},
|
|
8967
|
+
gatherer: {
|
|
8968
|
+
id: 'module.gatherer.description',
|
|
8969
|
+
template: 'mines resources at {yield} speed to a max depth of {depth} with {speed} gather speed while draining {drain} energy per second',
|
|
8970
|
+
params: [
|
|
8971
|
+
['yield', 'Yield'],
|
|
8972
|
+
['drain', 'Drain'],
|
|
8973
|
+
['depth', 'Depth'],
|
|
8974
|
+
['speed', 'Speed'],
|
|
8975
|
+
],
|
|
8976
|
+
highlightKeys: ['yield', 'depth', 'speed', 'drain'],
|
|
8977
|
+
},
|
|
8978
|
+
loader: {
|
|
8979
|
+
id: 'module.loader.description',
|
|
8980
|
+
template: '{quantity} loader that generates {thrust} thrust with a weight of {mass} per unit',
|
|
8981
|
+
params: [
|
|
8982
|
+
['quantity', 'Quantity'],
|
|
8983
|
+
['thrust', 'Thrust'],
|
|
8984
|
+
['mass', 'Mass'],
|
|
8985
|
+
],
|
|
8986
|
+
highlightKeys: ['quantity', 'thrust', 'mass'],
|
|
8987
|
+
},
|
|
8988
|
+
manufacturing: {
|
|
8989
|
+
id: 'module.manufacturing.description',
|
|
8990
|
+
template: 'manufactures items at {speed} speed while draining {drain} energy per second',
|
|
8991
|
+
params: [
|
|
8992
|
+
['speed', 'Speed'],
|
|
8993
|
+
['drain', 'Drain'],
|
|
8994
|
+
],
|
|
8995
|
+
highlightKeys: ['speed', 'drain'],
|
|
8996
|
+
},
|
|
8997
|
+
storage: {
|
|
8998
|
+
id: 'module.storage.description',
|
|
8999
|
+
template: 'boosts cargo capacity by {bonus}%',
|
|
9000
|
+
params: [['bonus', 'Capacity Bonus']],
|
|
9001
|
+
highlightKeys: ['bonus'],
|
|
9002
|
+
},
|
|
9003
|
+
hauler: {
|
|
9004
|
+
id: 'module.hauler.description',
|
|
9005
|
+
template: 'locks onto up to {capacity} targets at {efficiency} efficiency while draining {drain} energy per distance travelled per target',
|
|
9006
|
+
params: [
|
|
9007
|
+
['capacity', 'Capacity'],
|
|
9008
|
+
['efficiency', 'Efficiency'],
|
|
9009
|
+
['drain', 'Drain'],
|
|
9010
|
+
],
|
|
9011
|
+
highlightKeys: ['capacity', 'efficiency', 'drain'],
|
|
9012
|
+
},
|
|
9013
|
+
};
|
|
9014
|
+
function describeModule(input) {
|
|
9015
|
+
if (!input.attributes || input.attributes.length === 0)
|
|
9016
|
+
return null;
|
|
9017
|
+
const key = input.capability.toLowerCase();
|
|
9018
|
+
const spec = TEMPLATES[key];
|
|
9019
|
+
if (!spec)
|
|
9020
|
+
return null;
|
|
9021
|
+
const params = {};
|
|
9022
|
+
for (const [paramName, attrLabel] of spec.params) {
|
|
9023
|
+
const attr = input.attributes.find((a) => a.label === attrLabel);
|
|
9024
|
+
if (attr)
|
|
9025
|
+
params[paramName] = attr.value;
|
|
9026
|
+
}
|
|
9027
|
+
return {
|
|
9028
|
+
id: spec.id,
|
|
9029
|
+
template: spec.template,
|
|
9030
|
+
params,
|
|
9031
|
+
highlightKeys: spec.highlightKeys,
|
|
9032
|
+
};
|
|
9033
|
+
}
|
|
9034
|
+
function describeModuleForItem(resolved) {
|
|
9035
|
+
if (resolved.itemType !== 'module')
|
|
9036
|
+
return null;
|
|
9037
|
+
const group = resolved.attributes?.[0];
|
|
9038
|
+
if (!group)
|
|
9039
|
+
return null;
|
|
9040
|
+
return describeModule({ capability: group.capability, attributes: group.attributes });
|
|
9041
|
+
}
|
|
9042
|
+
function describeModuleForSlot(slot) {
|
|
9043
|
+
if (!slot.installed || !slot.name || !slot.attributes)
|
|
9044
|
+
return null;
|
|
9045
|
+
return describeModule({ capability: slot.name, attributes: slot.attributes });
|
|
9046
|
+
}
|
|
9047
|
+
function renderDescription(desc, options) {
|
|
9048
|
+
const translate = options?.translate ?? ((_id, fallback) => fallback);
|
|
9049
|
+
const formatNumber = options?.formatNumber ?? ((n) => n.toLocaleString('en-US'));
|
|
9050
|
+
const tpl = translate(desc.id, desc.template);
|
|
9051
|
+
const spans = [];
|
|
9052
|
+
const regex = /\{([A-Za-z_][A-Za-z0-9_]*)\}/g;
|
|
9053
|
+
let lastIndex = 0;
|
|
9054
|
+
let m;
|
|
9055
|
+
while ((m = regex.exec(tpl)) !== null) {
|
|
9056
|
+
if (m.index > lastIndex) {
|
|
9057
|
+
spans.push({ text: tpl.slice(lastIndex, m.index) });
|
|
9058
|
+
}
|
|
9059
|
+
const paramName = m[1] ?? '';
|
|
9060
|
+
const raw = desc.params[paramName];
|
|
9061
|
+
if (raw === undefined) {
|
|
9062
|
+
spans.push({ text: `{${paramName}}` });
|
|
9063
|
+
}
|
|
9064
|
+
else {
|
|
9065
|
+
const formatted = typeof raw === 'number' ? formatNumber(raw) : raw;
|
|
9066
|
+
const highlight = desc.highlightKeys.includes(paramName);
|
|
9067
|
+
spans.push(highlight ? { text: formatted, highlight: true } : { text: formatted });
|
|
9068
|
+
}
|
|
9069
|
+
lastIndex = m.index + m[0].length;
|
|
9070
|
+
}
|
|
9071
|
+
if (lastIndex < tpl.length) {
|
|
9072
|
+
spans.push({ text: tpl.slice(lastIndex) });
|
|
9073
|
+
}
|
|
9074
|
+
return spans;
|
|
8781
9075
|
}
|
|
8782
9076
|
|
|
8783
9077
|
function readCommonBase(data) {
|
|
8784
9078
|
return {
|
|
8785
9079
|
quantity: Number(data.quantity),
|
|
8786
|
-
|
|
9080
|
+
stats: String(data.stats),
|
|
8787
9081
|
origin_x: String(data.origin_x),
|
|
8788
9082
|
origin_y: String(data.origin_y),
|
|
8789
9083
|
};
|
|
8790
9084
|
}
|
|
8791
9085
|
function deserializeScalar(data, itemId) {
|
|
8792
9086
|
const base = readCommonBase(data);
|
|
8793
|
-
return { item_id: itemId, quantity: base.quantity,
|
|
9087
|
+
return { item_id: itemId, quantity: base.quantity, stats: base.stats };
|
|
8794
9088
|
}
|
|
8795
9089
|
const deserializeResource = deserializeScalar;
|
|
8796
9090
|
const deserializeComponent = deserializeScalar;
|
|
@@ -8798,15 +9092,15 @@ const deserializeModule = deserializeScalar;
|
|
|
8798
9092
|
function deserializeEntity(data, itemId) {
|
|
8799
9093
|
const base = readCommonBase(data);
|
|
8800
9094
|
const moduleItems = (data.module_items ?? []).map((v) => Number(v));
|
|
8801
|
-
const
|
|
9095
|
+
const moduleStats = (data.module_stats ?? []).map((v) => String(v));
|
|
8802
9096
|
const layout = getEntitySlotLayout(itemId);
|
|
8803
9097
|
const modules = layout.map((slot, i) => ({
|
|
8804
9098
|
type: slot.type,
|
|
8805
9099
|
installed: moduleItems[i] && moduleItems[i] !== 0
|
|
8806
|
-
? { item_id: moduleItems[i],
|
|
9100
|
+
? { item_id: moduleItems[i], stats: moduleStats[i] }
|
|
8807
9101
|
: undefined,
|
|
8808
9102
|
}));
|
|
8809
|
-
return { item_id: itemId, quantity: base.quantity,
|
|
9103
|
+
return { item_id: itemId, quantity: base.quantity, stats: base.stats, modules };
|
|
8810
9104
|
}
|
|
8811
9105
|
function deserializeAsset(data, itemId) {
|
|
8812
9106
|
const type = itemTypeCode(itemId);
|
|
@@ -8825,40 +9119,40 @@ function deserializeAsset(data, itemId) {
|
|
|
8825
9119
|
function idiv(a, b) {
|
|
8826
9120
|
return Math.floor(a / b);
|
|
8827
9121
|
}
|
|
8828
|
-
function computeBaseHullmass(
|
|
8829
|
-
const density = decodeStat(
|
|
9122
|
+
function computeBaseHullmass(stats) {
|
|
9123
|
+
const density = decodeStat(stats, 1);
|
|
8830
9124
|
return 25000 + 75 * density;
|
|
8831
9125
|
}
|
|
8832
|
-
function computeBaseCapacityShip(
|
|
8833
|
-
const s = decodeStat(
|
|
9126
|
+
function computeBaseCapacityShip(stats) {
|
|
9127
|
+
const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
|
|
8834
9128
|
return Math.floor(1000000 * Math.pow(10, s / 2997));
|
|
8835
9129
|
}
|
|
8836
|
-
function computeBaseCapacityWarehouse(
|
|
8837
|
-
const s = decodeStat(
|
|
9130
|
+
function computeBaseCapacityWarehouse(stats) {
|
|
9131
|
+
const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
|
|
8838
9132
|
return Math.floor(20000000 * Math.pow(10, s / 2997));
|
|
8839
9133
|
}
|
|
8840
9134
|
const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
|
|
8841
9135
|
const computeEngineDrain = (thm) => Math.max(30, 50 - idiv(thm, 70));
|
|
8842
9136
|
const computeGeneratorCap = (res) => 300 + idiv(res, 6);
|
|
8843
|
-
const computeGeneratorRech = (
|
|
9137
|
+
const computeGeneratorRech = (ref) => 1 + idiv(ref * 3, 1000);
|
|
8844
9138
|
const computeGathererYield = (str) => 200 + str;
|
|
8845
|
-
const computeGathererDrain = (con) => Math.max(
|
|
9139
|
+
const computeGathererDrain = (con) => Math.max(250, 1250 - idiv(con * 25, 20));
|
|
8846
9140
|
const computeGathererDepth = (tol) => 200 + idiv(tol * 3, 2);
|
|
8847
9141
|
const computeGathererSpeed = (ref) => 100 + idiv(ref * 4, 5);
|
|
8848
|
-
const computeLoaderMass = (
|
|
9142
|
+
const computeLoaderMass = (fin) => Math.max(200, 2000 - fin * 2);
|
|
8849
9143
|
const computeLoaderThrust = (pla) => 1 + idiv(pla, 500);
|
|
8850
9144
|
const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
|
|
8851
|
-
const computeCrafterDrain = (
|
|
9145
|
+
const computeCrafterDrain = (com) => Math.max(5, 30 - idiv(com, 33));
|
|
8852
9146
|
function entityDisplayName(itemId) {
|
|
8853
9147
|
switch (itemId) {
|
|
8854
9148
|
case ITEM_SHIP_T1_PACKED:
|
|
8855
|
-
return 'Ship
|
|
9149
|
+
return 'Ship';
|
|
8856
9150
|
case ITEM_WAREHOUSE_T1_PACKED:
|
|
8857
|
-
return 'Warehouse
|
|
9151
|
+
return 'Warehouse';
|
|
8858
9152
|
case ITEM_CONTAINER_T1_PACKED:
|
|
8859
|
-
return 'Container
|
|
9153
|
+
return 'Container';
|
|
8860
9154
|
case ITEM_CONTAINER_T2_PACKED:
|
|
8861
|
-
return 'Container
|
|
9155
|
+
return 'Container';
|
|
8862
9156
|
default:
|
|
8863
9157
|
return 'Entity';
|
|
8864
9158
|
}
|
|
@@ -8866,22 +9160,22 @@ function entityDisplayName(itemId) {
|
|
|
8866
9160
|
function moduleDisplayName(itemId) {
|
|
8867
9161
|
switch (itemId) {
|
|
8868
9162
|
case ITEM_ENGINE_T1:
|
|
8869
|
-
return 'Engine
|
|
9163
|
+
return 'Engine';
|
|
8870
9164
|
case ITEM_GENERATOR_T1:
|
|
8871
|
-
return 'Generator
|
|
9165
|
+
return 'Generator';
|
|
8872
9166
|
case ITEM_GATHERER_T1:
|
|
8873
|
-
return 'Gatherer
|
|
9167
|
+
return 'Gatherer';
|
|
8874
9168
|
case ITEM_LOADER_T1:
|
|
8875
|
-
return 'Loader
|
|
9169
|
+
return 'Loader';
|
|
8876
9170
|
case ITEM_MANUFACTURING_T1:
|
|
8877
|
-
return 'Manufacturing
|
|
9171
|
+
return 'Manufacturing';
|
|
8878
9172
|
case ITEM_STORAGE_T1:
|
|
8879
|
-
return 'Storage
|
|
9173
|
+
return 'Storage';
|
|
8880
9174
|
default:
|
|
8881
9175
|
return 'Module';
|
|
8882
9176
|
}
|
|
8883
9177
|
}
|
|
8884
|
-
function formatModuleLine(slot, itemId,
|
|
9178
|
+
function formatModuleLine(slot, itemId, stats) {
|
|
8885
9179
|
let out = `Slot ${slot} - `;
|
|
8886
9180
|
if (itemId === 0) {
|
|
8887
9181
|
out += '(empty)';
|
|
@@ -8891,42 +9185,42 @@ function formatModuleLine(slot, itemId, seed) {
|
|
|
8891
9185
|
const subtype = getModuleCapabilityType(itemId);
|
|
8892
9186
|
switch (subtype) {
|
|
8893
9187
|
case MODULE_ENGINE: {
|
|
8894
|
-
const vol = decodeStat(
|
|
8895
|
-
const thm = decodeStat(
|
|
9188
|
+
const vol = decodeStat(stats, 0);
|
|
9189
|
+
const thm = decodeStat(stats, 1);
|
|
8896
9190
|
out += ` Thrust ${computeEngineThrust(vol)} Drain ${computeEngineDrain(thm)}`;
|
|
8897
9191
|
break;
|
|
8898
9192
|
}
|
|
8899
9193
|
case MODULE_GENERATOR: {
|
|
8900
|
-
const res = decodeStat(
|
|
8901
|
-
const
|
|
8902
|
-
out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(
|
|
9194
|
+
const res = decodeStat(stats, 0);
|
|
9195
|
+
const ref = decodeStat(stats, 1);
|
|
9196
|
+
out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(ref)}`;
|
|
8903
9197
|
break;
|
|
8904
9198
|
}
|
|
8905
9199
|
case MODULE_GATHERER: {
|
|
8906
|
-
const str = decodeStat(
|
|
8907
|
-
const tol = decodeStat(
|
|
8908
|
-
const con = decodeStat(
|
|
8909
|
-
const ref = decodeStat(
|
|
9200
|
+
const str = decodeStat(stats, 0);
|
|
9201
|
+
const tol = decodeStat(stats, 1);
|
|
9202
|
+
const con = decodeStat(stats, 3);
|
|
9203
|
+
const ref = decodeStat(stats, 4);
|
|
8910
9204
|
out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol)} Speed ${computeGathererSpeed(ref)} Drain ${computeGathererDrain(con)}`;
|
|
8911
9205
|
break;
|
|
8912
9206
|
}
|
|
8913
9207
|
case MODULE_LOADER: {
|
|
8914
|
-
const
|
|
8915
|
-
const pla = decodeStat(
|
|
8916
|
-
out += ` Mass ${computeLoaderMass(
|
|
9208
|
+
const fin = decodeStat(stats, 0);
|
|
9209
|
+
const pla = decodeStat(stats, 1);
|
|
9210
|
+
out += ` Mass ${computeLoaderMass(fin)} Thrust ${computeLoaderThrust(pla)}`;
|
|
8917
9211
|
break;
|
|
8918
9212
|
}
|
|
8919
9213
|
case MODULE_CRAFTER: {
|
|
8920
|
-
const rea = decodeStat(
|
|
8921
|
-
const
|
|
8922
|
-
out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(
|
|
9214
|
+
const rea = decodeStat(stats, 0);
|
|
9215
|
+
const com = decodeStat(stats, 1);
|
|
9216
|
+
out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(com)}`;
|
|
8923
9217
|
break;
|
|
8924
9218
|
}
|
|
8925
9219
|
case MODULE_STORAGE: {
|
|
8926
|
-
const str = decodeStat(
|
|
8927
|
-
const
|
|
8928
|
-
const
|
|
8929
|
-
const sum = str +
|
|
9220
|
+
const str = decodeStat(stats, 0);
|
|
9221
|
+
const fin = decodeStat(stats, 2);
|
|
9222
|
+
const sat = decodeStat(stats, 3);
|
|
9223
|
+
const sum = str + fin + sat;
|
|
8930
9224
|
const pct = 10 + idiv(sum * 10, 2997);
|
|
8931
9225
|
out += ` +${pct}% capacity`;
|
|
8932
9226
|
break;
|
|
@@ -8934,14 +9228,14 @@ function formatModuleLine(slot, itemId, seed) {
|
|
|
8934
9228
|
}
|
|
8935
9229
|
return out;
|
|
8936
9230
|
}
|
|
8937
|
-
function buildEntityDescription(itemId,
|
|
8938
|
-
const hullMass = computeBaseHullmass(
|
|
9231
|
+
function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
|
|
9232
|
+
const hullMass = computeBaseHullmass(hullStats);
|
|
8939
9233
|
let baseCapacity = 0;
|
|
8940
9234
|
if (itemId === ITEM_SHIP_T1_PACKED) {
|
|
8941
|
-
baseCapacity = computeBaseCapacityShip(
|
|
9235
|
+
baseCapacity = computeBaseCapacityShip(hullStats);
|
|
8942
9236
|
}
|
|
8943
9237
|
else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
|
|
8944
|
-
baseCapacity = computeBaseCapacityWarehouse(
|
|
9238
|
+
baseCapacity = computeBaseCapacityWarehouse(hullStats);
|
|
8945
9239
|
}
|
|
8946
9240
|
let out = entityDisplayName(itemId);
|
|
8947
9241
|
out += ` - Hull ${hullMass} mass`;
|
|
@@ -8950,7 +9244,7 @@ function buildEntityDescription(itemId, hullSeed, moduleItems, moduleSeeds) {
|
|
|
8950
9244
|
}
|
|
8951
9245
|
out += '\n\n';
|
|
8952
9246
|
for (let i = 0; i < moduleItems.length; i++) {
|
|
8953
|
-
out += formatModuleLine(i, moduleItems[i],
|
|
9247
|
+
out += formatModuleLine(i, moduleItems[i], moduleStats[i] ?? 0n);
|
|
8954
9248
|
out += '\n';
|
|
8955
9249
|
}
|
|
8956
9250
|
return out;
|
|
@@ -8986,5 +9280,62 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
8986
9280
|
buildEntityDescription: buildEntityDescription
|
|
8987
9281
|
});
|
|
8988
9282
|
|
|
8989
|
-
|
|
9283
|
+
function formatMass(kg) {
|
|
9284
|
+
const t = kg / 1000;
|
|
9285
|
+
const fixed = t.toFixed(2);
|
|
9286
|
+
const trimmed = fixed.replace(/\.?0+$/, '');
|
|
9287
|
+
return `${trimmed} t`;
|
|
9288
|
+
}
|
|
9289
|
+
function formatMassDelta(kg) {
|
|
9290
|
+
if (kg === 0)
|
|
9291
|
+
return '0 t';
|
|
9292
|
+
const sign = kg > 0 ? '+' : '-';
|
|
9293
|
+
return `${sign}${formatMass(Math.abs(kg))}`;
|
|
9294
|
+
}
|
|
9295
|
+
|
|
9296
|
+
const TIER_ADJECTIVES = {
|
|
9297
|
+
1: 'Crude',
|
|
9298
|
+
2: 'Dense',
|
|
9299
|
+
3: 'Pure',
|
|
9300
|
+
4: 'Prime',
|
|
9301
|
+
5: 'Pristine',
|
|
9302
|
+
6: 'Radiant',
|
|
9303
|
+
7: 'Exotic',
|
|
9304
|
+
8: 'Mythic',
|
|
9305
|
+
9: 'Cosmic',
|
|
9306
|
+
10: 'Ascendant',
|
|
9307
|
+
};
|
|
9308
|
+
const CATEGORY_LABELS = {
|
|
9309
|
+
ore: 'Ore',
|
|
9310
|
+
crystal: 'Crystal',
|
|
9311
|
+
gas: 'Gas',
|
|
9312
|
+
regolith: 'Regolith',
|
|
9313
|
+
biomass: 'Biomass',
|
|
9314
|
+
};
|
|
9315
|
+
function tierNumber(tier) {
|
|
9316
|
+
return Number(String(tier).replace(/^t/i, ''));
|
|
9317
|
+
}
|
|
9318
|
+
function displayName(resolved) {
|
|
9319
|
+
if (resolved.itemType === 'resource') {
|
|
9320
|
+
const tierNum = tierNumber(resolved.tier);
|
|
9321
|
+
const adj = TIER_ADJECTIVES[tierNum] ?? 'Unknown';
|
|
9322
|
+
const cat = resolved.category ? CATEGORY_LABELS[resolved.category] : 'Resource';
|
|
9323
|
+
return `${adj} ${cat}`;
|
|
9324
|
+
}
|
|
9325
|
+
return resolved.name;
|
|
9326
|
+
}
|
|
9327
|
+
function describeItem(resolved, opts) {
|
|
9328
|
+
const massFmt = opts?.formatMass ?? formatMass;
|
|
9329
|
+
const mass = massFmt(resolved.mass);
|
|
9330
|
+
const tier = `T${tierNumber(resolved.tier)}`;
|
|
9331
|
+
if (resolved.itemType === 'resource') {
|
|
9332
|
+
const cat = resolved.category ? CATEGORY_LABELS[resolved.category] : 'Resource';
|
|
9333
|
+
const header = `${tier} ${cat}`;
|
|
9334
|
+
const stats = resolved.stats?.map((s) => `${s.label} ${s.value}`).join(', ');
|
|
9335
|
+
return [header, stats, mass].filter(Boolean).join(' · ');
|
|
9336
|
+
}
|
|
9337
|
+
return `${tier} ${resolved.name} · ${mass}`;
|
|
9338
|
+
}
|
|
9339
|
+
|
|
9340
|
+
export { ActionsManager, BASE_ORBITAL_MASS, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, CONTAINER_Z, CRAFT_ENERGY_DIVISOR, Container, Coordinates, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, ENTITY_CAPACITY_EXCEEDED, EPOCH_NON_ZERO, EPOCH_NOT_READY, ERROR_SYSTEM_ALREADY_INITIALIZED, ERROR_SYSTEM_DISABLED, ERROR_SYSTEM_NOT_INITIALIZED, EntitiesManager, EntityInventory, EntityType, EpochsManager, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GameState, INITIAL_CONTAINER_CAPACITY, INITIAL_CONTAINER_HULLMASS, INITIAL_WAREHOUSE_CAPACITY, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_CARGO_ARM, ITEM_CARGO_LINING, ITEM_CARGO_LINING_T2, ITEM_CONTAINER_T1_PACKED, ITEM_CONTAINER_T2_PACKED, ITEM_DOES_NOT_EXIST, ITEM_ENGINE_T1, ITEM_FOCUSING_ARRAY, ITEM_GATHERER_T1, ITEM_GENERATOR_T1, ITEM_HAULER_T1, ITEM_HULL_PLATES, ITEM_HULL_PLATES_T2, ITEM_LOADER_T1, ITEM_MANUFACTURING_T1, ITEM_MATTER_CONDUIT, ITEM_NOT_AVAILABLE_AT_LOCATION, ITEM_POWER_CELL, ITEM_REACTION_CHAMBER, ITEM_SHIP_T1_PACKED, ITEM_STORAGE_T1, ITEM_SURVEY_PROBE, ITEM_THRUSTER_CORE, ITEM_TOOL_BIT, ITEM_TYPE_COMPONENT, ITEM_TYPE_ENTITY, ITEM_TYPE_MODULE, ITEM_TYPE_RESOURCE, ITEM_WAREHOUSE_T1_PACKED, InventoryAccessor, Item, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MIN_ORBITAL_ALTITUDE, MODULE_ANY, MODULE_CRAFTER, MODULE_ENGINE, MODULE_GATHERER, MODULE_GENERATOR, MODULE_HAULER, MODULE_LAUNCHER, MODULE_LOADER, MODULE_STORAGE, MODULE_WARP, index as NFT, NO_SCHEDULE, PLANET_SUBTYPE_GAS_GIANT, PLANET_SUBTYPE_ICY, PLANET_SUBTYPE_INDUSTRIAL, PLANET_SUBTYPE_OCEAN, PLANET_SUBTYPE_ROCKY, PLANET_SUBTYPE_TERRESTRIAL, PLAYER_ALREADY_JOINED, PLAYER_NOT_FOUND, PRECISION$1 as PRECISION, platform as PlatformContract, Player, PlayersManager, RECIPE_INPUTS_EXCESS, RECIPE_INPUTS_INSUFFICIENT, RECIPE_INPUTS_INVALID, RECIPE_INPUTS_MIXED, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, RESERVE_TIERS, SHIP_ALREADY_THERE, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_CARGO_NOT_LOADED, SHIP_CARGO_NOT_OWNED, SHIP_INVALID_CARGO, SHIP_INVALID_DESTINATION, SHIP_INVALID_TRAVEL_DURATION, SHIP_NOT_ARRIVED, SHIP_NOT_ENOUGH_ENERGY, SHIP_NOT_ENOUGH_ENERGY_CAPACITY, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, ScheduleAccessor, server as ServerContract, Ship, Shipload, TIER_ROLL_MAX, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_CAPACITY_EXCEEDED, WAREHOUSE_NOT_FOUND, WAREHOUSE_Z, Warehouse, availableCapacity$1 as availableCapacity, availableCapacityFromMass, blendCargoStacks, blendComponentStacks, blendCrossGroup, blendStacks, buildEntityDescription, calcCargoItemMass, calcCargoMass, calcEnergyUsage, calcLoadDuration, calcStacksMass, calc_acceleration, calc_craft_duration, calc_craft_energy, calc_energyusage, calc_flighttime, calc_gather_duration, calc_gather_energy, calc_loader_acceleration, calc_loader_flighttime, calc_orbital_altitude, calc_rechargetime, calc_ship_acceleration, calc_ship_flighttime, calc_ship_mass, calc_ship_rechargetime, calc_transfer_duration, calculateFlightTime, calculateLoadTimeBreakdown, calculateRefuelingTime, calculateTransferTime, canMove, capabilityAttributes, capabilityNames, capsHasCrafter, capsHasGatherer, capsHasHauler, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoItemToStack, cargoUtils, categoryColors, categoryIconShapes, categoryIcons, categoryItemMass, componentIcon, components, computeBaseCapacityShip, computeBaseCapacityWarehouse, computeBaseHullmass, computeComponentStats, computeContainerCapabilities, computeContainerT2Capabilities, computeCraftedOutputStats, computeCrafterDrain, computeCrafterSpeed, computeEngineCapabilities, computeEngineDrain, computeEngineThrust, computeEntityStats, computeGathererCapabilities, computeGathererDepth, computeGathererDrain, computeGathererSpeed, computeGathererYield, computeGeneratorCap, computeGeneratorCapabilities, computeGeneratorRech, computeHaulPenalty, computeHaulerCapabilities, computeHaulerDrain, computeInputMass, computeLoaderCapabilities, computeLoaderMass, computeLoaderThrust, computeManufacturingCapabilities, computeShipCapabilities, computeShipHullCapabilities, computeStorageCapabilities, computeWarehouseCapabilities, computeWarehouseHullCapabilities, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeCraftedItemStats, decodeStat, decodeStats, Shipload as default, deriveLocation, deriveLocationEpoch, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStratum, describeItem, describeModule, describeModuleForItem, describeModuleForSlot, deserializeAsset, deserializeComponent, deserializeEntity, deserializeModule, deserializeResource, displayName, distanceBetweenCoordinates, distanceBetweenPoints, encodeGatheredCargoStats, encodeStats, energyPercent, entityDisplayName, entityRecipes, estimateDealTravelTime, estimateTravelTime, findNearbyPlanets, formatMass, formatMassDelta, formatModuleLine, getAllCraftableItems, getCapabilityAttributes, getCategoryInfo, getComponentById, getComponentsForCategory, getComponentsForStat, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEligibleResources, getEntityRecipe, getEntityRecipeByItemId, getEntitySlotLayout, getEpochInfo, getFlightOrigin, getItem, getItems, getLocationCandidates, getLocationType, getLocationTypeName, getModuleCapabilityType, getModuleRecipe, getModuleRecipeByItemId, getPlanetSubtype, getPlanetSubtypes, getPositionAt, getResourceTier, getResourceWeight, getStatDefinitions, getStatMappings, getStatMappingsForCapability, getStatMappingsForStat, getStatName, getSystemName, hasEnergy, hasEnergyForDistance$1 as hasEnergyForDistance, hasGatherer, hasLoaders, hasMass, hasSchedule, hasSpace$1 as hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, isCraftedItem, isFull$1 as isFull, isFullFromMass, isGatherableLocation, isInvertedAttribute, isModuleItem, isRelatedItem, itemAbbreviations, itemCategory, itemIds, itemOffset, itemTier, itemTypeCode, lerp, makeContainer, makeShip, makeWarehouse, maxTravelDistance, mergeStacks, moduleAccepts, moduleDisplayName, moduleIcon, moduleRecipes, needsRecharge, projectEntity, projectEntityAt, readCommonBase, removeFromStacks, renderDescription, resolveItem, resolveStats, rollTier, rollWithinTier, rotation, schedule, stackKey, stackToCargoItem, stacksEqual, statMappings, tierColors, tierLabels, toLocation, validateSchedule };
|
|
8990
9341
|
//# sourceMappingURL=shipload.m.js.map
|