m0saic 0.3.2 → 0.4.0
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/README.md +23 -16
- package/dist/browseE2e.js +1 -1
- package/dist/connectionsFromEnv.js +1 -1
- package/dist/e2eTemplateVariants.js +1 -1
- package/dist/frontDoor.js +1 -1
- package/dist/index.js +1 -1
- package/dist/inlineDsl.js +1 -1
- package/dist/mcp/bridgeClient.js +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/tools.js +1 -1
- package/dist/mosaicxRunner.js +1 -1
- package/dist/outputPattern.js +1 -1
- package/dist/showcaseFeed.js +1 -1
- package/dist/templateDoctor.js +1 -1
- package/dist/utils/checkFeasibility.js +1 -1
- package/dist/utils/collectRenderErrors.js +1 -1
- package/dist/utils/enrichImageAlphaFromDoc.js +1 -1
- package/dist/utils/ensureFfmpeg.js +1 -1
- package/dist/utils/extractLayoutMeta.js +1 -1
- package/dist/utils/failureHints.js +1 -1
- package/dist/utils/ffmpegProbe.js +1 -1
- package/dist/utils/formatM0saicForCli.js +1 -1
- package/dist/utils/hashFile.js +1 -1
- package/dist/utils/helpGroups.js +1 -1
- package/dist/utils/installContext.js +1 -1
- package/dist/utils/invocation.js +1 -1
- package/dist/utils/licenseActivation.js +1 -1
- package/dist/utils/licenseActivationWorker.js +1 -1
- package/dist/utils/mosaicSpinner.js +1 -1
- package/dist/utils/parseDimensions.js +1 -1
- package/dist/utils/pathInfo.js +1 -1
- package/dist/utils/readJsonArg.js +1 -1
- package/dist/utils/renderOutcome.js +1 -1
- package/dist/utils/renderReport.js +1 -1
- package/dist/utils/renderSignals.js +1 -1
- package/dist/utils/renderWorkspace.js +1 -1
- package/dist/utils/reportOutputFormat.js +1 -1
- package/dist/utils/resolveLayoutFileProps.js +1 -0
- package/dist/utils/setupFfmpeg.js +1 -1
- package/dist/utils/telemetry.js +1 -1
- package/dist/utils/telemetryFlushWorker.js +1 -1
- package/dist/utils/telemetryUpstream.js +1 -1
- package/dist/utils/telemetryUsage.js +1 -1
- package/dist/utils/templateInstall.js +1 -0
- package/dist/utils/templateRepoKeys.js +1 -0
- package/dist/utils/templateSources.js +1 -0
- package/dist/utils/toolchainConfig.js +1 -1
- package/dist/utils/tutorialDuration.js +1 -1
- package/dist/utils/updateCheck.js +1 -1
- package/dist/utils/updateCheckWorker.js +1 -1
- package/dist/utils/validateSourceCounts.js +1 -1
- package/dist/utils/versions.js +1 -1
- package/dist/webCustomizeLink.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildChildMosaicSource.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildChunkCommands.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildEncodeCommands.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildLavfiSource.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildMediaSource.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildMosaicNode.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildMosaicPlanFromFile.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildSvgTextSource.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildTextRenderCommand.js +1 -1
- package/node_modules/@m0saic/core/dist/core/collectRefTargets.js +1 -1
- package/node_modules/@m0saic/core/dist/core/index.js +1 -1
- package/node_modules/@m0saic/core/dist/core/maskCacheDir.js +1 -1
- package/node_modules/@m0saic/core/dist/core/maskWorkerBridge.js +1 -1
- package/node_modules/@m0saic/core/dist/core/playbackPlaySpeed.js +1 -1
- package/node_modules/@m0saic/core/dist/core/prepareProps.js +1 -1
- package/node_modules/@m0saic/core/dist/core/primaryOutput.js +1 -1
- package/node_modules/@m0saic/core/dist/core/rasterizeMaskPng.js +1 -1
- package/node_modules/@m0saic/core/dist/core/rasterizeSvgMediaPng.js +1 -1
- package/node_modules/@m0saic/core/dist/core/refTargetTap.js +1 -1
- package/node_modules/@m0saic/core/dist/core/resolveMasks.js +1 -1
- package/node_modules/@m0saic/core/dist/core/resolveMasksSync.js +1 -1
- package/node_modules/@m0saic/core/dist/core/resolveStrokeRingsSync.js +1 -1
- package/node_modules/@m0saic/core/dist/core/roundedRectMask.js +1 -1
- package/node_modules/@m0saic/core/dist/core/strokeRing.js +1 -1
- package/node_modules/@m0saic/core/dist/core/svgRaster.js +1 -1
- package/node_modules/@m0saic/core/dist/defaults.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/backgroundImageInput.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/bufferGuard.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/ffmpegCommands.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyBackdropBlur.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyBlur.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyBorderRadius.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyCamera.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyChromaKey.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyFade.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyGrade.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyMask.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyNoise.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyPixelize.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyRotate.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyStroke.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyTileEffects.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/coverCrop.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/index.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/sourceRectCrop.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/gridLowering.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/index.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/splitAvMux.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/stillOutput.js +1 -0
- package/node_modules/@m0saic/core/dist/ffmpeg/threadGuard.js +1 -1
- package/node_modules/@m0saic/core/dist/flatten/index.js +1 -1
- package/node_modules/@m0saic/core/dist/fs/index.js +1 -1
- package/node_modules/@m0saic/core/dist/fs/tempWorkspace.js +1 -1
- package/node_modules/@m0saic/core/dist/index.js +1 -1
- package/node_modules/@m0saic/core/dist/media/buildAssetManifestFromInputs.js +1 -1
- package/node_modules/@m0saic/core/dist/media/buildMediaRegistryFromInput.js +1 -1
- package/node_modules/@m0saic/core/dist/media/collectMediaInputsFromInvocationProps.js +1 -1
- package/node_modules/@m0saic/core/dist/media/collectMediaInputsFromMosaicRenderableFile.js +1 -1
- package/node_modules/@m0saic/core/dist/media/collectMediaInputsFromProps.js +1 -1
- package/node_modules/@m0saic/core/dist/media/index.js +1 -1
- package/node_modules/@m0saic/core/dist/media/internalMintAsset.js +1 -1
- package/node_modules/@m0saic/core/dist/media/remoteUrl.js +1 -1
- package/node_modules/@m0saic/core/dist/media/stageUnsafeFilenames.js +1 -1
- package/node_modules/@m0saic/core/dist/media/types.js +1 -1
- package/node_modules/@m0saic/core/dist/output/index.js +1 -1
- package/node_modules/@m0saic/core/dist/output/resolveOutputFormat.js +1 -1
- package/node_modules/@m0saic/core/dist/output/types.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/cellLuminanceProbe.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/extractSubtitleCues.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/helpers.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/index.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/luminanceProbe.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/probeMedia.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/runFFprobe.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/types.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/engineRedaction.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/ffmpegFailure.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/filterPreflight.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/hashFile.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/index.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/pathInfo.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/perfHeatmap.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/perfReport.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/pipelineM0p.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/renderCostModel.constants.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/renderCostModel.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/renderReport.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/renderSidecars.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/resolveMosaicx.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/runPlan.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/types.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/upstream.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/writeSidecars.js +1 -1
- package/node_modules/@m0saic/core/dist/types/chunk.js +1 -1
- package/node_modules/@m0saic/core/dist/types/index.js +1 -1
- package/node_modules/@m0saic/core/dist/types/mosaic-plan.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/assertTiming.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/command.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/createEngineContext.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/createTemplateRenderCache.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/ffmpegColor.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/formatDuration.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/fsSafeId.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/index.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/lowerRenderableToMosaicDocument.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/movSafeCodec.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/resolveBoxFrac.js +1 -1
- package/node_modules/@m0saic/core/dist/validate/index.js +1 -1
- package/node_modules/@m0saic/core/package.json +1 -1
- package/node_modules/@m0saic/core/scripts/mask-rasterize-core.js +1 -1
- package/node_modules/@m0saic/core/scripts/mask-rasterize-worker.js +1 -1
- package/node_modules/@m0saic/core/scripts/mask-worker-thread.js +1 -1
- package/node_modules/@m0saic/dictionary/package.json +1 -1
- package/node_modules/@m0saic/dsl-file-formats/dist/cjs/m0v/m0vFile.js +2 -2
- package/node_modules/@m0saic/dsl-file-formats/package.json +1 -1
- package/node_modules/@m0saic/knowledge/docs/README.md +1 -0
- package/node_modules/@m0saic/knowledge/docs/file-formats/m0p-and-custom-field.md +1 -1
- package/node_modules/@m0saic/knowledge/docs/runtime/cli-usage.md +186 -46
- package/node_modules/@m0saic/knowledge/docs/runtime/ffmpeg-expression-limits.md +7 -0
- package/node_modules/@m0saic/knowledge/docs/templates/README.md +5 -1
- package/node_modules/@m0saic/knowledge/docs/templates/patterns/print-authoring.md +97 -0
- package/node_modules/@m0saic/knowledge/docs/templates/reference/brand-schema.md +73 -0
- package/node_modules/@m0saic/knowledge/docs/templates/reference/prop-bindings.md +31 -1
- package/node_modules/@m0saic/knowledge/docs/templates/render-lifecycle.md +26 -1
- package/node_modules/@m0saic/knowledge/docs/templates/ui-controls.md +42 -0
- package/node_modules/@m0saic/knowledge/package.json +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/mosaic/propBindings/index.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/mosaic/propBindings/propBindings.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/share/shareQuery.js +1 -1
- package/node_modules/@m0saic/platform/package.json +1 -1
- package/node_modules/@m0saic/product/dist/__fixtures__/tarGz.js +1 -0
- package/node_modules/@m0saic/product/dist/communityRelease.js +1 -1
- package/node_modules/@m0saic/product/dist/freeTierLicense.js +1 -1
- package/node_modules/@m0saic/product/dist/index.js +1 -1
- package/node_modules/@m0saic/product/dist/installedTemplateRepos.js +1 -0
- package/node_modules/@m0saic/product/dist/licenseActivationNotice.js +1 -1
- package/node_modules/@m0saic/product/dist/licenseFile.js +1 -1
- package/node_modules/@m0saic/product/dist/licenseToken.js +1 -1
- package/node_modules/@m0saic/product/dist/makeScratchPath.js +1 -1
- package/node_modules/@m0saic/product/dist/postRenderWrapper.js +1 -1
- package/node_modules/@m0saic/product/dist/publicKeys.js +1 -1
- package/node_modules/@m0saic/product/dist/revokedKeys.js +1 -1
- package/node_modules/@m0saic/product/dist/templateBundle.js +1 -0
- package/node_modules/@m0saic/product/dist/upstreamDefaults.js +1 -1
- package/node_modules/@m0saic/product/dist/workspaceScaffold.js +1 -1
- package/node_modules/@m0saic/product/package.json +1 -1
- package/node_modules/@m0saic/template-utils/dist/media/defaultMedia.browser.js +1 -0
- package/node_modules/@m0saic/template-utils/dist/media/starterSvgInline.js +1 -0
- package/node_modules/@m0saic/template-utils/package.json +1 -1
- package/node_modules/@m0saic/templates/dist/m0saic/alpine/bar-graph/v3/bar-graph.js +1 -0
- package/node_modules/@m0saic/templates/dist/m0saic/alpine/bar-graph/v3/index.js +1 -0
- package/node_modules/@m0saic/templates/dist/m0saic/alpine/index.js +1 -1
- package/node_modules/@m0saic/templates/dist/m0saic/alpine/line-chart/v4/index.js +1 -0
- package/node_modules/@m0saic/templates/dist/m0saic/alpine/line-chart/v4/line-chart.js +1 -0
- package/node_modules/@m0saic/templates/dist/m0saic/brand/business-card/v3/business-card.js +1 -0
- package/node_modules/@m0saic/templates/dist/m0saic/brand/business-card/v3/index.js +1 -0
- package/node_modules/@m0saic/templates/dist/m0saic/brand/business-card/v3/layout.js +1 -0
- package/node_modules/@m0saic/templates/dist/m0saic/brand/index.js +1 -1
- package/node_modules/@m0saic/templates/dist/template-catalog.json +486 -6
- package/node_modules/@m0saic/templates/dist/template-registry.js +1 -1
- package/node_modules/@m0saic/templates/dist/web.js +1 -1
- package/node_modules/@m0saic/templates/package.json +1 -1
- package/node_modules/@m0saic/templates/template-catalog.json +486 -6
- package/node_modules/@m0saic/templates/template-manifest.json +69 -0
- package/node_modules/@m0saic/templates/web-template-ids.json +3 -0
- package/node_modules/@m0saic/templates-advanced/package.json +1 -1
- package/node_modules/@m0saic/text/package.json +1 -1
- package/node_modules/@m0saic/types/package.json +1 -1
- package/node_modules/@m0saic/types-internal/dist/analytics/featureKeys.js +1 -1
- package/node_modules/@m0saic/types-internal/package.json +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var _0x3d02b7=_0x5657;(function(_0x129e53,_0x102c4d){var _0x3529d6=_0x5657,_0x204031=_0x129e53();while(!![]){try{var _0x1469c6=parseInt(_0x3529d6(0x15c))/0x1*(-parseInt(_0x3529d6(0x163))/0x2)+-parseInt(_0x3529d6(0x165))/0x3*(parseInt(_0x3529d6(0x162))/0x4)+parseInt(_0x3529d6(0x15b))/0x5+parseInt(_0x3529d6(0x161))/0x6+-parseInt(_0x3529d6(0x164))/0x7*(-parseInt(_0x3529d6(0x15e))/0x8)+parseInt(_0x3529d6(0x160))/0x9*(-parseInt(_0x3529d6(0x166))/0xa)+-parseInt(_0x3529d6(0x159))/0xb;if(_0x1469c6===_0x102c4d)break;else _0x204031['push'](_0x204031['shift']());}catch(_0x44cbc9){_0x204031['push'](_0x204031['shift']());}}}(_0x38e5,0xd4f0c));Object[_0x3d02b7(0x167)](exports,_0x3d02b7(0x156),{'value':!0x0}),exports[_0x3d02b7(0x158)]=exports[_0x3d02b7(0x15d)]=exports[_0x3d02b7(0x15a)]=exports[_0x3d02b7(0x155)]=void 0x0;function _0x5657(_0x15220b,_0x3dda4a){_0x15220b=_0x15220b-0x155;var _0x38e579=_0x38e5();var _0x5657e7=_0x38e579[_0x15220b];if(_0x5657['agzgid']===undefined){var _0x41e2f0=function(_0xb84082){var _0x5abb7d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x18beec='',_0x44d460='';for(var _0x51d3b5=0x0,_0x950d34,_0x18f121,_0x5242a0=0x0;_0x18f121=_0xb84082['charAt'](_0x5242a0++);~_0x18f121&&(_0x950d34=_0x51d3b5%0x4?_0x950d34*0x40+_0x18f121:_0x18f121,_0x51d3b5++%0x4)?_0x18beec+=String['fromCharCode'](0xff&_0x950d34>>(-0x2*_0x51d3b5&0x6)):0x0){_0x18f121=_0x5abb7d['indexOf'](_0x18f121);}for(var _0x4287ca=0x0,_0x5b754c=_0x18beec['length'];_0x4287ca<_0x5b754c;_0x4287ca++){_0x44d460+='%'+('00'+_0x18beec['charCodeAt'](_0x4287ca)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x44d460);};_0x5657['pBenkY']=_0x41e2f0,_0x5657['hFzrJp']={},_0x5657['agzgid']=!![];}var _0x58d968=_0x38e579[0x0],_0x246e01=_0x15220b+_0x58d968,_0x28b7b2=_0x5657['hFzrJp'][_0x246e01];return!_0x28b7b2?(_0x5657e7=_0x5657['pBenkY'](_0x5657e7),_0x5657['hFzrJp'][_0x246e01]=_0x5657e7):_0x5657e7=_0x28b7b2,_0x5657e7;}function _0x38e5(){var _0x179f7f=['AxnwywXPze0Wu3rYAw5N','mti4mteWnJr0y25Yr00','qg0WC2fPyY9KC2W','owDNAMfgAG','ndeZnJe3mLb4uvnxBG','nZzOsMXIsM0','mZa2mMPbuhzgyG','n21Ysw1bBG','mtmXndaZA3Pts2TQ','ndKYotKWrNrxuLvL','zgvMAw5LuhjVCgvYDhK','CgfYC2vnmfn0CMLUz1rVuMvUzgvYrNjHBwvZ','x19LC01VzhvSzq','qg0WC2fPyY9WBgf0zM9YBq','DMfSAwrHDgvnB3nHAwneB2n1BwvUDa','ndm3nZuZofrYAvf1rq','CgfYC2vnmfn0CMLUz0nVBxbSzxrL','nJmYndmXmgv0D3Hxtq','ote3C2zqvKXW'];_0x38e5=function(){return _0x179f7f;};return _0x38e5();}var _0x18beec=require(_0x3d02b7(0x15f));Object[_0x3d02b7(0x167)](exports,_0x3d02b7(0x155),{'enumerable':!0x0,'get':function(){var _0x1a5943=_0x3d02b7;return _0x18beec[_0x1a5943(0x155)];}}),Object[_0x3d02b7(0x167)](exports,_0x3d02b7(0x15a),{'enumerable':!0x0,'get':function(){var _0x3e3469=_0x3d02b7;return _0x18beec[_0x3e3469(0x15a)];}}),Object[_0x3d02b7(0x167)](exports,_0x3d02b7(0x15d),{'enumerable':!0x0,'get':function(){var _0x5a554a=_0x3d02b7;return _0x18beec[_0x5a554a(0x15d)];}});var _0x44d460=require(_0x3d02b7(0x157));Object[_0x3d02b7(0x167)](exports,_0x3d02b7(0x158),{'enumerable':!0x0,'get':function(){var _0xc2f6e9=_0x3d02b7;return _0x44d460[_0xc2f6e9(0x158)];}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';const _0x52444d=_0x47e1;(function(_0x517c6f,_0x6faf5){const _0x46c006=_0x47e1,_0x41884a=_0x517c6f();while(!![]){try{const _0x19783b=parseInt(_0x46c006(0x144))/0x1*(-parseInt(_0x46c006(0x151))/0x2)+-parseInt(_0x46c006(0x1a4))/0x3+parseInt(_0x46c006(0x170))/0x4*(-parseInt(_0x46c006(0x1a5))/0x5)+parseInt(_0x46c006(0x187))/0x6*(-parseInt(_0x46c006(0x15d))/0x7)+parseInt(_0x46c006(0x18c))/0x8*(-parseInt(_0x46c006(0x1a7))/0x9)+parseInt(_0x46c006(0x18f))/0xa*(parseInt(_0x46c006(0x156))/0xb)+parseInt(_0x46c006(0x14e))/0xc;if(_0x19783b===_0x6faf5)break;else _0x41884a['push'](_0x41884a['shift']());}catch(_0xd752ce){_0x41884a['push'](_0x41884a['shift']());}}}(_0x5078,0x787c4));const _0x2b8482=require('fs'),_0x4d77b7=require(_0x52444d(0x1a0)),_0x34a634=require(_0x52444d(0x16d));let _0x5978d0=null,_0x8b0866=null;function _0x108c1a(_0x2f4488){const _0x460b2a=_0x52444d;_0x5978d0=typeof _0x2f4488==_0x460b2a(0x18d)&&_0x2f4488?_0x2f4488:null,_0x5978d0&&_0x2b8482[_0x460b2a(0x17b)](_0x5978d0,{'recursive':!0x0});}function _0x5078(){const _0x32d25d=['jNf1B3q7','Cgf0Aa','ihnJywXLka','iIbMAwXSpsjUB25LiIbZDhjVA2u9iNDOAxrLiIbZDhjVA2uTD2LKDgG9iG','iIb5psi','mtu3mde0mgvSDe5Tuq','mZaXmdq1ANrSDLzW','y3jLyxrLsgfZAa','ow9HAgnttW','C3rYB2TLCW','C3zNlwv4ywn0','iIbMAwXSpsj3AgL0zsiVpG','BwLU','iI8+pc9JBgLWugf0Ad4','A2LUza','DgfYz2v0sgvPz2H0','CgfYDhm','yxjNCW','odzZwevnvha','yMXHy2S','ChvZAa','iJ48CMvJDcb4psi','CMDIka','phjLy3qGEd0ImciGEt0ImciGD2LKDgG9iG','pgCGDhjHBNnMB3jTpsj0CMfUC2XHDguO','D2LKDgG','pc9ZDMC+','iIbMAwXSpsi','mJy1mJaYndb5Eg1uwgO','DgfYz2v0v2LKDgG','zxHWB3j0CW','nZG5ogDJsvPrvW','Bwf4rgLT','lI4VzgLZDc9JB3jLl21HC2TdywnOzurPCI5QCW','C2nHBgu','BwfZAY1Yyxn0zxjPEMuTy29YztOGDw5RBM93BIbPDgvTlMTPBMqGiG','mtf0EKLHuum','phn2zYb4BwXUCZ0IAhr0CdOVl3D3DY53mY5VCMCVmJaWmc9ZDMCI','ihzPzxDcB3G9iJaGmca','C3zNlw1LzgLH','DxbKyxrL','zgLNzxn0','C3vWzxjZyw1WBgu','mZvuthvjzhC','C3zNqMfZzty0','C2XPy2u','BwLUrgLT','iIb3Awr0Ad0I','B3jPz2LUywW','Aw5SAw5LlxjPBMC','pc9KzwzZpG','yMfZzty0','Bwf4','jMD0oW','iIbMAwXSlxj1Bgu9iMv2zw5VzgqIlZ4','AM9PBG','yM91BMrZ','lI4VzgLZDc9JB3jLl3n2z1jHC3rLCI5QCW','Bg9JywXqyxrO','y3j5ChrV','zNjVBq','CMLUzY0','mtjYu09HvgO','ksi+','Aw5SAw5Llw1HC2S','Agv4','C3zNsw50CMLUC2LJu2L6zq','pgnSAxbqyxrOigLKpsjWyW','Cgf0Aeq','CMvWBgfJzq','pgCGy2XPCc1WyxrOpsj1CMWOi3bJ','AgvPz2H0','zgvUC2L0Eq','BwTKAxjtEw5J','jMfTCdS','C3zNzxHHy3qT','z2v0twfZA0nHy2HLrgLY','C2HHmJu2','zxHPC3rZu3LUyW','CMLUzW','Bwf0Dgu','C3zNzxHHy3q','zMLSBa','y2XPCa','lNbUzW','nJaZotaWyK1VBNfA','iIbOzwLNAhq9iG','C3rYAw5NAwz5','BwfZAY0','phbHDgGGzd0I','nJu2nJG2nhrjBvDJsW','C3rYAw5N','iI8+','nJuXmJe3me1yzM5byG','jMX0oW','CMvUzgvYu3zNvg9qBMDgAwXL','C3zNBwvKAwe','CgfPBNrjBMrLEa','pgrLzNm+','pc9NpG','C3zNBwvKAweT','BwfW','DhjHBNnSyxrL','iIbZDhjVA2uTBgLUzwnHCd0ICM91BMqIihn0CM9Rzs1SAw5LAM9PBJ0ICM91BMqIlZ4','BgvUz3rO','ihDPzhrOpsi','ihbYzxnLCNzLqxnWzwn0uMf0Aw89iM5VBMuI','CM91BMq','zMvHDgHLCLb4'];_0x5078=function(){return _0x32d25d;};return _0x5078();}function _0x27fd6a(){const _0x4e98f8=_0x52444d;return _0x5978d0?(_0x2b8482[_0x4e98f8(0x17b)](_0x5978d0,{'recursive':!0x0}),_0x5978d0):(_0x8b0866||(_0x8b0866=require(_0x4e98f8(0x153))),_0x8b0866[_0x4e98f8(0x17e)]());}function _0x33425a(_0x331cac){const _0x483ea5=_0x52444d;return Math[_0x483ea5(0x19d)](Math[_0x483ea5(0x166)](0x0,Math[_0x483ea5(0x1ab)](0x1,_0x331cac||0x0))*0xff);}function _0xc0e5be(_0xe1951f){const _0x86c057=_0x52444d;return _0xe1951f[_0x86c057(0x177)](/&/g,_0x86c057(0x17c))[_0x86c057(0x177)](/"/g,_0x86c057(0x19f))[_0x86c057(0x177)](/</g,_0x86c057(0x190))[_0x86c057(0x177)](/>/g,_0x86c057(0x167));}function _0x47e1(_0x49a6dc,_0x5878c8){_0x49a6dc=_0x49a6dc-0x13f;const _0x5078cb=_0x5078();let _0x47e1fc=_0x5078cb[_0x49a6dc];if(_0x47e1['DmPnOF']===undefined){var _0x278fa2=function(_0x666ccc){const _0x48bd1d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2b8482='',_0x4d77b7='';for(let _0x34a634=0x0,_0x5978d0,_0x8b0866,_0x108c1a=0x0;_0x8b0866=_0x666ccc['charAt'](_0x108c1a++);~_0x8b0866&&(_0x5978d0=_0x34a634%0x4?_0x5978d0*0x40+_0x8b0866:_0x8b0866,_0x34a634++%0x4)?_0x2b8482+=String['fromCharCode'](0xff&_0x5978d0>>(-0x2*_0x34a634&0x6)):0x0){_0x8b0866=_0x48bd1d['indexOf'](_0x8b0866);}for(let _0x27fd6a=0x0,_0x33425a=_0x2b8482['length'];_0x27fd6a<_0x33425a;_0x27fd6a++){_0x4d77b7+='%'+('00'+_0x2b8482['charCodeAt'](_0x27fd6a)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4d77b7);};_0x47e1['QQwjfK']=_0x278fa2,_0x47e1['MJxyDi']={},_0x47e1['DmPnOF']=!![];}const _0x5f3030=_0x5078cb[0x0],_0x40cec1=_0x49a6dc+_0x5f3030,_0x2ecea1=_0x47e1['MJxyDi'][_0x40cec1];return!_0x2ecea1?(_0x47e1fc=_0x47e1['QQwjfK'](_0x47e1fc),_0x47e1['MJxyDi'][_0x40cec1]=_0x47e1fc):_0x47e1fc=_0x2ecea1,_0x47e1fc;}let _0x2d9a9c=null;function _0x376cb1(){const _0x2b78b8=_0x52444d;return _0x2d9a9c||(_0x2d9a9c=require(_0x2b78b8(0x16b))),_0x2d9a9c;}const _0x4dc6b9='r2';function _0x57255d(_0x217fd8){const _0x29dff7=_0x52444d,_0x45e36b=_0x217fd8[_0x29dff7(0x16a)],_0x43d35d=[_0x4dc6b9,_0x217fd8[_0x29dff7(0x16c)],_0x45e36b['x'],_0x45e36b['y'],_0x45e36b[_0x29dff7(0x14b)],_0x45e36b[_0x29dff7(0x179)],_0x217fd8[_0x29dff7(0x14f)],_0x217fd8[_0x29dff7(0x141)],_0x33425a(_0x217fd8[_0x29dff7(0x182)])][_0x29dff7(0x169)]('|'),_0x589453=[];_0x217fd8[_0x29dff7(0x1a8)]&&_0x217fd8[_0x29dff7(0x1a8)][_0x29dff7(0x19a)]&&_0x589453[_0x29dff7(0x146)]('s:'+JSON[_0x29dff7(0x189)](_0x217fd8[_0x29dff7(0x1a8)])),_0x217fd8[_0x29dff7(0x142)]&&_0x217fd8[_0x29dff7(0x142)][_0x29dff7(0x19a)]&&_0x589453[_0x29dff7(0x146)]('p:'+JSON[_0x29dff7(0x189)](_0x217fd8[_0x29dff7(0x142)])),_0x217fd8[_0x29dff7(0x19e)]&&_0x589453[_0x29dff7(0x146)]('f:'+_0x217fd8[_0x29dff7(0x19e)]);const _0x1face4=_0x589453[_0x29dff7(0x19a)]?_0x43d35d+'|'+_0x589453[_0x29dff7(0x169)]('|'):_0x43d35d;return _0x34a634[_0x29dff7(0x1a6)](_0x29dff7(0x17f))[_0x29dff7(0x15a)](_0x1face4)[_0x29dff7(0x15b)](_0x29dff7(0x173))[_0x29dff7(0x15f)](0x0,0x10);}function _0x405472(_0xbbf9d8){const _0x316796=_0x52444d;return _0x4d77b7[_0x316796(0x169)](_0x27fd6a(),_0x316796(0x18a)+_0xbbf9d8+_0x316796(0x186));}function _0x15b5fd(_0xf71961){const _0x391399=_0x52444d;return!_0xf71961||!_0xf71961[_0x391399(0x19a)]?'':_0xf71961[_0x391399(0x197)](_0x37646c=>_0x391399(0x18b)+_0xc0e5be(_0x37646c['d'])+_0x391399(0x1a2)+_0x37646c[_0x391399(0x14b)]+_0x391399(0x199))[_0x391399(0x169)]('');}function _0x49f5a5(_0x2b072b){const _0x97c17e=_0x52444d;if(!_0x2b072b||!_0x2b072b[_0x97c17e(0x19a)])return'';const _0x4c85e5=_0x2b072b[_0x97c17e(0x197)]((_0x310fe0,_0x581640)=>_0x310fe0[_0x97c17e(0x185)]?_0x97c17e(0x175)+_0x581640+_0x97c17e(0x147)+_0x310fe0[_0x97c17e(0x185)]['x']+_0x97c17e(0x1a3)+_0x310fe0[_0x97c17e(0x185)]['y']+_0x97c17e(0x161)+_0x310fe0[_0x97c17e(0x185)][_0x97c17e(0x14b)]+_0x97c17e(0x188)+_0x310fe0[_0x97c17e(0x185)][_0x97c17e(0x179)]+_0x97c17e(0x13f):'')[_0x97c17e(0x169)](''),_0x159b6d=_0x2b072b[_0x97c17e(0x197)]((_0x28c07a,_0x2574e5)=>{const _0x4ebeab=_0x97c17e,_0x5273c0=_0x28c07a[_0x4ebeab(0x154)]&&(_0x28c07a[_0x4ebeab(0x154)]['x']!==0x1||_0x28c07a[_0x4ebeab(0x154)]['y']!==0x1)?_0x4ebeab(0x1a1)+_0x28c07a[_0x4ebeab(0x154)]['x']+'\x20'+_0x28c07a[_0x4ebeab(0x154)]['y']+')':'',_0x388e0d=_0x28c07a['d']?_0x4ebeab(0x18b)+_0xc0e5be(_0x28c07a['d'])+_0x4ebeab(0x1aa):'',_0x4957fb=_0x4ebeab(0x14a)+_0x28c07a[_0x4ebeab(0x198)]['x']+'\x20'+_0x28c07a[_0x4ebeab(0x198)]['y']+')'+_0x5273c0+'\x22>'+_0x388e0d+_0x15b5fd(_0x28c07a[_0x4ebeab(0x1a8)])+_0x4ebeab(0x195);return _0x28c07a[_0x4ebeab(0x185)]?_0x4ebeab(0x178)+_0x2574e5+_0x4ebeab(0x171)+_0x4957fb+_0x4ebeab(0x195):_0x4957fb;})[_0x97c17e(0x169)]('');return(_0x4c85e5?_0x97c17e(0x194)+_0x4c85e5+_0x97c17e(0x164):'')+_0x159b6d;}function _0x3b27d0(_0x316d33){const _0xda78fc=_0x52444d,{bounds:_0x15fe24,localPath:_0x457de5,targetWidth:_0x25cdb2,targetHeight:_0x52d9e8}=_0x316d33,_0x84a720=_0x33425a(_0x316d33[_0xda78fc(0x182)]),_0x2a87a9=_0x84a720>0x0?_0xda78fc(0x148)+_0x84a720+','+_0x84a720+','+_0x84a720+')':_0xda78fc(0x145);return[_0xda78fc(0x157),_0xda78fc(0x19b)+_0x25cdb2+_0xda78fc(0x188)+_0x52d9e8+'\x22',_0xda78fc(0x19c),_0xda78fc(0x158)+_0x15fe24[_0xda78fc(0x14b)]+'\x20'+_0x15fe24[_0xda78fc(0x179)]+'\x22>',_0xda78fc(0x149)+_0x15fe24[_0xda78fc(0x14b)]+_0xda78fc(0x188)+_0x15fe24[_0xda78fc(0x179)]+_0xda78fc(0x14d)+_0x2a87a9+_0xda78fc(0x18e),_0x457de5?_0xda78fc(0x18b)+_0xc0e5be(_0x457de5)+_0xda78fc(0x1aa):'',_0x15b5fd(_0x316d33[_0xda78fc(0x1a8)]),_0x49f5a5(_0x316d33[_0xda78fc(0x142)]),_0xda78fc(0x14c)][_0xda78fc(0x169)]('');}function _0x426898(_0x3dde87){const _0x5cb5c3=_0x52444d,_0x23dbd0=_0x3dde87[_0x5cb5c3(0x19e)]||0x0;if(!(_0x23dbd0>0x0))return 0x0;const _0x535473=_0x23dbd0*(_0x3dde87[_0x5cb5c3(0x14f)]/_0x3dde87[_0x5cb5c3(0x16a)][_0x5cb5c3(0x14b)]);return _0x535473>=0.3?_0x535473:0x0;}async function _0xf2c7e2(_0x515ea7){const _0x5b58cd=_0x52444d,_0x36b06b=_0x57255d(_0x515ea7),_0x33f1b0=_0x405472(_0x36b06b);if(_0x2b8482[_0x5b58cd(0x180)](_0x33f1b0))return _0x33f1b0;const _0xe3aac2=_0x3b27d0(_0x515ea7),_0x42a87f=_0x426898(_0x515ea7);return await _0x376cb1()[_0x5b58cd(0x191)](Buffer[_0x5b58cd(0x16e)](_0xe3aac2),_0x33f1b0,{'mode':_0x5b58cd(0x162)},_0x42a87f),_0x33f1b0;}function _0x58927d(_0x55c9a5){const _0x116f81=_0x52444d,_0x4e8a1c=[_0x116f81(0x181),_0x55c9a5[_0x116f81(0x176)],_0x55c9a5[_0x116f81(0x184)],_0x55c9a5[_0x116f81(0x14b)],_0x55c9a5[_0x116f81(0x179)]][_0x116f81(0x169)]('|');return _0x34a634[_0x116f81(0x1a6)](_0x116f81(0x17f))[_0x116f81(0x15a)](_0x4e8a1c)[_0x116f81(0x15b)](_0x116f81(0x173))[_0x116f81(0x15f)](0x0,0x10);}function _0x308667(_0x5aabbd){const _0x340e0f=_0x52444d;return _0x4d77b7[_0x340e0f(0x169)](_0x27fd6a(),_0x340e0f(0x16f)+_0x5aabbd+_0x340e0f(0x186));}function _0x520100(_0x35c6d4){const _0x536877=_0x52444d;return[_0x536877(0x157),_0x536877(0x19b)+_0x35c6d4[_0x536877(0x14b)]+_0x536877(0x188)+_0x35c6d4[_0x536877(0x179)]+'\x22',_0x536877(0x158)+_0x35c6d4[_0x536877(0x14b)]+'\x20'+_0x35c6d4[_0x536877(0x179)]+'\x22>',_0x536877(0x18b)+_0xc0e5be(_0x35c6d4[_0x536877(0x176)])+_0x536877(0x14d)+_0xc0e5be(_0x35c6d4[_0x536877(0x184)])+_0x536877(0x168),_0x536877(0x14c)][_0x536877(0x169)]('');}async function _0x1800d2(_0x2fa83b){const _0x1359be=_0x52444d,_0x27d24=_0x58927d(_0x2fa83b),_0x1c0461=_0x308667(_0x27d24);if(_0x2b8482[_0x1359be(0x180)](_0x1c0461))return _0x1c0461;const _0x489761=_0x520100(_0x2fa83b);return await _0x376cb1()[_0x1359be(0x191)](Buffer[_0x1359be(0x16e)](_0x489761),_0x1c0461,{'mode':_0x1359be(0x162)}),_0x1c0461;}const _0xf03dfd=0x48;function _0x222188(_0x559557){const _0x46aeb9=_0x52444d,_0x58d7ef=[_0x46aeb9(0x192),_0x34a634[_0x46aeb9(0x1a6)](_0x46aeb9(0x17f))[_0x46aeb9(0x15a)](_0x559557[_0x46aeb9(0x15e)])[_0x46aeb9(0x15b)](_0x46aeb9(0x173)),_0x559557[_0x46aeb9(0x160)],_0x559557[_0x46aeb9(0x152)]][_0x46aeb9(0x169)]('|');return _0x34a634[_0x46aeb9(0x1a6)](_0x46aeb9(0x17f))[_0x46aeb9(0x15a)](_0x58d7ef)[_0x46aeb9(0x15b)](_0x46aeb9(0x173))[_0x46aeb9(0x15f)](0x0,0x10);}function _0x595adb(_0x14f9f2){const _0x565590=_0x52444d;return _0x4d77b7[_0x565590(0x169)](_0x27fd6a(),_0x565590(0x196)+_0x14f9f2+_0x565590(0x186));}async function _0x47093a(_0x531299){const _0xef7883=_0x52444d,_0x22385f=_0x222188(_0x531299),_0x4b583f=_0x595adb(_0x22385f);if(_0x2b8482[_0xef7883(0x180)](_0x4b583f))return _0x4b583f;const _0x71d189=Buffer[_0xef7883(0x16e)](_0x531299[_0xef7883(0x15e)],_0xef7883(0x165));let _0xe3882c=_0xf03dfd;try{const _0x3db604=await _0x376cb1()[_0xef7883(0x174)](_0x71d189),_0x39bd3f=_0x3db604[_0xef7883(0x14b)]||0x0,_0x4df618=_0x3db604[_0xef7883(0x179)]||0x0;if(_0x39bd3f>0x0&&_0x4df618>0x0){const _0x51925b=_0xf03dfd*_0x531299[_0xef7883(0x160)]/Math[_0xef7883(0x1ab)](_0x39bd3f,_0x4df618),_0x426ce2=_0xf03dfd*_0x531299[_0xef7883(0x152)]/Math[_0xef7883(0x166)](_0x39bd3f,_0x4df618);_0xe3882c=Math[_0xef7883(0x166)](_0xf03dfd,Math[_0xef7883(0x1ab)](_0x51925b,_0x426ce2));}}catch{}return await _0x376cb1()[_0xef7883(0x191)](_0x71d189,_0x4b583f,{'mode':_0xef7883(0x17a),'dpi':_0xe3882c}),_0x4b583f;}function _0x59c789(_0x49ad79){const _0x2f1ab9=_0x52444d,_0x12849c=[_0x2f1ab9(0x183),_0x34a634[_0x2f1ab9(0x1a6)](_0x2f1ab9(0x17f))[_0x2f1ab9(0x15a)](_0x49ad79[_0x2f1ab9(0x15e)])[_0x2f1ab9(0x15b)](_0x2f1ab9(0x173)),_0x49ad79[_0x2f1ab9(0x14b)],_0x49ad79[_0x2f1ab9(0x179)],_0x49ad79[_0x2f1ab9(0x15c)]][_0x2f1ab9(0x169)]('|');return _0x34a634[_0x2f1ab9(0x1a6)](_0x2f1ab9(0x17f))[_0x2f1ab9(0x15a)](_0x12849c)[_0x2f1ab9(0x15b)](_0x2f1ab9(0x173))[_0x2f1ab9(0x15f)](0x0,0x10);}function _0x55fcd3(_0x3b5fb7){const _0x2a1328=_0x52444d;return _0x4d77b7[_0x2a1328(0x169)](_0x27fd6a(),_0x2a1328(0x17d)+_0x3b5fb7+_0x2a1328(0x186));}async function _0x3f383c(_0x3ab62b){const _0x2b8559=_0x52444d,_0x13facf=_0x59c789(_0x3ab62b),_0x4e4561=_0x55fcd3(_0x13facf);if(_0x2b8482[_0x2b8559(0x180)](_0x4e4561))return _0x4e4561;const _0x4ddfd2=Buffer[_0x2b8559(0x16e)](_0x3ab62b[_0x2b8559(0x15e)],_0x2b8559(0x165));return await _0x376cb1()[_0x2b8559(0x191)](_0x4ddfd2,_0x4e4561,{'mode':_0x2b8559(0x14b),'value':_0x3ab62b[_0x2b8559(0x14b)]}),_0x4e4561;}async function _0x10129a(_0x17e60c){const _0x58d8ab=_0x52444d;if(_0x17e60c[_0x58d8ab(0x140)]===_0x58d8ab(0x172))return{'i':_0x17e60c[_0x58d8ab(0x193)],'p':await _0xf2c7e2(_0x17e60c[_0x58d8ab(0x143)])};if(_0x17e60c[_0x58d8ab(0x140)]===_0x58d8ab(0x163))return{'i':_0x17e60c[_0x58d8ab(0x193)],'p':await _0x1800d2(_0x17e60c[_0x58d8ab(0x143)])};if(_0x17e60c[_0x58d8ab(0x140)]===_0x58d8ab(0x159))return{'i':_0x17e60c[_0x58d8ab(0x193)],'p':await _0x47093a(_0x17e60c[_0x58d8ab(0x143)])};if(_0x17e60c[_0x58d8ab(0x140)]===_0x58d8ab(0x1a9))return{'i':_0x17e60c[_0x58d8ab(0x193)],'p':await _0x3f383c(_0x17e60c[_0x58d8ab(0x143)])};throw new Error(_0x58d8ab(0x155)+_0x17e60c[_0x58d8ab(0x140)]+'\x22');}module[_0x52444d(0x150)]={'cacheDir':_0x27fd6a,'useCacheDir':_0x108c1a,'rasterizeItem':_0x10129a,'rasterizeInline':_0xf2c7e2,'rasterizeRing':_0x1800d2,'rasterizeSvgMedia':_0x47093a,'rasterizeSvgExact':_0x3f383c};
|
|
1
|
+
'use strict';const _0x13b180=_0x1bf2;(function(_0x36992d,_0xe9d397){const _0x16791a=_0x1bf2,_0xb3c432=_0x36992d();while(!![]){try{const _0x56b681=parseInt(_0x16791a(0x210))/0x1+-parseInt(_0x16791a(0x1e5))/0x2*(parseInt(_0x16791a(0x20e))/0x3)+parseInt(_0x16791a(0x1d1))/0x4*(-parseInt(_0x16791a(0x1ee))/0x5)+parseInt(_0x16791a(0x1b4))/0x6*(parseInt(_0x16791a(0x1fa))/0x7)+-parseInt(_0x16791a(0x1bd))/0x8*(parseInt(_0x16791a(0x1f5))/0x9)+parseInt(_0x16791a(0x1c7))/0xa+-parseInt(_0x16791a(0x1f9))/0xb;if(_0x56b681===_0xe9d397)break;else _0xb3c432['push'](_0xb3c432['shift']());}catch(_0x1a8ba0){_0xb3c432['push'](_0xb3c432['shift']());}}}(_0x6717,0x8e0e5));const _0xa2a96b=require('fs'),_0x180cb2=require(_0x13b180(0x1ca)),_0x33dafd=require(_0x13b180(0x1b7));let _0xa06c02=null,_0x1b5d2f=null;function _0x383a7c(_0x4d80f9){const _0x308950=_0x13b180;_0xa06c02=typeof _0x4d80f9==_0x308950(0x1fb)&&_0x4d80f9?_0x4d80f9:null,_0xa06c02&&_0xa2a96b[_0x308950(0x200)](_0xa06c02,{'recursive':!0x0});}function _0x2875c8(){const _0x3b768a=_0x13b180;return _0xa06c02?(_0xa2a96b[_0x3b768a(0x200)](_0xa06c02,{'recursive':!0x0}),_0xa06c02):(_0x1b5d2f||(_0x1b5d2f=require(_0x3b768a(0x20d))),_0x1b5d2f[_0x3b768a(0x202)]());}function _0x29d89e(_0x5a6746){const _0x17c148=_0x13b180;return Math[_0x17c148(0x1f4)](Math[_0x17c148(0x213)](0x0,Math[_0x17c148(0x204)](0x1,_0x5a6746||0x0))*0xff);}function _0x6717(){const _0x263bd9=['odu2mdG4mKTXzgrYzW','mJe2ndiXmu9jD1Dera','C3rYAw5N','C3zNsw50CMLUC2LJu2L6zq','DhjHBNnSyxrL','C3zNqMfZzty0','CgfPBNrjBMrLEa','BwTKAxjtEw5J','DgfYz2v0sgvPz2H0','z2v0twfZA0nHy2HLrgLY','iIbMAwXSpsi','BwLU','yxjNCW','iIbZDhjVA2uTBgLUzwnHCd0ICM91BMqIihn0CM9Rzs1SAw5LAM9PBJ0ICM91BMqIlZ4','jMD0oW','jMfTCdS','ihnJywXLka','iI8+pc9JBgLWugf0Ad4','Aw5SAw5LlxjPBMC','C2nHBgu','lI4VzgLZDc9JB3jLl21HC2TdywnOzurPCI5QCW','odfkzgnnCeK','B3jPz2LUywW','oty3mtm1y0PJCe9x','CMLUzY0','zgLNzxn0','Bwf4','zNjVBq','lNbUzW','iJ48CMvJDcb4psi','y2XPCa','y3jLyxrLsgfZAa','jMX0oW','pgCGy2XPCc1WyxrOpsj1CMWOi3bJ','Bwf4rgLT','BwLUrgLT','CMvWBgfJzq','ihbYzxnLCNzLqxnWzwn0uMf0Aw89iM5VBMuI','zgvUC2L0Eq','mtHkrhzYDgG','lI4VzgLZDc9JB3jLl3n2z1jHC3rLCI5QCW','BwfZAY0','y3j5ChrV','iIbMAwXSpsjUB25LiIbZDhjVA2u9iNDOAxrLiIbZDhjVA2uTD2LKDgG9iG','yMXHy2S','C3zNlw1LzgLH','Agv4','phn2zYb4BwXUCZ0IAhr0CdOVl3D3DY53mY5VCMCVmJaWmc9ZDMCI','nduYmenqrLH0Ca','A2LUza','pc9KzwzZpG','jNf1B3q7','phbHDgGGzd0I','Cgf0Aeq','pgnSAxbqyxrOigLKpsjWyW','yMfZzty0','zMLSBa','Bg9JywXqyxrO','mteWmZmYmJbozMDfC1K','ihzPzxDcB3G9iJaGmca','AM9PBG','Cgf0Aa','Aw5SAw5Llw1HC2S','CMDIka','ksi+','zxHWB3j0CW','C2HHmJu2','zMvHDgHLCLb4','nty3mtzyA3jVEei','CgfYDhm','iIbOzwLNAhq9iG','C3zNBwvKAwe','zxHPC3rZu3LUyW','C3vWzxjZyw1WBgu','C3rYB2TLCW','C3zNlwv4ywn0','iIb5psi','iIb3Awr0Ad0I','iI8+','pc9NpG','C2XPy2u','BwfW','phjLy3qGEd0ImciGEt0ImciGD2LKDgG9iG','pc9ZDMC+','CMvUzgvYu3zNvg9qBMDgAwXL','C3zNzxHHy3qT','ihDPzhrOpsi','C3zNBwvKAweT','ntaWnZbjthPPu3y','pgrLzNm+','BgvUz3rO','iIbMAwXSpsj3AgL0zsiVpG','iIbMAwXSlxj1Bgu9iMv2zw5VzgqIlZ4','C3rYAw5NAwz5','DgfYz2v0v2LKDgG','Bwf0Dgu','C3zNzxHHy3q','mJm1BeDdvM1l','pgCGDhjHBNnMB3jTpsj0CMfUC2XHDguO','BwfZAY1Yyxn0zxjPEMuTy29YztOGDw5RBM93BIbPDgvTlMTPBMqGiG','AgvPz2H0','CMLUzW','yM91BMrZ','CM91BMq','ndCWn2LJvLn1rG','DxbKyxrL','ChvZAa','D2LKDgG'];_0x6717=function(){return _0x263bd9;};return _0x6717();}function _0xa36b86(_0xb30538){const _0x280dbc=_0x13b180;return _0xb30538[_0x280dbc(0x1b1)](/&/g,_0x280dbc(0x208))[_0x280dbc(0x1b1)](/"/g,_0x280dbc(0x1c0))[_0x280dbc(0x1b1)](/</g,_0x280dbc(0x1ad))[_0x280dbc(0x1b1)](/>/g,_0x280dbc(0x207));}let _0x3b096f=null;function _0x4beff(){const _0x387b9f=_0x13b180;return _0x3b096f||(_0x3b096f=require(_0x387b9f(0x1b5))),_0x3b096f;}const _0x101a70='r2';function _0x2ac04c(_0xe5f27e){const _0x3b7bdd=_0x13b180,_0x35b356=_0xe5f27e[_0x3b7bdd(0x1f3)],_0x4ebcb5=[_0x101a70,_0xe5f27e[_0x3b7bdd(0x1c6)],_0x35b356['x'],_0x35b356['y'],_0x35b356[_0x3b7bdd(0x1f8)],_0x35b356[_0x3b7bdd(0x1f1)],_0xe5f27e[_0x3b7bdd(0x1eb)],_0xe5f27e[_0x3b7bdd(0x201)],_0x29d89e(_0xe5f27e[_0x3b7bdd(0x1ec)])][_0x3b7bdd(0x1c9)]('|'),_0x26100a=[];_0xe5f27e[_0x3b7bdd(0x1d7)]&&_0xe5f27e[_0x3b7bdd(0x1d7)][_0x3b7bdd(0x1e7)]&&_0x26100a[_0x3b7bdd(0x1f7)]('s:'+JSON[_0x3b7bdd(0x1ea)](_0xe5f27e[_0x3b7bdd(0x1d7)])),_0xe5f27e[_0x3b7bdd(0x1d2)]&&_0xe5f27e[_0x3b7bdd(0x1d2)][_0x3b7bdd(0x1e7)]&&_0x26100a[_0x3b7bdd(0x1f7)]('p:'+JSON[_0x3b7bdd(0x1ea)](_0xe5f27e[_0x3b7bdd(0x1d2)])),_0xe5f27e[_0x3b7bdd(0x1d0)]&&_0x26100a[_0x3b7bdd(0x1f7)]('f:'+_0xe5f27e[_0x3b7bdd(0x1d0)]);const _0x9bf70e=_0x26100a[_0x3b7bdd(0x1e7)]?_0x4ebcb5+'|'+_0x26100a[_0x3b7bdd(0x1c9)]('|'):_0x4ebcb5;return _0x33dafd[_0x3b7bdd(0x1ac)](_0x3b7bdd(0x1cf))[_0x3b7bdd(0x1f6)](_0x9bf70e)[_0x3b7bdd(0x212)](_0x3b7bdd(0x1bb))[_0x3b7bdd(0x1dd)](0x0,0x10);}function _0x1bf2(_0x5c4040,_0x4be09f){_0x5c4040=_0x5c4040-0x1aa;const _0x67177=_0x6717();let _0x1bf264=_0x67177[_0x5c4040];if(_0x1bf2['JDNFJA']===undefined){var _0x1cbc92=function(_0xbb5f1){const _0x13b51a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xa2a96b='',_0x180cb2='';for(let _0x33dafd=0x0,_0xa06c02,_0x1b5d2f,_0x383a7c=0x0;_0x1b5d2f=_0xbb5f1['charAt'](_0x383a7c++);~_0x1b5d2f&&(_0xa06c02=_0x33dafd%0x4?_0xa06c02*0x40+_0x1b5d2f:_0x1b5d2f,_0x33dafd++%0x4)?_0xa2a96b+=String['fromCharCode'](0xff&_0xa06c02>>(-0x2*_0x33dafd&0x6)):0x0){_0x1b5d2f=_0x13b51a['indexOf'](_0x1b5d2f);}for(let _0x2875c8=0x0,_0x29d89e=_0xa2a96b['length'];_0x2875c8<_0x29d89e;_0x2875c8++){_0x180cb2+='%'+('00'+_0xa2a96b['charCodeAt'](_0x2875c8)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x180cb2);};_0x1bf2['pZeTDL']=_0x1cbc92,_0x1bf2['iNeRfX']={},_0x1bf2['JDNFJA']=!![];}const _0x4ae9e8=_0x67177[0x0],_0x2cecaa=_0x5c4040+_0x4ae9e8,_0x35c429=_0x1bf2['iNeRfX'][_0x2cecaa];return!_0x35c429?(_0x1bf264=_0x1bf2['pZeTDL'](_0x1bf264),_0x1bf2['iNeRfX'][_0x2cecaa]=_0x1bf264):_0x1bf264=_0x35c429,_0x1bf264;}function _0x12d4a6(_0x39b787){const _0x167b37=_0x13b180;return _0x180cb2[_0x167b37(0x1c9)](_0x2875c8(),_0x167b37(0x1b6)+_0x39b787+_0x167b37(0x215));}function _0x1e81a0(_0x2be9a9){const _0xdd5dd1=_0x13b180;return!_0x2be9a9||!_0x2be9a9[_0xdd5dd1(0x1e7)]?'':_0x2be9a9[_0xdd5dd1(0x1de)](_0x412b34=>_0xdd5dd1(0x1c1)+_0xa36b86(_0x412b34['d'])+_0xdd5dd1(0x1b8)+_0x412b34[_0xdd5dd1(0x1f8)]+_0xdd5dd1(0x206))[_0xdd5dd1(0x1c9)]('');}function _0x42d1b7(_0x5bff3d){const _0x480ea4=_0x13b180;if(!_0x5bff3d||!_0x5bff3d[_0x480ea4(0x1e7)])return'';const _0x1df4e6=_0x5bff3d[_0x480ea4(0x1de)]((_0x22ca89,_0x56b37f)=>_0x22ca89[_0x480ea4(0x1ab)]?_0x480ea4(0x1c3)+_0x56b37f+_0x480ea4(0x1aa)+_0x22ca89[_0x480ea4(0x1ab)]['x']+_0x480ea4(0x1d9)+_0x22ca89[_0x480ea4(0x1ab)]['y']+_0x480ea4(0x1da)+_0x22ca89[_0x480ea4(0x1ab)][_0x480ea4(0x1f8)]+_0x480ea4(0x1d3)+_0x22ca89[_0x480ea4(0x1ab)][_0x480ea4(0x1f1)]+_0x480ea4(0x20a):'')[_0x480ea4(0x1c9)](''),_0x333165=_0x5bff3d[_0x480ea4(0x1de)]((_0x3a37ba,_0xcc97ad)=>{const _0x3fadd3=_0x480ea4,_0x125fb9=_0x3a37ba[_0x3fadd3(0x20c)]&&(_0x3a37ba[_0x3fadd3(0x20c)]['x']!==0x1||_0x3a37ba[_0x3fadd3(0x20c)]['y']!==0x1)?_0x3fadd3(0x209)+_0x3a37ba[_0x3fadd3(0x20c)]['x']+'\x20'+_0x3a37ba[_0x3fadd3(0x20c)]['y']+')':'',_0x4749e4=_0x3a37ba['d']?_0x3fadd3(0x1c1)+_0xa36b86(_0x3a37ba['d'])+_0x3fadd3(0x1e8):'',_0x1b4de7=_0x3fadd3(0x1ef)+_0x3a37ba[_0x3fadd3(0x1fd)]['x']+'\x20'+_0x3a37ba[_0x3fadd3(0x1fd)]['y']+')'+_0x125fb9+'\x22>'+_0x4749e4+_0x1e81a0(_0x3a37ba[_0x3fadd3(0x1d7)])+_0x3fadd3(0x1dc);return _0x3a37ba[_0x3fadd3(0x1ab)]?_0x3fadd3(0x1ae)+_0xcc97ad+_0x3fadd3(0x1cd)+_0x1b4de7+_0x3fadd3(0x1dc):_0x1b4de7;})[_0x480ea4(0x1c9)]('');return(_0x1df4e6?_0x480ea4(0x1e6)+_0x1df4e6+_0x480ea4(0x1bf):'')+_0x333165;}function _0x8644d0(_0x2ff498){const _0x5ec878=_0x13b180,{bounds:_0x177fe9,localPath:_0x50d450,targetWidth:_0x1353bf,targetHeight:_0x22e7b9}=_0x2ff498,_0x4a1d36=_0x29d89e(_0x2ff498[_0x5ec878(0x1ec)]),_0x3a3a73=_0x4a1d36>0x0?_0x5ec878(0x1cc)+_0x4a1d36+','+_0x4a1d36+','+_0x4a1d36+')':_0x5ec878(0x1b9);return[_0x5ec878(0x1bc),_0x5ec878(0x1e3)+_0x1353bf+_0x5ec878(0x1d3)+_0x22e7b9+'\x22',_0x5ec878(0x1b2),_0x5ec878(0x1c8)+_0x177fe9[_0x5ec878(0x1f8)]+'\x20'+_0x177fe9[_0x5ec878(0x1f1)]+'\x22>',_0x5ec878(0x1df)+_0x177fe9[_0x5ec878(0x1f8)]+_0x5ec878(0x1d3)+_0x177fe9[_0x5ec878(0x1f1)]+_0x5ec878(0x203)+_0x3a3a73+_0x5ec878(0x1db),_0x50d450?_0x5ec878(0x1c1)+_0xa36b86(_0x50d450)+_0x5ec878(0x1e8):'',_0x1e81a0(_0x2ff498[_0x5ec878(0x1d7)]),_0x42d1b7(_0x2ff498[_0x5ec878(0x1d2)]),_0x5ec878(0x1e0)][_0x5ec878(0x1c9)]('');}function _0x56986f(_0x54660b){const _0x1fb2b3=_0x13b180,_0x5d0676=_0x54660b[_0x1fb2b3(0x1d0)]||0x0;if(!(_0x5d0676>0x0))return 0x0;const _0x28b218=_0x5d0676*(_0x54660b[_0x1fb2b3(0x1eb)]/_0x54660b[_0x1fb2b3(0x1f3)][_0x1fb2b3(0x1f8)]);return _0x28b218>=0.3?_0x28b218:0x0;}async function _0x632bcf(_0x2cdf06){const _0x448122=_0x13b180,_0x449814=_0x2ac04c(_0x2cdf06),_0xfc4196=_0x12d4a6(_0x449814);if(_0xa2a96b[_0x448122(0x1d5)](_0xfc4196))return _0xfc4196;const _0x299082=_0x8644d0(_0x2cdf06),_0x596b7f=_0x56986f(_0x2cdf06);return await _0x4beff()[_0x448122(0x1e1)](Buffer[_0x448122(0x214)](_0x299082),_0xfc4196,{'mode':_0x448122(0x20f)},_0x596b7f),_0xfc4196;}function _0x217232(_0x906549){const _0x307896=_0x13b180,_0x224029=[_0x307896(0x1f2),_0x906549[_0x307896(0x1c2)],_0x906549[_0x307896(0x1c5)],_0x906549[_0x307896(0x1f8)],_0x906549[_0x307896(0x1f1)]][_0x307896(0x1c9)]('|');return _0x33dafd[_0x307896(0x1ac)](_0x307896(0x1cf))[_0x307896(0x1f6)](_0x224029)[_0x307896(0x212)](_0x307896(0x1bb))[_0x307896(0x1dd)](0x0,0x10);}function _0x2e4ca4(_0x24bfa6){const _0x160fc0=_0x13b180;return _0x180cb2[_0x160fc0(0x1c9)](_0x2875c8(),_0x160fc0(0x211)+_0x24bfa6+_0x160fc0(0x215));}function _0x247e7e(_0x5d3a15){const _0x183527=_0x13b180;return[_0x183527(0x1bc),_0x183527(0x1e3)+_0x5d3a15[_0x183527(0x1f8)]+_0x183527(0x1d3)+_0x5d3a15[_0x183527(0x1f1)]+'\x22',_0x183527(0x1c8)+_0x5d3a15[_0x183527(0x1f8)]+'\x20'+_0x5d3a15[_0x183527(0x1f1)]+'\x22>',_0x183527(0x1c1)+_0xa36b86(_0x5d3a15[_0x183527(0x1c2)])+_0x183527(0x203)+_0xa36b86(_0x5d3a15[_0x183527(0x1c5)])+_0x183527(0x1e9),_0x183527(0x1e0)][_0x183527(0x1c9)]('');}async function _0x5c4dd4(_0x76f2b0){const _0x22385d=_0x13b180,_0x47999f=_0x217232(_0x76f2b0),_0x4ec31d=_0x2e4ca4(_0x47999f);if(_0xa2a96b[_0x22385d(0x1d5)](_0x4ec31d))return _0x4ec31d;const _0x5f1956=_0x247e7e(_0x76f2b0);return await _0x4beff()[_0x22385d(0x1e1)](Buffer[_0x22385d(0x214)](_0x5f1956),_0x4ec31d,{'mode':_0x22385d(0x20f)}),_0x4ec31d;}const _0x548460=0x48;function _0x23e4f2(_0x17b23b){const _0x2899e1=_0x13b180,_0x9d9fe7=[_0x2899e1(0x1d4),_0x33dafd[_0x2899e1(0x1ac)](_0x2899e1(0x1cf))[_0x2899e1(0x1f6)](_0x17b23b[_0x2899e1(0x1fe)])[_0x2899e1(0x212)](_0x2899e1(0x1bb)),_0x17b23b[_0x2899e1(0x1b0)],_0x17b23b[_0x2899e1(0x1af)]][_0x2899e1(0x1c9)]('|');return _0x33dafd[_0x2899e1(0x1ac)](_0x2899e1(0x1cf))[_0x2899e1(0x1f6)](_0x9d9fe7)[_0x2899e1(0x212)](_0x2899e1(0x1bb))[_0x2899e1(0x1dd)](0x0,0x10);}function _0x4a311d(_0x29748a){const _0x131321=_0x13b180;return _0x180cb2[_0x131321(0x1c9)](_0x2875c8(),_0x131321(0x1e4)+_0x29748a+_0x131321(0x215));}async function _0x341713(_0x136f0d){const _0x390a6c=_0x13b180,_0x4b5dca=_0x23e4f2(_0x136f0d),_0xdf2364=_0x4a311d(_0x4b5dca);if(_0xa2a96b[_0x390a6c(0x1d5)](_0xdf2364))return _0xdf2364;const _0x5161e2=Buffer[_0x390a6c(0x214)](_0x136f0d[_0x390a6c(0x1fe)],_0x390a6c(0x1c4));let _0x939bf4=_0x548460;try{const _0x4441a2=await _0x4beff()[_0x390a6c(0x1fc)](_0x5161e2),_0x6c7634=_0x4441a2[_0x390a6c(0x1f8)]||0x0,_0x1598f1=_0x4441a2[_0x390a6c(0x1f1)]||0x0;if(_0x6c7634>0x0&&_0x1598f1>0x0){const _0x2b1633=_0x548460*_0x136f0d[_0x390a6c(0x1b0)]/Math[_0x390a6c(0x204)](_0x6c7634,_0x1598f1),_0x41083c=_0x548460*_0x136f0d[_0x390a6c(0x1af)]/Math[_0x390a6c(0x213)](_0x6c7634,_0x1598f1);_0x939bf4=Math[_0x390a6c(0x213)](_0x548460,Math[_0x390a6c(0x204)](_0x2b1633,_0x41083c));}}catch{}return await _0x4beff()[_0x390a6c(0x1e1)](_0x5161e2,_0xdf2364,{'mode':_0x390a6c(0x1b3),'dpi':_0x939bf4}),_0xdf2364;}function _0x208dcf(_0x4fba59){const _0x3c549c=_0x13b180,_0x1e19fd=[_0x3c549c(0x1ed),_0x33dafd[_0x3c549c(0x1ac)](_0x3c549c(0x1cf))[_0x3c549c(0x1f6)](_0x4fba59[_0x3c549c(0x1fe)])[_0x3c549c(0x212)](_0x3c549c(0x1bb)),_0x4fba59[_0x3c549c(0x1f8)],_0x4fba59[_0x3c549c(0x1f1)],_0x4fba59[_0x3c549c(0x1d6)]][_0x3c549c(0x1c9)]('|');return _0x33dafd[_0x3c549c(0x1ac)](_0x3c549c(0x1cf))[_0x3c549c(0x1f6)](_0x1e19fd)[_0x3c549c(0x212)](_0x3c549c(0x1bb))[_0x3c549c(0x1dd)](0x0,0x10);}function _0x1ce489(_0x23d32e){const _0xd4b033=_0x13b180;return _0x180cb2[_0xd4b033(0x1c9)](_0x2875c8(),_0xd4b033(0x1e2)+_0x23d32e+_0xd4b033(0x215));}async function _0x407e2a(_0x155361){const _0x33a279=_0x13b180,_0x364998=_0x208dcf(_0x155361),_0x5300fa=_0x1ce489(_0x364998);if(_0xa2a96b[_0x33a279(0x1d5)](_0x5300fa))return _0x5300fa;const _0x95ca9b=Buffer[_0x33a279(0x214)](_0x155361[_0x33a279(0x1fe)],_0x33a279(0x1c4));return await _0x4beff()[_0x33a279(0x1e1)](_0x95ca9b,_0x5300fa,{'mode':_0x33a279(0x1f8),'value':_0x155361[_0x33a279(0x1f8)]}),_0x5300fa;}async function _0x5b8911(_0x168c21){const _0x2cd438=_0x13b180;if(_0x168c21[_0x2cd438(0x1be)]===_0x2cd438(0x1cb))return{'i':_0x168c21[_0x2cd438(0x1ff)],'p':await _0x632bcf(_0x168c21[_0x2cd438(0x205)])};if(_0x168c21[_0x2cd438(0x1be)]===_0x2cd438(0x20b))return{'i':_0x168c21[_0x2cd438(0x1ff)],'p':await _0x5c4dd4(_0x168c21[_0x2cd438(0x205)])};if(_0x168c21[_0x2cd438(0x1be)]===_0x2cd438(0x1ba))return{'i':_0x168c21[_0x2cd438(0x1ff)],'p':await _0x341713(_0x168c21[_0x2cd438(0x205)])};if(_0x168c21[_0x2cd438(0x1be)]===_0x2cd438(0x1d8))return{'i':_0x168c21[_0x2cd438(0x1ff)],'p':await _0x407e2a(_0x168c21[_0x2cd438(0x205)])};throw new Error(_0x2cd438(0x1f0)+_0x168c21[_0x2cd438(0x1be)]+'\x22');}module[_0x13b180(0x1ce)]={'cacheDir':_0x2875c8,'useCacheDir':_0x383a7c,'rasterizeItem':_0x5b8911,'rasterizeInline':_0x632bcf,'rasterizeRing':_0x5c4dd4,'rasterizeSvgMedia':_0x341713,'rasterizeSvgExact':_0x407e2a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';const
|
|
1
|
+
'use strict';const _0x3d8c97=_0x2683;(function(_0x356eab,_0x2e2050){const _0x3dabf1=_0x2683,_0x3372de=_0x356eab();while(!![]){try{const _0x62517e=-parseInt(_0x3dabf1(0xf9))/0x1*(-parseInt(_0x3dabf1(0xf4))/0x2)+-parseInt(_0x3dabf1(0xf1))/0x3*(-parseInt(_0x3dabf1(0xe3))/0x4)+parseInt(_0x3dabf1(0xe5))/0x5+parseInt(_0x3dabf1(0xe6))/0x6*(-parseInt(_0x3dabf1(0xeb))/0x7)+parseInt(_0x3dabf1(0xfa))/0x8*(parseInt(_0x3dabf1(0xf3))/0x9)+parseInt(_0x3dabf1(0xe8))/0xa+-parseInt(_0x3dabf1(0xf5))/0xb;if(_0x62517e===_0x2e2050)break;else _0x3372de['push'](_0x3372de['shift']());}catch(_0x35aa5b){_0x3372de['push'](_0x3372de['shift']());}}}(_0x5561,0x6b94f));function _0x5561(){const _0x564821=['mJfvufH0u3a','y2f0y2G','mtq2n3zvufLArq','ngvosNvKCW','mti5otiYmJf4tvPfr24','BwvZC2fNzq','AxnbCNjHEq','yxjNDG','nZG5mtLHCgLSuw0','mtK4mtzQu29dAKW','C3rKB3v0','D3jPDgu','lI9TyxnRlxjHC3rLCML6zs1JB3jL','C3rKzxjY','mtqYmdi4D3jXwMD5','y2fJAgveAxi','mJu3ntaZnwLftw1JuG','nKrIweLNCG','C3rYAw5NAwz5','nJy4oty0me1UyuPqwq','BwfZAY1Yyxn0zxjPEMuTD29YA2vYoIbLEhbLy3rLzcbHiePtt04GyxjYyxKGB3iGEYbPDgvTCYWGy2fJAgveAxiGFsbVBIbZDgrPBIaOB3iGyxjNDLSYxsK','DxrMoa','mJyWnJqWmxL0s2jizG','CgfYC2u','CMvHzezPBgvtEw5J','AxrLBxm','DhjPBq','zxHPDa'];_0x5561=function(){return _0x564821;};return _0x5561();}function _0x2683(_0x486086,_0x187efb){_0x486086=_0x486086-0xe3;const _0x5561cc=_0x5561();let _0x2683fe=_0x5561cc[_0x486086];if(_0x2683['OnEUaZ']===undefined){var _0x360453=function(_0x3cd3a9){const _0x5048e2='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x356730='',_0x40daed='';for(let _0x5875ef=0x0,_0x265b53,_0x2187bf,_0x26c7d5=0x0;_0x2187bf=_0x3cd3a9['charAt'](_0x26c7d5++);~_0x2187bf&&(_0x265b53=_0x5875ef%0x4?_0x265b53*0x40+_0x2187bf:_0x2187bf,_0x5875ef++%0x4)?_0x356730+=String['fromCharCode'](0xff&_0x265b53>>(-0x2*_0x5875ef&0x6)):0x0){_0x2187bf=_0x5048e2['indexOf'](_0x2187bf);}for(let _0x246f28=0x0,_0x33a131=_0x356730['length'];_0x246f28<_0x33a131;_0x246f28++){_0x40daed+='%'+('00'+_0x356730['charCodeAt'](_0x246f28)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x40daed);};_0x2683['NSWGwC']=_0x360453,_0x2683['BtxsNX']={},_0x2683['OnEUaZ']=!![];}const _0x5ca2a0=_0x5561cc[0x0],_0x250054=_0x486086+_0x5ca2a0,_0x1a8085=_0x2683['BtxsNX'][_0x250054];return!_0x1a8085?(_0x2683fe=_0x2683['NSWGwC'](_0x2683fe),_0x2683['BtxsNX'][_0x250054]=_0x2683fe):_0x2683fe=_0x1a8085,_0x2683fe;}const _0x356730=require('fs'),{rasterizeItem:_0x40daed,useCacheDir:_0x5875ef}=require(_0x3d8c97(0xfd));function _0x265b53(){const _0x133b79=_0x3d8c97;try{return _0x356730[_0x133b79(0xed)](0x0,_0x133b79(0xea));}catch{return'';}}async function _0x2187bf(){const _0x862bf=_0x3d8c97,_0x26c7d5=process[_0x862bf(0xf8)][0x2]||_0x265b53()[_0x862bf(0xef)]()||'[]',_0x246f28=JSON[_0x862bf(0xec)](_0x26c7d5),_0x33a131=Array[_0x862bf(0xf7)](_0x246f28)?_0x246f28:_0x246f28&&_0x246f28[_0x862bf(0xee)];if(!Array[_0x862bf(0xf7)](_0x33a131))throw new Error(_0x862bf(0xe9));_0x5875ef(Array[_0x862bf(0xf7)](_0x246f28)?null:_0x246f28[_0x862bf(0xe4)]);for(const _0x1d7f1a of _0x33a131){const {i:_0x2eae26,p:_0x202c46}=await _0x40daed(_0x1d7f1a);_0x202c46&&process[_0x862bf(0xfb)][_0x862bf(0xfc)](JSON[_0x862bf(0xe7)]({'i':_0x2eae26,'p':_0x202c46})+'\x0a');}}_0x2187bf()[_0x3d8c97(0xf2)](_0x564c72=>{const _0xf61007=_0x3d8c97;process[_0xf61007(0xfe)][_0xf61007(0xfc)](_0x564c72&&_0x564c72[_0xf61007(0xf6)]||String(_0x564c72)),process[_0xf61007(0xf0)](0x1);});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';const
|
|
1
|
+
'use strict';const _0xe3d9f4=_0xb79a;(function(_0x39887e,_0xad6be5){const _0x3a6be3=_0xb79a,_0x2de77f=_0x39887e();while(!![]){try{const _0x30067b=-parseInt(_0x3a6be3(0xd6))/0x1+parseInt(_0x3a6be3(0xeb))/0x2+-parseInt(_0x3a6be3(0xdf))/0x3*(-parseInt(_0x3a6be3(0xe5))/0x4)+parseInt(_0x3a6be3(0xec))/0x5*(-parseInt(_0x3a6be3(0xe4))/0x6)+parseInt(_0x3a6be3(0xe3))/0x7+parseInt(_0x3a6be3(0xe2))/0x8*(parseInt(_0x3a6be3(0xe0))/0x9)+parseInt(_0x3a6be3(0xd7))/0xa*(-parseInt(_0x3a6be3(0xe6))/0xb);if(_0x30067b===_0xad6be5)break;else _0x2de77f['push'](_0x2de77f['shift']());}catch(_0x5e4356){_0x2de77f['push'](_0x2de77f['shift']());}}}(_0xedf6,0x87f24));function _0xedf6(){const _0x41979d=['CMvZDwX0CW','C2LNBMfS','zxjYB3i','mtG3mtu5mMfttfLcEq','mtKWntb5BNnJqNq','Cg9ZDe1LC3nHz2u','mtaWodi1m3bkCg12rW','mtu3mdKZmtbsq0TysNy','D29YA2vYx3rOCMvHzhm','C3rVCMu','BwvZC2fNzq','lI9TyxnRlxjHC3rLCML6zs1JB3jL','y2fJAgveAxi','AxrLBxm','Cg9YDa','mJq4nde5mLrfDKPsvG','oxvksvPWAW','ChvZAa','ndG0oty4ohvkz0zfvq','nJq1nteXm2zPsgjHBG','mJq2v1rYDKzt','ngHlAxP3AW','mtfnEu9wEeS','BM90Awz5'];_0xedf6=function(){return _0x41979d;};return _0xedf6();}const {workerData:_0x3b6a3b}=require(_0xe3d9f4(0xd8)),{rasterizeItem:_0x589e26,useCacheDir:_0x2b7f9c}=require(_0xe3d9f4(0xdb)),_0x5774d7=_0x3b6a3b[_0xe3d9f4(0xde)],_0x283277=new Int32Array(_0x3b6a3b[_0xe3d9f4(0xe9)]);function _0xb79a(_0x26f3cb,_0x116505){_0x26f3cb=_0x26f3cb-0xd5;const _0xedf6c6=_0xedf6();let _0xb79a3d=_0xedf6c6[_0x26f3cb];if(_0xb79a['gBwHGM']===undefined){var _0x88940d=function(_0x43cca5){const _0xcccb26='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3b6a3b='',_0x589e26='';for(let _0x2b7f9c=0x0,_0x5774d7,_0x283277,_0x3b27bb=0x0;_0x283277=_0x43cca5['charAt'](_0x3b27bb++);~_0x283277&&(_0x5774d7=_0x2b7f9c%0x4?_0x5774d7*0x40+_0x283277:_0x283277,_0x2b7f9c++%0x4)?_0x3b6a3b+=String['fromCharCode'](0xff&_0x5774d7>>(-0x2*_0x2b7f9c&0x6)):0x0){_0x283277=_0xcccb26['indexOf'](_0x283277);}for(let _0x1dae9c=0x0,_0x3248ec=_0x3b6a3b['length'];_0x1dae9c<_0x3248ec;_0x1dae9c++){_0x589e26+='%'+('00'+_0x3b6a3b['charCodeAt'](_0x1dae9c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x589e26);};_0xb79a['ihhBIM']=_0x88940d,_0xb79a['jpyjkw']={},_0xb79a['gBwHGM']=!![];}const _0x42e07f=_0xedf6c6[0x0],_0x40e320=_0x26f3cb+_0x42e07f,_0x2ae7b7=_0xb79a['jpyjkw'][_0x40e320];return!_0x2ae7b7?(_0xb79a3d=_0xb79a['ihhBIM'](_0xb79a3d),_0xb79a['jpyjkw'][_0x40e320]=_0xb79a3d):_0xb79a3d=_0x2ae7b7,_0xb79a3d;}_0x5774d7['on'](_0xe3d9f4(0xda),async _0x3b27bb=>{const _0x4657f0=_0xe3d9f4,_0x1dae9c={'id':_0x3b27bb['id']};try{_0x2b7f9c(_0x3b27bb[_0x4657f0(0xdc)]);const _0x3248ec=[];for(const _0x36cb48 of _0x3b27bb[_0x4657f0(0xdd)]){const {i:_0x1e5706,p:_0x4c46d8}=await _0x589e26(_0x36cb48);_0x4c46d8&&_0x3248ec[_0x4657f0(0xe1)]({'i':_0x1e5706,'p':_0x4c46d8});}_0x1dae9c[_0x4657f0(0xe8)]=_0x3248ec;}catch(_0x59a45e){_0x1dae9c[_0x4657f0(0xea)]=_0x59a45e&&_0x59a45e[_0x4657f0(0xda)]||String(_0x59a45e);}_0x5774d7[_0x4657f0(0xd5)](_0x1dae9c),Atomics[_0x4657f0(0xd9)](_0x283277,0x0,0x1),Atomics[_0x4657f0(0xe7)](_0x283277,0x0);});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`}
|
|
1
|
+
"use strict";var d=Object.defineProperty;var a=(e,t)=>d(e,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.serializeM0vFile=serializeM0vFile,exports.parseM0vFile=parseM0vFile;const serializeM0File_1=require("../m0/serializeM0File");function serializeM0vFile(e){const t=e.created??new Date;if(e.outputs!==void 0&&(e.outputs===null||typeof e.outputs!="object"||Array.isArray(e.outputs)))throw new Error("serializeM0vFile: outputs must be an object map when provided");if(e.assets!==void 0&&(e.assets===null||typeof e.assets!="object"||Array.isArray(e.assets)))throw new Error("serializeM0vFile: assets must be an object map when provided");if(e.brand!==void 0&&(e.brand===null||typeof e.brand!="object"||Array.isArray(e.brand)))throw new Error("serializeM0vFile: brand must be an object map when provided");const r=e.app??null,i=e.appVersion??null,s=normalizeMeta(e.meta??null),n={format:"m0v",version:1,created:(0,serializeM0File_1.formatISO)(t),app:r&&r.trim()!==""?r.trim():null,appVersion:i&&i.trim()!==""?i.trim():null,meta:s,custom:e.custom??null};return e.outputs&&Object.keys(e.outputs).length>0&&(n.outputs=e.outputs),e.assets&&Object.keys(e.assets).length>0&&(n.assets=e.assets),e.brand&&Object.keys(e.brand).length>0&&(n.brand=e.brand),JSON.stringify(n,null,2)+`
|
|
2
|
+
`}a(serializeM0vFile,"serializeM0vFile");function normalizeMeta(e){if(!e)return null;const t={},r=["title","author","source","note"];for(const i of r){const s=e[i];if(s!=null){const n=s.trim();n!==""&&(t[i]=n)}}return Object.keys(t).length?t:null}a(normalizeMeta,"normalizeMeta");function parseM0vFile(e){if(typeof e!="string")throw new Error("parseM0vFile: input must be a string");let t;try{t=JSON.parse(e)}catch{throw new Error("parseM0vFile: invalid JSON")}if(!isPlainObject(t))throw new Error("parseM0vFile: expected JSON object");const r=t;if(r.format!=="m0v")throw new Error(`parseM0vFile: expected format "m0v", got "${String(r.format)}"`);if(r.version!==1)throw new Error(`parseM0vFile: expected version 1, got ${String(r.version)}`);const i=typeof r.created=="string"?r.created.trim():"";if(!i)throw new Error("parseM0vFile: missing created timestamp");const s=parseOptionalMap(r.outputs,"outputs"),n=parseOptionalMap(r.assets,"assets"),u=parseOptionalMap(r.brand,"brand"),l=parseStringOrNull(r.app),c=parseStringOrNull(r.appVersion),f=parseMetaOrNull(r.meta),o={format:"m0v",version:1,created:i,app:l,appVersion:c,meta:f,custom:r.custom===void 0?null:r.custom};return s!==void 0&&(o.outputs=s),n!==void 0&&(o.assets=n),u!==void 0&&(o.brand=u),o}a(parseM0vFile,"parseM0vFile");function parseOptionalMap(e,t){if(e!==void 0){if(e===null)throw new Error(`parseM0vFile: invalid ${t} (expected object map or omit, got null)`);if(!isPlainObject(e))throw new Error(`parseM0vFile: invalid ${t} (expected object map, got `+(Array.isArray(e)?"array":typeof e)+")");return e}}a(parseOptionalMap,"parseOptionalMap");function parseStringOrNull(e){if(e==null||typeof e!="string")return null;const t=e.trim();return t||null}a(parseStringOrNull,"parseStringOrNull");function parseMetaOrNull(e){if(e==null)return null;if(!isPlainObject(e))throw new Error("parseM0vFile: invalid meta (expected object or null)");const t=e,r={};for(const i of["title","author","source","note"]){const s=t[i];if(typeof s=="string"){const n=s.trim();n&&(r[i]=n)}}return Object.keys(r).length?r:null}a(parseMetaOrNull,"parseMetaOrNull");function isPlainObject(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}a(isPlainObject,"isPlainObject");
|
|
@@ -45,6 +45,7 @@ disposes).
|
|
|
45
45
|
| Overlays, passthroughs, identity | `skills/overlay-semantics.md`, `skills/passthrough-semantics.md`, `skills/identity.md` |
|
|
46
46
|
| Build a template | `templates/philosophy-and-contract.md` → `templates/construction-strategy.md` → `templates/geometry-recipes.md` |
|
|
47
47
|
| Template perf | `templates/patterns/perf-authoring-rules.md` |
|
|
48
|
+
| A template that goes to paper (cards, banners, posters) | `templates/patterns/print-authoring.md` |
|
|
48
49
|
| Data-driven templates | `templates/data-pipeline.md` |
|
|
49
50
|
| Read/write `.m0` / `.m0c` / `.m0p` / `.m0v` | `file-formats/m0p-and-custom-field.md` |
|
|
50
51
|
| Render via the CLI | `runtime/cli-usage.md` |
|
|
@@ -23,7 +23,7 @@ These features shipped together in April 2026. They are foundational to v2 work
|
|
|
23
23
|
| `.m0c` | JSON: DSL + StableKey-keyed labels + derive image + meta | One layout, with labels / overlays / derive thumbnail / `custom.*` |
|
|
24
24
|
| `.m0g` | `.m0c`-shaped JSON with `format: "m0g"` + the `M0cGold` `gold` block | A **m0saic golden** ("mogging") — a tried-and-true, signed-off layout; `#mogging` comment-line convention (`types.ts`) |
|
|
25
25
|
| `.m0p` | JSON: pack of `.m0c`-shaped variants under shared identity | Multiple coordinated variants (cross-canvas, brand pack, content set, themed collection) |
|
|
26
|
-
| `.m0v` | JSON: `outputs` / `assets` / `custom` (`src/m0v/m0vFile.ts`) | **Mosaic Vocabulary** — user-tier shared brand language: output presets,
|
|
26
|
+
| `.m0v` | JSON: `outputs` / `assets` / `brand` / `custom` (`src/m0v/m0vFile.ts`) | **Mosaic Vocabulary** — user-tier shared brand language: output presets, asset paths, and since 2026-10-19 the `brand` slot (the shop's name, logo, accent, site, … as strings — Mosaic Desktop's "Your brand" profile, `~/m0saic/solutions/<id>/brand.m0v`; see `templates/reference/brand-schema.md`). Every slot optional; palette, typography still ride in `custom`. CLI `--m0v <path>` reads `outputs`; `m0saic open` accepts it |
|
|
27
27
|
|
|
28
28
|
`.m0` and `.m0c` are unchanged by the later formats' arrival — each is purely additive.
|
|
29
29
|
This doc covers `.m0`/`.m0c`/`.m0p` in depth; `.m0g` and `.m0v` have their own type
|
|
@@ -44,7 +44,11 @@ m0saic layout.m0 # .m0 / .m0c paths also accepted (index.ts:~7184-7270
|
|
|
44
44
|
## Command table
|
|
45
45
|
|
|
46
46
|
18 `.command(` registrations in `index.ts` + `telemetry` registered by
|
|
47
|
-
`registerTelemetryCommand(program)` (index.ts:~7138 → `utils/telemetry.ts:~372`)
|
|
47
|
+
`registerTelemetryCommand(program)` (index.ts:~7138 → `utils/telemetry.ts:~372`) +
|
|
48
|
+
`community` (`fetch`), `install`, `uninstall` registered by
|
|
49
|
+
`registerTemplateInstallCommands(program, …)` (`utils/templateInstall.ts`, since
|
|
50
|
+
0.4.0; also listed in `inlineDsl.ts` `KNOWN_SUBCOMMANDS` so they are never read as
|
|
51
|
+
an inline m0 string).
|
|
48
52
|
Two of the 18 sit inside `if (DEV_MODE) { … }` and are absent from the public
|
|
49
53
|
help — see the DEV-GATED rows below.
|
|
50
54
|
|
|
@@ -58,12 +62,15 @@ help — see the DEV-GATED rows below.
|
|
|
58
62
|
| Command (index.ts line) | What it does |
|
|
59
63
|
|---|---|
|
|
60
64
|
| `make <input>` (~5095) | Primary render: template id / `.mosaic` / `.mosaicx` → video or image. Full flag surface below. |
|
|
61
|
-
| `hello-world` | The first render — a thin alias for `make @m0saic/hello-world/v1` (the brand card; output defaults to `hello-world.mp4`). With `--template-repo <path...>`
|
|
65
|
+
| `hello-world` | The first render — a thin alias for `make @m0saic/hello-world/v1` (the brand card; output defaults to `hello-world.mp4`). With `--template-repo <path...>` it renders the loaded folder's **front door** instead: the first flagged repo (load order) whose `repo.helloWorld` names a template that registered (installed repos never are the front door; the community one is `m0saic make @m0saic-community/hello-world/v1` after `m0saic community fetch`), announced as `Front door: <id> — <repo>'s hello-world`; no repos, or none that name one → the core card with a one-line why. Takes `-o -w -h --fps --durationMs --props --quiet --verbose` (no engine surface). Picker: the CLI source (not published). |
|
|
62
66
|
| `make-wireframe` (~5462) | Static wireframe PNG from `--m0 <string>` or `--mfile <path>`. |
|
|
63
67
|
| `make-wireframe-animated` (~5568) | Animated wireframe MP4 from `--m0`/`--mfile`; extra `--disable-ui`. |
|
|
64
68
|
| `flatten <input>` (~5680) | Inline all `type:mosaic` children of a `.mosaic`/template into one flat JSON doc — no render. |
|
|
65
69
|
| `resolve <input>` (~5800) | `.mosaicx` recipe → resolved `.mosaic` provenance doc, no ffmpeg; `--flatten` also inlines children. |
|
|
66
|
-
| `list-templates` (~
|
|
70
|
+
| `list-templates` (~6103) | Print registered template ids, grouped by source (since 0.4.0): `Built-in: N templates`, then `Installed <repo id> (<name>): <tag>, signed|unsigned, N templates` (community first), then `Folder <path>, <repo id> (<name>): N templates` for `--template-repo`. A heading is one line that never starts with `@`; ids stay one per line, flush left. `--source <name>` lists one group: `builtin`, `community`, or a repo id with or without `@` (any case); an unknown name exits 1 and lists the sources. `--json` = a flat sorted id array, filtered by `--source`. Annotates primitive/internal/deprecated. Grouping: the CLI source (not published). |
|
|
71
|
+
| `community fetch` | **Since 0.4.0.** Install or update the official community templates from their latest signed GitHub release bundle, or report them current (`--force` reinstalls, `--quiet`). A valid signature is required. See "Installed template repos" below. Impl: the CLI source (not published). |
|
|
72
|
+
| `install [source]` | **Since 0.4.0.** Install a template repo from its release bundle: `owner/repo[@tag]`, a GitHub repo or release page, a `bundle.json` / `.tgz` URL, or a bundle on disk. No source: list what is installed (`--json`). A third-party repo: once `bundle.json` is read, the third-party code notice, then a question (repo, tag, templates, size; default No) before the runtime downloads; `--yes` skips it and is required with no terminal (CI, pipes: exit 1, nothing installed). A repo signed by m0saic (second-party) gets one line instead, no question. Given the official community repo in any GitHub form, it runs `community fetch` instead. A private repo needs its access key: `--key-env <name>`, then `M0SAIC_REPO_KEY`, then the key saved for it; in a terminal it asks once and saves it. `--force`, `--quiet`. |
|
|
73
|
+
| `uninstall <repoId>` | **Since 0.4.0.** Remove an installed template repo (files + entry) and its saved access key, if any; exit 1 with the installed ids when it is not installed. |
|
|
67
74
|
| `doctor <repoDir>` | **Public since 0.2.0** (dev-gated at 0.1.0; founder ruling 2026-09-16, BURN-DOWN D5 → publish). Run the template conventions over a template repo folder — the same checks its build gate (`tools/check-registry.mjs`) runs, from outside (agents, reviewers, forks, CI on a fork): definition-time + render-time conventions (the 13 throw-posture ones incl. `latticeSmooth`) and, when the repo commits `layout-fingerprints/` or `.layout.m0` sidecars, the fingerprint diff. `--json` (one object: `ok, repo, mode, loadDiagnostics, rendered, skipped, errors, warnings, notes, fingerprints, conventions`), `--sweep` (also render on the standard 1080p canvases → `canvasEnvelope`), `--entry <path>`, `--src <dir>`. Loads through `loadTemplateRepoFromPath` under the external origin scope, so conventions RECORD rather than throw and one bad template never hides the rest. **Runs the repo's template module bodies in-process** — prints a trust warning to stderr (not under `--json`). Exit 1 on any error-severity finding or a fatal load diagnostic. It is the pack-publishing contract for community/starter authors ("the publish requirement for packs"). Impl: the CLI source (not published); locked public by `__tests__/cli.surface.test.js`. |
|
|
68
75
|
| `browse-templates` (~6033) | **DEV-GATED** (whole command inside `if (DEV_MODE)`, 4792): interactive TTY picker (template → variant → confirm → delegates to `make`). It drives the E2E variant matrix and writes to `test-output/` — a development harness, not a user surface. |
|
|
69
76
|
| `momo <message…>` (~6282) | **DEV-GATED** (whole command inside `if (DEV_MODE)`, 5040): relay English geometry instruction to Momo in a running Mosaic Desktop over the loopback bridge; exit 0 applied / 2 not-applied / 1 couldn't-run. |
|
|
@@ -177,8 +184,9 @@ mosaic; prints `Validation DEGRADED`), `--report` (`.output.json` /
|
|
|
177
184
|
`--keep-temp`, `--quiet`, `--verbose`, `--prefer-pretty-m0` /
|
|
178
185
|
`--prefer-canonical-m0` (printed-m0 form only; note: NOT `--prefer-*-m0saic`),
|
|
179
186
|
`--background-color <color>`, `--template-repo <path...>` +
|
|
180
|
-
`--template-repo-entry <file>` (
|
|
181
|
-
|
|
187
|
+
`--template-repo-entry <file>` (a template repo folder for one run). Installed
|
|
188
|
+
repos load with no flag; `--community-repo` was removed in 0.4.0 — see
|
|
189
|
+
"Installed template repos" and the community gate below.
|
|
182
190
|
|
|
183
191
|
**Encode surface** (index.ts:~4231-4338, mirrors the Make page's Advanced panel;
|
|
184
192
|
precedence: flags > `.m0v` preset > doc-on-disk > engine default):
|
|
@@ -235,34 +243,140 @@ and neither is `doctor` (public since 0.2.0).
|
|
|
235
243
|
> `momo` / `browse-templates` finds hits; that is the router table, not the
|
|
236
244
|
> gated implementation.
|
|
237
245
|
|
|
238
|
-
## External template repos and the community gate (2026-09-16)
|
|
239
|
-
|
|
240
|
-
**Three reserved
|
|
241
|
-
namespaces `@m0saic
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
`
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
246
|
+
## External template repos and the community gate (2026-09-16; installs 2026-10-13)
|
|
247
|
+
|
|
248
|
+
**Three reserved namespaces and one reserved repo id, exact-match, nothing else
|
|
249
|
+
is checked:** template namespaces `@m0saic/`, `@m0saic-dev/`, `@m0saic-community/`
|
|
250
|
+
and repo id `@m0saic-community` (`RESERVED_TEMPLATE_NAMESPACES` /
|
|
251
|
+
`RESERVED_COMMUNITY_REPO_ID` in `index.ts`; registry compare is case-insensitive,
|
|
252
|
+
`templateRegistry.ts`). Every other namespace / repo id is open. A `--template-repo`
|
|
253
|
+
folder never gets a grant in a shipped build.
|
|
254
|
+
|
|
255
|
+
**Installed template repos (CLI 0.4.0).** `m0saic community fetch` and
|
|
256
|
+
`m0saic install <source>` put release bundles (`bundle.json` + `runtime.tgz`,
|
|
257
|
+
written by https://github.com/m0saic-project/m0saic-community-templates/blob/main/tools/pack-bundle.mjs — the starter's
|
|
258
|
+
`npm run bundle` — and attached to a GitHub release; previews and samples are
|
|
259
|
+
never downloaded) into `~/m0saic/template-repos/` (`M0SAIC_ROOT` moves it):
|
|
260
|
+
`installed.json` + one unpacked runtime per repo at `<slug>/<tag or sha-…>/`.
|
|
261
|
+
The store, download and checks are `@m0saic/product` `templateBundle.ts` (index
|
|
262
|
+
parse, source resolution, download with a 30 s idle timeout + HTTP Range resume +
|
|
263
|
+
size/sha256 checks, an extractor that writes only regular files and folders —
|
|
264
|
+
links, devices, `..`, absolute paths, backslashes, `node_modules`,
|
|
265
|
+
Windows-illegal names and duplicates are refused) and `installedTemplateRepos.ts`
|
|
266
|
+
(lock, staging + swap, the signature and reserved-namespace checks). `community
|
|
267
|
+
fetch` reads `github.com/m0saic-project/m0saic-community-templates/releases/latest/
|
|
268
|
+
download/bundle.json` (`M0SAIC_COMMUNITY_GITHUB_REPO` overrides; the bundle must
|
|
269
|
+
still verify) and installs, updates, or reports current; a signed install that no
|
|
270
|
+
longer verifies is reinstalled. Install refusals: `not-signed` (any
|
|
271
|
+
`@m0saic-community` bundle that does not verify — dev builds also take an
|
|
272
|
+
unsigned one), `reserved-namespace` (manifest ids in a reserved namespace,
|
|
273
|
+
unless the verified community repo), `check-failed` (the CLI loads the staged
|
|
274
|
+
copy once, `checkStagedTemplateRepo`, before it replaces anything),
|
|
275
|
+
`wrong-repo`, size / hash / tree mismatches, `busy` (another install holds
|
|
276
|
+
`.lock`), `declined` (the question below answered no, cancelled, or no terminal
|
|
277
|
+
and no `--yes`).
|
|
278
|
+
|
|
279
|
+
**Asking first (2026-10-13).** `install` reads `bundle.json`, then decides
|
|
280
|
+
(product `installTemplateBundle({ confirm })`: the hook runs after the index and
|
|
281
|
+
the "current" check, before the runtime download, and the store lock is taken
|
|
282
|
+
after it, so an open question never holds `.lock`; false throws `declined`). A
|
|
283
|
+
copy that is already current is reported with no question. A third-party repo
|
|
284
|
+
(a bare `.tgz` too) gets the notice, then `Install @acme (Acme Templates)
|
|
285
|
+
v2026.10.1 (12 templates, 640 KB)?` (`Update @acme v2026.10.0 → v2026.10.1
|
|
286
|
+
(…)?`, `Reinstall …?` for `--force` over the same tag, `Install the template
|
|
287
|
+
repo at <source>?` with no `bundle.json`), default No: no prints `Nothing
|
|
288
|
+
installed.`, exit 1. With no terminal (stdin or stdout not a TTY, or `CI` set)
|
|
289
|
+
and no `--yes`: `✗ Not installed: m0saic asks before it installs a template
|
|
290
|
+
repo, and there is no terminal to ask on.` + `Approve it explicitly: m0saic
|
|
291
|
+
install <source> --yes`, exit 1, the runtime never downloaded (the `setup`
|
|
292
|
+
rule). `--yes` never asks. The notice prints once per install, never at load.
|
|
293
|
+
|
|
294
|
+
**One way in for the community templates.** `community fetch` never asks.
|
|
295
|
+
`install` given the community repo's GitHub releases in any form
|
|
296
|
+
(`owner/repo[@tag]`, the repo or a release page, a release file's URL; product
|
|
297
|
+
`isCommunityBundleSource`) prints `The community templates install with m0saic
|
|
298
|
+
community fetch; running that.` and runs it: the same pins (signed only, repo id
|
|
299
|
+
`@m0saic-community` only), recorded as `community`, a tag kept
|
|
300
|
+
(`fetchCommunityTemplates({ source })`). A `@m0saic-community` bundle from
|
|
301
|
+
anywhere else (one packed on disk, tested before it is published) installs
|
|
302
|
+
through `install` with no notice and no question, printing
|
|
303
|
+
`@m0saic-community is m0saic's official community repo: it installs only if
|
|
304
|
+
m0saic's signature verifies.`: safe on an unverified claim, since a bundle naming
|
|
305
|
+
that repo id installs only if it verifies and an index that disagrees with the
|
|
306
|
+
manifest inside is refused. A community not-found says `No community templates
|
|
307
|
+
release there.` (a third-party one points at m0saic.io/developers/bundles).
|
|
308
|
+
|
|
309
|
+
**Three tiers (2026-10-13).** First-party: the built-in templates and the community
|
|
310
|
+
repo (signed; the only holder of the reserved namespaces). Second-party: a repo
|
|
311
|
+
signed by m0saic in its own namespace (one m0saic built for a customer, signed with
|
|
312
|
+
`scripts/sign-template-repo.mjs` like the starters; the starters land here too).
|
|
313
|
+
Third-party: unsigned. `install` acts on `bundle.json`'s `signed` before the
|
|
314
|
+
download: a second-party bundle prints `<repo id> (<name>) is signed by m0saic: it
|
|
315
|
+
installs only if that signature verifies.`, with no third-party notice, no question
|
|
316
|
+
and no `--yes` needed. The product refuses any bundle whose `bundle.json` says signed
|
|
317
|
+
and whose signature does not verify (`not-signed`: `bundle.json says it is signed by
|
|
318
|
+
m0saic, but the signature does not verify (<reason>)`), before the CLI's load check
|
|
319
|
+
runs any code; it is never installed unsigned. A signature is not a namespace grant:
|
|
320
|
+
a signed repo other than the community repo using reserved ids is still
|
|
321
|
+
`reserved-namespace`.
|
|
322
|
+
|
|
323
|
+
**Private repos (an access key, 2026-10-13).** A private GitHub repo that publishes
|
|
324
|
+
bundles installs like any other, plus an access key: today a fine-grained GitHub
|
|
325
|
+
token its owner hands out (that repo, Contents read-only). The key comes from
|
|
326
|
+
`--key-env <NAME>` (the variable must be set; a source that is not a GitHub release
|
|
327
|
+
exits 1), then `M0SAIC_REPO_KEY`, then the key saved for that owner/repo in
|
|
328
|
+
`~/m0saic/template-repo-keys.json` (mode 0600, by lowercase owner/repo). There is no
|
|
329
|
+
`--key <value>` flag (shell history, process lists). In a terminal, a GitHub source
|
|
330
|
+
that answers not-found with no key, or refuses the key (`auth-failed`, `no-access`),
|
|
331
|
+
prints why and asks `Access key for owner/repo (Enter to stop)` (masked), retries,
|
|
332
|
+
and saves a key that worked (`Saved the access key for owner/repo (<file>); updates
|
|
333
|
+
use it.`); keys from the environment are never saved. With no terminal, a GitHub
|
|
334
|
+
not-found adds `A private repo needs its access key: run this in a terminal to enter
|
|
335
|
+
it, or set M0SAIC_REPO_KEY.` Transport: `GET api.github.com/repos/<o>/<r>/releases/
|
|
336
|
+
latest` (or `/tags/<tag>`) lists the assets, `bundle.json` is the index, and each
|
|
337
|
+
file is `GET …/releases/assets/<id>` with `Accept: application/octet-stream` and
|
|
338
|
+
`redirect: manual`; GitHub's redirect is followed without the key, which is only ever
|
|
339
|
+
sent to `https://api.github.com` (`downloadToFile` refuses any other host). Every
|
|
340
|
+
GitHub release form carries `githubRelease` (owner/repo[@tag], the repo and release
|
|
341
|
+
pages, release file URLs; product `resolveKeyedGitHubSource`). Errors: `auth-failed`
|
|
342
|
+
(401), `no-access` (404/403 with a key; a used-up rate limit is `http-error`).
|
|
343
|
+
Records gain `github` ("owner/repo", lowercase, on any GitHub install) and
|
|
344
|
+
`access: "key"`, never the key; `m0saic install` lists keyed repos `private`;
|
|
345
|
+
`uninstall` deletes the saved key (`✓ removed … and its saved access key`). Access
|
|
346
|
+
ending changes nothing installed (it keeps working offline); updates stop.
|
|
347
|
+
|
|
348
|
+
**Loading.** `make`, `hello-world`, `list-templates` and `mcp` load the installed
|
|
349
|
+
repos with no flag, once per process (the MCP server sees a new install after a
|
|
350
|
+
restart), after any `--template-repo` folders — a folder with the same repo id
|
|
351
|
+
wins (the developer's clone over its installed release) — and quietly (no notice,
|
|
352
|
+
no "Loaded" line). An installed repo that fails to load is skipped with one
|
|
353
|
+
warning instead of stopping the command. Installed repos never become
|
|
354
|
+
`hello-world`'s front door. A not-registered `@m0saic-dev/…` /
|
|
355
|
+
`@m0saic-community/…` id adds the hint `m0saic community fetch` when the
|
|
356
|
+
community templates are not installed.
|
|
357
|
+
|
|
358
|
+
**The grant.** The reserved namespaces go only to the installed
|
|
359
|
+
`@m0saic-community` whose `release.json` passes `verifyCommunityRelease()`
|
|
360
|
+
(`@m0saic/product` `communityRelease.ts`) against `LICENSE_PUBLIC_KEYS`
|
|
361
|
+
(`publicKeys.ts` — the licence k1 family; rotation = append `k2`, ship, sign with
|
|
362
|
+
`M0SAIC_SIGNING_KID=k2`; older CLIs report `unknown-kid`). It is checked at install
|
|
363
|
+
and again on EVERY load (`gateCommunityRepo`, before the entry module is
|
|
364
|
+
imported): pass → silent; fail → the copy is skipped, never imported (not even as
|
|
365
|
+
an ordinary repo), with one stderr line: `⚠ [template-repo] the installed
|
|
366
|
+
community templates (<tag>) no longer verify (<why>); skipped. Reinstall: m0saic
|
|
367
|
+
community fetch --force`. A `--template-repo` folder whose repo id is
|
|
368
|
+
`@m0saic-community` loads under ordinary rules in a shipped build: its reserved
|
|
369
|
+
ids are refused in ONE collapsed line, `⚠ [template-repo]
|
|
370
|
+
TEMPLATE_ID_RESERVED_NAMESPACE: refused <N> ids in reserved namespaces
|
|
371
|
+
(@m0saic-community/…, @m0saic-dev/…): <id1>, <id2>, <id3>, …` (other rejection
|
|
372
|
+
codes stay one line each) → `❌ Refusing to use template repo` with the hint
|
|
373
|
+
`install its signed release instead: m0saic community fetch` → **exit 1**.
|
|
261
374
|
|
|
262
375
|
**`release.json` v1:** `{ schemaVersion: 1, tag, publishedAt, treeSha256,
|
|
263
376
|
signature: { kid, alg: "ed25519", sig: <base64url> } }` (`--unsigned` omits
|
|
264
377
|
`signature`; the legacy `{ tag, publishedAt }` reads as `missing-signature`).
|
|
265
|
-
Tree = every file under `dist/**` + `template-manifest.json` + `package.json
|
|
378
|
+
Tree = every file under `dist/**` + `template-manifest.json` + `package.json` +
|
|
379
|
+
`template-catalog.json` (each root file only when present),
|
|
266
380
|
sorted POSIX paths, one `"<path>\0<sha256>\n"` line each; `*.json` hashed on
|
|
267
381
|
`JSON.stringify(JSON.parse(text))` (BOM stripped; CRLF / re-indent survive, a
|
|
268
382
|
key reorder does not), other files raw bytes; no symlink is ever followed.
|
|
@@ -287,7 +401,8 @@ repo root from the HOST's own `node_modules` walk — the CLI's vendored copies,
|
|
|
287
401
|
the desktop's bundle, the workspace under dev — never from the checkout. So a
|
|
288
402
|
clone with nothing installed loads anywhere (0.2.0 is the first CLI that
|
|
289
403
|
can), and a `node_modules/@m0saic/template-utils` planted beside a tree is
|
|
290
|
-
never evaluated
|
|
404
|
+
never evaluated through a `--template-repo` folder (an installed copy with a
|
|
405
|
+
`node_modules` beside its tree is refused by the gate before any import). Every
|
|
291
406
|
other specifier (`sharp`, `@twemoji/svg`, relative paths) resolves as before,
|
|
292
407
|
from the checkout. CommonJS only — an `.mjs` entry's static `import`s use the
|
|
293
408
|
ESM resolver, which has no hook.
|
|
@@ -297,12 +412,33 @@ with `M0SAIC_SIGNING_KEY_FILE` (REQUIRED — no default path; production laptop
|
|
|
297
412
|
only) under `M0SAIC_SIGNING_KID` (default `k1`), self-verifies against the
|
|
298
413
|
embedded keys, writes `.gitattributes` (`* -text`). Unset or missing key =
|
|
299
414
|
refused, never a silent unsigned release; `--unsigned` = loud banner, a snapshot
|
|
300
|
-
no shipped CLI trusts.
|
|
415
|
+
no shipped CLI trusts. After the tag: `node tools/pack-bundle.mjs --tag <tag>` in
|
|
416
|
+
the snapshot, then `gh release create <tag> -R m0saic-project/m0saic-community-templates
|
|
417
|
+
bundle/bundle.json bundle/runtime.tgz bundle/previews.tgz` — what `community fetch`
|
|
418
|
+
installs (the mint's next steps print both lines).
|
|
419
|
+
|
|
420
|
+
**Samples (2026-10-20).** A pack may ship sample pictures and clips for people
|
|
421
|
+
with no assets yet: `template-manifest.json` names the folder in
|
|
422
|
+
`repo.assets.samplesDir` (say `"samples"`), and `pack-bundle.mjs` packs every
|
|
423
|
+
file under it as a third archive, `samples.tgz` (`bundle.json.samples {file,
|
|
424
|
+
sha256, size, files, unpackedSize, dir} | null`; `--no-samples` skips it; the
|
|
425
|
+
folder must sit inside the repo, hold no links, and stay under 128 MB unpacked —
|
|
426
|
+
`samples-outside-repo`, `samples-missing`, `samples-too-large`). A manifest that
|
|
427
|
+
names no folder ships none. Mosaic Desktop installs it beside the previews (best
|
|
428
|
+
effort, `installed.json.samples = installed | none | failed`) and shows the
|
|
429
|
+
folder as the Files dock's first place, "Samples" (a plain `samples/` folder in
|
|
430
|
+
a clone or the dev stand-in counts too); the CLI never fetches it. Add
|
|
431
|
+
`bundle/samples.tgz` to the `gh release create` line when the packer prints it.
|
|
301
432
|
|
|
302
433
|
**DEV seam (workspace builds only, inside `if (DEV_MODE)`):** reasons
|
|
303
|
-
`missing-release` / `missing-signature` are still granted —
|
|
304
|
-
|
|
305
|
-
|
|
434
|
+
`missing-release` / `missing-signature` are still granted — for an installed copy
|
|
435
|
+
(and `m0saic install` takes an unsigned community bundle), and for a
|
|
436
|
+
`--template-repo` folder whose repo id is `@m0saic-community`: `✓ community
|
|
437
|
+
templates from <path> (dev build: --template-repo trusted when it verifies or is
|
|
438
|
+
unsigned)` (the in-repo https://github.com/m0saic-project/m0saic-community-templates/blob/main has no `release.json`;
|
|
439
|
+
`scripts/bake-front-door-preview.mjs` and the community render e2e load it this
|
|
440
|
+
way, against the real `~/m0saic` toolchain and license; a FIFO/socket/device tree
|
|
441
|
+
is refused there) — and
|
|
306
442
|
`M0SAIC_COMMUNITY_TRUST_KEY_PEM` (+ `M0SAIC_COMMUNITY_TRUST_KEY_KID`, default `k1`)
|
|
307
443
|
adds a public key for tests. Tampered tree, forged release or unknown kid are
|
|
308
444
|
refused even in dev. The tarball folds `process.env.M0SAIC_DEV` to `"0"` and the
|
|
@@ -310,14 +446,15 @@ audit bans the token, so none of this ships.
|
|
|
310
446
|
|
|
311
447
|
**Lookalikes are a display concern** — one stderr line for UNSIGNED repos, never a
|
|
312
448
|
refusal: `⚠ [template-repo] <subject> is not an official m0saic namespace — only
|
|
313
|
-
@m0saic
|
|
314
|
-
|
|
449
|
+
@m0saic/, @m0saic-dev/, @m0saic-community/ are, and they are signed.` Printed for a
|
|
450
|
+
`--template-repo` folder on every load, for an installed repo once (at install).
|
|
451
|
+
Subject: loaded publisher namespaces starting with `@m0saic` that are not exactly
|
|
452
|
+
the reserved ones →
|
|
315
453
|
else a repoId matching `/m0saic|mosaic/i` → else `"<displayName>" (<repoId>)`.
|
|
316
454
|
Never for repoId exactly `@m0saic-community`: via `--template-repo` that gets
|
|
317
455
|
`⚠ [template-repo] repo id "@m0saic-community" is reserved for the official
|
|
318
|
-
community repo
|
|
319
|
-
|
|
320
|
-
not-verified notice.
|
|
456
|
+
community repo; this folder loads under ordinary rules (the signed release
|
|
457
|
+
installs with: m0saic community fetch).`
|
|
321
458
|
|
|
322
459
|
**Desktop:** `installVersion()` runs `validateCommunityTree` → `verifyCommunityTree`
|
|
323
460
|
(inline-requires `@m0saic/product`) → refuses `tag-mismatch`; failure =
|
|
@@ -327,20 +464,23 @@ not-verified notice.
|
|
|
327
464
|
seed/installed load path (`loadCommunityRepo`) does not re-verify; consent gate
|
|
328
465
|
unchanged.
|
|
329
466
|
|
|
330
|
-
Help
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
467
|
+
Help (test-locked, `__tests__/cli.surface.test.js`): the root epilog lists
|
|
468
|
+
`m0saic community fetch`, `m0saic install <source>` and `--template-repo`;
|
|
469
|
+
`make` / `hello-world` / `list-templates` carry `--template-repo` and point at
|
|
470
|
+
`m0saic community fetch`; `--community-repo` is an unknown option
|
|
471
|
+
(`cli.flags.test.js`). The gate and every on-disk tampering case are locked by
|
|
472
|
+
`__tests__/community-install.signing.e2e.test.js`, the install flow by
|
|
473
|
+
`__tests__/template-install.e2e.test.js`.
|
|
334
474
|
|
|
335
475
|
### Hardening (rounds 2 + 3, 2026-09-16)
|
|
336
476
|
|
|
337
|
-
**Host-first `@m0saic/*` resolution.** https://github.com/m0saic-project/m0saic-packages/blob/main/packages/platform/src/template-repos/hostFirstResolution.ts (wired in `loadTemplateRepoFromPath.ts` via `registerHostFirstRepoRoot(repoRoot)` before the native `import(file://…)` of the entry): ONE wrapper around Node's real `Module._resolveFilename` (found by walking the prototype chain — under Jest `node:module` exports a subclass copy), installed once per process, persistent so render-time lazy requires are covered. A request matching `/^@m0saic\/[^/\\]+(?:\/.*)?$/` whose requesting module lies under a registered root (realpath'd) is resolved from the HOST's own `node_modules` walk — never the checkout's. Everything else (relative paths, non-`@m0saic` deps, host code) is untouched. CJS only. Consequences: a
|
|
477
|
+
**Host-first `@m0saic/*` resolution.** https://github.com/m0saic-project/m0saic-packages/blob/main/packages/platform/src/template-repos/hostFirstResolution.ts (wired in `loadTemplateRepoFromPath.ts` via `registerHostFirstRepoRoot(repoRoot)` before the native `import(file://…)` of the entry): ONE wrapper around Node's real `Module._resolveFilename` (found by walking the prototype chain — under Jest `node:module` exports a subclass copy), installed once per process, persistent so render-time lazy requires are covered. A request matching `/^@m0saic\/[^/\\]+(?:\/.*)?$/` whose requesting module lies under a registered root (realpath'd) is resolved from the HOST's own `node_modules` walk — never the checkout's. Everything else (relative paths, non-`@m0saic` deps, host code) is untouched. CJS only. Consequences: a template repo loads from ANY directory with no `node_modules` (an installed bundle never has one); a planted `node_modules/@m0saic/*` beside a tree is never evaluated through a `--template-repo` folder (and an installed copy carrying one is refused by the gate before import); a starter's `file:` link to `@m0saic/template-utils` resolves to the same physical package — no drift.
|
|
338
478
|
|
|
339
|
-
**Fail-closed tree verification** (`inspectReleaseTree` in `communityRelease.ts`; desktop mirror `inspectCommunityTree` in the Mosaic Desktop / Web app source (not published), run by `installVersion`). A release tree is plain files and directories, nothing else. Refused, in this order after the signature check and before the hash compare: `symlink-in-tree` (ANY symlink — file or dir — under `dist/**`, `dist` itself, a signed root file, or ANY entry at the checkout root); `special-file-in-tree` (FIFO / socket / device anywhere in the same places — a FIFO named `dist/publishers.js` shadows the signed `dist/publishers/` dir and blocks or executes whoever opens it); `foreign-modules` (a `node_modules` dir at the root or under `dist/`, matched case-insensitively). `verifyCommunityRelease` lstats `release.json` before opening it (a FIFO planted there used to hang the verifier). The hasher THROWS `ReleaseTreeError` on a special entry rather than skipping it; `signCommunityRelease` refuses to sign such a tree. The signed payload is `"m0saic-community-release/v1\n<tag>\n<publishedAt>\n<treeSha256>\n"`. The CLI
|
|
479
|
+
**Fail-closed tree verification** (`inspectReleaseTree` in `communityRelease.ts`; desktop mirror `inspectCommunityTree` in the Mosaic Desktop / Web app source (not published), run by `installVersion`). A release tree is plain files and directories, nothing else. Refused, in this order after the signature check and before the hash compare: `symlink-in-tree` (ANY symlink — file or dir — under `dist/**`, `dist` itself, a signed root file, or ANY entry at the checkout root); `special-file-in-tree` (FIFO / socket / device anywhere in the same places — a FIFO named `dist/publishers.js` shadows the signed `dist/publishers/` dir and blocks or executes whoever opens it); `foreign-modules` (a `node_modules` dir at the root or under `dist/`, matched case-insensitively). `verifyCommunityRelease` lstats `release.json` before opening it (a FIFO planted there used to hang the verifier). The hasher THROWS `ReleaseTreeError` on a special entry rather than skipping it; `signCommunityRelease` refuses to sign such a tree. The signed payload is `"m0saic-community-release/v1\n<tag>\n<publishedAt>\n<treeSha256>\n"`. The CLI's skip line carries the detail for these reasons — `(foreign-modules: node_modules)`; an installed copy that fails is never imported, so a `special-file-in-tree` (an ordinary load provably hangs) cannot block the process; a dev `--template-repo` community folder with one is refused (`❌ Refusing to use template repo` + exit 1).
|
|
340
480
|
|
|
341
481
|
**Community deps.** The `@m0saic-dev/community-m` pack (the only `sharp` / `@twemoji/svg` user) was deleted as defunct on 2026-09-16; both left the community `package.json` and BOTH allowlists (`dep-allowlist.json` ↔ `TEMPLATE_REPO_DEP_ALLOWLIST`, lockstep-tested). Community templates may import only what the hosts ship: `@m0saic/{types,template-utils,dsl-stdlib,platform,dsl}` + `node:path`. A native or third-party runtime dep is a founder decision. `sharp` survives only as a root devDependency for core/templates tests.
|
|
342
482
|
|
|
343
|
-
**Accepted residual.** A third-party `--template-repo` checkout with its own `node_modules` runs its own copies of non-`@m0saic` deps — third-party code, with the notice printed; it cannot obtain a reserved identity that way (adversary-verified). DEV builds (`M0SAIC_DEV=1`, compile-stripped from the tarball) still trust an unsigned
|
|
483
|
+
**Accepted residual.** A third-party `--template-repo` checkout with its own `node_modules` runs its own copies of non-`@m0saic` deps — third-party code, with the notice printed; it cannot obtain a reserved identity that way (adversary-verified). DEV builds (`M0SAIC_DEV=1`, compile-stripped from the tarball) still trust an unsigned community copy (installed, or a `--template-repo` folder) for `missing-release` / `missing-signature` only; a tampered or forged tree is refused even in dev.
|
|
344
484
|
|
|
345
485
|
## Wireframe commands
|
|
346
486
|
|
|
@@ -115,3 +115,10 @@ at t=0 or grind at ~1 fps. That one is neither parse depth nor `geq` eval cost
|
|
|
115
115
|
that wall is engine-internal: `.ai/moat/runtime/macos-swscale-thread-cap.md`
|
|
116
116
|
(absent in the shipped copy; symptom summary: dense still-image canvases freeze
|
|
117
117
|
at t=0 / grind ~1 fps on macOS — the engine's threadGuard mitigates it).
|
|
118
|
+
Since 0.4.0 the same guard also caps every video decoder in a dense command:
|
|
119
|
+
past six threaded video inputs each `-i` takes `-threads K` (K = 32 / inputs,
|
|
120
|
+
between 1 and 4), because each mp4 decoder otherwise keeps a frame-thread pool of
|
|
121
|
+
one thread per core plus that many frames in flight — 22 inputs on an 8 GB machine
|
|
122
|
+
swapped until the kernel panicked. Stills, lavfi graphs and the engine's own qtrle
|
|
123
|
+
intermediates are not counted. Measured on the panic case (16 videos, 5 s at
|
|
124
|
+
1080p, 8 GB): 29 s, 1.3 GB peak, no swap.
|