blue-chestnut-solar-expert 0.0.67 → 0.0.68
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/dist/stencil-library/assets/tutorial4.mp4 +0 -0
- package/dist/{collection/config.js → stencil-library/config-CWfV1nKn.js} +10 -4
- package/dist/stencil-library/config-CWfV1nKn.js.map +1 -0
- package/dist/stencil-library/constants-hboFofU4.js +1522 -0
- package/dist/stencil-library/constants-hboFofU4.js.map +1 -0
- package/dist/stencil-library/decoder-DNOvLSaS.js +39 -0
- package/dist/stencil-library/decoder-DNOvLSaS.js.map +1 -0
- package/dist/stencil-library/deflate-0Vdd6-55.js +21 -0
- package/dist/{esm/deflate-DHgPf9CO.js.map → stencil-library/deflate-0Vdd6-55.js.map} +1 -1
- package/dist/stencil-library/eraser-icon.entry.esm.js.map +1 -0
- package/dist/{components/p-CL74Q4VR.js → stencil-library/eraser-icon.entry.js} +9 -27
- package/dist/stencil-library/eraser-icon.entry.js.map +1 -0
- package/dist/stencil-library/house-icon.entry.esm.js.map +1 -0
- package/dist/{components/p-D8w3bTPO.js → stencil-library/house-icon.entry.js} +9 -27
- package/dist/stencil-library/house-icon.entry.js.map +1 -0
- package/dist/{components/loading-widget.js → stencil-library/icon-selector.entry.esm.js.map} +1 -38
- package/dist/stencil-library/icon-selector.entry.js +47 -0
- package/dist/stencil-library/icon-selector.entry.js.map +1 -0
- package/dist/stencil-library/index-CChkgM3J.js +414 -0
- package/dist/stencil-library/index-CChkgM3J.js.map +1 -0
- package/dist/stencil-library/index-ICfDNUMe.js +4172 -0
- package/dist/stencil-library/index-ICfDNUMe.js.map +1 -0
- package/dist/stencil-library/index.esm.js +13 -1
- package/dist/stencil-library/index.esm.js.map +1 -1
- package/dist/{esm/jpeg-CJLm1GkA.js → stencil-library/jpeg-Dd5nnHR5.js} +11 -3
- package/dist/stencil-library/jpeg-Dd5nnHR5.js.map +1 -0
- package/dist/{components/p-BcVa4_YP.js → stencil-library/lerc-7W4E8EBs.js} +27 -1981
- package/dist/stencil-library/lerc-7W4E8EBs.js.map +1 -0
- package/dist/{esm → stencil-library}/loading-widget.entry.js +3 -3
- package/dist/{components/p-P28NBglk.js.map → stencil-library/loading-widget.entry.js.map} +1 -1
- package/dist/{esm/lzw-DaOzWJUD.js → stencil-library/lzw--P4c0ZHH.js} +10 -4
- package/dist/stencil-library/lzw--P4c0ZHH.js.map +1 -0
- package/dist/stencil-library/map-draw-Cx9WZoKH.js +25567 -0
- package/dist/stencil-library/map-draw-Cx9WZoKH.js.map +1 -0
- package/dist/stencil-library/map-draw.entry.esm.js.map +1 -0
- package/dist/stencil-library/map-draw.entry.js +12 -0
- package/dist/stencil-library/map-draw.entry.js.map +1 -0
- package/dist/stencil-library/map-selector.entry.esm.js.map +1 -0
- package/dist/{components/p-C5QieOat.js → stencil-library/map-selector.entry.js} +164 -96
- package/dist/stencil-library/map-selector.entry.js.map +1 -0
- package/dist/{components/loading-widget.js.map → stencil-library/marker-icon.entry.esm.js.map} +1 -1
- package/dist/{components/p-Umz6nJIv.js → stencil-library/marker-icon.entry.js} +9 -27
- package/dist/stencil-library/marker-icon.entry.js.map +1 -0
- package/dist/stencil-library/move-icon.entry.esm.js.map +1 -0
- package/dist/{components/p-FdEV2qPo.js → stencil-library/move-icon.entry.js} +9 -27
- package/dist/stencil-library/move-icon.entry.js.map +1 -0
- package/dist/{components/p-DTXeHbuh.js.map → stencil-library/octagon-minus-icon.entry.esm.js.map} +1 -1
- package/dist/{components/p-BJLO76Yi.js → stencil-library/octagon-minus-icon.entry.js} +9 -27
- package/dist/stencil-library/octagon-minus-icon.entry.js.map +1 -0
- package/dist/{components/p-ByX6QP-E.js → stencil-library/packbits-X3R_utTs.js} +9 -3
- package/dist/stencil-library/packbits-X3R_utTs.js.map +1 -0
- package/dist/stencil-library/pako.esm-CPorU236.js +6881 -0
- package/dist/{esm/pako.esm-B5WTRCh8.js.map → stencil-library/pako.esm-CPorU236.js.map} +1 -1
- package/dist/{components/p-B4X-RCW0.js.map → stencil-library/polygon-buttons.entry.esm.js.map} +1 -1
- package/dist/{cjs/loading-widget.cjs.entry.js → stencil-library/polygon-buttons.entry.js} +16 -10
- package/dist/stencil-library/polygon-buttons.entry.js.map +1 -0
- package/dist/{cjs/loading-widget.cjs.entry.js.map → stencil-library/polygon-information.entry.esm.js.map} +1 -1
- package/dist/{components/p-BFJHTJPM.js → stencil-library/polygon-information.entry.js} +13 -70
- package/dist/stencil-library/polygon-information.entry.js.map +1 -0
- package/dist/stencil-library/raw-BxukYehy.js +20 -0
- package/dist/stencil-library/raw-BxukYehy.js.map +1 -0
- package/dist/stencil-library/search-icon.entry.esm.js.map +1 -0
- package/dist/{components/p-DBwr8xSB.js → stencil-library/search-icon.entry.js} +9 -27
- package/dist/stencil-library/{p-ab0f2031.entry.js → search-icon.entry.js.map} +1 -2
- package/dist/stencil-library/settings-icon.entry.esm.js.map +1 -0
- package/dist/{components/p-DTXeHbuh.js → stencil-library/settings-icon.entry.js} +9 -27
- package/dist/stencil-library/settings-icon.entry.js.map +1 -0
- package/dist/stencil-library/settings-modal.entry.esm.js.map +1 -0
- package/dist/{components/p-B4X-RCW0.js → stencil-library/settings-modal.entry.js} +20 -38
- package/dist/stencil-library/settings-modal.entry.js.map +1 -0
- package/dist/stencil-library/solar-expert.entry.esm.js.map +1 -0
- package/dist/{components/solar-expert.js → stencil-library/solar-expert.entry.js} +14 -150
- package/dist/{components/p-i1uLweD0.js.map → stencil-library/solar-expert.entry.js.map} +1 -1
- package/dist/stencil-library/solar-system-form.entry.esm.js.map +1 -0
- package/dist/stencil-library/solar-system-form.entry.js +553 -0
- package/dist/stencil-library/solar-system-form.entry.js.map +1 -0
- package/dist/stencil-library/stencil-library.esm.js +52 -1
- package/dist/stencil-library/stencil-library.esm.js.map +1 -1
- package/dist/{components/p-eDwaXClX.js → stencil-library/store-CcqrFuBK.js} +24 -3
- package/dist/stencil-library/store-CcqrFuBK.js.map +1 -0
- package/dist/stencil-library/toast-notification.entry.esm.js.map +1 -0
- package/dist/{components/p-P28NBglk.js → stencil-library/toast-notification.entry.js} +9 -30
- package/dist/stencil-library/toast-notification.entry.js.map +1 -0
- package/dist/stencil-library/tool-box.entry.esm.js.map +1 -0
- package/dist/{components/p-i1uLweD0.js → stencil-library/tool-box.entry.js} +27 -35
- package/dist/stencil-library/tool-box.entry.js.map +1 -0
- package/dist/{collection/utils/render/tools.js → stencil-library/tools-BNYKV5H5.js} +14 -8
- package/dist/stencil-library/tools-BNYKV5H5.js.map +1 -0
- package/dist/stencil-library/tutorial-component.entry.esm.js.map +1 -0
- package/dist/{components/p-Dzl6kfPI.js → stencil-library/tutorial-component.entry.js} +42 -35
- package/dist/stencil-library/tutorial-component.entry.js.map +1 -0
- package/dist/stencil-library/undo-icon.entry.esm.js.map +1 -0
- package/dist/{components/p-waOPoUcA.js → stencil-library/undo-icon.entry.js} +9 -27
- package/dist/stencil-library/undo-icon.entry.js.map +1 -0
- package/dist/{collection/utils/utils.js → stencil-library/utils-BCUZxI9u.js} +9 -3
- package/dist/stencil-library/utils-BCUZxI9u.js.map +1 -0
- package/dist/{esm/webimage-BiHardhv.js → stencil-library/webimage-CBrfoxHM.js} +9 -3
- package/dist/{esm/webimage-BiHardhv.js.map → stencil-library/webimage-CBrfoxHM.js.map} +1 -1
- package/dist/types/components/map-draw/map-draw.d.ts +5 -0
- package/dist/types/components/map-draw/tutorial-component.d.ts +7 -0
- package/dist/types/components.d.ts +4 -0
- package/dist/types/types/lang.d.ts +7 -0
- package/package.json +1 -1
- package/dist/cjs/app-globals-I24yU8do.js +0 -10
- package/dist/cjs/app-globals-I24yU8do.js.map +0 -1
- package/dist/cjs/basedecoder-CQuzfSgz.js +0 -116
- package/dist/cjs/basedecoder-CQuzfSgz.js.map +0 -1
- package/dist/cjs/deflate-AzGzQSW2.js +0 -17
- package/dist/cjs/deflate-AzGzQSW2.js.map +0 -1
- package/dist/cjs/eraser-icon_19.cjs.entry.js +0 -31
- package/dist/cjs/eraser-icon_19.cjs.entry.js.map +0 -1
- package/dist/cjs/index-HgRXF6kp.js +0 -1470
- package/dist/cjs/index-HgRXF6kp.js.map +0 -1
- package/dist/cjs/index.cjs.js +0 -7
- package/dist/cjs/index.cjs.js.map +0 -1
- package/dist/cjs/jpeg-Bx3bTm32.js +0 -904
- package/dist/cjs/jpeg-Bx3bTm32.js.map +0 -1
- package/dist/cjs/lerc-v64rYVDy.js +0 -4427
- package/dist/cjs/lerc-v64rYVDy.js.map +0 -1
- package/dist/cjs/loader.cjs.js +0 -18
- package/dist/cjs/loader.cjs.js.map +0 -1
- package/dist/cjs/loading-widget.entry.cjs.js.map +0 -1
- package/dist/cjs/lzw-BmFug486.js +0 -140
- package/dist/cjs/lzw-BmFug486.js.map +0 -1
- package/dist/cjs/packbits-CYx9fB0v.js +0 -35
- package/dist/cjs/packbits-CYx9fB0v.js.map +0 -1
- package/dist/cjs/pako.esm-0mKI6Jik.js +0 -3243
- package/dist/cjs/pako.esm-0mKI6Jik.js.map +0 -1
- package/dist/cjs/raw-DC82yoyr.js +0 -16
- package/dist/cjs/raw-DC82yoyr.js.map +0 -1
- package/dist/cjs/stencil-library.cjs.js +0 -30
- package/dist/cjs/stencil-library.cjs.js.map +0 -1
- package/dist/cjs/webimage-Dc0t2xAB.js +0 -49
- package/dist/cjs/webimage-Dc0t2xAB.js.map +0 -1
- package/dist/collection/collection-manifest.json +0 -31
- package/dist/collection/components/icons/eraser.js +0 -64
- package/dist/collection/components/icons/eraser.js.map +0 -1
- package/dist/collection/components/icons/house.js +0 -64
- package/dist/collection/components/icons/house.js.map +0 -1
- package/dist/collection/components/icons/icon.js +0 -108
- package/dist/collection/components/icons/icon.js.map +0 -1
- package/dist/collection/components/icons/marker.js +0 -64
- package/dist/collection/components/icons/marker.js.map +0 -1
- package/dist/collection/components/icons/move.js +0 -64
- package/dist/collection/components/icons/move.js.map +0 -1
- package/dist/collection/components/icons/octagonMinus.js +0 -64
- package/dist/collection/components/icons/octagonMinus.js.map +0 -1
- package/dist/collection/components/icons/search.js +0 -64
- package/dist/collection/components/icons/search.js.map +0 -1
- package/dist/collection/components/icons/settings.js +0 -64
- package/dist/collection/components/icons/settings.js.map +0 -1
- package/dist/collection/components/icons/undo.js +0 -64
- package/dist/collection/components/icons/undo.js.map +0 -1
- package/dist/collection/components/map-draw/map-draw.js +0 -795
- package/dist/collection/components/map-draw/map-draw.js.map +0 -1
- package/dist/collection/components/map-draw/map-selector.js +0 -246
- package/dist/collection/components/map-draw/map-selector.js.map +0 -1
- package/dist/collection/components/map-draw/polygon-buttons.js +0 -86
- package/dist/collection/components/map-draw/polygon-buttons.js.map +0 -1
- package/dist/collection/components/map-draw/polygon-information.js +0 -211
- package/dist/collection/components/map-draw/polygon-information.js.map +0 -1
- package/dist/collection/components/map-draw/tool-box.js +0 -108
- package/dist/collection/components/map-draw/tool-box.js.map +0 -1
- package/dist/collection/components/map-draw/tutorial-component.js +0 -151
- package/dist/collection/components/map-draw/tutorial-component.js.map +0 -1
- package/dist/collection/components/settings/settings.js +0 -127
- package/dist/collection/components/settings/settings.js.map +0 -1
- package/dist/collection/components/solar-expert/solar-expert.js +0 -241
- package/dist/collection/components/solar-expert/solar-expert.js.map +0 -1
- package/dist/collection/components/solar-system-form/solar-system-form.js +0 -596
- package/dist/collection/components/solar-system-form/solar-system-form.js.map +0 -1
- package/dist/collection/components/widgets/loading-widget.js +0 -18
- package/dist/collection/components/widgets/loading-widget.js.map +0 -1
- package/dist/collection/components/widgets/toast-notification.js +0 -133
- package/dist/collection/components/widgets/toast-notification.js.map +0 -1
- package/dist/collection/config.js.map +0 -1
- package/dist/collection/constants.js +0 -90
- package/dist/collection/constants.js.map +0 -1
- package/dist/collection/index.js +0 -2
- package/dist/collection/index.js.map +0 -1
- package/dist/collection/output.css +0 -1126
- package/dist/collection/store.js +0 -43
- package/dist/collection/store.js.map +0 -1
- package/dist/collection/types/lang.js +0 -2
- package/dist/collection/types/lang.js.map +0 -1
- package/dist/collection/types/shapes.js +0 -2
- package/dist/collection/types/shapes.js.map +0 -1
- package/dist/collection/utils/api.js +0 -93
- package/dist/collection/utils/api.js.map +0 -1
- package/dist/collection/utils/images.js +0 -2
- package/dist/collection/utils/images.js.map +0 -1
- package/dist/collection/utils/lang/english.js +0 -157
- package/dist/collection/utils/lang/english.js.map +0 -1
- package/dist/collection/utils/lang/general.js +0 -30
- package/dist/collection/utils/lang/general.js.map +0 -1
- package/dist/collection/utils/lang/german.js +0 -157
- package/dist/collection/utils/lang/german.js.map +0 -1
- package/dist/collection/utils/lang/spanish.js +0 -157
- package/dist/collection/utils/lang/spanish.js.map +0 -1
- package/dist/collection/utils/render/tools.js.map +0 -1
- package/dist/collection/utils/solar.js +0 -136
- package/dist/collection/utils/solar.js.map +0 -1
- package/dist/collection/utils/theme.js +0 -97
- package/dist/collection/utils/theme.js.map +0 -1
- package/dist/collection/utils/utils.js.map +0 -1
- package/dist/components/eraser-icon.js +0 -11
- package/dist/components/eraser-icon.js.map +0 -1
- package/dist/components/house-icon.js +0 -11
- package/dist/components/house-icon.js.map +0 -1
- package/dist/components/icon-selector.js +0 -11
- package/dist/components/icon-selector.js.map +0 -1
- package/dist/components/index.js +0 -1269
- package/dist/components/index.js.map +0 -1
- package/dist/components/map-draw.js +0 -11
- package/dist/components/map-draw.js.map +0 -1
- package/dist/components/map-selector.js +0 -11
- package/dist/components/map-selector.js.map +0 -1
- package/dist/components/marker-icon.js +0 -11
- package/dist/components/marker-icon.js.map +0 -1
- package/dist/components/move-icon.js +0 -11
- package/dist/components/move-icon.js.map +0 -1
- package/dist/components/octagon-minus-icon.js +0 -11
- package/dist/components/octagon-minus-icon.js.map +0 -1
- package/dist/components/p-B54Ul0nf.js +0 -15
- package/dist/components/p-B54Ul0nf.js.map +0 -1
- package/dist/components/p-B5WTRCh8.js +0 -3241
- package/dist/components/p-B5WTRCh8.js.map +0 -1
- package/dist/components/p-BFJHTJPM.js.map +0 -1
- package/dist/components/p-BGoSj_DR.js +0 -902
- package/dist/components/p-BGoSj_DR.js.map +0 -1
- package/dist/components/p-BJLO76Yi.js.map +0 -1
- package/dist/components/p-BcVa4_YP.js.map +0 -1
- package/dist/components/p-Bopprtc7.js +0 -623
- package/dist/components/p-Bopprtc7.js.map +0 -1
- package/dist/components/p-ByX6QP-E.js.map +0 -1
- package/dist/components/p-C5QieOat.js.map +0 -1
- package/dist/components/p-CL74Q4VR.js.map +0 -1
- package/dist/components/p-Cgchl6bA.js +0 -47
- package/dist/components/p-Cgchl6bA.js.map +0 -1
- package/dist/components/p-D8w3bTPO.js.map +0 -1
- package/dist/components/p-DBwr8xSB.js.map +0 -1
- package/dist/components/p-DWirjxpO.js +0 -163
- package/dist/components/p-DWirjxpO.js.map +0 -1
- package/dist/components/p-DlNHVTGB.js +0 -15949
- package/dist/components/p-DlNHVTGB.js.map +0 -1
- package/dist/components/p-Dzl6kfPI.js.map +0 -1
- package/dist/components/p-FdEV2qPo.js.map +0 -1
- package/dist/components/p-PkMjF2if.js +0 -1985
- package/dist/components/p-PkMjF2if.js.map +0 -1
- package/dist/components/p-Umz6nJIv.js.map +0 -1
- package/dist/components/p-WmcSqXD8.js +0 -14
- package/dist/components/p-WmcSqXD8.js.map +0 -1
- package/dist/components/p-eDwaXClX.js.map +0 -1
- package/dist/components/p-j-vOrhhh.js +0 -114
- package/dist/components/p-j-vOrhhh.js.map +0 -1
- package/dist/components/p-q8auDIJ2.js +0 -138
- package/dist/components/p-q8auDIJ2.js.map +0 -1
- package/dist/components/p-waOPoUcA.js.map +0 -1
- package/dist/components/polygon-buttons.js +0 -11
- package/dist/components/polygon-buttons.js.map +0 -1
- package/dist/components/polygon-information.js +0 -11
- package/dist/components/polygon-information.js.map +0 -1
- package/dist/components/search-icon.js +0 -11
- package/dist/components/search-icon.js.map +0 -1
- package/dist/components/settings-icon.js +0 -11
- package/dist/components/settings-icon.js.map +0 -1
- package/dist/components/settings-modal.js +0 -11
- package/dist/components/settings-modal.js.map +0 -1
- package/dist/components/solar-expert.js.map +0 -1
- package/dist/components/solar-system-form.js +0 -11
- package/dist/components/solar-system-form.js.map +0 -1
- package/dist/components/toast-notification.js +0 -11
- package/dist/components/toast-notification.js.map +0 -1
- package/dist/components/tool-box.js +0 -11
- package/dist/components/tool-box.js.map +0 -1
- package/dist/components/tutorial-component.js +0 -11
- package/dist/components/tutorial-component.js.map +0 -1
- package/dist/components/undo-icon.js +0 -11
- package/dist/components/undo-icon.js.map +0 -1
- package/dist/esm/basedecoder-j-vOrhhh.js +0 -114
- package/dist/esm/basedecoder-j-vOrhhh.js.map +0 -1
- package/dist/esm/deflate-DHgPf9CO.js +0 -15
- package/dist/esm/eraser-icon_19.entry.js +0 -7
- package/dist/esm/eraser-icon_19.entry.js.map +0 -1
- package/dist/esm/index-C2JRBB5c.js +0 -1458
- package/dist/esm/index-C2JRBB5c.js.map +0 -1
- package/dist/esm/index.js +0 -5
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/jpeg-CJLm1GkA.js.map +0 -1
- package/dist/esm/lerc-CAiDQjTu.js +0 -4424
- package/dist/esm/lerc-CAiDQjTu.js.map +0 -1
- package/dist/esm/loader.js +0 -16
- package/dist/esm/loader.js.map +0 -1
- package/dist/esm/loading-widget.entry.js.map +0 -1
- package/dist/esm/lzw-DaOzWJUD.js.map +0 -1
- package/dist/esm/packbits-CZPyx9kx.js +0 -33
- package/dist/esm/packbits-CZPyx9kx.js.map +0 -1
- package/dist/esm/pako.esm-B5WTRCh8.js +0 -3241
- package/dist/esm/raw-pqeeWc2_.js +0 -14
- package/dist/esm/raw-pqeeWc2_.js.map +0 -1
- package/dist/esm/stencil-library.js +0 -26
- package/dist/esm/stencil-library.js.map +0 -1
- package/dist/index.cjs.js +0 -1
- package/dist/index.js +0 -1
- package/dist/stencil-library/p-B54Ul0nf.js +0 -2
- package/dist/stencil-library/p-B54Ul0nf.js.map +0 -1
- package/dist/stencil-library/p-B5WTRCh8.js +0 -2
- package/dist/stencil-library/p-B5WTRCh8.js.map +0 -1
- package/dist/stencil-library/p-BBtmpSUK.js +0 -2
- package/dist/stencil-library/p-BBtmpSUK.js.map +0 -1
- package/dist/stencil-library/p-BGoSj_DR.js +0 -2
- package/dist/stencil-library/p-BGoSj_DR.js.map +0 -1
- package/dist/stencil-library/p-ByX6QP-E.js +0 -2
- package/dist/stencil-library/p-ByX6QP-E.js.map +0 -1
- package/dist/stencil-library/p-C2JRBB5c.js +0 -3
- package/dist/stencil-library/p-C2JRBB5c.js.map +0 -1
- package/dist/stencil-library/p-CX8V3eiN.js +0 -2
- package/dist/stencil-library/p-CX8V3eiN.js.map +0 -1
- package/dist/stencil-library/p-Cgchl6bA.js +0 -2
- package/dist/stencil-library/p-Cgchl6bA.js.map +0 -1
- package/dist/stencil-library/p-WmcSqXD8.js +0 -2
- package/dist/stencil-library/p-WmcSqXD8.js.map +0 -1
- package/dist/stencil-library/p-ab0f2031.entry.js.map +0 -1
- package/dist/stencil-library/p-cAuhy_jT.js +0 -10
- package/dist/stencil-library/p-cAuhy_jT.js.map +0 -1
- package/dist/stencil-library/p-e7b94dbb.entry.js +0 -2
- package/dist/stencil-library/p-e7b94dbb.entry.js.map +0 -1
- package/dist/stencil-library/p-j-vOrhhh.js +0 -2
- package/dist/stencil-library/p-j-vOrhhh.js.map +0 -1
- package/dist/stencil-library/p-q8auDIJ2.js +0 -2
- package/dist/stencil-library/p-q8auDIJ2.js.map +0 -1
- /package/dist/{esm → stencil-library}/app-globals-CX8V3eiN.js +0 -0
- /package/dist/{esm → stencil-library}/app-globals-CX8V3eiN.js.map +0 -0
|
@@ -1,4427 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
if (typeof global === "undefined") { var global = globalThis || window || self; }
|
|
3
|
-
'use strict';
|
|
4
|
-
|
|
5
|
-
var pako_esm = require('./pako.esm-0mKI6Jik.js');
|
|
6
|
-
var eraserIcon_houseIcon_iconSelector_mapDraw_mapSelector_markerIcon_moveIcon_octagonMinusIcon_polygonButtons_polygonInformation_searchIcon_settingsIcon_settingsModal_solarExpert_solarSystemForm_toastNotification_toolBox_tutorialComponent_undoIcon_entry = require('./eraser-icon.house-icon.icon-selector.map-draw.map-selector.marker-icon.move-icon.octagon-minus-icon.polygon-buttons.polygon-information.search-icon.settings-icon.settings-modal.solar-expert.solar-system-form.toast-notification.tool-box.tutorial-component.undo-icon-DrjC7tSC.js');
|
|
7
|
-
var basedecoder = require('./basedecoder-CQuzfSgz.js');
|
|
8
|
-
require('./index-HgRXF6kp.js');
|
|
9
|
-
|
|
10
|
-
var lookup = [];
|
|
11
|
-
var revLookup = [];
|
|
12
|
-
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;
|
|
13
|
-
var inited = false;
|
|
14
|
-
function init$1 () {
|
|
15
|
-
inited = true;
|
|
16
|
-
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
17
|
-
for (var i = 0, len = code.length; i < len; ++i) {
|
|
18
|
-
lookup[i] = code[i];
|
|
19
|
-
revLookup[code.charCodeAt(i)] = i;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
revLookup['-'.charCodeAt(0)] = 62;
|
|
23
|
-
revLookup['_'.charCodeAt(0)] = 63;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function toByteArray (b64) {
|
|
27
|
-
if (!inited) {
|
|
28
|
-
init$1();
|
|
29
|
-
}
|
|
30
|
-
var i, j, l, tmp, placeHolders, arr;
|
|
31
|
-
var len = b64.length;
|
|
32
|
-
|
|
33
|
-
if (len % 4 > 0) {
|
|
34
|
-
throw new Error('Invalid string. Length must be a multiple of 4')
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// the number of equal signs (place holders)
|
|
38
|
-
// if there are two placeholders, than the two characters before it
|
|
39
|
-
// represent one byte
|
|
40
|
-
// if there is only one, then the three characters before it represent 2 bytes
|
|
41
|
-
// this is just a cheap hack to not do indexOf twice
|
|
42
|
-
placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0;
|
|
43
|
-
|
|
44
|
-
// base64 is 4/3 + up to two characters of the original data
|
|
45
|
-
arr = new Arr(len * 3 / 4 - placeHolders);
|
|
46
|
-
|
|
47
|
-
// if there are placeholders, only get up to the last complete 4 chars
|
|
48
|
-
l = placeHolders > 0 ? len - 4 : len;
|
|
49
|
-
|
|
50
|
-
var L = 0;
|
|
51
|
-
|
|
52
|
-
for (i = 0, j = 0; i < l; i += 4, j += 3) {
|
|
53
|
-
tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)];
|
|
54
|
-
arr[L++] = (tmp >> 16) & 0xFF;
|
|
55
|
-
arr[L++] = (tmp >> 8) & 0xFF;
|
|
56
|
-
arr[L++] = tmp & 0xFF;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (placeHolders === 2) {
|
|
60
|
-
tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4);
|
|
61
|
-
arr[L++] = tmp & 0xFF;
|
|
62
|
-
} else if (placeHolders === 1) {
|
|
63
|
-
tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2);
|
|
64
|
-
arr[L++] = (tmp >> 8) & 0xFF;
|
|
65
|
-
arr[L++] = tmp & 0xFF;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return arr
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function tripletToBase64 (num) {
|
|
72
|
-
return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function encodeChunk (uint8, start, end) {
|
|
76
|
-
var tmp;
|
|
77
|
-
var output = [];
|
|
78
|
-
for (var i = start; i < end; i += 3) {
|
|
79
|
-
tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]);
|
|
80
|
-
output.push(tripletToBase64(tmp));
|
|
81
|
-
}
|
|
82
|
-
return output.join('')
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function fromByteArray (uint8) {
|
|
86
|
-
if (!inited) {
|
|
87
|
-
init$1();
|
|
88
|
-
}
|
|
89
|
-
var tmp;
|
|
90
|
-
var len = uint8.length;
|
|
91
|
-
var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
|
|
92
|
-
var output = '';
|
|
93
|
-
var parts = [];
|
|
94
|
-
var maxChunkLength = 16383; // must be multiple of 3
|
|
95
|
-
|
|
96
|
-
// go through the array every three bytes, we'll deal with trailing stuff later
|
|
97
|
-
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
|
98
|
-
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)));
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// pad the end with zeros, but make sure to not forget the extra bytes
|
|
102
|
-
if (extraBytes === 1) {
|
|
103
|
-
tmp = uint8[len - 1];
|
|
104
|
-
output += lookup[tmp >> 2];
|
|
105
|
-
output += lookup[(tmp << 4) & 0x3F];
|
|
106
|
-
output += '==';
|
|
107
|
-
} else if (extraBytes === 2) {
|
|
108
|
-
tmp = (uint8[len - 2] << 8) + (uint8[len - 1]);
|
|
109
|
-
output += lookup[tmp >> 10];
|
|
110
|
-
output += lookup[(tmp >> 4) & 0x3F];
|
|
111
|
-
output += lookup[(tmp << 2) & 0x3F];
|
|
112
|
-
output += '=';
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
parts.push(output);
|
|
116
|
-
|
|
117
|
-
return parts.join('')
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function read (buffer, offset, isLE, mLen, nBytes) {
|
|
121
|
-
var e, m;
|
|
122
|
-
var eLen = nBytes * 8 - mLen - 1;
|
|
123
|
-
var eMax = (1 << eLen) - 1;
|
|
124
|
-
var eBias = eMax >> 1;
|
|
125
|
-
var nBits = -7;
|
|
126
|
-
var i = isLE ? (nBytes - 1) : 0;
|
|
127
|
-
var d = isLE ? -1 : 1;
|
|
128
|
-
var s = buffer[offset + i];
|
|
129
|
-
|
|
130
|
-
i += d;
|
|
131
|
-
|
|
132
|
-
e = s & ((1 << (-nBits)) - 1);
|
|
133
|
-
s >>= (-nBits);
|
|
134
|
-
nBits += eLen;
|
|
135
|
-
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
|
|
136
|
-
|
|
137
|
-
m = e & ((1 << (-nBits)) - 1);
|
|
138
|
-
e >>= (-nBits);
|
|
139
|
-
nBits += mLen;
|
|
140
|
-
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
|
|
141
|
-
|
|
142
|
-
if (e === 0) {
|
|
143
|
-
e = 1 - eBias;
|
|
144
|
-
} else if (e === eMax) {
|
|
145
|
-
return m ? NaN : ((s ? -1 : 1) * Infinity)
|
|
146
|
-
} else {
|
|
147
|
-
m = m + Math.pow(2, mLen);
|
|
148
|
-
e = e - eBias;
|
|
149
|
-
}
|
|
150
|
-
return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function write (buffer, value, offset, isLE, mLen, nBytes) {
|
|
154
|
-
var e, m, c;
|
|
155
|
-
var eLen = nBytes * 8 - mLen - 1;
|
|
156
|
-
var eMax = (1 << eLen) - 1;
|
|
157
|
-
var eBias = eMax >> 1;
|
|
158
|
-
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
|
|
159
|
-
var i = isLE ? 0 : (nBytes - 1);
|
|
160
|
-
var d = isLE ? 1 : -1;
|
|
161
|
-
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
|
|
162
|
-
|
|
163
|
-
value = Math.abs(value);
|
|
164
|
-
|
|
165
|
-
if (isNaN(value) || value === Infinity) {
|
|
166
|
-
m = isNaN(value) ? 1 : 0;
|
|
167
|
-
e = eMax;
|
|
168
|
-
} else {
|
|
169
|
-
e = Math.floor(Math.log(value) / Math.LN2);
|
|
170
|
-
if (value * (c = Math.pow(2, -e)) < 1) {
|
|
171
|
-
e--;
|
|
172
|
-
c *= 2;
|
|
173
|
-
}
|
|
174
|
-
if (e + eBias >= 1) {
|
|
175
|
-
value += rt / c;
|
|
176
|
-
} else {
|
|
177
|
-
value += rt * Math.pow(2, 1 - eBias);
|
|
178
|
-
}
|
|
179
|
-
if (value * c >= 2) {
|
|
180
|
-
e++;
|
|
181
|
-
c /= 2;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (e + eBias >= eMax) {
|
|
185
|
-
m = 0;
|
|
186
|
-
e = eMax;
|
|
187
|
-
} else if (e + eBias >= 1) {
|
|
188
|
-
m = (value * c - 1) * Math.pow(2, mLen);
|
|
189
|
-
e = e + eBias;
|
|
190
|
-
} else {
|
|
191
|
-
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
|
|
192
|
-
e = 0;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
|
|
197
|
-
|
|
198
|
-
e = (e << mLen) | m;
|
|
199
|
-
eLen += mLen;
|
|
200
|
-
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
|
|
201
|
-
|
|
202
|
-
buffer[offset + i - d] |= s * 128;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
var toString = {}.toString;
|
|
206
|
-
|
|
207
|
-
var isArray = Array.isArray || function (arr) {
|
|
208
|
-
return toString.call(arr) == '[object Array]';
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
/*!
|
|
212
|
-
* The buffer module from node.js, for the browser.
|
|
213
|
-
*
|
|
214
|
-
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
|
|
215
|
-
* @license MIT
|
|
216
|
-
*/
|
|
217
|
-
|
|
218
|
-
var INSPECT_MAX_BYTES = 50;
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* If `Buffer.TYPED_ARRAY_SUPPORT`:
|
|
222
|
-
* === true Use Uint8Array implementation (fastest)
|
|
223
|
-
* === false Use Object implementation (most compatible, even IE6)
|
|
224
|
-
*
|
|
225
|
-
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
|
|
226
|
-
* Opera 11.6+, iOS 4.2+.
|
|
227
|
-
*
|
|
228
|
-
* Due to various browser bugs, sometimes the Object implementation will be used even
|
|
229
|
-
* when the browser supports typed arrays.
|
|
230
|
-
*
|
|
231
|
-
* Note:
|
|
232
|
-
*
|
|
233
|
-
* - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
|
|
234
|
-
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
|
|
235
|
-
*
|
|
236
|
-
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
|
|
237
|
-
*
|
|
238
|
-
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
|
|
239
|
-
* incorrect length in some situations.
|
|
240
|
-
|
|
241
|
-
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
|
|
242
|
-
* get the Object implementation, which is slower but behaves correctly.
|
|
243
|
-
*/
|
|
244
|
-
Buffer.TYPED_ARRAY_SUPPORT = eraserIcon_houseIcon_iconSelector_mapDraw_mapSelector_markerIcon_moveIcon_octagonMinusIcon_polygonButtons_polygonInformation_searchIcon_settingsIcon_settingsModal_solarExpert_solarSystemForm_toastNotification_toolBox_tutorialComponent_undoIcon_entry.global.TYPED_ARRAY_SUPPORT !== undefined
|
|
245
|
-
? eraserIcon_houseIcon_iconSelector_mapDraw_mapSelector_markerIcon_moveIcon_octagonMinusIcon_polygonButtons_polygonInformation_searchIcon_settingsIcon_settingsModal_solarExpert_solarSystemForm_toastNotification_toolBox_tutorialComponent_undoIcon_entry.global.TYPED_ARRAY_SUPPORT
|
|
246
|
-
: true;
|
|
247
|
-
|
|
248
|
-
function kMaxLength () {
|
|
249
|
-
return Buffer.TYPED_ARRAY_SUPPORT
|
|
250
|
-
? 0x7fffffff
|
|
251
|
-
: 0x3fffffff
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function createBuffer (that, length) {
|
|
255
|
-
if (kMaxLength() < length) {
|
|
256
|
-
throw new RangeError('Invalid typed array length')
|
|
257
|
-
}
|
|
258
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
259
|
-
// Return an augmented `Uint8Array` instance, for best performance
|
|
260
|
-
that = new Uint8Array(length);
|
|
261
|
-
that.__proto__ = Buffer.prototype;
|
|
262
|
-
} else {
|
|
263
|
-
// Fallback: Return an object instance of the Buffer class
|
|
264
|
-
if (that === null) {
|
|
265
|
-
that = new Buffer(length);
|
|
266
|
-
}
|
|
267
|
-
that.length = length;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
return that
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
* The Buffer constructor returns instances of `Uint8Array` that have their
|
|
275
|
-
* prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
|
|
276
|
-
* `Uint8Array`, so the returned instances will have all the node `Buffer` methods
|
|
277
|
-
* and the `Uint8Array` methods. Square bracket notation works as expected -- it
|
|
278
|
-
* returns a single octet.
|
|
279
|
-
*
|
|
280
|
-
* The `Uint8Array` prototype remains unmodified.
|
|
281
|
-
*/
|
|
282
|
-
|
|
283
|
-
function Buffer (arg, encodingOrOffset, length) {
|
|
284
|
-
if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
|
|
285
|
-
return new Buffer(arg, encodingOrOffset, length)
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// Common case.
|
|
289
|
-
if (typeof arg === 'number') {
|
|
290
|
-
if (typeof encodingOrOffset === 'string') {
|
|
291
|
-
throw new Error(
|
|
292
|
-
'If encoding is specified then the first argument must be a string'
|
|
293
|
-
)
|
|
294
|
-
}
|
|
295
|
-
return allocUnsafe(this, arg)
|
|
296
|
-
}
|
|
297
|
-
return from(this, arg, encodingOrOffset, length)
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
Buffer.poolSize = 8192; // not used by this implementation
|
|
301
|
-
|
|
302
|
-
// TODO: Legacy, not needed anymore. Remove in next major version.
|
|
303
|
-
Buffer._augment = function (arr) {
|
|
304
|
-
arr.__proto__ = Buffer.prototype;
|
|
305
|
-
return arr
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
function from (that, value, encodingOrOffset, length) {
|
|
309
|
-
if (typeof value === 'number') {
|
|
310
|
-
throw new TypeError('"value" argument must not be a number')
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
|
|
314
|
-
return fromArrayBuffer(that, value, encodingOrOffset, length)
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
if (typeof value === 'string') {
|
|
318
|
-
return fromString(that, value, encodingOrOffset)
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
return fromObject(that, value)
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
|
|
326
|
-
* if value is a number.
|
|
327
|
-
* Buffer.from(str[, encoding])
|
|
328
|
-
* Buffer.from(array)
|
|
329
|
-
* Buffer.from(buffer)
|
|
330
|
-
* Buffer.from(arrayBuffer[, byteOffset[, length]])
|
|
331
|
-
**/
|
|
332
|
-
Buffer.from = function (value, encodingOrOffset, length) {
|
|
333
|
-
return from(null, value, encodingOrOffset, length)
|
|
334
|
-
};
|
|
335
|
-
|
|
336
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
337
|
-
Buffer.prototype.__proto__ = Uint8Array.prototype;
|
|
338
|
-
Buffer.__proto__ = Uint8Array;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
function assertSize (size) {
|
|
342
|
-
if (typeof size !== 'number') {
|
|
343
|
-
throw new TypeError('"size" argument must be a number')
|
|
344
|
-
} else if (size < 0) {
|
|
345
|
-
throw new RangeError('"size" argument must not be negative')
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
function alloc (that, size, fill, encoding) {
|
|
350
|
-
assertSize(size);
|
|
351
|
-
if (size <= 0) {
|
|
352
|
-
return createBuffer(that, size)
|
|
353
|
-
}
|
|
354
|
-
if (fill !== undefined) {
|
|
355
|
-
// Only pay attention to encoding if it's a string. This
|
|
356
|
-
// prevents accidentally sending in a number that would
|
|
357
|
-
// be interpretted as a start offset.
|
|
358
|
-
return typeof encoding === 'string'
|
|
359
|
-
? createBuffer(that, size).fill(fill, encoding)
|
|
360
|
-
: createBuffer(that, size).fill(fill)
|
|
361
|
-
}
|
|
362
|
-
return createBuffer(that, size)
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
/**
|
|
366
|
-
* Creates a new filled Buffer instance.
|
|
367
|
-
* alloc(size[, fill[, encoding]])
|
|
368
|
-
**/
|
|
369
|
-
Buffer.alloc = function (size, fill, encoding) {
|
|
370
|
-
return alloc(null, size, fill, encoding)
|
|
371
|
-
};
|
|
372
|
-
|
|
373
|
-
function allocUnsafe (that, size) {
|
|
374
|
-
assertSize(size);
|
|
375
|
-
that = createBuffer(that, size < 0 ? 0 : checked(size) | 0);
|
|
376
|
-
if (!Buffer.TYPED_ARRAY_SUPPORT) {
|
|
377
|
-
for (var i = 0; i < size; ++i) {
|
|
378
|
-
that[i] = 0;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
return that
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
|
|
386
|
-
* */
|
|
387
|
-
Buffer.allocUnsafe = function (size) {
|
|
388
|
-
return allocUnsafe(null, size)
|
|
389
|
-
};
|
|
390
|
-
/**
|
|
391
|
-
* Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
|
|
392
|
-
*/
|
|
393
|
-
Buffer.allocUnsafeSlow = function (size) {
|
|
394
|
-
return allocUnsafe(null, size)
|
|
395
|
-
};
|
|
396
|
-
|
|
397
|
-
function fromString (that, string, encoding) {
|
|
398
|
-
if (typeof encoding !== 'string' || encoding === '') {
|
|
399
|
-
encoding = 'utf8';
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
if (!Buffer.isEncoding(encoding)) {
|
|
403
|
-
throw new TypeError('"encoding" must be a valid string encoding')
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
var length = byteLength(string, encoding) | 0;
|
|
407
|
-
that = createBuffer(that, length);
|
|
408
|
-
|
|
409
|
-
var actual = that.write(string, encoding);
|
|
410
|
-
|
|
411
|
-
if (actual !== length) {
|
|
412
|
-
// Writing a hex string, for example, that contains invalid characters will
|
|
413
|
-
// cause everything after the first invalid character to be ignored. (e.g.
|
|
414
|
-
// 'abxxcd' will be treated as 'ab')
|
|
415
|
-
that = that.slice(0, actual);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
return that
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
function fromArrayLike (that, array) {
|
|
422
|
-
var length = array.length < 0 ? 0 : checked(array.length) | 0;
|
|
423
|
-
that = createBuffer(that, length);
|
|
424
|
-
for (var i = 0; i < length; i += 1) {
|
|
425
|
-
that[i] = array[i] & 255;
|
|
426
|
-
}
|
|
427
|
-
return that
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
function fromArrayBuffer (that, array, byteOffset, length) {
|
|
431
|
-
|
|
432
|
-
if (byteOffset < 0 || array.byteLength < byteOffset) {
|
|
433
|
-
throw new RangeError('\'offset\' is out of bounds')
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
if (array.byteLength < byteOffset + (length || 0)) {
|
|
437
|
-
throw new RangeError('\'length\' is out of bounds')
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
if (byteOffset === undefined && length === undefined) {
|
|
441
|
-
array = new Uint8Array(array);
|
|
442
|
-
} else if (length === undefined) {
|
|
443
|
-
array = new Uint8Array(array, byteOffset);
|
|
444
|
-
} else {
|
|
445
|
-
array = new Uint8Array(array, byteOffset, length);
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
449
|
-
// Return an augmented `Uint8Array` instance, for best performance
|
|
450
|
-
that = array;
|
|
451
|
-
that.__proto__ = Buffer.prototype;
|
|
452
|
-
} else {
|
|
453
|
-
// Fallback: Return an object instance of the Buffer class
|
|
454
|
-
that = fromArrayLike(that, array);
|
|
455
|
-
}
|
|
456
|
-
return that
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
function fromObject (that, obj) {
|
|
460
|
-
if (internalIsBuffer(obj)) {
|
|
461
|
-
var len = checked(obj.length) | 0;
|
|
462
|
-
that = createBuffer(that, len);
|
|
463
|
-
|
|
464
|
-
if (that.length === 0) {
|
|
465
|
-
return that
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
obj.copy(that, 0, 0, len);
|
|
469
|
-
return that
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
if (obj) {
|
|
473
|
-
if ((typeof ArrayBuffer !== 'undefined' &&
|
|
474
|
-
obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
|
|
475
|
-
if (typeof obj.length !== 'number' || isnan(obj.length)) {
|
|
476
|
-
return createBuffer(that, 0)
|
|
477
|
-
}
|
|
478
|
-
return fromArrayLike(that, obj)
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
if (obj.type === 'Buffer' && isArray(obj.data)) {
|
|
482
|
-
return fromArrayLike(that, obj.data)
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
function checked (length) {
|
|
490
|
-
// Note: cannot use `length < kMaxLength()` here because that fails when
|
|
491
|
-
// length is NaN (which is otherwise coerced to zero.)
|
|
492
|
-
if (length >= kMaxLength()) {
|
|
493
|
-
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
|
|
494
|
-
'size: 0x' + kMaxLength().toString(16) + ' bytes')
|
|
495
|
-
}
|
|
496
|
-
return length | 0
|
|
497
|
-
}
|
|
498
|
-
Buffer.isBuffer = isBuffer;
|
|
499
|
-
function internalIsBuffer (b) {
|
|
500
|
-
return !!(b != null && b._isBuffer)
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
Buffer.compare = function compare (a, b) {
|
|
504
|
-
if (!internalIsBuffer(a) || !internalIsBuffer(b)) {
|
|
505
|
-
throw new TypeError('Arguments must be Buffers')
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
if (a === b) return 0
|
|
509
|
-
|
|
510
|
-
var x = a.length;
|
|
511
|
-
var y = b.length;
|
|
512
|
-
|
|
513
|
-
for (var i = 0, len = Math.min(x, y); i < len; ++i) {
|
|
514
|
-
if (a[i] !== b[i]) {
|
|
515
|
-
x = a[i];
|
|
516
|
-
y = b[i];
|
|
517
|
-
break
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
if (x < y) return -1
|
|
522
|
-
if (y < x) return 1
|
|
523
|
-
return 0
|
|
524
|
-
};
|
|
525
|
-
|
|
526
|
-
Buffer.isEncoding = function isEncoding (encoding) {
|
|
527
|
-
switch (String(encoding).toLowerCase()) {
|
|
528
|
-
case 'hex':
|
|
529
|
-
case 'utf8':
|
|
530
|
-
case 'utf-8':
|
|
531
|
-
case 'ascii':
|
|
532
|
-
case 'latin1':
|
|
533
|
-
case 'binary':
|
|
534
|
-
case 'base64':
|
|
535
|
-
case 'ucs2':
|
|
536
|
-
case 'ucs-2':
|
|
537
|
-
case 'utf16le':
|
|
538
|
-
case 'utf-16le':
|
|
539
|
-
return true
|
|
540
|
-
default:
|
|
541
|
-
return false
|
|
542
|
-
}
|
|
543
|
-
};
|
|
544
|
-
|
|
545
|
-
Buffer.concat = function concat (list, length) {
|
|
546
|
-
if (!isArray(list)) {
|
|
547
|
-
throw new TypeError('"list" argument must be an Array of Buffers')
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
if (list.length === 0) {
|
|
551
|
-
return Buffer.alloc(0)
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
var i;
|
|
555
|
-
if (length === undefined) {
|
|
556
|
-
length = 0;
|
|
557
|
-
for (i = 0; i < list.length; ++i) {
|
|
558
|
-
length += list[i].length;
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
var buffer = Buffer.allocUnsafe(length);
|
|
563
|
-
var pos = 0;
|
|
564
|
-
for (i = 0; i < list.length; ++i) {
|
|
565
|
-
var buf = list[i];
|
|
566
|
-
if (!internalIsBuffer(buf)) {
|
|
567
|
-
throw new TypeError('"list" argument must be an Array of Buffers')
|
|
568
|
-
}
|
|
569
|
-
buf.copy(buffer, pos);
|
|
570
|
-
pos += buf.length;
|
|
571
|
-
}
|
|
572
|
-
return buffer
|
|
573
|
-
};
|
|
574
|
-
|
|
575
|
-
function byteLength (string, encoding) {
|
|
576
|
-
if (internalIsBuffer(string)) {
|
|
577
|
-
return string.length
|
|
578
|
-
}
|
|
579
|
-
if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
|
|
580
|
-
(ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
|
|
581
|
-
return string.byteLength
|
|
582
|
-
}
|
|
583
|
-
if (typeof string !== 'string') {
|
|
584
|
-
string = '' + string;
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
var len = string.length;
|
|
588
|
-
if (len === 0) return 0
|
|
589
|
-
|
|
590
|
-
// Use a for loop to avoid recursion
|
|
591
|
-
var loweredCase = false;
|
|
592
|
-
for (;;) {
|
|
593
|
-
switch (encoding) {
|
|
594
|
-
case 'ascii':
|
|
595
|
-
case 'latin1':
|
|
596
|
-
case 'binary':
|
|
597
|
-
return len
|
|
598
|
-
case 'utf8':
|
|
599
|
-
case 'utf-8':
|
|
600
|
-
case undefined:
|
|
601
|
-
return utf8ToBytes(string).length
|
|
602
|
-
case 'ucs2':
|
|
603
|
-
case 'ucs-2':
|
|
604
|
-
case 'utf16le':
|
|
605
|
-
case 'utf-16le':
|
|
606
|
-
return len * 2
|
|
607
|
-
case 'hex':
|
|
608
|
-
return len >>> 1
|
|
609
|
-
case 'base64':
|
|
610
|
-
return base64ToBytes(string).length
|
|
611
|
-
default:
|
|
612
|
-
if (loweredCase) return utf8ToBytes(string).length // assume utf8
|
|
613
|
-
encoding = ('' + encoding).toLowerCase();
|
|
614
|
-
loweredCase = true;
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
Buffer.byteLength = byteLength;
|
|
619
|
-
|
|
620
|
-
function slowToString (encoding, start, end) {
|
|
621
|
-
var loweredCase = false;
|
|
622
|
-
|
|
623
|
-
// No need to verify that "this.length <= MAX_UINT32" since it's a read-only
|
|
624
|
-
// property of a typed array.
|
|
625
|
-
|
|
626
|
-
// This behaves neither like String nor Uint8Array in that we set start/end
|
|
627
|
-
// to their upper/lower bounds if the value passed is out of range.
|
|
628
|
-
// undefined is handled specially as per ECMA-262 6th Edition,
|
|
629
|
-
// Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
|
|
630
|
-
if (start === undefined || start < 0) {
|
|
631
|
-
start = 0;
|
|
632
|
-
}
|
|
633
|
-
// Return early if start > this.length. Done here to prevent potential uint32
|
|
634
|
-
// coercion fail below.
|
|
635
|
-
if (start > this.length) {
|
|
636
|
-
return ''
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
if (end === undefined || end > this.length) {
|
|
640
|
-
end = this.length;
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
if (end <= 0) {
|
|
644
|
-
return ''
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
// Force coersion to uint32. This will also coerce falsey/NaN values to 0.
|
|
648
|
-
end >>>= 0;
|
|
649
|
-
start >>>= 0;
|
|
650
|
-
|
|
651
|
-
if (end <= start) {
|
|
652
|
-
return ''
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
if (!encoding) encoding = 'utf8';
|
|
656
|
-
|
|
657
|
-
while (true) {
|
|
658
|
-
switch (encoding) {
|
|
659
|
-
case 'hex':
|
|
660
|
-
return hexSlice(this, start, end)
|
|
661
|
-
|
|
662
|
-
case 'utf8':
|
|
663
|
-
case 'utf-8':
|
|
664
|
-
return utf8Slice(this, start, end)
|
|
665
|
-
|
|
666
|
-
case 'ascii':
|
|
667
|
-
return asciiSlice(this, start, end)
|
|
668
|
-
|
|
669
|
-
case 'latin1':
|
|
670
|
-
case 'binary':
|
|
671
|
-
return latin1Slice(this, start, end)
|
|
672
|
-
|
|
673
|
-
case 'base64':
|
|
674
|
-
return base64Slice(this, start, end)
|
|
675
|
-
|
|
676
|
-
case 'ucs2':
|
|
677
|
-
case 'ucs-2':
|
|
678
|
-
case 'utf16le':
|
|
679
|
-
case 'utf-16le':
|
|
680
|
-
return utf16leSlice(this, start, end)
|
|
681
|
-
|
|
682
|
-
default:
|
|
683
|
-
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
|
684
|
-
encoding = (encoding + '').toLowerCase();
|
|
685
|
-
loweredCase = true;
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
|
|
691
|
-
// Buffer instances.
|
|
692
|
-
Buffer.prototype._isBuffer = true;
|
|
693
|
-
|
|
694
|
-
function swap (b, n, m) {
|
|
695
|
-
var i = b[n];
|
|
696
|
-
b[n] = b[m];
|
|
697
|
-
b[m] = i;
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
Buffer.prototype.swap16 = function swap16 () {
|
|
701
|
-
var len = this.length;
|
|
702
|
-
if (len % 2 !== 0) {
|
|
703
|
-
throw new RangeError('Buffer size must be a multiple of 16-bits')
|
|
704
|
-
}
|
|
705
|
-
for (var i = 0; i < len; i += 2) {
|
|
706
|
-
swap(this, i, i + 1);
|
|
707
|
-
}
|
|
708
|
-
return this
|
|
709
|
-
};
|
|
710
|
-
|
|
711
|
-
Buffer.prototype.swap32 = function swap32 () {
|
|
712
|
-
var len = this.length;
|
|
713
|
-
if (len % 4 !== 0) {
|
|
714
|
-
throw new RangeError('Buffer size must be a multiple of 32-bits')
|
|
715
|
-
}
|
|
716
|
-
for (var i = 0; i < len; i += 4) {
|
|
717
|
-
swap(this, i, i + 3);
|
|
718
|
-
swap(this, i + 1, i + 2);
|
|
719
|
-
}
|
|
720
|
-
return this
|
|
721
|
-
};
|
|
722
|
-
|
|
723
|
-
Buffer.prototype.swap64 = function swap64 () {
|
|
724
|
-
var len = this.length;
|
|
725
|
-
if (len % 8 !== 0) {
|
|
726
|
-
throw new RangeError('Buffer size must be a multiple of 64-bits')
|
|
727
|
-
}
|
|
728
|
-
for (var i = 0; i < len; i += 8) {
|
|
729
|
-
swap(this, i, i + 7);
|
|
730
|
-
swap(this, i + 1, i + 6);
|
|
731
|
-
swap(this, i + 2, i + 5);
|
|
732
|
-
swap(this, i + 3, i + 4);
|
|
733
|
-
}
|
|
734
|
-
return this
|
|
735
|
-
};
|
|
736
|
-
|
|
737
|
-
Buffer.prototype.toString = function toString () {
|
|
738
|
-
var length = this.length | 0;
|
|
739
|
-
if (length === 0) return ''
|
|
740
|
-
if (arguments.length === 0) return utf8Slice(this, 0, length)
|
|
741
|
-
return slowToString.apply(this, arguments)
|
|
742
|
-
};
|
|
743
|
-
|
|
744
|
-
Buffer.prototype.equals = function equals (b) {
|
|
745
|
-
if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer')
|
|
746
|
-
if (this === b) return true
|
|
747
|
-
return Buffer.compare(this, b) === 0
|
|
748
|
-
};
|
|
749
|
-
|
|
750
|
-
Buffer.prototype.inspect = function inspect () {
|
|
751
|
-
var str = '';
|
|
752
|
-
var max = INSPECT_MAX_BYTES;
|
|
753
|
-
if (this.length > 0) {
|
|
754
|
-
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ');
|
|
755
|
-
if (this.length > max) str += ' ... ';
|
|
756
|
-
}
|
|
757
|
-
return '<Buffer ' + str + '>'
|
|
758
|
-
};
|
|
759
|
-
|
|
760
|
-
Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
|
|
761
|
-
if (!internalIsBuffer(target)) {
|
|
762
|
-
throw new TypeError('Argument must be a Buffer')
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
if (start === undefined) {
|
|
766
|
-
start = 0;
|
|
767
|
-
}
|
|
768
|
-
if (end === undefined) {
|
|
769
|
-
end = target ? target.length : 0;
|
|
770
|
-
}
|
|
771
|
-
if (thisStart === undefined) {
|
|
772
|
-
thisStart = 0;
|
|
773
|
-
}
|
|
774
|
-
if (thisEnd === undefined) {
|
|
775
|
-
thisEnd = this.length;
|
|
776
|
-
}
|
|
777
|
-
|
|
778
|
-
if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
|
|
779
|
-
throw new RangeError('out of range index')
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
if (thisStart >= thisEnd && start >= end) {
|
|
783
|
-
return 0
|
|
784
|
-
}
|
|
785
|
-
if (thisStart >= thisEnd) {
|
|
786
|
-
return -1
|
|
787
|
-
}
|
|
788
|
-
if (start >= end) {
|
|
789
|
-
return 1
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
start >>>= 0;
|
|
793
|
-
end >>>= 0;
|
|
794
|
-
thisStart >>>= 0;
|
|
795
|
-
thisEnd >>>= 0;
|
|
796
|
-
|
|
797
|
-
if (this === target) return 0
|
|
798
|
-
|
|
799
|
-
var x = thisEnd - thisStart;
|
|
800
|
-
var y = end - start;
|
|
801
|
-
var len = Math.min(x, y);
|
|
802
|
-
|
|
803
|
-
var thisCopy = this.slice(thisStart, thisEnd);
|
|
804
|
-
var targetCopy = target.slice(start, end);
|
|
805
|
-
|
|
806
|
-
for (var i = 0; i < len; ++i) {
|
|
807
|
-
if (thisCopy[i] !== targetCopy[i]) {
|
|
808
|
-
x = thisCopy[i];
|
|
809
|
-
y = targetCopy[i];
|
|
810
|
-
break
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
if (x < y) return -1
|
|
815
|
-
if (y < x) return 1
|
|
816
|
-
return 0
|
|
817
|
-
};
|
|
818
|
-
|
|
819
|
-
// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
|
|
820
|
-
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
|
|
821
|
-
//
|
|
822
|
-
// Arguments:
|
|
823
|
-
// - buffer - a Buffer to search
|
|
824
|
-
// - val - a string, Buffer, or number
|
|
825
|
-
// - byteOffset - an index into `buffer`; will be clamped to an int32
|
|
826
|
-
// - encoding - an optional encoding, relevant is val is a string
|
|
827
|
-
// - dir - true for indexOf, false for lastIndexOf
|
|
828
|
-
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
|
|
829
|
-
// Empty buffer means no match
|
|
830
|
-
if (buffer.length === 0) return -1
|
|
831
|
-
|
|
832
|
-
// Normalize byteOffset
|
|
833
|
-
if (typeof byteOffset === 'string') {
|
|
834
|
-
encoding = byteOffset;
|
|
835
|
-
byteOffset = 0;
|
|
836
|
-
} else if (byteOffset > 0x7fffffff) {
|
|
837
|
-
byteOffset = 0x7fffffff;
|
|
838
|
-
} else if (byteOffset < -2147483648) {
|
|
839
|
-
byteOffset = -2147483648;
|
|
840
|
-
}
|
|
841
|
-
byteOffset = +byteOffset; // Coerce to Number.
|
|
842
|
-
if (isNaN(byteOffset)) {
|
|
843
|
-
// byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
|
|
844
|
-
byteOffset = dir ? 0 : (buffer.length - 1);
|
|
845
|
-
}
|
|
846
|
-
|
|
847
|
-
// Normalize byteOffset: negative offsets start from the end of the buffer
|
|
848
|
-
if (byteOffset < 0) byteOffset = buffer.length + byteOffset;
|
|
849
|
-
if (byteOffset >= buffer.length) {
|
|
850
|
-
if (dir) return -1
|
|
851
|
-
else byteOffset = buffer.length - 1;
|
|
852
|
-
} else if (byteOffset < 0) {
|
|
853
|
-
if (dir) byteOffset = 0;
|
|
854
|
-
else return -1
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
// Normalize val
|
|
858
|
-
if (typeof val === 'string') {
|
|
859
|
-
val = Buffer.from(val, encoding);
|
|
860
|
-
}
|
|
861
|
-
|
|
862
|
-
// Finally, search either indexOf (if dir is true) or lastIndexOf
|
|
863
|
-
if (internalIsBuffer(val)) {
|
|
864
|
-
// Special case: looking for empty string/buffer always fails
|
|
865
|
-
if (val.length === 0) {
|
|
866
|
-
return -1
|
|
867
|
-
}
|
|
868
|
-
return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
|
|
869
|
-
} else if (typeof val === 'number') {
|
|
870
|
-
val = val & 0xFF; // Search for a byte value [0-255]
|
|
871
|
-
if (Buffer.TYPED_ARRAY_SUPPORT &&
|
|
872
|
-
typeof Uint8Array.prototype.indexOf === 'function') {
|
|
873
|
-
if (dir) {
|
|
874
|
-
return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
|
|
875
|
-
} else {
|
|
876
|
-
return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
|
|
877
|
-
}
|
|
878
|
-
}
|
|
879
|
-
return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
throw new TypeError('val must be string, number or Buffer')
|
|
883
|
-
}
|
|
884
|
-
|
|
885
|
-
function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
|
|
886
|
-
var indexSize = 1;
|
|
887
|
-
var arrLength = arr.length;
|
|
888
|
-
var valLength = val.length;
|
|
889
|
-
|
|
890
|
-
if (encoding !== undefined) {
|
|
891
|
-
encoding = String(encoding).toLowerCase();
|
|
892
|
-
if (encoding === 'ucs2' || encoding === 'ucs-2' ||
|
|
893
|
-
encoding === 'utf16le' || encoding === 'utf-16le') {
|
|
894
|
-
if (arr.length < 2 || val.length < 2) {
|
|
895
|
-
return -1
|
|
896
|
-
}
|
|
897
|
-
indexSize = 2;
|
|
898
|
-
arrLength /= 2;
|
|
899
|
-
valLength /= 2;
|
|
900
|
-
byteOffset /= 2;
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
|
|
904
|
-
function read (buf, i) {
|
|
905
|
-
if (indexSize === 1) {
|
|
906
|
-
return buf[i]
|
|
907
|
-
} else {
|
|
908
|
-
return buf.readUInt16BE(i * indexSize)
|
|
909
|
-
}
|
|
910
|
-
}
|
|
911
|
-
|
|
912
|
-
var i;
|
|
913
|
-
if (dir) {
|
|
914
|
-
var foundIndex = -1;
|
|
915
|
-
for (i = byteOffset; i < arrLength; i++) {
|
|
916
|
-
if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
|
|
917
|
-
if (foundIndex === -1) foundIndex = i;
|
|
918
|
-
if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
|
|
919
|
-
} else {
|
|
920
|
-
if (foundIndex !== -1) i -= i - foundIndex;
|
|
921
|
-
foundIndex = -1;
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
} else {
|
|
925
|
-
if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;
|
|
926
|
-
for (i = byteOffset; i >= 0; i--) {
|
|
927
|
-
var found = true;
|
|
928
|
-
for (var j = 0; j < valLength; j++) {
|
|
929
|
-
if (read(arr, i + j) !== read(val, j)) {
|
|
930
|
-
found = false;
|
|
931
|
-
break
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
if (found) return i
|
|
935
|
-
}
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
return -1
|
|
939
|
-
}
|
|
940
|
-
|
|
941
|
-
Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
|
|
942
|
-
return this.indexOf(val, byteOffset, encoding) !== -1
|
|
943
|
-
};
|
|
944
|
-
|
|
945
|
-
Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
|
|
946
|
-
return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
|
|
947
|
-
};
|
|
948
|
-
|
|
949
|
-
Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
|
|
950
|
-
return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
|
|
951
|
-
};
|
|
952
|
-
|
|
953
|
-
function hexWrite (buf, string, offset, length) {
|
|
954
|
-
offset = Number(offset) || 0;
|
|
955
|
-
var remaining = buf.length - offset;
|
|
956
|
-
if (!length) {
|
|
957
|
-
length = remaining;
|
|
958
|
-
} else {
|
|
959
|
-
length = Number(length);
|
|
960
|
-
if (length > remaining) {
|
|
961
|
-
length = remaining;
|
|
962
|
-
}
|
|
963
|
-
}
|
|
964
|
-
|
|
965
|
-
// must be an even number of digits
|
|
966
|
-
var strLen = string.length;
|
|
967
|
-
if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
|
|
968
|
-
|
|
969
|
-
if (length > strLen / 2) {
|
|
970
|
-
length = strLen / 2;
|
|
971
|
-
}
|
|
972
|
-
for (var i = 0; i < length; ++i) {
|
|
973
|
-
var parsed = parseInt(string.substr(i * 2, 2), 16);
|
|
974
|
-
if (isNaN(parsed)) return i
|
|
975
|
-
buf[offset + i] = parsed;
|
|
976
|
-
}
|
|
977
|
-
return i
|
|
978
|
-
}
|
|
979
|
-
|
|
980
|
-
function utf8Write (buf, string, offset, length) {
|
|
981
|
-
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
function asciiWrite (buf, string, offset, length) {
|
|
985
|
-
return blitBuffer(asciiToBytes(string), buf, offset, length)
|
|
986
|
-
}
|
|
987
|
-
|
|
988
|
-
function latin1Write (buf, string, offset, length) {
|
|
989
|
-
return asciiWrite(buf, string, offset, length)
|
|
990
|
-
}
|
|
991
|
-
|
|
992
|
-
function base64Write (buf, string, offset, length) {
|
|
993
|
-
return blitBuffer(base64ToBytes(string), buf, offset, length)
|
|
994
|
-
}
|
|
995
|
-
|
|
996
|
-
function ucs2Write (buf, string, offset, length) {
|
|
997
|
-
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
|
|
998
|
-
}
|
|
999
|
-
|
|
1000
|
-
Buffer.prototype.write = function write (string, offset, length, encoding) {
|
|
1001
|
-
// Buffer#write(string)
|
|
1002
|
-
if (offset === undefined) {
|
|
1003
|
-
encoding = 'utf8';
|
|
1004
|
-
length = this.length;
|
|
1005
|
-
offset = 0;
|
|
1006
|
-
// Buffer#write(string, encoding)
|
|
1007
|
-
} else if (length === undefined && typeof offset === 'string') {
|
|
1008
|
-
encoding = offset;
|
|
1009
|
-
length = this.length;
|
|
1010
|
-
offset = 0;
|
|
1011
|
-
// Buffer#write(string, offset[, length][, encoding])
|
|
1012
|
-
} else if (isFinite(offset)) {
|
|
1013
|
-
offset = offset | 0;
|
|
1014
|
-
if (isFinite(length)) {
|
|
1015
|
-
length = length | 0;
|
|
1016
|
-
if (encoding === undefined) encoding = 'utf8';
|
|
1017
|
-
} else {
|
|
1018
|
-
encoding = length;
|
|
1019
|
-
length = undefined;
|
|
1020
|
-
}
|
|
1021
|
-
// legacy write(string, encoding, offset, length) - remove in v0.13
|
|
1022
|
-
} else {
|
|
1023
|
-
throw new Error(
|
|
1024
|
-
'Buffer.write(string, encoding, offset[, length]) is no longer supported'
|
|
1025
|
-
)
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
var remaining = this.length - offset;
|
|
1029
|
-
if (length === undefined || length > remaining) length = remaining;
|
|
1030
|
-
|
|
1031
|
-
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
|
|
1032
|
-
throw new RangeError('Attempt to write outside buffer bounds')
|
|
1033
|
-
}
|
|
1034
|
-
|
|
1035
|
-
if (!encoding) encoding = 'utf8';
|
|
1036
|
-
|
|
1037
|
-
var loweredCase = false;
|
|
1038
|
-
for (;;) {
|
|
1039
|
-
switch (encoding) {
|
|
1040
|
-
case 'hex':
|
|
1041
|
-
return hexWrite(this, string, offset, length)
|
|
1042
|
-
|
|
1043
|
-
case 'utf8':
|
|
1044
|
-
case 'utf-8':
|
|
1045
|
-
return utf8Write(this, string, offset, length)
|
|
1046
|
-
|
|
1047
|
-
case 'ascii':
|
|
1048
|
-
return asciiWrite(this, string, offset, length)
|
|
1049
|
-
|
|
1050
|
-
case 'latin1':
|
|
1051
|
-
case 'binary':
|
|
1052
|
-
return latin1Write(this, string, offset, length)
|
|
1053
|
-
|
|
1054
|
-
case 'base64':
|
|
1055
|
-
// Warning: maxLength not taken into account in base64Write
|
|
1056
|
-
return base64Write(this, string, offset, length)
|
|
1057
|
-
|
|
1058
|
-
case 'ucs2':
|
|
1059
|
-
case 'ucs-2':
|
|
1060
|
-
case 'utf16le':
|
|
1061
|
-
case 'utf-16le':
|
|
1062
|
-
return ucs2Write(this, string, offset, length)
|
|
1063
|
-
|
|
1064
|
-
default:
|
|
1065
|
-
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
|
1066
|
-
encoding = ('' + encoding).toLowerCase();
|
|
1067
|
-
loweredCase = true;
|
|
1068
|
-
}
|
|
1069
|
-
}
|
|
1070
|
-
};
|
|
1071
|
-
|
|
1072
|
-
Buffer.prototype.toJSON = function toJSON () {
|
|
1073
|
-
return {
|
|
1074
|
-
type: 'Buffer',
|
|
1075
|
-
data: Array.prototype.slice.call(this._arr || this, 0)
|
|
1076
|
-
}
|
|
1077
|
-
};
|
|
1078
|
-
|
|
1079
|
-
function base64Slice (buf, start, end) {
|
|
1080
|
-
if (start === 0 && end === buf.length) {
|
|
1081
|
-
return fromByteArray(buf)
|
|
1082
|
-
} else {
|
|
1083
|
-
return fromByteArray(buf.slice(start, end))
|
|
1084
|
-
}
|
|
1085
|
-
}
|
|
1086
|
-
|
|
1087
|
-
function utf8Slice (buf, start, end) {
|
|
1088
|
-
end = Math.min(buf.length, end);
|
|
1089
|
-
var res = [];
|
|
1090
|
-
|
|
1091
|
-
var i = start;
|
|
1092
|
-
while (i < end) {
|
|
1093
|
-
var firstByte = buf[i];
|
|
1094
|
-
var codePoint = null;
|
|
1095
|
-
var bytesPerSequence = (firstByte > 0xEF) ? 4
|
|
1096
|
-
: (firstByte > 0xDF) ? 3
|
|
1097
|
-
: (firstByte > 0xBF) ? 2
|
|
1098
|
-
: 1;
|
|
1099
|
-
|
|
1100
|
-
if (i + bytesPerSequence <= end) {
|
|
1101
|
-
var secondByte, thirdByte, fourthByte, tempCodePoint;
|
|
1102
|
-
|
|
1103
|
-
switch (bytesPerSequence) {
|
|
1104
|
-
case 1:
|
|
1105
|
-
if (firstByte < 0x80) {
|
|
1106
|
-
codePoint = firstByte;
|
|
1107
|
-
}
|
|
1108
|
-
break
|
|
1109
|
-
case 2:
|
|
1110
|
-
secondByte = buf[i + 1];
|
|
1111
|
-
if ((secondByte & 0xC0) === 0x80) {
|
|
1112
|
-
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F);
|
|
1113
|
-
if (tempCodePoint > 0x7F) {
|
|
1114
|
-
codePoint = tempCodePoint;
|
|
1115
|
-
}
|
|
1116
|
-
}
|
|
1117
|
-
break
|
|
1118
|
-
case 3:
|
|
1119
|
-
secondByte = buf[i + 1];
|
|
1120
|
-
thirdByte = buf[i + 2];
|
|
1121
|
-
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
|
|
1122
|
-
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F);
|
|
1123
|
-
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
|
|
1124
|
-
codePoint = tempCodePoint;
|
|
1125
|
-
}
|
|
1126
|
-
}
|
|
1127
|
-
break
|
|
1128
|
-
case 4:
|
|
1129
|
-
secondByte = buf[i + 1];
|
|
1130
|
-
thirdByte = buf[i + 2];
|
|
1131
|
-
fourthByte = buf[i + 3];
|
|
1132
|
-
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
|
|
1133
|
-
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F);
|
|
1134
|
-
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
|
|
1135
|
-
codePoint = tempCodePoint;
|
|
1136
|
-
}
|
|
1137
|
-
}
|
|
1138
|
-
}
|
|
1139
|
-
}
|
|
1140
|
-
|
|
1141
|
-
if (codePoint === null) {
|
|
1142
|
-
// we did not generate a valid codePoint so insert a
|
|
1143
|
-
// replacement char (U+FFFD) and advance only 1 byte
|
|
1144
|
-
codePoint = 0xFFFD;
|
|
1145
|
-
bytesPerSequence = 1;
|
|
1146
|
-
} else if (codePoint > 0xFFFF) {
|
|
1147
|
-
// encode to utf16 (surrogate pair dance)
|
|
1148
|
-
codePoint -= 0x10000;
|
|
1149
|
-
res.push(codePoint >>> 10 & 0x3FF | 0xD800);
|
|
1150
|
-
codePoint = 0xDC00 | codePoint & 0x3FF;
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
|
-
res.push(codePoint);
|
|
1154
|
-
i += bytesPerSequence;
|
|
1155
|
-
}
|
|
1156
|
-
|
|
1157
|
-
return decodeCodePointsArray(res)
|
|
1158
|
-
}
|
|
1159
|
-
|
|
1160
|
-
// Based on http://stackoverflow.com/a/22747272/680742, the browser with
|
|
1161
|
-
// the lowest limit is Chrome, with 0x10000 args.
|
|
1162
|
-
// We go 1 magnitude less, for safety
|
|
1163
|
-
var MAX_ARGUMENTS_LENGTH = 0x1000;
|
|
1164
|
-
|
|
1165
|
-
function decodeCodePointsArray (codePoints) {
|
|
1166
|
-
var len = codePoints.length;
|
|
1167
|
-
if (len <= MAX_ARGUMENTS_LENGTH) {
|
|
1168
|
-
return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
// Decode in chunks to avoid "call stack size exceeded".
|
|
1172
|
-
var res = '';
|
|
1173
|
-
var i = 0;
|
|
1174
|
-
while (i < len) {
|
|
1175
|
-
res += String.fromCharCode.apply(
|
|
1176
|
-
String,
|
|
1177
|
-
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
|
|
1178
|
-
);
|
|
1179
|
-
}
|
|
1180
|
-
return res
|
|
1181
|
-
}
|
|
1182
|
-
|
|
1183
|
-
function asciiSlice (buf, start, end) {
|
|
1184
|
-
var ret = '';
|
|
1185
|
-
end = Math.min(buf.length, end);
|
|
1186
|
-
|
|
1187
|
-
for (var i = start; i < end; ++i) {
|
|
1188
|
-
ret += String.fromCharCode(buf[i] & 0x7F);
|
|
1189
|
-
}
|
|
1190
|
-
return ret
|
|
1191
|
-
}
|
|
1192
|
-
|
|
1193
|
-
function latin1Slice (buf, start, end) {
|
|
1194
|
-
var ret = '';
|
|
1195
|
-
end = Math.min(buf.length, end);
|
|
1196
|
-
|
|
1197
|
-
for (var i = start; i < end; ++i) {
|
|
1198
|
-
ret += String.fromCharCode(buf[i]);
|
|
1199
|
-
}
|
|
1200
|
-
return ret
|
|
1201
|
-
}
|
|
1202
|
-
|
|
1203
|
-
function hexSlice (buf, start, end) {
|
|
1204
|
-
var len = buf.length;
|
|
1205
|
-
|
|
1206
|
-
if (!start || start < 0) start = 0;
|
|
1207
|
-
if (!end || end < 0 || end > len) end = len;
|
|
1208
|
-
|
|
1209
|
-
var out = '';
|
|
1210
|
-
for (var i = start; i < end; ++i) {
|
|
1211
|
-
out += toHex(buf[i]);
|
|
1212
|
-
}
|
|
1213
|
-
return out
|
|
1214
|
-
}
|
|
1215
|
-
|
|
1216
|
-
function utf16leSlice (buf, start, end) {
|
|
1217
|
-
var bytes = buf.slice(start, end);
|
|
1218
|
-
var res = '';
|
|
1219
|
-
for (var i = 0; i < bytes.length; i += 2) {
|
|
1220
|
-
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);
|
|
1221
|
-
}
|
|
1222
|
-
return res
|
|
1223
|
-
}
|
|
1224
|
-
|
|
1225
|
-
Buffer.prototype.slice = function slice (start, end) {
|
|
1226
|
-
var len = this.length;
|
|
1227
|
-
start = ~~start;
|
|
1228
|
-
end = end === undefined ? len : ~~end;
|
|
1229
|
-
|
|
1230
|
-
if (start < 0) {
|
|
1231
|
-
start += len;
|
|
1232
|
-
if (start < 0) start = 0;
|
|
1233
|
-
} else if (start > len) {
|
|
1234
|
-
start = len;
|
|
1235
|
-
}
|
|
1236
|
-
|
|
1237
|
-
if (end < 0) {
|
|
1238
|
-
end += len;
|
|
1239
|
-
if (end < 0) end = 0;
|
|
1240
|
-
} else if (end > len) {
|
|
1241
|
-
end = len;
|
|
1242
|
-
}
|
|
1243
|
-
|
|
1244
|
-
if (end < start) end = start;
|
|
1245
|
-
|
|
1246
|
-
var newBuf;
|
|
1247
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
1248
|
-
newBuf = this.subarray(start, end);
|
|
1249
|
-
newBuf.__proto__ = Buffer.prototype;
|
|
1250
|
-
} else {
|
|
1251
|
-
var sliceLen = end - start;
|
|
1252
|
-
newBuf = new Buffer(sliceLen, undefined);
|
|
1253
|
-
for (var i = 0; i < sliceLen; ++i) {
|
|
1254
|
-
newBuf[i] = this[i + start];
|
|
1255
|
-
}
|
|
1256
|
-
}
|
|
1257
|
-
|
|
1258
|
-
return newBuf
|
|
1259
|
-
};
|
|
1260
|
-
|
|
1261
|
-
/*
|
|
1262
|
-
* Need to make sure that buffer isn't trying to write out of bounds.
|
|
1263
|
-
*/
|
|
1264
|
-
function checkOffset (offset, ext, length) {
|
|
1265
|
-
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
|
|
1266
|
-
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
|
|
1267
|
-
}
|
|
1268
|
-
|
|
1269
|
-
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
|
|
1270
|
-
offset = offset | 0;
|
|
1271
|
-
byteLength = byteLength | 0;
|
|
1272
|
-
if (!noAssert) checkOffset(offset, byteLength, this.length);
|
|
1273
|
-
|
|
1274
|
-
var val = this[offset];
|
|
1275
|
-
var mul = 1;
|
|
1276
|
-
var i = 0;
|
|
1277
|
-
while (++i < byteLength && (mul *= 0x100)) {
|
|
1278
|
-
val += this[offset + i] * mul;
|
|
1279
|
-
}
|
|
1280
|
-
|
|
1281
|
-
return val
|
|
1282
|
-
};
|
|
1283
|
-
|
|
1284
|
-
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
|
|
1285
|
-
offset = offset | 0;
|
|
1286
|
-
byteLength = byteLength | 0;
|
|
1287
|
-
if (!noAssert) {
|
|
1288
|
-
checkOffset(offset, byteLength, this.length);
|
|
1289
|
-
}
|
|
1290
|
-
|
|
1291
|
-
var val = this[offset + --byteLength];
|
|
1292
|
-
var mul = 1;
|
|
1293
|
-
while (byteLength > 0 && (mul *= 0x100)) {
|
|
1294
|
-
val += this[offset + --byteLength] * mul;
|
|
1295
|
-
}
|
|
1296
|
-
|
|
1297
|
-
return val
|
|
1298
|
-
};
|
|
1299
|
-
|
|
1300
|
-
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
|
|
1301
|
-
if (!noAssert) checkOffset(offset, 1, this.length);
|
|
1302
|
-
return this[offset]
|
|
1303
|
-
};
|
|
1304
|
-
|
|
1305
|
-
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
|
|
1306
|
-
if (!noAssert) checkOffset(offset, 2, this.length);
|
|
1307
|
-
return this[offset] | (this[offset + 1] << 8)
|
|
1308
|
-
};
|
|
1309
|
-
|
|
1310
|
-
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
|
|
1311
|
-
if (!noAssert) checkOffset(offset, 2, this.length);
|
|
1312
|
-
return (this[offset] << 8) | this[offset + 1]
|
|
1313
|
-
};
|
|
1314
|
-
|
|
1315
|
-
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
|
|
1316
|
-
if (!noAssert) checkOffset(offset, 4, this.length);
|
|
1317
|
-
|
|
1318
|
-
return ((this[offset]) |
|
|
1319
|
-
(this[offset + 1] << 8) |
|
|
1320
|
-
(this[offset + 2] << 16)) +
|
|
1321
|
-
(this[offset + 3] * 0x1000000)
|
|
1322
|
-
};
|
|
1323
|
-
|
|
1324
|
-
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
|
|
1325
|
-
if (!noAssert) checkOffset(offset, 4, this.length);
|
|
1326
|
-
|
|
1327
|
-
return (this[offset] * 0x1000000) +
|
|
1328
|
-
((this[offset + 1] << 16) |
|
|
1329
|
-
(this[offset + 2] << 8) |
|
|
1330
|
-
this[offset + 3])
|
|
1331
|
-
};
|
|
1332
|
-
|
|
1333
|
-
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
|
|
1334
|
-
offset = offset | 0;
|
|
1335
|
-
byteLength = byteLength | 0;
|
|
1336
|
-
if (!noAssert) checkOffset(offset, byteLength, this.length);
|
|
1337
|
-
|
|
1338
|
-
var val = this[offset];
|
|
1339
|
-
var mul = 1;
|
|
1340
|
-
var i = 0;
|
|
1341
|
-
while (++i < byteLength && (mul *= 0x100)) {
|
|
1342
|
-
val += this[offset + i] * mul;
|
|
1343
|
-
}
|
|
1344
|
-
mul *= 0x80;
|
|
1345
|
-
|
|
1346
|
-
if (val >= mul) val -= Math.pow(2, 8 * byteLength);
|
|
1347
|
-
|
|
1348
|
-
return val
|
|
1349
|
-
};
|
|
1350
|
-
|
|
1351
|
-
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
|
|
1352
|
-
offset = offset | 0;
|
|
1353
|
-
byteLength = byteLength | 0;
|
|
1354
|
-
if (!noAssert) checkOffset(offset, byteLength, this.length);
|
|
1355
|
-
|
|
1356
|
-
var i = byteLength;
|
|
1357
|
-
var mul = 1;
|
|
1358
|
-
var val = this[offset + --i];
|
|
1359
|
-
while (i > 0 && (mul *= 0x100)) {
|
|
1360
|
-
val += this[offset + --i] * mul;
|
|
1361
|
-
}
|
|
1362
|
-
mul *= 0x80;
|
|
1363
|
-
|
|
1364
|
-
if (val >= mul) val -= Math.pow(2, 8 * byteLength);
|
|
1365
|
-
|
|
1366
|
-
return val
|
|
1367
|
-
};
|
|
1368
|
-
|
|
1369
|
-
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
|
|
1370
|
-
if (!noAssert) checkOffset(offset, 1, this.length);
|
|
1371
|
-
if (!(this[offset] & 0x80)) return (this[offset])
|
|
1372
|
-
return ((0xff - this[offset] + 1) * -1)
|
|
1373
|
-
};
|
|
1374
|
-
|
|
1375
|
-
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
|
|
1376
|
-
if (!noAssert) checkOffset(offset, 2, this.length);
|
|
1377
|
-
var val = this[offset] | (this[offset + 1] << 8);
|
|
1378
|
-
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|
1379
|
-
};
|
|
1380
|
-
|
|
1381
|
-
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
|
|
1382
|
-
if (!noAssert) checkOffset(offset, 2, this.length);
|
|
1383
|
-
var val = this[offset + 1] | (this[offset] << 8);
|
|
1384
|
-
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|
1385
|
-
};
|
|
1386
|
-
|
|
1387
|
-
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
|
|
1388
|
-
if (!noAssert) checkOffset(offset, 4, this.length);
|
|
1389
|
-
|
|
1390
|
-
return (this[offset]) |
|
|
1391
|
-
(this[offset + 1] << 8) |
|
|
1392
|
-
(this[offset + 2] << 16) |
|
|
1393
|
-
(this[offset + 3] << 24)
|
|
1394
|
-
};
|
|
1395
|
-
|
|
1396
|
-
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
|
|
1397
|
-
if (!noAssert) checkOffset(offset, 4, this.length);
|
|
1398
|
-
|
|
1399
|
-
return (this[offset] << 24) |
|
|
1400
|
-
(this[offset + 1] << 16) |
|
|
1401
|
-
(this[offset + 2] << 8) |
|
|
1402
|
-
(this[offset + 3])
|
|
1403
|
-
};
|
|
1404
|
-
|
|
1405
|
-
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
|
|
1406
|
-
if (!noAssert) checkOffset(offset, 4, this.length);
|
|
1407
|
-
return read(this, offset, true, 23, 4)
|
|
1408
|
-
};
|
|
1409
|
-
|
|
1410
|
-
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
|
|
1411
|
-
if (!noAssert) checkOffset(offset, 4, this.length);
|
|
1412
|
-
return read(this, offset, false, 23, 4)
|
|
1413
|
-
};
|
|
1414
|
-
|
|
1415
|
-
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
|
|
1416
|
-
if (!noAssert) checkOffset(offset, 8, this.length);
|
|
1417
|
-
return read(this, offset, true, 52, 8)
|
|
1418
|
-
};
|
|
1419
|
-
|
|
1420
|
-
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
|
|
1421
|
-
if (!noAssert) checkOffset(offset, 8, this.length);
|
|
1422
|
-
return read(this, offset, false, 52, 8)
|
|
1423
|
-
};
|
|
1424
|
-
|
|
1425
|
-
function checkInt (buf, value, offset, ext, max, min) {
|
|
1426
|
-
if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
|
|
1427
|
-
if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
|
|
1428
|
-
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
|
1429
|
-
}
|
|
1430
|
-
|
|
1431
|
-
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
|
|
1432
|
-
value = +value;
|
|
1433
|
-
offset = offset | 0;
|
|
1434
|
-
byteLength = byteLength | 0;
|
|
1435
|
-
if (!noAssert) {
|
|
1436
|
-
var maxBytes = Math.pow(2, 8 * byteLength) - 1;
|
|
1437
|
-
checkInt(this, value, offset, byteLength, maxBytes, 0);
|
|
1438
|
-
}
|
|
1439
|
-
|
|
1440
|
-
var mul = 1;
|
|
1441
|
-
var i = 0;
|
|
1442
|
-
this[offset] = value & 0xFF;
|
|
1443
|
-
while (++i < byteLength && (mul *= 0x100)) {
|
|
1444
|
-
this[offset + i] = (value / mul) & 0xFF;
|
|
1445
|
-
}
|
|
1446
|
-
|
|
1447
|
-
return offset + byteLength
|
|
1448
|
-
};
|
|
1449
|
-
|
|
1450
|
-
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
|
|
1451
|
-
value = +value;
|
|
1452
|
-
offset = offset | 0;
|
|
1453
|
-
byteLength = byteLength | 0;
|
|
1454
|
-
if (!noAssert) {
|
|
1455
|
-
var maxBytes = Math.pow(2, 8 * byteLength) - 1;
|
|
1456
|
-
checkInt(this, value, offset, byteLength, maxBytes, 0);
|
|
1457
|
-
}
|
|
1458
|
-
|
|
1459
|
-
var i = byteLength - 1;
|
|
1460
|
-
var mul = 1;
|
|
1461
|
-
this[offset + i] = value & 0xFF;
|
|
1462
|
-
while (--i >= 0 && (mul *= 0x100)) {
|
|
1463
|
-
this[offset + i] = (value / mul) & 0xFF;
|
|
1464
|
-
}
|
|
1465
|
-
|
|
1466
|
-
return offset + byteLength
|
|
1467
|
-
};
|
|
1468
|
-
|
|
1469
|
-
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
|
|
1470
|
-
value = +value;
|
|
1471
|
-
offset = offset | 0;
|
|
1472
|
-
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);
|
|
1473
|
-
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
|
|
1474
|
-
this[offset] = (value & 0xff);
|
|
1475
|
-
return offset + 1
|
|
1476
|
-
};
|
|
1477
|
-
|
|
1478
|
-
function objectWriteUInt16 (buf, value, offset, littleEndian) {
|
|
1479
|
-
if (value < 0) value = 0xffff + value + 1;
|
|
1480
|
-
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
|
|
1481
|
-
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
|
|
1482
|
-
(littleEndian ? i : 1 - i) * 8;
|
|
1483
|
-
}
|
|
1484
|
-
}
|
|
1485
|
-
|
|
1486
|
-
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
|
|
1487
|
-
value = +value;
|
|
1488
|
-
offset = offset | 0;
|
|
1489
|
-
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
|
|
1490
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
1491
|
-
this[offset] = (value & 0xff);
|
|
1492
|
-
this[offset + 1] = (value >>> 8);
|
|
1493
|
-
} else {
|
|
1494
|
-
objectWriteUInt16(this, value, offset, true);
|
|
1495
|
-
}
|
|
1496
|
-
return offset + 2
|
|
1497
|
-
};
|
|
1498
|
-
|
|
1499
|
-
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
|
|
1500
|
-
value = +value;
|
|
1501
|
-
offset = offset | 0;
|
|
1502
|
-
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
|
|
1503
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
1504
|
-
this[offset] = (value >>> 8);
|
|
1505
|
-
this[offset + 1] = (value & 0xff);
|
|
1506
|
-
} else {
|
|
1507
|
-
objectWriteUInt16(this, value, offset, false);
|
|
1508
|
-
}
|
|
1509
|
-
return offset + 2
|
|
1510
|
-
};
|
|
1511
|
-
|
|
1512
|
-
function objectWriteUInt32 (buf, value, offset, littleEndian) {
|
|
1513
|
-
if (value < 0) value = 0xffffffff + value + 1;
|
|
1514
|
-
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
|
|
1515
|
-
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff;
|
|
1516
|
-
}
|
|
1517
|
-
}
|
|
1518
|
-
|
|
1519
|
-
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
|
|
1520
|
-
value = +value;
|
|
1521
|
-
offset = offset | 0;
|
|
1522
|
-
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
|
|
1523
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
1524
|
-
this[offset + 3] = (value >>> 24);
|
|
1525
|
-
this[offset + 2] = (value >>> 16);
|
|
1526
|
-
this[offset + 1] = (value >>> 8);
|
|
1527
|
-
this[offset] = (value & 0xff);
|
|
1528
|
-
} else {
|
|
1529
|
-
objectWriteUInt32(this, value, offset, true);
|
|
1530
|
-
}
|
|
1531
|
-
return offset + 4
|
|
1532
|
-
};
|
|
1533
|
-
|
|
1534
|
-
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
|
|
1535
|
-
value = +value;
|
|
1536
|
-
offset = offset | 0;
|
|
1537
|
-
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
|
|
1538
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
1539
|
-
this[offset] = (value >>> 24);
|
|
1540
|
-
this[offset + 1] = (value >>> 16);
|
|
1541
|
-
this[offset + 2] = (value >>> 8);
|
|
1542
|
-
this[offset + 3] = (value & 0xff);
|
|
1543
|
-
} else {
|
|
1544
|
-
objectWriteUInt32(this, value, offset, false);
|
|
1545
|
-
}
|
|
1546
|
-
return offset + 4
|
|
1547
|
-
};
|
|
1548
|
-
|
|
1549
|
-
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
|
|
1550
|
-
value = +value;
|
|
1551
|
-
offset = offset | 0;
|
|
1552
|
-
if (!noAssert) {
|
|
1553
|
-
var limit = Math.pow(2, 8 * byteLength - 1);
|
|
1554
|
-
|
|
1555
|
-
checkInt(this, value, offset, byteLength, limit - 1, -limit);
|
|
1556
|
-
}
|
|
1557
|
-
|
|
1558
|
-
var i = 0;
|
|
1559
|
-
var mul = 1;
|
|
1560
|
-
var sub = 0;
|
|
1561
|
-
this[offset] = value & 0xFF;
|
|
1562
|
-
while (++i < byteLength && (mul *= 0x100)) {
|
|
1563
|
-
if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
|
|
1564
|
-
sub = 1;
|
|
1565
|
-
}
|
|
1566
|
-
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;
|
|
1567
|
-
}
|
|
1568
|
-
|
|
1569
|
-
return offset + byteLength
|
|
1570
|
-
};
|
|
1571
|
-
|
|
1572
|
-
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
|
|
1573
|
-
value = +value;
|
|
1574
|
-
offset = offset | 0;
|
|
1575
|
-
if (!noAssert) {
|
|
1576
|
-
var limit = Math.pow(2, 8 * byteLength - 1);
|
|
1577
|
-
|
|
1578
|
-
checkInt(this, value, offset, byteLength, limit - 1, -limit);
|
|
1579
|
-
}
|
|
1580
|
-
|
|
1581
|
-
var i = byteLength - 1;
|
|
1582
|
-
var mul = 1;
|
|
1583
|
-
var sub = 0;
|
|
1584
|
-
this[offset + i] = value & 0xFF;
|
|
1585
|
-
while (--i >= 0 && (mul *= 0x100)) {
|
|
1586
|
-
if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
|
|
1587
|
-
sub = 1;
|
|
1588
|
-
}
|
|
1589
|
-
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;
|
|
1590
|
-
}
|
|
1591
|
-
|
|
1592
|
-
return offset + byteLength
|
|
1593
|
-
};
|
|
1594
|
-
|
|
1595
|
-
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
|
|
1596
|
-
value = +value;
|
|
1597
|
-
offset = offset | 0;
|
|
1598
|
-
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -128);
|
|
1599
|
-
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
|
|
1600
|
-
if (value < 0) value = 0xff + value + 1;
|
|
1601
|
-
this[offset] = (value & 0xff);
|
|
1602
|
-
return offset + 1
|
|
1603
|
-
};
|
|
1604
|
-
|
|
1605
|
-
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
|
|
1606
|
-
value = +value;
|
|
1607
|
-
offset = offset | 0;
|
|
1608
|
-
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768);
|
|
1609
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
1610
|
-
this[offset] = (value & 0xff);
|
|
1611
|
-
this[offset + 1] = (value >>> 8);
|
|
1612
|
-
} else {
|
|
1613
|
-
objectWriteUInt16(this, value, offset, true);
|
|
1614
|
-
}
|
|
1615
|
-
return offset + 2
|
|
1616
|
-
};
|
|
1617
|
-
|
|
1618
|
-
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
|
|
1619
|
-
value = +value;
|
|
1620
|
-
offset = offset | 0;
|
|
1621
|
-
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768);
|
|
1622
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
1623
|
-
this[offset] = (value >>> 8);
|
|
1624
|
-
this[offset + 1] = (value & 0xff);
|
|
1625
|
-
} else {
|
|
1626
|
-
objectWriteUInt16(this, value, offset, false);
|
|
1627
|
-
}
|
|
1628
|
-
return offset + 2
|
|
1629
|
-
};
|
|
1630
|
-
|
|
1631
|
-
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
|
|
1632
|
-
value = +value;
|
|
1633
|
-
offset = offset | 0;
|
|
1634
|
-
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648);
|
|
1635
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
1636
|
-
this[offset] = (value & 0xff);
|
|
1637
|
-
this[offset + 1] = (value >>> 8);
|
|
1638
|
-
this[offset + 2] = (value >>> 16);
|
|
1639
|
-
this[offset + 3] = (value >>> 24);
|
|
1640
|
-
} else {
|
|
1641
|
-
objectWriteUInt32(this, value, offset, true);
|
|
1642
|
-
}
|
|
1643
|
-
return offset + 4
|
|
1644
|
-
};
|
|
1645
|
-
|
|
1646
|
-
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
|
|
1647
|
-
value = +value;
|
|
1648
|
-
offset = offset | 0;
|
|
1649
|
-
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648);
|
|
1650
|
-
if (value < 0) value = 0xffffffff + value + 1;
|
|
1651
|
-
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
1652
|
-
this[offset] = (value >>> 24);
|
|
1653
|
-
this[offset + 1] = (value >>> 16);
|
|
1654
|
-
this[offset + 2] = (value >>> 8);
|
|
1655
|
-
this[offset + 3] = (value & 0xff);
|
|
1656
|
-
} else {
|
|
1657
|
-
objectWriteUInt32(this, value, offset, false);
|
|
1658
|
-
}
|
|
1659
|
-
return offset + 4
|
|
1660
|
-
};
|
|
1661
|
-
|
|
1662
|
-
function checkIEEE754 (buf, value, offset, ext, max, min) {
|
|
1663
|
-
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
|
1664
|
-
if (offset < 0) throw new RangeError('Index out of range')
|
|
1665
|
-
}
|
|
1666
|
-
|
|
1667
|
-
function writeFloat (buf, value, offset, littleEndian, noAssert) {
|
|
1668
|
-
if (!noAssert) {
|
|
1669
|
-
checkIEEE754(buf, value, offset, 4);
|
|
1670
|
-
}
|
|
1671
|
-
write(buf, value, offset, littleEndian, 23, 4);
|
|
1672
|
-
return offset + 4
|
|
1673
|
-
}
|
|
1674
|
-
|
|
1675
|
-
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
|
|
1676
|
-
return writeFloat(this, value, offset, true, noAssert)
|
|
1677
|
-
};
|
|
1678
|
-
|
|
1679
|
-
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
|
|
1680
|
-
return writeFloat(this, value, offset, false, noAssert)
|
|
1681
|
-
};
|
|
1682
|
-
|
|
1683
|
-
function writeDouble (buf, value, offset, littleEndian, noAssert) {
|
|
1684
|
-
if (!noAssert) {
|
|
1685
|
-
checkIEEE754(buf, value, offset, 8);
|
|
1686
|
-
}
|
|
1687
|
-
write(buf, value, offset, littleEndian, 52, 8);
|
|
1688
|
-
return offset + 8
|
|
1689
|
-
}
|
|
1690
|
-
|
|
1691
|
-
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
|
|
1692
|
-
return writeDouble(this, value, offset, true, noAssert)
|
|
1693
|
-
};
|
|
1694
|
-
|
|
1695
|
-
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
|
|
1696
|
-
return writeDouble(this, value, offset, false, noAssert)
|
|
1697
|
-
};
|
|
1698
|
-
|
|
1699
|
-
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
|
|
1700
|
-
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
|
|
1701
|
-
if (!start) start = 0;
|
|
1702
|
-
if (!end && end !== 0) end = this.length;
|
|
1703
|
-
if (targetStart >= target.length) targetStart = target.length;
|
|
1704
|
-
if (!targetStart) targetStart = 0;
|
|
1705
|
-
if (end > 0 && end < start) end = start;
|
|
1706
|
-
|
|
1707
|
-
// Copy 0 bytes; we're done
|
|
1708
|
-
if (end === start) return 0
|
|
1709
|
-
if (target.length === 0 || this.length === 0) return 0
|
|
1710
|
-
|
|
1711
|
-
// Fatal error conditions
|
|
1712
|
-
if (targetStart < 0) {
|
|
1713
|
-
throw new RangeError('targetStart out of bounds')
|
|
1714
|
-
}
|
|
1715
|
-
if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
|
|
1716
|
-
if (end < 0) throw new RangeError('sourceEnd out of bounds')
|
|
1717
|
-
|
|
1718
|
-
// Are we oob?
|
|
1719
|
-
if (end > this.length) end = this.length;
|
|
1720
|
-
if (target.length - targetStart < end - start) {
|
|
1721
|
-
end = target.length - targetStart + start;
|
|
1722
|
-
}
|
|
1723
|
-
|
|
1724
|
-
var len = end - start;
|
|
1725
|
-
var i;
|
|
1726
|
-
|
|
1727
|
-
if (this === target && start < targetStart && targetStart < end) {
|
|
1728
|
-
// descending copy from end
|
|
1729
|
-
for (i = len - 1; i >= 0; --i) {
|
|
1730
|
-
target[i + targetStart] = this[i + start];
|
|
1731
|
-
}
|
|
1732
|
-
} else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
|
|
1733
|
-
// ascending copy from start
|
|
1734
|
-
for (i = 0; i < len; ++i) {
|
|
1735
|
-
target[i + targetStart] = this[i + start];
|
|
1736
|
-
}
|
|
1737
|
-
} else {
|
|
1738
|
-
Uint8Array.prototype.set.call(
|
|
1739
|
-
target,
|
|
1740
|
-
this.subarray(start, start + len),
|
|
1741
|
-
targetStart
|
|
1742
|
-
);
|
|
1743
|
-
}
|
|
1744
|
-
|
|
1745
|
-
return len
|
|
1746
|
-
};
|
|
1747
|
-
|
|
1748
|
-
// Usage:
|
|
1749
|
-
// buffer.fill(number[, offset[, end]])
|
|
1750
|
-
// buffer.fill(buffer[, offset[, end]])
|
|
1751
|
-
// buffer.fill(string[, offset[, end]][, encoding])
|
|
1752
|
-
Buffer.prototype.fill = function fill (val, start, end, encoding) {
|
|
1753
|
-
// Handle string cases:
|
|
1754
|
-
if (typeof val === 'string') {
|
|
1755
|
-
if (typeof start === 'string') {
|
|
1756
|
-
encoding = start;
|
|
1757
|
-
start = 0;
|
|
1758
|
-
end = this.length;
|
|
1759
|
-
} else if (typeof end === 'string') {
|
|
1760
|
-
encoding = end;
|
|
1761
|
-
end = this.length;
|
|
1762
|
-
}
|
|
1763
|
-
if (val.length === 1) {
|
|
1764
|
-
var code = val.charCodeAt(0);
|
|
1765
|
-
if (code < 256) {
|
|
1766
|
-
val = code;
|
|
1767
|
-
}
|
|
1768
|
-
}
|
|
1769
|
-
if (encoding !== undefined && typeof encoding !== 'string') {
|
|
1770
|
-
throw new TypeError('encoding must be a string')
|
|
1771
|
-
}
|
|
1772
|
-
if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
|
|
1773
|
-
throw new TypeError('Unknown encoding: ' + encoding)
|
|
1774
|
-
}
|
|
1775
|
-
} else if (typeof val === 'number') {
|
|
1776
|
-
val = val & 255;
|
|
1777
|
-
}
|
|
1778
|
-
|
|
1779
|
-
// Invalid ranges are not set to a default, so can range check early.
|
|
1780
|
-
if (start < 0 || this.length < start || this.length < end) {
|
|
1781
|
-
throw new RangeError('Out of range index')
|
|
1782
|
-
}
|
|
1783
|
-
|
|
1784
|
-
if (end <= start) {
|
|
1785
|
-
return this
|
|
1786
|
-
}
|
|
1787
|
-
|
|
1788
|
-
start = start >>> 0;
|
|
1789
|
-
end = end === undefined ? this.length : end >>> 0;
|
|
1790
|
-
|
|
1791
|
-
if (!val) val = 0;
|
|
1792
|
-
|
|
1793
|
-
var i;
|
|
1794
|
-
if (typeof val === 'number') {
|
|
1795
|
-
for (i = start; i < end; ++i) {
|
|
1796
|
-
this[i] = val;
|
|
1797
|
-
}
|
|
1798
|
-
} else {
|
|
1799
|
-
var bytes = internalIsBuffer(val)
|
|
1800
|
-
? val
|
|
1801
|
-
: utf8ToBytes(new Buffer(val, encoding).toString());
|
|
1802
|
-
var len = bytes.length;
|
|
1803
|
-
for (i = 0; i < end - start; ++i) {
|
|
1804
|
-
this[i + start] = bytes[i % len];
|
|
1805
|
-
}
|
|
1806
|
-
}
|
|
1807
|
-
|
|
1808
|
-
return this
|
|
1809
|
-
};
|
|
1810
|
-
|
|
1811
|
-
// HELPER FUNCTIONS
|
|
1812
|
-
// ================
|
|
1813
|
-
|
|
1814
|
-
var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g;
|
|
1815
|
-
|
|
1816
|
-
function base64clean (str) {
|
|
1817
|
-
// Node strips out invalid characters like \n and \t from the string, base64-js does not
|
|
1818
|
-
str = stringtrim(str).replace(INVALID_BASE64_RE, '');
|
|
1819
|
-
// Node converts strings with length < 2 to ''
|
|
1820
|
-
if (str.length < 2) return ''
|
|
1821
|
-
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
|
|
1822
|
-
while (str.length % 4 !== 0) {
|
|
1823
|
-
str = str + '=';
|
|
1824
|
-
}
|
|
1825
|
-
return str
|
|
1826
|
-
}
|
|
1827
|
-
|
|
1828
|
-
function stringtrim (str) {
|
|
1829
|
-
if (str.trim) return str.trim()
|
|
1830
|
-
return str.replace(/^\s+|\s+$/g, '')
|
|
1831
|
-
}
|
|
1832
|
-
|
|
1833
|
-
function toHex (n) {
|
|
1834
|
-
if (n < 16) return '0' + n.toString(16)
|
|
1835
|
-
return n.toString(16)
|
|
1836
|
-
}
|
|
1837
|
-
|
|
1838
|
-
function utf8ToBytes (string, units) {
|
|
1839
|
-
units = units || Infinity;
|
|
1840
|
-
var codePoint;
|
|
1841
|
-
var length = string.length;
|
|
1842
|
-
var leadSurrogate = null;
|
|
1843
|
-
var bytes = [];
|
|
1844
|
-
|
|
1845
|
-
for (var i = 0; i < length; ++i) {
|
|
1846
|
-
codePoint = string.charCodeAt(i);
|
|
1847
|
-
|
|
1848
|
-
// is surrogate component
|
|
1849
|
-
if (codePoint > 0xD7FF && codePoint < 0xE000) {
|
|
1850
|
-
// last char was a lead
|
|
1851
|
-
if (!leadSurrogate) {
|
|
1852
|
-
// no lead yet
|
|
1853
|
-
if (codePoint > 0xDBFF) {
|
|
1854
|
-
// unexpected trail
|
|
1855
|
-
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
|
|
1856
|
-
continue
|
|
1857
|
-
} else if (i + 1 === length) {
|
|
1858
|
-
// unpaired lead
|
|
1859
|
-
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
|
|
1860
|
-
continue
|
|
1861
|
-
}
|
|
1862
|
-
|
|
1863
|
-
// valid lead
|
|
1864
|
-
leadSurrogate = codePoint;
|
|
1865
|
-
|
|
1866
|
-
continue
|
|
1867
|
-
}
|
|
1868
|
-
|
|
1869
|
-
// 2 leads in a row
|
|
1870
|
-
if (codePoint < 0xDC00) {
|
|
1871
|
-
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
|
|
1872
|
-
leadSurrogate = codePoint;
|
|
1873
|
-
continue
|
|
1874
|
-
}
|
|
1875
|
-
|
|
1876
|
-
// valid surrogate pair
|
|
1877
|
-
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;
|
|
1878
|
-
} else if (leadSurrogate) {
|
|
1879
|
-
// valid bmp char, but last char was a lead
|
|
1880
|
-
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
|
|
1881
|
-
}
|
|
1882
|
-
|
|
1883
|
-
leadSurrogate = null;
|
|
1884
|
-
|
|
1885
|
-
// encode utf8
|
|
1886
|
-
if (codePoint < 0x80) {
|
|
1887
|
-
if ((units -= 1) < 0) break
|
|
1888
|
-
bytes.push(codePoint);
|
|
1889
|
-
} else if (codePoint < 0x800) {
|
|
1890
|
-
if ((units -= 2) < 0) break
|
|
1891
|
-
bytes.push(
|
|
1892
|
-
codePoint >> 0x6 | 0xC0,
|
|
1893
|
-
codePoint & 0x3F | 0x80
|
|
1894
|
-
);
|
|
1895
|
-
} else if (codePoint < 0x10000) {
|
|
1896
|
-
if ((units -= 3) < 0) break
|
|
1897
|
-
bytes.push(
|
|
1898
|
-
codePoint >> 0xC | 0xE0,
|
|
1899
|
-
codePoint >> 0x6 & 0x3F | 0x80,
|
|
1900
|
-
codePoint & 0x3F | 0x80
|
|
1901
|
-
);
|
|
1902
|
-
} else if (codePoint < 0x110000) {
|
|
1903
|
-
if ((units -= 4) < 0) break
|
|
1904
|
-
bytes.push(
|
|
1905
|
-
codePoint >> 0x12 | 0xF0,
|
|
1906
|
-
codePoint >> 0xC & 0x3F | 0x80,
|
|
1907
|
-
codePoint >> 0x6 & 0x3F | 0x80,
|
|
1908
|
-
codePoint & 0x3F | 0x80
|
|
1909
|
-
);
|
|
1910
|
-
} else {
|
|
1911
|
-
throw new Error('Invalid code point')
|
|
1912
|
-
}
|
|
1913
|
-
}
|
|
1914
|
-
|
|
1915
|
-
return bytes
|
|
1916
|
-
}
|
|
1917
|
-
|
|
1918
|
-
function asciiToBytes (str) {
|
|
1919
|
-
var byteArray = [];
|
|
1920
|
-
for (var i = 0; i < str.length; ++i) {
|
|
1921
|
-
// Node's code seems to be doing this and not & 0x7F..
|
|
1922
|
-
byteArray.push(str.charCodeAt(i) & 0xFF);
|
|
1923
|
-
}
|
|
1924
|
-
return byteArray
|
|
1925
|
-
}
|
|
1926
|
-
|
|
1927
|
-
function utf16leToBytes (str, units) {
|
|
1928
|
-
var c, hi, lo;
|
|
1929
|
-
var byteArray = [];
|
|
1930
|
-
for (var i = 0; i < str.length; ++i) {
|
|
1931
|
-
if ((units -= 2) < 0) break
|
|
1932
|
-
|
|
1933
|
-
c = str.charCodeAt(i);
|
|
1934
|
-
hi = c >> 8;
|
|
1935
|
-
lo = c % 256;
|
|
1936
|
-
byteArray.push(lo);
|
|
1937
|
-
byteArray.push(hi);
|
|
1938
|
-
}
|
|
1939
|
-
|
|
1940
|
-
return byteArray
|
|
1941
|
-
}
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
function base64ToBytes (str) {
|
|
1945
|
-
return toByteArray(base64clean(str))
|
|
1946
|
-
}
|
|
1947
|
-
|
|
1948
|
-
function blitBuffer (src, dst, offset, length) {
|
|
1949
|
-
for (var i = 0; i < length; ++i) {
|
|
1950
|
-
if ((i + offset >= dst.length) || (i >= src.length)) break
|
|
1951
|
-
dst[i + offset] = src[i];
|
|
1952
|
-
}
|
|
1953
|
-
return i
|
|
1954
|
-
}
|
|
1955
|
-
|
|
1956
|
-
function isnan (val) {
|
|
1957
|
-
return val !== val // eslint-disable-line no-self-compare
|
|
1958
|
-
}
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
// the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence
|
|
1962
|
-
// The _isBuffer check is for Safari 5-7 support, because it's missing
|
|
1963
|
-
// Object.prototype.constructor. Remove this eventually
|
|
1964
|
-
function isBuffer(obj) {
|
|
1965
|
-
return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj))
|
|
1966
|
-
}
|
|
1967
|
-
|
|
1968
|
-
function isFastBuffer (obj) {
|
|
1969
|
-
return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
|
|
1970
|
-
}
|
|
1971
|
-
|
|
1972
|
-
// For Node v0.10 support. Remove this eventually.
|
|
1973
|
-
function isSlowBuffer (obj) {
|
|
1974
|
-
return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0))
|
|
1975
|
-
}
|
|
1976
|
-
|
|
1977
|
-
var LercDecode = {exports: {}};
|
|
1978
|
-
|
|
1979
|
-
/* jshint forin: false, bitwise: false */
|
|
1980
|
-
|
|
1981
|
-
var hasRequiredLercDecode;
|
|
1982
|
-
|
|
1983
|
-
function requireLercDecode () {
|
|
1984
|
-
if (hasRequiredLercDecode) return LercDecode.exports;
|
|
1985
|
-
hasRequiredLercDecode = 1;
|
|
1986
|
-
(function (module) {
|
|
1987
|
-
/*
|
|
1988
|
-
Copyright 2015-2021 Esri
|
|
1989
|
-
|
|
1990
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
|
1991
|
-
you may not use this file except in compliance with the License.
|
|
1992
|
-
You may obtain a copy of the License at
|
|
1993
|
-
|
|
1994
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
|
1995
|
-
|
|
1996
|
-
Unless required by applicable law or agreed to in writing, software
|
|
1997
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
|
1998
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1999
|
-
See the License for the specific language governing permissions and
|
|
2000
|
-
limitations under the License.
|
|
2001
|
-
|
|
2002
|
-
A copy of the license and additional notices are located with the
|
|
2003
|
-
source distribution at:
|
|
2004
|
-
|
|
2005
|
-
http://github.com/Esri/lerc/
|
|
2006
|
-
|
|
2007
|
-
Contributors: Johannes Schmid, (LERC v1)
|
|
2008
|
-
Chayanika Khatua, (LERC v1)
|
|
2009
|
-
Wenxue Ju (LERC v1, v2.x)
|
|
2010
|
-
*/
|
|
2011
|
-
|
|
2012
|
-
/* Copyright 2015-2021 Esri. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 @preserve */
|
|
2013
|
-
|
|
2014
|
-
/**
|
|
2015
|
-
* a module for decoding LERC blobs
|
|
2016
|
-
* @module Lerc
|
|
2017
|
-
*/
|
|
2018
|
-
(function() {
|
|
2019
|
-
//this decoder supports all lerc versions, each version has its own class (LercDecode and Lerc2Decode).
|
|
2020
|
-
//the exported module handles format variation autoamtically.
|
|
2021
|
-
|
|
2022
|
-
//the original LercDecode for Version 1
|
|
2023
|
-
var LercDecode = (function() {
|
|
2024
|
-
|
|
2025
|
-
// Note: currently, this module only has an implementation for decoding LERC data, not encoding. The name of
|
|
2026
|
-
// the class was chosen to be future proof.
|
|
2027
|
-
|
|
2028
|
-
var CntZImage = {};
|
|
2029
|
-
|
|
2030
|
-
CntZImage.defaultNoDataValue = -34027999387901484e22; // smallest Float32 value
|
|
2031
|
-
|
|
2032
|
-
/**
|
|
2033
|
-
* Decode a LERC byte stream and return an object containing the pixel data and some required and optional
|
|
2034
|
-
* information about it, such as the image's width and height.
|
|
2035
|
-
*
|
|
2036
|
-
* @param {ArrayBuffer} input The LERC input byte stream
|
|
2037
|
-
* @param {object} [options] Decoding options, containing any of the following properties:
|
|
2038
|
-
* @config {number} [inputOffset = 0]
|
|
2039
|
-
* Skip the first inputOffset bytes of the input byte stream. A valid LERC file is expected at that position.
|
|
2040
|
-
* @config {Uint8Array} [encodedMask = null]
|
|
2041
|
-
* If specified, the decoder will not read mask information from the input and use the specified encoded
|
|
2042
|
-
* mask data instead. Mask header/data must not be present in the LERC byte stream in this case.
|
|
2043
|
-
* @config {number} [noDataValue = LercCode.defaultNoDataValue]
|
|
2044
|
-
* Pixel value to use for masked pixels.
|
|
2045
|
-
* @config {ArrayBufferView|Array} [pixelType = Float32Array]
|
|
2046
|
-
* The desired type of the pixelData array in the return value. Note that it is the caller's responsibility to
|
|
2047
|
-
* provide an appropriate noDataValue if the default pixelType is overridden.
|
|
2048
|
-
* @config {boolean} [returnMask = false]
|
|
2049
|
-
* If true, the return value will contain a maskData property of type Uint8Array which has one element per
|
|
2050
|
-
* pixel, the value of which is 1 or 0 depending on whether that pixel's data is present or masked. If the
|
|
2051
|
-
* input LERC data does not contain a mask, maskData will not be returned.
|
|
2052
|
-
* @config {boolean} [returnEncodedMask = false]
|
|
2053
|
-
* If true, the return value will contain a encodedMaskData property, which can be passed into encode() as
|
|
2054
|
-
* encodedMask.
|
|
2055
|
-
* @config {boolean} [returnFileInfo = false]
|
|
2056
|
-
* If true, the return value will have a fileInfo property that contains metadata obtained from the
|
|
2057
|
-
* LERC headers and the decoding process.
|
|
2058
|
-
* @config {boolean} [computeUsedBitDepths = false]
|
|
2059
|
-
* If true, the fileInfo property in the return value will contain the set of all block bit depths
|
|
2060
|
-
* encountered during decoding. Will only have an effect if returnFileInfo option is true.
|
|
2061
|
-
* @returns {{width, height, pixelData, minValue, maxValue, noDataValue, maskData, encodedMaskData, fileInfo}}
|
|
2062
|
-
*/
|
|
2063
|
-
CntZImage.decode = function(input, options) {
|
|
2064
|
-
options = options || {};
|
|
2065
|
-
|
|
2066
|
-
var skipMask = options.encodedMaskData || (options.encodedMaskData === null);
|
|
2067
|
-
var parsedData = parse(input, options.inputOffset || 0, skipMask);
|
|
2068
|
-
|
|
2069
|
-
var noDataValue = (options.noDataValue !== null) ? options.noDataValue : CntZImage.defaultNoDataValue;
|
|
2070
|
-
|
|
2071
|
-
var uncompressedData = uncompressPixelValues(parsedData, options.pixelType || Float32Array,
|
|
2072
|
-
options.encodedMaskData, noDataValue, options.returnMask);
|
|
2073
|
-
|
|
2074
|
-
var result = {
|
|
2075
|
-
width: parsedData.width,
|
|
2076
|
-
height: parsedData.height,
|
|
2077
|
-
pixelData: uncompressedData.resultPixels,
|
|
2078
|
-
minValue: uncompressedData.minValue,
|
|
2079
|
-
maxValue: parsedData.pixels.maxValue,
|
|
2080
|
-
noDataValue: noDataValue
|
|
2081
|
-
};
|
|
2082
|
-
|
|
2083
|
-
if (uncompressedData.resultMask) {
|
|
2084
|
-
result.maskData = uncompressedData.resultMask;
|
|
2085
|
-
}
|
|
2086
|
-
|
|
2087
|
-
if (options.returnEncodedMask && parsedData.mask) {
|
|
2088
|
-
result.encodedMaskData = parsedData.mask.bitset ? parsedData.mask.bitset : null;
|
|
2089
|
-
}
|
|
2090
|
-
|
|
2091
|
-
if (options.returnFileInfo) {
|
|
2092
|
-
result.fileInfo = formatFileInfo(parsedData);
|
|
2093
|
-
if (options.computeUsedBitDepths) {
|
|
2094
|
-
result.fileInfo.bitDepths = computeUsedBitDepths(parsedData);
|
|
2095
|
-
}
|
|
2096
|
-
}
|
|
2097
|
-
|
|
2098
|
-
return result;
|
|
2099
|
-
};
|
|
2100
|
-
|
|
2101
|
-
var uncompressPixelValues = function(data, TypedArrayClass, maskBitset, noDataValue, storeDecodedMask) {
|
|
2102
|
-
var blockIdx = 0;
|
|
2103
|
-
var numX = data.pixels.numBlocksX;
|
|
2104
|
-
var numY = data.pixels.numBlocksY;
|
|
2105
|
-
var blockWidth = Math.floor(data.width / numX);
|
|
2106
|
-
var blockHeight = Math.floor(data.height / numY);
|
|
2107
|
-
var scale = 2 * data.maxZError;
|
|
2108
|
-
var minValue = Number.MAX_VALUE, currentValue;
|
|
2109
|
-
maskBitset = maskBitset || ((data.mask) ? data.mask.bitset : null);
|
|
2110
|
-
|
|
2111
|
-
var resultPixels, resultMask;
|
|
2112
|
-
resultPixels = new TypedArrayClass(data.width * data.height);
|
|
2113
|
-
if (storeDecodedMask && maskBitset) {
|
|
2114
|
-
resultMask = new Uint8Array(data.width * data.height);
|
|
2115
|
-
}
|
|
2116
|
-
var blockDataBuffer = new Float32Array(blockWidth * blockHeight);
|
|
2117
|
-
|
|
2118
|
-
var xx, yy;
|
|
2119
|
-
for (var y = 0; y <= numY; y++) {
|
|
2120
|
-
var thisBlockHeight = (y !== numY) ? blockHeight : (data.height % numY);
|
|
2121
|
-
if (thisBlockHeight === 0) {
|
|
2122
|
-
continue;
|
|
2123
|
-
}
|
|
2124
|
-
for (var x = 0; x <= numX; x++) {
|
|
2125
|
-
var thisBlockWidth = (x !== numX) ? blockWidth : (data.width % numX);
|
|
2126
|
-
if (thisBlockWidth === 0) {
|
|
2127
|
-
continue;
|
|
2128
|
-
}
|
|
2129
|
-
|
|
2130
|
-
var outPtr = y * data.width * blockHeight + x * blockWidth;
|
|
2131
|
-
var outStride = data.width - thisBlockWidth;
|
|
2132
|
-
|
|
2133
|
-
var block = data.pixels.blocks[blockIdx];
|
|
2134
|
-
|
|
2135
|
-
var blockData, blockPtr, constValue;
|
|
2136
|
-
if (block.encoding < 2) {
|
|
2137
|
-
// block is either uncompressed or bit-stuffed (encodings 0 and 1)
|
|
2138
|
-
if (block.encoding === 0) {
|
|
2139
|
-
// block is uncompressed
|
|
2140
|
-
blockData = block.rawData;
|
|
2141
|
-
} else {
|
|
2142
|
-
// block is bit-stuffed
|
|
2143
|
-
unstuff(block.stuffedData, block.bitsPerPixel, block.numValidPixels, block.offset, scale, blockDataBuffer, data.pixels.maxValue);
|
|
2144
|
-
blockData = blockDataBuffer;
|
|
2145
|
-
}
|
|
2146
|
-
blockPtr = 0;
|
|
2147
|
-
}
|
|
2148
|
-
else if (block.encoding === 2) {
|
|
2149
|
-
// block is all 0
|
|
2150
|
-
constValue = 0;
|
|
2151
|
-
}
|
|
2152
|
-
else {
|
|
2153
|
-
// block has constant value (encoding === 3)
|
|
2154
|
-
constValue = block.offset;
|
|
2155
|
-
}
|
|
2156
|
-
|
|
2157
|
-
var maskByte;
|
|
2158
|
-
if (maskBitset) {
|
|
2159
|
-
for (yy = 0; yy < thisBlockHeight; yy++) {
|
|
2160
|
-
if (outPtr & 7) {
|
|
2161
|
-
//
|
|
2162
|
-
maskByte = maskBitset[outPtr >> 3];
|
|
2163
|
-
maskByte <<= outPtr & 7;
|
|
2164
|
-
}
|
|
2165
|
-
for (xx = 0; xx < thisBlockWidth; xx++) {
|
|
2166
|
-
if (!(outPtr & 7)) {
|
|
2167
|
-
// read next byte from mask
|
|
2168
|
-
maskByte = maskBitset[outPtr >> 3];
|
|
2169
|
-
}
|
|
2170
|
-
if (maskByte & 128) {
|
|
2171
|
-
// pixel data present
|
|
2172
|
-
if (resultMask) {
|
|
2173
|
-
resultMask[outPtr] = 1;
|
|
2174
|
-
}
|
|
2175
|
-
currentValue = (block.encoding < 2) ? blockData[blockPtr++] : constValue;
|
|
2176
|
-
minValue = minValue > currentValue ? currentValue : minValue;
|
|
2177
|
-
resultPixels[outPtr++] = currentValue;
|
|
2178
|
-
} else {
|
|
2179
|
-
// pixel data not present
|
|
2180
|
-
if (resultMask) {
|
|
2181
|
-
resultMask[outPtr] = 0;
|
|
2182
|
-
}
|
|
2183
|
-
resultPixels[outPtr++] = noDataValue;
|
|
2184
|
-
}
|
|
2185
|
-
maskByte <<= 1;
|
|
2186
|
-
}
|
|
2187
|
-
outPtr += outStride;
|
|
2188
|
-
}
|
|
2189
|
-
} else {
|
|
2190
|
-
// mask not present, simply copy block over
|
|
2191
|
-
if (block.encoding < 2) {
|
|
2192
|
-
// duplicating this code block for performance reasons
|
|
2193
|
-
// blockData case:
|
|
2194
|
-
for (yy = 0; yy < thisBlockHeight; yy++) {
|
|
2195
|
-
for (xx = 0; xx < thisBlockWidth; xx++) {
|
|
2196
|
-
currentValue = blockData[blockPtr++];
|
|
2197
|
-
minValue = minValue > currentValue ? currentValue : minValue;
|
|
2198
|
-
resultPixels[outPtr++] = currentValue;
|
|
2199
|
-
}
|
|
2200
|
-
outPtr += outStride;
|
|
2201
|
-
}
|
|
2202
|
-
}
|
|
2203
|
-
else {
|
|
2204
|
-
// constValue case:
|
|
2205
|
-
minValue = minValue > constValue ? constValue : minValue;
|
|
2206
|
-
for (yy = 0; yy < thisBlockHeight; yy++) {
|
|
2207
|
-
for (xx = 0; xx < thisBlockWidth; xx++) {
|
|
2208
|
-
resultPixels[outPtr++] = constValue;
|
|
2209
|
-
}
|
|
2210
|
-
outPtr += outStride;
|
|
2211
|
-
}
|
|
2212
|
-
}
|
|
2213
|
-
}
|
|
2214
|
-
if ((block.encoding === 1) && (blockPtr !== block.numValidPixels)) {
|
|
2215
|
-
throw "Block and Mask do not match";
|
|
2216
|
-
}
|
|
2217
|
-
blockIdx++;
|
|
2218
|
-
}
|
|
2219
|
-
}
|
|
2220
|
-
|
|
2221
|
-
return {
|
|
2222
|
-
resultPixels: resultPixels,
|
|
2223
|
-
resultMask: resultMask,
|
|
2224
|
-
minValue: minValue
|
|
2225
|
-
};
|
|
2226
|
-
};
|
|
2227
|
-
|
|
2228
|
-
var formatFileInfo = function(data) {
|
|
2229
|
-
return {
|
|
2230
|
-
"fileIdentifierString": data.fileIdentifierString,
|
|
2231
|
-
"fileVersion": data.fileVersion,
|
|
2232
|
-
"imageType": data.imageType,
|
|
2233
|
-
"height": data.height,
|
|
2234
|
-
"width": data.width,
|
|
2235
|
-
"maxZError": data.maxZError,
|
|
2236
|
-
"eofOffset": data.eofOffset,
|
|
2237
|
-
"mask": data.mask ? {
|
|
2238
|
-
"numBlocksX": data.mask.numBlocksX,
|
|
2239
|
-
"numBlocksY": data.mask.numBlocksY,
|
|
2240
|
-
"numBytes": data.mask.numBytes,
|
|
2241
|
-
"maxValue": data.mask.maxValue
|
|
2242
|
-
} : null,
|
|
2243
|
-
"pixels": {
|
|
2244
|
-
"numBlocksX": data.pixels.numBlocksX,
|
|
2245
|
-
"numBlocksY": data.pixels.numBlocksY,
|
|
2246
|
-
"numBytes": data.pixels.numBytes,
|
|
2247
|
-
"maxValue": data.pixels.maxValue,
|
|
2248
|
-
"noDataValue": data.noDataValue
|
|
2249
|
-
}
|
|
2250
|
-
};
|
|
2251
|
-
};
|
|
2252
|
-
|
|
2253
|
-
var computeUsedBitDepths = function(data) {
|
|
2254
|
-
var numBlocks = data.pixels.numBlocksX * data.pixels.numBlocksY;
|
|
2255
|
-
var bitDepths = {};
|
|
2256
|
-
for (var i = 0; i < numBlocks; i++) {
|
|
2257
|
-
var block = data.pixels.blocks[i];
|
|
2258
|
-
if (block.encoding === 0) {
|
|
2259
|
-
bitDepths.float32 = true;
|
|
2260
|
-
} else if (block.encoding === 1) {
|
|
2261
|
-
bitDepths[block.bitsPerPixel] = true;
|
|
2262
|
-
} else {
|
|
2263
|
-
bitDepths[0] = true;
|
|
2264
|
-
}
|
|
2265
|
-
}
|
|
2266
|
-
|
|
2267
|
-
return Object.keys(bitDepths);
|
|
2268
|
-
};
|
|
2269
|
-
|
|
2270
|
-
var parse = function(input, fp, skipMask) {
|
|
2271
|
-
var data = {};
|
|
2272
|
-
|
|
2273
|
-
// File header
|
|
2274
|
-
var fileIdView = new Uint8Array(input, fp, 10);
|
|
2275
|
-
data.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
|
|
2276
|
-
if (data.fileIdentifierString.trim() !== "CntZImage") {
|
|
2277
|
-
throw "Unexpected file identifier string: " + data.fileIdentifierString;
|
|
2278
|
-
}
|
|
2279
|
-
fp += 10;
|
|
2280
|
-
var view = new DataView(input, fp, 24);
|
|
2281
|
-
data.fileVersion = view.getInt32(0, true);
|
|
2282
|
-
data.imageType = view.getInt32(4, true);
|
|
2283
|
-
data.height = view.getUint32(8, true);
|
|
2284
|
-
data.width = view.getUint32(12, true);
|
|
2285
|
-
data.maxZError = view.getFloat64(16, true);
|
|
2286
|
-
fp += 24;
|
|
2287
|
-
|
|
2288
|
-
// Mask Header
|
|
2289
|
-
if (!skipMask) {
|
|
2290
|
-
view = new DataView(input, fp, 16);
|
|
2291
|
-
data.mask = {};
|
|
2292
|
-
data.mask.numBlocksY = view.getUint32(0, true);
|
|
2293
|
-
data.mask.numBlocksX = view.getUint32(4, true);
|
|
2294
|
-
data.mask.numBytes = view.getUint32(8, true);
|
|
2295
|
-
data.mask.maxValue = view.getFloat32(12, true);
|
|
2296
|
-
fp += 16;
|
|
2297
|
-
|
|
2298
|
-
// Mask Data
|
|
2299
|
-
if (data.mask.numBytes > 0) {
|
|
2300
|
-
var bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
|
|
2301
|
-
view = new DataView(input, fp, data.mask.numBytes);
|
|
2302
|
-
var cnt = view.getInt16(0, true);
|
|
2303
|
-
var ip = 2, op = 0;
|
|
2304
|
-
do {
|
|
2305
|
-
if (cnt > 0) {
|
|
2306
|
-
while (cnt--) { bitset[op++] = view.getUint8(ip++); }
|
|
2307
|
-
} else {
|
|
2308
|
-
var val = view.getUint8(ip++);
|
|
2309
|
-
cnt = -cnt;
|
|
2310
|
-
while (cnt--) { bitset[op++] = val; }
|
|
2311
|
-
}
|
|
2312
|
-
cnt = view.getInt16(ip, true);
|
|
2313
|
-
ip += 2;
|
|
2314
|
-
} while (ip < data.mask.numBytes);
|
|
2315
|
-
if ((cnt !== -32768) || (op < bitset.length)) {
|
|
2316
|
-
throw "Unexpected end of mask RLE encoding";
|
|
2317
|
-
}
|
|
2318
|
-
data.mask.bitset = bitset;
|
|
2319
|
-
fp += data.mask.numBytes;
|
|
2320
|
-
}
|
|
2321
|
-
else if ((data.mask.numBytes | data.mask.numBlocksY | data.mask.maxValue) === 0) { // Special case, all nodata
|
|
2322
|
-
data.mask.bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
|
|
2323
|
-
}
|
|
2324
|
-
}
|
|
2325
|
-
|
|
2326
|
-
// Pixel Header
|
|
2327
|
-
view = new DataView(input, fp, 16);
|
|
2328
|
-
data.pixels = {};
|
|
2329
|
-
data.pixels.numBlocksY = view.getUint32(0, true);
|
|
2330
|
-
data.pixels.numBlocksX = view.getUint32(4, true);
|
|
2331
|
-
data.pixels.numBytes = view.getUint32(8, true);
|
|
2332
|
-
data.pixels.maxValue = view.getFloat32(12, true);
|
|
2333
|
-
fp += 16;
|
|
2334
|
-
|
|
2335
|
-
var numBlocksX = data.pixels.numBlocksX;
|
|
2336
|
-
var numBlocksY = data.pixels.numBlocksY;
|
|
2337
|
-
// the number of blocks specified in the header does not take into account the blocks at the end of
|
|
2338
|
-
// each row/column with a special width/height that make the image complete in case the width is not
|
|
2339
|
-
// evenly divisible by the number of blocks.
|
|
2340
|
-
var actualNumBlocksX = numBlocksX + ((data.width % numBlocksX) > 0 ? 1 : 0);
|
|
2341
|
-
var actualNumBlocksY = numBlocksY + ((data.height % numBlocksY) > 0 ? 1 : 0);
|
|
2342
|
-
data.pixels.blocks = new Array(actualNumBlocksX * actualNumBlocksY);
|
|
2343
|
-
var blockI = 0;
|
|
2344
|
-
for (var blockY = 0; blockY < actualNumBlocksY; blockY++) {
|
|
2345
|
-
for (var blockX = 0; blockX < actualNumBlocksX; blockX++) {
|
|
2346
|
-
|
|
2347
|
-
// Block
|
|
2348
|
-
var size = 0;
|
|
2349
|
-
var bytesLeft = input.byteLength - fp;
|
|
2350
|
-
view = new DataView(input, fp, Math.min(10, bytesLeft));
|
|
2351
|
-
var block = {};
|
|
2352
|
-
data.pixels.blocks[blockI++] = block;
|
|
2353
|
-
var headerByte = view.getUint8(0); size++;
|
|
2354
|
-
block.encoding = headerByte & 63;
|
|
2355
|
-
if (block.encoding > 3) {
|
|
2356
|
-
throw "Invalid block encoding (" + block.encoding + ")";
|
|
2357
|
-
}
|
|
2358
|
-
if (block.encoding === 2) {
|
|
2359
|
-
fp++;
|
|
2360
|
-
continue;
|
|
2361
|
-
}
|
|
2362
|
-
if ((headerByte !== 0) && (headerByte !== 2)) {
|
|
2363
|
-
headerByte >>= 6;
|
|
2364
|
-
block.offsetType = headerByte;
|
|
2365
|
-
if (headerByte === 2) {
|
|
2366
|
-
block.offset = view.getInt8(1); size++;
|
|
2367
|
-
} else if (headerByte === 1) {
|
|
2368
|
-
block.offset = view.getInt16(1, true); size += 2;
|
|
2369
|
-
} else if (headerByte === 0) {
|
|
2370
|
-
block.offset = view.getFloat32(1, true); size += 4;
|
|
2371
|
-
} else {
|
|
2372
|
-
throw "Invalid block offset type";
|
|
2373
|
-
}
|
|
2374
|
-
|
|
2375
|
-
if (block.encoding === 1) {
|
|
2376
|
-
headerByte = view.getUint8(size); size++;
|
|
2377
|
-
block.bitsPerPixel = headerByte & 63;
|
|
2378
|
-
headerByte >>= 6;
|
|
2379
|
-
block.numValidPixelsType = headerByte;
|
|
2380
|
-
if (headerByte === 2) {
|
|
2381
|
-
block.numValidPixels = view.getUint8(size); size++;
|
|
2382
|
-
} else if (headerByte === 1) {
|
|
2383
|
-
block.numValidPixels = view.getUint16(size, true); size += 2;
|
|
2384
|
-
} else if (headerByte === 0) {
|
|
2385
|
-
block.numValidPixels = view.getUint32(size, true); size += 4;
|
|
2386
|
-
} else {
|
|
2387
|
-
throw "Invalid valid pixel count type";
|
|
2388
|
-
}
|
|
2389
|
-
}
|
|
2390
|
-
}
|
|
2391
|
-
fp += size;
|
|
2392
|
-
|
|
2393
|
-
if (block.encoding === 3) {
|
|
2394
|
-
continue;
|
|
2395
|
-
}
|
|
2396
|
-
|
|
2397
|
-
var arrayBuf, store8;
|
|
2398
|
-
if (block.encoding === 0) {
|
|
2399
|
-
var numPixels = (data.pixels.numBytes - 1) / 4;
|
|
2400
|
-
if (numPixels !== Math.floor(numPixels)) {
|
|
2401
|
-
throw "uncompressed block has invalid length";
|
|
2402
|
-
}
|
|
2403
|
-
arrayBuf = new ArrayBuffer(numPixels * 4);
|
|
2404
|
-
store8 = new Uint8Array(arrayBuf);
|
|
2405
|
-
store8.set(new Uint8Array(input, fp, numPixels * 4));
|
|
2406
|
-
var rawData = new Float32Array(arrayBuf);
|
|
2407
|
-
block.rawData = rawData;
|
|
2408
|
-
fp += numPixels * 4;
|
|
2409
|
-
} else if (block.encoding === 1) {
|
|
2410
|
-
var dataBytes = Math.ceil(block.numValidPixels * block.bitsPerPixel / 8);
|
|
2411
|
-
var dataWords = Math.ceil(dataBytes / 4);
|
|
2412
|
-
arrayBuf = new ArrayBuffer(dataWords * 4);
|
|
2413
|
-
store8 = new Uint8Array(arrayBuf);
|
|
2414
|
-
store8.set(new Uint8Array(input, fp, dataBytes));
|
|
2415
|
-
block.stuffedData = new Uint32Array(arrayBuf);
|
|
2416
|
-
fp += dataBytes;
|
|
2417
|
-
}
|
|
2418
|
-
}
|
|
2419
|
-
}
|
|
2420
|
-
data.eofOffset = fp;
|
|
2421
|
-
return data;
|
|
2422
|
-
};
|
|
2423
|
-
|
|
2424
|
-
var unstuff = function(src, bitsPerPixel, numPixels, offset, scale, dest, maxValue) {
|
|
2425
|
-
var bitMask = (1 << bitsPerPixel) - 1;
|
|
2426
|
-
var i = 0, o;
|
|
2427
|
-
var bitsLeft = 0;
|
|
2428
|
-
var n, buffer;
|
|
2429
|
-
var nmax = Math.ceil((maxValue - offset) / scale);
|
|
2430
|
-
// get rid of trailing bytes that are already part of next block
|
|
2431
|
-
var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
|
|
2432
|
-
src[src.length - 1] <<= 8 * numInvalidTailBytes;
|
|
2433
|
-
|
|
2434
|
-
for (o = 0; o < numPixels; o++) {
|
|
2435
|
-
if (bitsLeft === 0) {
|
|
2436
|
-
buffer = src[i++];
|
|
2437
|
-
bitsLeft = 32;
|
|
2438
|
-
}
|
|
2439
|
-
if (bitsLeft >= bitsPerPixel) {
|
|
2440
|
-
n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
|
|
2441
|
-
bitsLeft -= bitsPerPixel;
|
|
2442
|
-
} else {
|
|
2443
|
-
var missingBits = (bitsPerPixel - bitsLeft);
|
|
2444
|
-
n = ((buffer & bitMask) << missingBits) & bitMask;
|
|
2445
|
-
buffer = src[i++];
|
|
2446
|
-
bitsLeft = 32 - missingBits;
|
|
2447
|
-
n += (buffer >>> bitsLeft);
|
|
2448
|
-
}
|
|
2449
|
-
//pixel values may exceed max due to quantization
|
|
2450
|
-
dest[o] = n < nmax ? offset + n * scale : maxValue;
|
|
2451
|
-
}
|
|
2452
|
-
return dest;
|
|
2453
|
-
};
|
|
2454
|
-
|
|
2455
|
-
return CntZImage;
|
|
2456
|
-
})();
|
|
2457
|
-
|
|
2458
|
-
//version 2. Supports 2.1, 2.2, 2.3
|
|
2459
|
-
var Lerc2Decode = (function() {
|
|
2460
|
-
// Note: currently, this module only has an implementation for decoding LERC data, not encoding. The name of
|
|
2461
|
-
// the class was chosen to be future proof, following LercDecode.
|
|
2462
|
-
|
|
2463
|
-
/*****************************************
|
|
2464
|
-
* private static class bitsutffer used by Lerc2Decode
|
|
2465
|
-
*******************************************/
|
|
2466
|
-
var BitStuffer = {
|
|
2467
|
-
//methods ending with 2 are for the new byte order used by Lerc2.3 and above.
|
|
2468
|
-
//originalUnstuff is used to unpack Huffman code table. code is duplicated to unstuffx for performance reasons.
|
|
2469
|
-
unstuff: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
|
|
2470
|
-
var bitMask = (1 << bitsPerPixel) - 1;
|
|
2471
|
-
var i = 0, o;
|
|
2472
|
-
var bitsLeft = 0;
|
|
2473
|
-
var n, buffer, missingBits, nmax;
|
|
2474
|
-
|
|
2475
|
-
// get rid of trailing bytes that are already part of next block
|
|
2476
|
-
var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
|
|
2477
|
-
src[src.length - 1] <<= 8 * numInvalidTailBytes;
|
|
2478
|
-
if (lutArr) {
|
|
2479
|
-
for (o = 0; o < numPixels; o++) {
|
|
2480
|
-
if (bitsLeft === 0) {
|
|
2481
|
-
buffer = src[i++];
|
|
2482
|
-
bitsLeft = 32;
|
|
2483
|
-
}
|
|
2484
|
-
if (bitsLeft >= bitsPerPixel) {
|
|
2485
|
-
n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
|
|
2486
|
-
bitsLeft -= bitsPerPixel;
|
|
2487
|
-
}
|
|
2488
|
-
else {
|
|
2489
|
-
missingBits = (bitsPerPixel - bitsLeft);
|
|
2490
|
-
n = ((buffer & bitMask) << missingBits) & bitMask;
|
|
2491
|
-
buffer = src[i++];
|
|
2492
|
-
bitsLeft = 32 - missingBits;
|
|
2493
|
-
n += (buffer >>> bitsLeft);
|
|
2494
|
-
}
|
|
2495
|
-
dest[o] = lutArr[n];//offset + lutArr[n] * scale;
|
|
2496
|
-
}
|
|
2497
|
-
}
|
|
2498
|
-
else {
|
|
2499
|
-
nmax = Math.ceil((maxValue - offset) / scale);
|
|
2500
|
-
for (o = 0; o < numPixels; o++) {
|
|
2501
|
-
if (bitsLeft === 0) {
|
|
2502
|
-
buffer = src[i++];
|
|
2503
|
-
bitsLeft = 32;
|
|
2504
|
-
}
|
|
2505
|
-
if (bitsLeft >= bitsPerPixel) {
|
|
2506
|
-
n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
|
|
2507
|
-
bitsLeft -= bitsPerPixel;
|
|
2508
|
-
}
|
|
2509
|
-
else {
|
|
2510
|
-
missingBits = (bitsPerPixel - bitsLeft);
|
|
2511
|
-
n = ((buffer & bitMask) << missingBits) & bitMask;
|
|
2512
|
-
buffer = src[i++];
|
|
2513
|
-
bitsLeft = 32 - missingBits;
|
|
2514
|
-
n += (buffer >>> bitsLeft);
|
|
2515
|
-
}
|
|
2516
|
-
//pixel values may exceed max due to quantization
|
|
2517
|
-
dest[o] = n < nmax ? offset + n * scale : maxValue;
|
|
2518
|
-
}
|
|
2519
|
-
}
|
|
2520
|
-
},
|
|
2521
|
-
|
|
2522
|
-
unstuffLUT: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {
|
|
2523
|
-
var bitMask = (1 << bitsPerPixel) - 1;
|
|
2524
|
-
var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0;
|
|
2525
|
-
var buffer;
|
|
2526
|
-
var dest = [];
|
|
2527
|
-
|
|
2528
|
-
// get rid of trailing bytes that are already part of next block
|
|
2529
|
-
var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
|
|
2530
|
-
src[src.length - 1] <<= 8 * numInvalidTailBytes;
|
|
2531
|
-
|
|
2532
|
-
var nmax = Math.ceil((maxValue - offset) / scale);
|
|
2533
|
-
for (o = 0; o < numPixels; o++) {
|
|
2534
|
-
if (bitsLeft === 0) {
|
|
2535
|
-
buffer = src[i++];
|
|
2536
|
-
bitsLeft = 32;
|
|
2537
|
-
}
|
|
2538
|
-
if (bitsLeft >= bitsPerPixel) {
|
|
2539
|
-
n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
|
|
2540
|
-
bitsLeft -= bitsPerPixel;
|
|
2541
|
-
} else {
|
|
2542
|
-
missingBits = (bitsPerPixel - bitsLeft);
|
|
2543
|
-
n = ((buffer & bitMask) << missingBits) & bitMask;
|
|
2544
|
-
buffer = src[i++];
|
|
2545
|
-
bitsLeft = 32 - missingBits;
|
|
2546
|
-
n += (buffer >>> bitsLeft);
|
|
2547
|
-
}
|
|
2548
|
-
//dest.push(n);
|
|
2549
|
-
dest[o] = n < nmax ? offset + n * scale : maxValue;
|
|
2550
|
-
}
|
|
2551
|
-
dest.unshift(offset);//1st one
|
|
2552
|
-
return dest;
|
|
2553
|
-
},
|
|
2554
|
-
|
|
2555
|
-
unstuff2: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
|
|
2556
|
-
var bitMask = (1 << bitsPerPixel) - 1;
|
|
2557
|
-
var i = 0, o;
|
|
2558
|
-
var bitsLeft = 0, bitPos = 0;
|
|
2559
|
-
var n, buffer, missingBits;
|
|
2560
|
-
if (lutArr) {
|
|
2561
|
-
for (o = 0; o < numPixels; o++) {
|
|
2562
|
-
if (bitsLeft === 0) {
|
|
2563
|
-
buffer = src[i++];
|
|
2564
|
-
bitsLeft = 32;
|
|
2565
|
-
bitPos = 0;
|
|
2566
|
-
}
|
|
2567
|
-
if (bitsLeft >= bitsPerPixel) {
|
|
2568
|
-
n = ((buffer >>> bitPos) & bitMask);
|
|
2569
|
-
bitsLeft -= bitsPerPixel;
|
|
2570
|
-
bitPos += bitsPerPixel;
|
|
2571
|
-
} else {
|
|
2572
|
-
missingBits = (bitsPerPixel - bitsLeft);
|
|
2573
|
-
n = (buffer >>> bitPos) & bitMask;
|
|
2574
|
-
buffer = src[i++];
|
|
2575
|
-
bitsLeft = 32 - missingBits;
|
|
2576
|
-
n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
|
|
2577
|
-
bitPos = missingBits;
|
|
2578
|
-
}
|
|
2579
|
-
dest[o] = lutArr[n];
|
|
2580
|
-
}
|
|
2581
|
-
}
|
|
2582
|
-
else {
|
|
2583
|
-
var nmax = Math.ceil((maxValue - offset) / scale);
|
|
2584
|
-
for (o = 0; o < numPixels; o++) {
|
|
2585
|
-
if (bitsLeft === 0) {
|
|
2586
|
-
buffer = src[i++];
|
|
2587
|
-
bitsLeft = 32;
|
|
2588
|
-
bitPos = 0;
|
|
2589
|
-
}
|
|
2590
|
-
if (bitsLeft >= bitsPerPixel) {
|
|
2591
|
-
//no unsigned left shift
|
|
2592
|
-
n = ((buffer >>> bitPos) & bitMask);
|
|
2593
|
-
bitsLeft -= bitsPerPixel;
|
|
2594
|
-
bitPos += bitsPerPixel;
|
|
2595
|
-
} else {
|
|
2596
|
-
missingBits = (bitsPerPixel - bitsLeft);
|
|
2597
|
-
n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;
|
|
2598
|
-
buffer = src[i++];
|
|
2599
|
-
bitsLeft = 32 - missingBits;
|
|
2600
|
-
n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
|
|
2601
|
-
bitPos = missingBits;
|
|
2602
|
-
}
|
|
2603
|
-
//pixel values may exceed max due to quantization
|
|
2604
|
-
dest[o] = n < nmax ? offset + n * scale : maxValue;
|
|
2605
|
-
}
|
|
2606
|
-
}
|
|
2607
|
-
return dest;
|
|
2608
|
-
},
|
|
2609
|
-
|
|
2610
|
-
unstuffLUT2: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {
|
|
2611
|
-
var bitMask = (1 << bitsPerPixel) - 1;
|
|
2612
|
-
var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0, bitPos = 0;
|
|
2613
|
-
var buffer;
|
|
2614
|
-
var dest = [];
|
|
2615
|
-
var nmax = Math.ceil((maxValue - offset) / scale);
|
|
2616
|
-
for (o = 0; o < numPixels; o++) {
|
|
2617
|
-
if (bitsLeft === 0) {
|
|
2618
|
-
buffer = src[i++];
|
|
2619
|
-
bitsLeft = 32;
|
|
2620
|
-
bitPos = 0;
|
|
2621
|
-
}
|
|
2622
|
-
if (bitsLeft >= bitsPerPixel) {
|
|
2623
|
-
//no unsigned left shift
|
|
2624
|
-
n = ((buffer >>> bitPos) & bitMask);
|
|
2625
|
-
bitsLeft -= bitsPerPixel;
|
|
2626
|
-
bitPos += bitsPerPixel;
|
|
2627
|
-
} else {
|
|
2628
|
-
missingBits = (bitsPerPixel - bitsLeft);
|
|
2629
|
-
n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;
|
|
2630
|
-
buffer = src[i++];
|
|
2631
|
-
bitsLeft = 32 - missingBits;
|
|
2632
|
-
n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
|
|
2633
|
-
bitPos = missingBits;
|
|
2634
|
-
}
|
|
2635
|
-
//dest.push(n);
|
|
2636
|
-
dest[o] = n < nmax ? offset + n * scale : maxValue;
|
|
2637
|
-
}
|
|
2638
|
-
dest.unshift(offset);
|
|
2639
|
-
return dest;
|
|
2640
|
-
},
|
|
2641
|
-
|
|
2642
|
-
originalUnstuff: function(src, dest, bitsPerPixel, numPixels) {
|
|
2643
|
-
var bitMask = (1 << bitsPerPixel) - 1;
|
|
2644
|
-
var i = 0, o;
|
|
2645
|
-
var bitsLeft = 0;
|
|
2646
|
-
var n, buffer, missingBits;
|
|
2647
|
-
|
|
2648
|
-
// get rid of trailing bytes that are already part of next block
|
|
2649
|
-
var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
|
|
2650
|
-
src[src.length - 1] <<= 8 * numInvalidTailBytes;
|
|
2651
|
-
|
|
2652
|
-
for (o = 0; o < numPixels; o++) {
|
|
2653
|
-
if (bitsLeft === 0) {
|
|
2654
|
-
buffer = src[i++];
|
|
2655
|
-
bitsLeft = 32;
|
|
2656
|
-
}
|
|
2657
|
-
if (bitsLeft >= bitsPerPixel) {
|
|
2658
|
-
n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
|
|
2659
|
-
bitsLeft -= bitsPerPixel;
|
|
2660
|
-
}
|
|
2661
|
-
else {
|
|
2662
|
-
missingBits = (bitsPerPixel - bitsLeft);
|
|
2663
|
-
n = ((buffer & bitMask) << missingBits) & bitMask;
|
|
2664
|
-
buffer = src[i++];
|
|
2665
|
-
bitsLeft = 32 - missingBits;
|
|
2666
|
-
n += (buffer >>> bitsLeft);
|
|
2667
|
-
}
|
|
2668
|
-
dest[o] = n;
|
|
2669
|
-
}
|
|
2670
|
-
return dest;
|
|
2671
|
-
},
|
|
2672
|
-
|
|
2673
|
-
originalUnstuff2: function(src, dest, bitsPerPixel, numPixels) {
|
|
2674
|
-
var bitMask = (1 << bitsPerPixel) - 1;
|
|
2675
|
-
var i = 0, o;
|
|
2676
|
-
var bitsLeft = 0, bitPos = 0;
|
|
2677
|
-
var n, buffer, missingBits;
|
|
2678
|
-
//micro-optimizations
|
|
2679
|
-
for (o = 0; o < numPixels; o++) {
|
|
2680
|
-
if (bitsLeft === 0) {
|
|
2681
|
-
buffer = src[i++];
|
|
2682
|
-
bitsLeft = 32;
|
|
2683
|
-
bitPos = 0;
|
|
2684
|
-
}
|
|
2685
|
-
if (bitsLeft >= bitsPerPixel) {
|
|
2686
|
-
//no unsigned left shift
|
|
2687
|
-
n = ((buffer >>> bitPos) & bitMask);
|
|
2688
|
-
bitsLeft -= bitsPerPixel;
|
|
2689
|
-
bitPos += bitsPerPixel;
|
|
2690
|
-
} else {
|
|
2691
|
-
missingBits = (bitsPerPixel - bitsLeft);
|
|
2692
|
-
n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;
|
|
2693
|
-
buffer = src[i++];
|
|
2694
|
-
bitsLeft = 32 - missingBits;
|
|
2695
|
-
n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
|
|
2696
|
-
bitPos = missingBits;
|
|
2697
|
-
}
|
|
2698
|
-
dest[o] = n;
|
|
2699
|
-
}
|
|
2700
|
-
return dest;
|
|
2701
|
-
}
|
|
2702
|
-
};
|
|
2703
|
-
|
|
2704
|
-
/*****************************************
|
|
2705
|
-
*private static class used by Lerc2Decode
|
|
2706
|
-
******************************************/
|
|
2707
|
-
var Lerc2Helpers = {
|
|
2708
|
-
HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, treat it like constant
|
|
2709
|
-
computeChecksumFletcher32: function(input) {
|
|
2710
|
-
|
|
2711
|
-
var sum1 = 0xffff, sum2 = 0xffff;
|
|
2712
|
-
var len = input.length;
|
|
2713
|
-
var words = Math.floor(len / 2);
|
|
2714
|
-
var i = 0;
|
|
2715
|
-
while (words) {
|
|
2716
|
-
var tlen = (words >= 359) ? 359 : words;
|
|
2717
|
-
words -= tlen;
|
|
2718
|
-
do {
|
|
2719
|
-
sum1 += (input[i++] << 8);
|
|
2720
|
-
sum2 += sum1 += input[i++];
|
|
2721
|
-
} while (--tlen);
|
|
2722
|
-
|
|
2723
|
-
sum1 = (sum1 & 0xffff) + (sum1 >>> 16);
|
|
2724
|
-
sum2 = (sum2 & 0xffff) + (sum2 >>> 16);
|
|
2725
|
-
}
|
|
2726
|
-
|
|
2727
|
-
// add the straggler byte if it exists
|
|
2728
|
-
if (len & 1) {
|
|
2729
|
-
sum2 += sum1 += (input[i] << 8);
|
|
2730
|
-
}
|
|
2731
|
-
// second reduction step to reduce sums to 16 bits
|
|
2732
|
-
sum1 = (sum1 & 0xffff) + (sum1 >>> 16);
|
|
2733
|
-
sum2 = (sum2 & 0xffff) + (sum2 >>> 16);
|
|
2734
|
-
|
|
2735
|
-
return (sum2 << 16 | sum1) >>> 0;
|
|
2736
|
-
},
|
|
2737
|
-
|
|
2738
|
-
readHeaderInfo: function(input, data) {
|
|
2739
|
-
var ptr = data.ptr;
|
|
2740
|
-
var fileIdView = new Uint8Array(input, ptr, 6);
|
|
2741
|
-
var headerInfo = {};
|
|
2742
|
-
headerInfo.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
|
|
2743
|
-
if (headerInfo.fileIdentifierString.lastIndexOf("Lerc2", 0) !== 0) {
|
|
2744
|
-
throw "Unexpected file identifier string (expect Lerc2 ): " + headerInfo.fileIdentifierString;
|
|
2745
|
-
}
|
|
2746
|
-
ptr += 6;
|
|
2747
|
-
var view = new DataView(input, ptr, 8);
|
|
2748
|
-
var fileVersion = view.getInt32(0, true);
|
|
2749
|
-
headerInfo.fileVersion = fileVersion;
|
|
2750
|
-
ptr += 4;
|
|
2751
|
-
if (fileVersion >= 3) {
|
|
2752
|
-
headerInfo.checksum = view.getUint32(4, true); //nrows
|
|
2753
|
-
ptr += 4;
|
|
2754
|
-
}
|
|
2755
|
-
|
|
2756
|
-
//keys start from here
|
|
2757
|
-
view = new DataView(input, ptr, 12);
|
|
2758
|
-
headerInfo.height = view.getUint32(0, true); //nrows
|
|
2759
|
-
headerInfo.width = view.getUint32(4, true); //ncols
|
|
2760
|
-
ptr += 8;
|
|
2761
|
-
if (fileVersion >= 4) {
|
|
2762
|
-
headerInfo.numDims = view.getUint32(8, true);
|
|
2763
|
-
ptr += 4;
|
|
2764
|
-
}
|
|
2765
|
-
else {
|
|
2766
|
-
headerInfo.numDims = 1;
|
|
2767
|
-
}
|
|
2768
|
-
|
|
2769
|
-
view = new DataView(input, ptr, 40);
|
|
2770
|
-
headerInfo.numValidPixel = view.getUint32(0, true);
|
|
2771
|
-
headerInfo.microBlockSize = view.getInt32(4, true);
|
|
2772
|
-
headerInfo.blobSize = view.getInt32(8, true);
|
|
2773
|
-
headerInfo.imageType = view.getInt32(12, true);
|
|
2774
|
-
|
|
2775
|
-
headerInfo.maxZError = view.getFloat64(16, true);
|
|
2776
|
-
headerInfo.zMin = view.getFloat64(24, true);
|
|
2777
|
-
headerInfo.zMax = view.getFloat64(32, true);
|
|
2778
|
-
ptr += 40;
|
|
2779
|
-
data.headerInfo = headerInfo;
|
|
2780
|
-
data.ptr = ptr;
|
|
2781
|
-
|
|
2782
|
-
var checksum, keyLength;
|
|
2783
|
-
if (fileVersion >= 3) {
|
|
2784
|
-
keyLength = fileVersion >= 4 ? 52 : 48;
|
|
2785
|
-
checksum = this.computeChecksumFletcher32(new Uint8Array(input, ptr - keyLength, headerInfo.blobSize - 14));
|
|
2786
|
-
if (checksum !== headerInfo.checksum) {
|
|
2787
|
-
throw "Checksum failed.";
|
|
2788
|
-
}
|
|
2789
|
-
}
|
|
2790
|
-
return true;
|
|
2791
|
-
},
|
|
2792
|
-
|
|
2793
|
-
checkMinMaxRanges: function(input, data) {
|
|
2794
|
-
var headerInfo = data.headerInfo;
|
|
2795
|
-
var OutPixelTypeArray = this.getDataTypeArray(headerInfo.imageType);
|
|
2796
|
-
var rangeBytes = headerInfo.numDims * this.getDataTypeSize(headerInfo.imageType);
|
|
2797
|
-
var minValues = this.readSubArray(input, data.ptr, OutPixelTypeArray, rangeBytes);
|
|
2798
|
-
var maxValues = this.readSubArray(input, data.ptr + rangeBytes, OutPixelTypeArray, rangeBytes);
|
|
2799
|
-
data.ptr += (2 * rangeBytes);
|
|
2800
|
-
var i, equal = true;
|
|
2801
|
-
for (i = 0; i < headerInfo.numDims; i++) {
|
|
2802
|
-
if (minValues[i] !== maxValues[i]) {
|
|
2803
|
-
equal = false;
|
|
2804
|
-
break;
|
|
2805
|
-
}
|
|
2806
|
-
}
|
|
2807
|
-
headerInfo.minValues = minValues;
|
|
2808
|
-
headerInfo.maxValues = maxValues;
|
|
2809
|
-
return equal;
|
|
2810
|
-
},
|
|
2811
|
-
|
|
2812
|
-
readSubArray: function(input, ptr, OutPixelTypeArray, numBytes) {
|
|
2813
|
-
var rawData;
|
|
2814
|
-
if (OutPixelTypeArray === Uint8Array) {
|
|
2815
|
-
rawData = new Uint8Array(input, ptr, numBytes);
|
|
2816
|
-
}
|
|
2817
|
-
else {
|
|
2818
|
-
var arrayBuf = new ArrayBuffer(numBytes);
|
|
2819
|
-
var store8 = new Uint8Array(arrayBuf);
|
|
2820
|
-
store8.set(new Uint8Array(input, ptr, numBytes));
|
|
2821
|
-
rawData = new OutPixelTypeArray(arrayBuf);
|
|
2822
|
-
}
|
|
2823
|
-
return rawData;
|
|
2824
|
-
},
|
|
2825
|
-
|
|
2826
|
-
readMask: function(input, data) {
|
|
2827
|
-
var ptr = data.ptr;
|
|
2828
|
-
var headerInfo = data.headerInfo;
|
|
2829
|
-
var numPixels = headerInfo.width * headerInfo.height;
|
|
2830
|
-
var numValidPixel = headerInfo.numValidPixel;
|
|
2831
|
-
|
|
2832
|
-
var view = new DataView(input, ptr, 4);
|
|
2833
|
-
var mask = {};
|
|
2834
|
-
mask.numBytes = view.getUint32(0, true);
|
|
2835
|
-
ptr += 4;
|
|
2836
|
-
|
|
2837
|
-
// Mask Data
|
|
2838
|
-
if ((0 === numValidPixel || numPixels === numValidPixel) && 0 !== mask.numBytes) {
|
|
2839
|
-
throw ("invalid mask");
|
|
2840
|
-
}
|
|
2841
|
-
var bitset, resultMask;
|
|
2842
|
-
if (numValidPixel === 0) {
|
|
2843
|
-
bitset = new Uint8Array(Math.ceil(numPixels / 8));
|
|
2844
|
-
mask.bitset = bitset;
|
|
2845
|
-
resultMask = new Uint8Array(numPixels);
|
|
2846
|
-
data.pixels.resultMask = resultMask;
|
|
2847
|
-
ptr += mask.numBytes;
|
|
2848
|
-
}// ????? else if (data.mask.numBytes > 0 && data.mask.numBytes< data.numValidPixel) {
|
|
2849
|
-
else if (mask.numBytes > 0) {
|
|
2850
|
-
bitset = new Uint8Array(Math.ceil(numPixels / 8));
|
|
2851
|
-
view = new DataView(input, ptr, mask.numBytes);
|
|
2852
|
-
var cnt = view.getInt16(0, true);
|
|
2853
|
-
var ip = 2, op = 0, val = 0;
|
|
2854
|
-
do {
|
|
2855
|
-
if (cnt > 0) {
|
|
2856
|
-
while (cnt--) { bitset[op++] = view.getUint8(ip++); }
|
|
2857
|
-
} else {
|
|
2858
|
-
val = view.getUint8(ip++);
|
|
2859
|
-
cnt = -cnt;
|
|
2860
|
-
while (cnt--) { bitset[op++] = val; }
|
|
2861
|
-
}
|
|
2862
|
-
cnt = view.getInt16(ip, true);
|
|
2863
|
-
ip += 2;
|
|
2864
|
-
} while (ip < mask.numBytes);
|
|
2865
|
-
if ((cnt !== -32768) || (op < bitset.length)) {
|
|
2866
|
-
throw "Unexpected end of mask RLE encoding";
|
|
2867
|
-
}
|
|
2868
|
-
|
|
2869
|
-
resultMask = new Uint8Array(numPixels);
|
|
2870
|
-
var mb = 0, k = 0;
|
|
2871
|
-
|
|
2872
|
-
for (k = 0; k < numPixels; k++) {
|
|
2873
|
-
if (k & 7) {
|
|
2874
|
-
mb = bitset[k >> 3];
|
|
2875
|
-
mb <<= k & 7;
|
|
2876
|
-
}
|
|
2877
|
-
else {
|
|
2878
|
-
mb = bitset[k >> 3];
|
|
2879
|
-
}
|
|
2880
|
-
if (mb & 128) {
|
|
2881
|
-
resultMask[k] = 1;
|
|
2882
|
-
}
|
|
2883
|
-
}
|
|
2884
|
-
data.pixels.resultMask = resultMask;
|
|
2885
|
-
|
|
2886
|
-
mask.bitset = bitset;
|
|
2887
|
-
ptr += mask.numBytes;
|
|
2888
|
-
}
|
|
2889
|
-
data.ptr = ptr;
|
|
2890
|
-
data.mask = mask;
|
|
2891
|
-
return true;
|
|
2892
|
-
},
|
|
2893
|
-
|
|
2894
|
-
readDataOneSweep: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {
|
|
2895
|
-
var ptr = data.ptr;
|
|
2896
|
-
var headerInfo = data.headerInfo;
|
|
2897
|
-
var numDims = headerInfo.numDims;
|
|
2898
|
-
var numPixels = headerInfo.width * headerInfo.height;
|
|
2899
|
-
var imageType = headerInfo.imageType;
|
|
2900
|
-
var numBytes = headerInfo.numValidPixel * Lerc2Helpers.getDataTypeSize(imageType) * numDims;
|
|
2901
|
-
//data.pixels.numBytes = numBytes;
|
|
2902
|
-
var rawData;
|
|
2903
|
-
var mask = data.pixels.resultMask;
|
|
2904
|
-
if (OutPixelTypeArray === Uint8Array) {
|
|
2905
|
-
rawData = new Uint8Array(input, ptr, numBytes);
|
|
2906
|
-
}
|
|
2907
|
-
else {
|
|
2908
|
-
var arrayBuf = new ArrayBuffer(numBytes);
|
|
2909
|
-
var store8 = new Uint8Array(arrayBuf);
|
|
2910
|
-
store8.set(new Uint8Array(input, ptr, numBytes));
|
|
2911
|
-
rawData = new OutPixelTypeArray(arrayBuf);
|
|
2912
|
-
}
|
|
2913
|
-
if (rawData.length === numPixels * numDims) {
|
|
2914
|
-
if (useBSQForOutputDim) {
|
|
2915
|
-
data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(rawData, numPixels, numDims, OutPixelTypeArray, true);
|
|
2916
|
-
}
|
|
2917
|
-
else {
|
|
2918
|
-
data.pixels.resultPixels = rawData;
|
|
2919
|
-
}
|
|
2920
|
-
}
|
|
2921
|
-
else //mask
|
|
2922
|
-
{
|
|
2923
|
-
data.pixels.resultPixels = new OutPixelTypeArray(numPixels * numDims);
|
|
2924
|
-
var z = 0, k = 0, i = 0, nStart = 0;
|
|
2925
|
-
if (numDims > 1) {
|
|
2926
|
-
if (useBSQForOutputDim) {
|
|
2927
|
-
for (k = 0; k < numPixels; k++) {
|
|
2928
|
-
if (mask[k]) {
|
|
2929
|
-
nStart = k;
|
|
2930
|
-
for (i = 0; i < numDims; i++, nStart+=numPixels) {
|
|
2931
|
-
data.pixels.resultPixels[nStart] = rawData[z++];
|
|
2932
|
-
}
|
|
2933
|
-
}
|
|
2934
|
-
}
|
|
2935
|
-
}
|
|
2936
|
-
else {
|
|
2937
|
-
for (k = 0; k < numPixels; k++) {
|
|
2938
|
-
if (mask[k]) {
|
|
2939
|
-
nStart = k * numDims;
|
|
2940
|
-
for (i = 0; i < numDims; i++) {
|
|
2941
|
-
data.pixels.resultPixels[nStart + i] = rawData[z++];
|
|
2942
|
-
}
|
|
2943
|
-
}
|
|
2944
|
-
}
|
|
2945
|
-
}
|
|
2946
|
-
}
|
|
2947
|
-
else {
|
|
2948
|
-
for (k = 0; k < numPixels; k++) {
|
|
2949
|
-
if (mask[k]) {
|
|
2950
|
-
data.pixels.resultPixels[k] = rawData[z++];
|
|
2951
|
-
}
|
|
2952
|
-
}
|
|
2953
|
-
}
|
|
2954
|
-
}
|
|
2955
|
-
ptr += numBytes;
|
|
2956
|
-
data.ptr = ptr; //return data;
|
|
2957
|
-
return true;
|
|
2958
|
-
},
|
|
2959
|
-
|
|
2960
|
-
readHuffmanTree: function(input, data) {
|
|
2961
|
-
var BITS_MAX = this.HUFFMAN_LUT_BITS_MAX; //8 is slow for the large test image
|
|
2962
|
-
//var size_max = 1 << BITS_MAX;
|
|
2963
|
-
/* ************************
|
|
2964
|
-
* reading code table
|
|
2965
|
-
*************************/
|
|
2966
|
-
var view = new DataView(input, data.ptr, 16);
|
|
2967
|
-
data.ptr += 16;
|
|
2968
|
-
var version = view.getInt32(0, true);
|
|
2969
|
-
if (version < 2) {
|
|
2970
|
-
throw "unsupported Huffman version";
|
|
2971
|
-
}
|
|
2972
|
-
var size = view.getInt32(4, true);
|
|
2973
|
-
var i0 = view.getInt32(8, true);
|
|
2974
|
-
var i1 = view.getInt32(12, true);
|
|
2975
|
-
if (i0 >= i1) {
|
|
2976
|
-
return false;
|
|
2977
|
-
}
|
|
2978
|
-
var blockDataBuffer = new Uint32Array(i1 - i0);
|
|
2979
|
-
Lerc2Helpers.decodeBits(input, data, blockDataBuffer);
|
|
2980
|
-
var codeTable = []; //size
|
|
2981
|
-
var i, j, k, len;
|
|
2982
|
-
|
|
2983
|
-
for (i = i0; i < i1; i++) {
|
|
2984
|
-
j = i - (i < size ? 0 : size);//wrap around
|
|
2985
|
-
codeTable[j] = { first: blockDataBuffer[i - i0], second: null };
|
|
2986
|
-
}
|
|
2987
|
-
|
|
2988
|
-
var dataBytes = input.byteLength - data.ptr;
|
|
2989
|
-
var dataWords = Math.ceil(dataBytes / 4);
|
|
2990
|
-
var arrayBuf = new ArrayBuffer(dataWords * 4);
|
|
2991
|
-
var store8 = new Uint8Array(arrayBuf);
|
|
2992
|
-
store8.set(new Uint8Array(input, data.ptr, dataBytes));
|
|
2993
|
-
var stuffedData = new Uint32Array(arrayBuf); //must start from x*4
|
|
2994
|
-
var bitPos = 0, word, srcPtr = 0;
|
|
2995
|
-
word = stuffedData[0];
|
|
2996
|
-
for (i = i0; i < i1; i++) {
|
|
2997
|
-
j = i - (i < size ? 0 : size);//wrap around
|
|
2998
|
-
len = codeTable[j].first;
|
|
2999
|
-
if (len > 0) {
|
|
3000
|
-
codeTable[j].second = (word << bitPos) >>> (32 - len);
|
|
3001
|
-
|
|
3002
|
-
if (32 - bitPos >= len) {
|
|
3003
|
-
bitPos += len;
|
|
3004
|
-
if (bitPos === 32) {
|
|
3005
|
-
bitPos = 0;
|
|
3006
|
-
srcPtr++;
|
|
3007
|
-
word = stuffedData[srcPtr];
|
|
3008
|
-
}
|
|
3009
|
-
}
|
|
3010
|
-
else {
|
|
3011
|
-
bitPos += len - 32;
|
|
3012
|
-
srcPtr++;
|
|
3013
|
-
word = stuffedData[srcPtr];
|
|
3014
|
-
codeTable[j].second |= word >>> (32 - bitPos);
|
|
3015
|
-
}
|
|
3016
|
-
}
|
|
3017
|
-
}
|
|
3018
|
-
|
|
3019
|
-
//finished reading code table
|
|
3020
|
-
|
|
3021
|
-
/* ************************
|
|
3022
|
-
* building lut
|
|
3023
|
-
*************************/
|
|
3024
|
-
var numBitsLUT = 0, numBitsLUTQick = 0;
|
|
3025
|
-
var tree = new TreeNode();
|
|
3026
|
-
for (i = 0; i < codeTable.length; i++) {
|
|
3027
|
-
if (codeTable[i] !== undefined) {
|
|
3028
|
-
numBitsLUT = Math.max(numBitsLUT, codeTable[i].first);
|
|
3029
|
-
}
|
|
3030
|
-
}
|
|
3031
|
-
if (numBitsLUT >= BITS_MAX) {
|
|
3032
|
-
numBitsLUTQick = BITS_MAX;
|
|
3033
|
-
}
|
|
3034
|
-
else {
|
|
3035
|
-
numBitsLUTQick = numBitsLUT;
|
|
3036
|
-
}
|
|
3037
|
-
// for debugging purpose
|
|
3038
|
-
// if (numBitsLUT >= 30) {
|
|
3039
|
-
// console.log("WARning, large NUM LUT BITS IS " + numBitsLUT);
|
|
3040
|
-
// }
|
|
3041
|
-
var decodeLut = [], entry, code, numEntries, jj, currentBit, node;
|
|
3042
|
-
for (i = i0; i < i1; i++) {
|
|
3043
|
-
j = i - (i < size ? 0 : size);//wrap around
|
|
3044
|
-
len = codeTable[j].first;
|
|
3045
|
-
if (len > 0) {
|
|
3046
|
-
entry = [len, j];
|
|
3047
|
-
if (len <= numBitsLUTQick) {
|
|
3048
|
-
code = codeTable[j].second << (numBitsLUTQick - len);
|
|
3049
|
-
numEntries = 1 << (numBitsLUTQick - len);
|
|
3050
|
-
for (k = 0; k < numEntries; k++) {
|
|
3051
|
-
decodeLut[code | k] = entry;
|
|
3052
|
-
}
|
|
3053
|
-
}
|
|
3054
|
-
else {
|
|
3055
|
-
//build tree
|
|
3056
|
-
code = codeTable[j].second;
|
|
3057
|
-
node = tree;
|
|
3058
|
-
for (jj = len - 1; jj >= 0; jj--) {
|
|
3059
|
-
currentBit = code >>> jj & 1; //no left shift as length could be 30,31
|
|
3060
|
-
if (currentBit) {
|
|
3061
|
-
if (!node.right) {
|
|
3062
|
-
node.right = new TreeNode();
|
|
3063
|
-
}
|
|
3064
|
-
node = node.right;
|
|
3065
|
-
}
|
|
3066
|
-
else {
|
|
3067
|
-
if (!node.left) {
|
|
3068
|
-
node.left = new TreeNode();
|
|
3069
|
-
}
|
|
3070
|
-
node = node.left;
|
|
3071
|
-
}
|
|
3072
|
-
if (jj === 0 && !node.val) {
|
|
3073
|
-
node.val = entry[1];
|
|
3074
|
-
}
|
|
3075
|
-
}
|
|
3076
|
-
}
|
|
3077
|
-
}
|
|
3078
|
-
}
|
|
3079
|
-
return {
|
|
3080
|
-
decodeLut: decodeLut,
|
|
3081
|
-
numBitsLUTQick: numBitsLUTQick,
|
|
3082
|
-
numBitsLUT: numBitsLUT,
|
|
3083
|
-
tree: tree,
|
|
3084
|
-
stuffedData: stuffedData,
|
|
3085
|
-
srcPtr: srcPtr,
|
|
3086
|
-
bitPos: bitPos
|
|
3087
|
-
};
|
|
3088
|
-
},
|
|
3089
|
-
|
|
3090
|
-
readHuffman: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {
|
|
3091
|
-
var headerInfo = data.headerInfo;
|
|
3092
|
-
var numDims = headerInfo.numDims;
|
|
3093
|
-
var height = data.headerInfo.height;
|
|
3094
|
-
var width = data.headerInfo.width;
|
|
3095
|
-
var numPixels = width * height;
|
|
3096
|
-
//var size_max = 1 << BITS_MAX;
|
|
3097
|
-
/* ************************
|
|
3098
|
-
* reading huffman structure info
|
|
3099
|
-
*************************/
|
|
3100
|
-
var huffmanInfo = this.readHuffmanTree(input, data);
|
|
3101
|
-
var decodeLut = huffmanInfo.decodeLut;
|
|
3102
|
-
var tree = huffmanInfo.tree;
|
|
3103
|
-
//stuffedData includes huffman headers
|
|
3104
|
-
var stuffedData = huffmanInfo.stuffedData;
|
|
3105
|
-
var srcPtr = huffmanInfo.srcPtr;
|
|
3106
|
-
var bitPos = huffmanInfo.bitPos;
|
|
3107
|
-
var numBitsLUTQick = huffmanInfo.numBitsLUTQick;
|
|
3108
|
-
var numBitsLUT = huffmanInfo.numBitsLUT;
|
|
3109
|
-
var offset = data.headerInfo.imageType === 0 ? 128 : 0;
|
|
3110
|
-
/*************************
|
|
3111
|
-
* decode
|
|
3112
|
-
***************************/
|
|
3113
|
-
var node, val, delta, mask = data.pixels.resultMask, valTmp, valTmpQuick, currentBit;
|
|
3114
|
-
var i, j, k, ii;
|
|
3115
|
-
var prevVal = 0;
|
|
3116
|
-
if (bitPos > 0) {
|
|
3117
|
-
srcPtr++;
|
|
3118
|
-
bitPos = 0;
|
|
3119
|
-
}
|
|
3120
|
-
var word = stuffedData[srcPtr];
|
|
3121
|
-
var deltaEncode = data.encodeMode === 1;
|
|
3122
|
-
var resultPixelsAllDim = new OutPixelTypeArray(numPixels * numDims);
|
|
3123
|
-
var resultPixels = resultPixelsAllDim;
|
|
3124
|
-
var iDim;
|
|
3125
|
-
// TODO: reevaluate the need to keep inlined decoding code as IE support is phasing out
|
|
3126
|
-
if (numDims < 2 || deltaEncode) {
|
|
3127
|
-
for (iDim = 0; iDim < numDims; iDim++) {
|
|
3128
|
-
if (numDims > 1) {
|
|
3129
|
-
//get the mem block of current dimension
|
|
3130
|
-
resultPixels = new OutPixelTypeArray(resultPixelsAllDim.buffer, numPixels * iDim, numPixels);
|
|
3131
|
-
prevVal = 0;
|
|
3132
|
-
}
|
|
3133
|
-
if (data.headerInfo.numValidPixel === width * height) { //all valid
|
|
3134
|
-
for (k = 0, i = 0; i < height; i++) {
|
|
3135
|
-
for (j = 0; j < width; j++, k++) {
|
|
3136
|
-
val = 0;
|
|
3137
|
-
valTmp = (word << bitPos) >>> (32 - numBitsLUTQick);
|
|
3138
|
-
valTmpQuick = valTmp;// >>> deltaBits;
|
|
3139
|
-
if (32 - bitPos < numBitsLUTQick) {
|
|
3140
|
-
valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUTQick));
|
|
3141
|
-
valTmpQuick = valTmp;// >>> deltaBits;
|
|
3142
|
-
}
|
|
3143
|
-
if (decodeLut[valTmpQuick]) // if there, move the correct number of bits and done
|
|
3144
|
-
{
|
|
3145
|
-
val = decodeLut[valTmpQuick][1];
|
|
3146
|
-
bitPos += decodeLut[valTmpQuick][0];
|
|
3147
|
-
}
|
|
3148
|
-
else {
|
|
3149
|
-
valTmp = (word << bitPos) >>> (32 - numBitsLUT);
|
|
3150
|
-
valTmpQuick = valTmp;// >>> deltaBits;
|
|
3151
|
-
if (32 - bitPos < numBitsLUT) {
|
|
3152
|
-
valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUT));
|
|
3153
|
-
valTmpQuick = valTmp;// >>> deltaBits;
|
|
3154
|
-
}
|
|
3155
|
-
node = tree;
|
|
3156
|
-
for (ii = 0; ii < numBitsLUT; ii++) {
|
|
3157
|
-
currentBit = valTmp >>> (numBitsLUT - ii - 1) & 1;
|
|
3158
|
-
node = currentBit ? node.right : node.left;
|
|
3159
|
-
if (!(node.left || node.right)) {
|
|
3160
|
-
val = node.val;
|
|
3161
|
-
bitPos = bitPos + ii + 1;
|
|
3162
|
-
break;
|
|
3163
|
-
}
|
|
3164
|
-
}
|
|
3165
|
-
}
|
|
3166
|
-
|
|
3167
|
-
if (bitPos >= 32) {
|
|
3168
|
-
bitPos -= 32;
|
|
3169
|
-
srcPtr++;
|
|
3170
|
-
word = stuffedData[srcPtr];
|
|
3171
|
-
}
|
|
3172
|
-
|
|
3173
|
-
delta = val - offset;
|
|
3174
|
-
if (deltaEncode) {
|
|
3175
|
-
if (j > 0) {
|
|
3176
|
-
delta += prevVal; // use overflow
|
|
3177
|
-
}
|
|
3178
|
-
else if (i > 0) {
|
|
3179
|
-
delta += resultPixels[k - width];
|
|
3180
|
-
}
|
|
3181
|
-
else {
|
|
3182
|
-
delta += prevVal;
|
|
3183
|
-
}
|
|
3184
|
-
delta &= 0xFF; //overflow
|
|
3185
|
-
resultPixels[k] = delta;//overflow
|
|
3186
|
-
prevVal = delta;
|
|
3187
|
-
}
|
|
3188
|
-
else {
|
|
3189
|
-
resultPixels[k] = delta;
|
|
3190
|
-
}
|
|
3191
|
-
}
|
|
3192
|
-
}
|
|
3193
|
-
}
|
|
3194
|
-
else { //not all valid, use mask
|
|
3195
|
-
for (k = 0, i = 0; i < height; i++) {
|
|
3196
|
-
for (j = 0; j < width; j++, k++) {
|
|
3197
|
-
if (mask[k]) {
|
|
3198
|
-
val = 0;
|
|
3199
|
-
valTmp = (word << bitPos) >>> (32 - numBitsLUTQick);
|
|
3200
|
-
valTmpQuick = valTmp;// >>> deltaBits;
|
|
3201
|
-
if (32 - bitPos < numBitsLUTQick) {
|
|
3202
|
-
valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUTQick));
|
|
3203
|
-
valTmpQuick = valTmp;// >>> deltaBits;
|
|
3204
|
-
}
|
|
3205
|
-
if (decodeLut[valTmpQuick]) // if there, move the correct number of bits and done
|
|
3206
|
-
{
|
|
3207
|
-
val = decodeLut[valTmpQuick][1];
|
|
3208
|
-
bitPos += decodeLut[valTmpQuick][0];
|
|
3209
|
-
}
|
|
3210
|
-
else {
|
|
3211
|
-
valTmp = (word << bitPos) >>> (32 - numBitsLUT);
|
|
3212
|
-
valTmpQuick = valTmp;// >>> deltaBits;
|
|
3213
|
-
if (32 - bitPos < numBitsLUT) {
|
|
3214
|
-
valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUT));
|
|
3215
|
-
valTmpQuick = valTmp;// >>> deltaBits;
|
|
3216
|
-
}
|
|
3217
|
-
node = tree;
|
|
3218
|
-
for (ii = 0; ii < numBitsLUT; ii++) {
|
|
3219
|
-
currentBit = valTmp >>> (numBitsLUT - ii - 1) & 1;
|
|
3220
|
-
node = currentBit ? node.right : node.left;
|
|
3221
|
-
if (!(node.left || node.right)) {
|
|
3222
|
-
val = node.val;
|
|
3223
|
-
bitPos = bitPos + ii + 1;
|
|
3224
|
-
break;
|
|
3225
|
-
}
|
|
3226
|
-
}
|
|
3227
|
-
}
|
|
3228
|
-
|
|
3229
|
-
if (bitPos >= 32) {
|
|
3230
|
-
bitPos -= 32;
|
|
3231
|
-
srcPtr++;
|
|
3232
|
-
word = stuffedData[srcPtr];
|
|
3233
|
-
}
|
|
3234
|
-
|
|
3235
|
-
delta = val - offset;
|
|
3236
|
-
if (deltaEncode) {
|
|
3237
|
-
if (j > 0 && mask[k - 1]) {
|
|
3238
|
-
delta += prevVal; // use overflow
|
|
3239
|
-
}
|
|
3240
|
-
else if (i > 0 && mask[k - width]) {
|
|
3241
|
-
delta += resultPixels[k - width];
|
|
3242
|
-
}
|
|
3243
|
-
else {
|
|
3244
|
-
delta += prevVal;
|
|
3245
|
-
}
|
|
3246
|
-
|
|
3247
|
-
delta &= 0xFF; //overflow
|
|
3248
|
-
resultPixels[k] = delta;//overflow
|
|
3249
|
-
prevVal = delta;
|
|
3250
|
-
}
|
|
3251
|
-
else {
|
|
3252
|
-
resultPixels[k] = delta;
|
|
3253
|
-
}
|
|
3254
|
-
}
|
|
3255
|
-
}
|
|
3256
|
-
}
|
|
3257
|
-
}
|
|
3258
|
-
}
|
|
3259
|
-
}
|
|
3260
|
-
else {
|
|
3261
|
-
for (k = 0, i = 0; i < height; i++) {
|
|
3262
|
-
for (j = 0; j < width; j++) {
|
|
3263
|
-
k = i * width + j;
|
|
3264
|
-
if (!mask || mask[k]) {
|
|
3265
|
-
for (iDim = 0; iDim < numDims; iDim++, k+=numPixels) {
|
|
3266
|
-
val = 0;
|
|
3267
|
-
valTmp = (word << bitPos) >>> (32 - numBitsLUTQick);
|
|
3268
|
-
valTmpQuick = valTmp;
|
|
3269
|
-
if (32 - bitPos < numBitsLUTQick) {
|
|
3270
|
-
valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUTQick));
|
|
3271
|
-
valTmpQuick = valTmp;
|
|
3272
|
-
}
|
|
3273
|
-
if (decodeLut[valTmpQuick])
|
|
3274
|
-
{
|
|
3275
|
-
val = decodeLut[valTmpQuick][1];
|
|
3276
|
-
bitPos += decodeLut[valTmpQuick][0];
|
|
3277
|
-
}
|
|
3278
|
-
else {
|
|
3279
|
-
valTmp = (word << bitPos) >>> (32 - numBitsLUT);
|
|
3280
|
-
valTmpQuick = valTmp;
|
|
3281
|
-
if (32 - bitPos < numBitsLUT) {
|
|
3282
|
-
valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUT));
|
|
3283
|
-
valTmpQuick = valTmp;
|
|
3284
|
-
}
|
|
3285
|
-
node = tree;
|
|
3286
|
-
for (ii = 0; ii < numBitsLUT; ii++) {
|
|
3287
|
-
currentBit = valTmp >>> (numBitsLUT - ii - 1) & 1;
|
|
3288
|
-
node = currentBit ? node.right : node.left;
|
|
3289
|
-
if (!(node.left || node.right)) {
|
|
3290
|
-
val = node.val;
|
|
3291
|
-
bitPos = bitPos + ii + 1;
|
|
3292
|
-
break;
|
|
3293
|
-
}
|
|
3294
|
-
}
|
|
3295
|
-
}
|
|
3296
|
-
|
|
3297
|
-
if (bitPos >= 32) {
|
|
3298
|
-
bitPos -= 32;
|
|
3299
|
-
srcPtr++;
|
|
3300
|
-
word = stuffedData[srcPtr];
|
|
3301
|
-
}
|
|
3302
|
-
|
|
3303
|
-
delta = val - offset;
|
|
3304
|
-
resultPixels[k] = delta;
|
|
3305
|
-
}
|
|
3306
|
-
}
|
|
3307
|
-
}
|
|
3308
|
-
}
|
|
3309
|
-
}
|
|
3310
|
-
data.ptr = data.ptr + (srcPtr + 1) * 4 + (bitPos > 0 ? 4 : 0);
|
|
3311
|
-
data.pixels.resultPixels = resultPixelsAllDim;
|
|
3312
|
-
//swap for BIP layout
|
|
3313
|
-
if (numDims > 1 && !useBSQForOutputDim) {
|
|
3314
|
-
data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(resultPixelsAllDim, numPixels, numDims, OutPixelTypeArray);
|
|
3315
|
-
}
|
|
3316
|
-
},
|
|
3317
|
-
|
|
3318
|
-
decodeBits: function(input, data, blockDataBuffer, offset, iDim) {
|
|
3319
|
-
{
|
|
3320
|
-
//bitstuff encoding is 3
|
|
3321
|
-
var headerInfo = data.headerInfo;
|
|
3322
|
-
var fileVersion = headerInfo.fileVersion;
|
|
3323
|
-
//var block = {};
|
|
3324
|
-
var blockPtr = 0;
|
|
3325
|
-
var viewByteLength = ((input.byteLength - data.ptr) >= 5) ? 5 : (input.byteLength - data.ptr);
|
|
3326
|
-
var view = new DataView(input, data.ptr, viewByteLength);
|
|
3327
|
-
var headerByte = view.getUint8(0);
|
|
3328
|
-
blockPtr++;
|
|
3329
|
-
var bits67 = headerByte >> 6;
|
|
3330
|
-
var n = (bits67 === 0) ? 4 : 3 - bits67;
|
|
3331
|
-
var doLut = (headerByte & 32) > 0 ? true : false;//5th bit
|
|
3332
|
-
var numBits = headerByte & 31;
|
|
3333
|
-
var numElements = 0;
|
|
3334
|
-
if (n === 1) {
|
|
3335
|
-
numElements = view.getUint8(blockPtr); blockPtr++;
|
|
3336
|
-
} else if (n === 2) {
|
|
3337
|
-
numElements = view.getUint16(blockPtr, true); blockPtr += 2;
|
|
3338
|
-
} else if (n === 4) {
|
|
3339
|
-
numElements = view.getUint32(blockPtr, true); blockPtr += 4;
|
|
3340
|
-
} else {
|
|
3341
|
-
throw "Invalid valid pixel count type";
|
|
3342
|
-
}
|
|
3343
|
-
//fix: huffman codes are bit stuffed, but not bound by data's max value, so need to use originalUnstuff
|
|
3344
|
-
//offset = offset || 0;
|
|
3345
|
-
var scale = 2 * headerInfo.maxZError;
|
|
3346
|
-
var stuffedData, arrayBuf, store8, dataBytes, dataWords;
|
|
3347
|
-
var lutArr, lutData, lutBytes, bitsPerPixel;
|
|
3348
|
-
var zMax = headerInfo.numDims > 1 ? headerInfo.maxValues[iDim] : headerInfo.zMax;
|
|
3349
|
-
if (doLut) {
|
|
3350
|
-
data.counter.lut++;
|
|
3351
|
-
lutBytes = view.getUint8(blockPtr);
|
|
3352
|
-
blockPtr++;
|
|
3353
|
-
dataBytes = Math.ceil((lutBytes - 1) * numBits / 8);
|
|
3354
|
-
dataWords = Math.ceil(dataBytes / 4);
|
|
3355
|
-
arrayBuf = new ArrayBuffer(dataWords * 4);
|
|
3356
|
-
store8 = new Uint8Array(arrayBuf);
|
|
3357
|
-
|
|
3358
|
-
data.ptr += blockPtr;
|
|
3359
|
-
store8.set(new Uint8Array(input, data.ptr, dataBytes));
|
|
3360
|
-
|
|
3361
|
-
lutData = new Uint32Array(arrayBuf);
|
|
3362
|
-
data.ptr += dataBytes;
|
|
3363
|
-
|
|
3364
|
-
bitsPerPixel = 0;
|
|
3365
|
-
while ((lutBytes - 1) >>> bitsPerPixel) {
|
|
3366
|
-
bitsPerPixel++;
|
|
3367
|
-
}
|
|
3368
|
-
dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
|
|
3369
|
-
dataWords = Math.ceil(dataBytes / 4);
|
|
3370
|
-
arrayBuf = new ArrayBuffer(dataWords * 4);
|
|
3371
|
-
store8 = new Uint8Array(arrayBuf);
|
|
3372
|
-
store8.set(new Uint8Array(input, data.ptr, dataBytes));
|
|
3373
|
-
stuffedData = new Uint32Array(arrayBuf);
|
|
3374
|
-
data.ptr += dataBytes;
|
|
3375
|
-
if (fileVersion >= 3) {
|
|
3376
|
-
lutArr = BitStuffer.unstuffLUT2(lutData, numBits, lutBytes - 1, offset, scale, zMax);
|
|
3377
|
-
}
|
|
3378
|
-
else {
|
|
3379
|
-
lutArr = BitStuffer.unstuffLUT(lutData, numBits, lutBytes - 1, offset, scale, zMax);
|
|
3380
|
-
}
|
|
3381
|
-
//lutArr.unshift(0);
|
|
3382
|
-
if (fileVersion >= 3) {
|
|
3383
|
-
//BitStuffer.unstuff2(block, blockDataBuffer, headerInfo.zMax);
|
|
3384
|
-
BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
|
|
3385
|
-
}
|
|
3386
|
-
else {
|
|
3387
|
-
BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
|
|
3388
|
-
}
|
|
3389
|
-
}
|
|
3390
|
-
else {
|
|
3391
|
-
//console.debug("bitstuffer");
|
|
3392
|
-
data.counter.bitstuffer++;
|
|
3393
|
-
bitsPerPixel = numBits;
|
|
3394
|
-
data.ptr += blockPtr;
|
|
3395
|
-
if (bitsPerPixel > 0) {
|
|
3396
|
-
dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
|
|
3397
|
-
dataWords = Math.ceil(dataBytes / 4);
|
|
3398
|
-
arrayBuf = new ArrayBuffer(dataWords * 4);
|
|
3399
|
-
store8 = new Uint8Array(arrayBuf);
|
|
3400
|
-
store8.set(new Uint8Array(input, data.ptr, dataBytes));
|
|
3401
|
-
stuffedData = new Uint32Array(arrayBuf);
|
|
3402
|
-
data.ptr += dataBytes;
|
|
3403
|
-
if (fileVersion >= 3) {
|
|
3404
|
-
if (offset == null) {
|
|
3405
|
-
BitStuffer.originalUnstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
|
|
3406
|
-
}
|
|
3407
|
-
else {
|
|
3408
|
-
BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
|
|
3409
|
-
}
|
|
3410
|
-
}
|
|
3411
|
-
else {
|
|
3412
|
-
if (offset == null) {
|
|
3413
|
-
BitStuffer.originalUnstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
|
|
3414
|
-
}
|
|
3415
|
-
else {
|
|
3416
|
-
BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
|
|
3417
|
-
}
|
|
3418
|
-
}
|
|
3419
|
-
}
|
|
3420
|
-
}
|
|
3421
|
-
}
|
|
3422
|
-
|
|
3423
|
-
},
|
|
3424
|
-
|
|
3425
|
-
readTiles: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {
|
|
3426
|
-
var headerInfo = data.headerInfo;
|
|
3427
|
-
var width = headerInfo.width;
|
|
3428
|
-
var height = headerInfo.height;
|
|
3429
|
-
var numPixels = width * height;
|
|
3430
|
-
var microBlockSize = headerInfo.microBlockSize;
|
|
3431
|
-
var imageType = headerInfo.imageType;
|
|
3432
|
-
var dataTypeSize = Lerc2Helpers.getDataTypeSize(imageType);
|
|
3433
|
-
var numBlocksX = Math.ceil(width / microBlockSize);
|
|
3434
|
-
var numBlocksY = Math.ceil(height / microBlockSize);
|
|
3435
|
-
data.pixels.numBlocksY = numBlocksY;
|
|
3436
|
-
data.pixels.numBlocksX = numBlocksX;
|
|
3437
|
-
data.pixels.ptr = 0;
|
|
3438
|
-
var row = 0, col = 0, blockY = 0, blockX = 0, thisBlockHeight = 0, thisBlockWidth = 0, bytesLeft = 0, headerByte = 0, bits67 = 0, testCode = 0, outPtr = 0, outStride = 0, numBytes = 0, bytesleft = 0, z = 0, blockPtr = 0;
|
|
3439
|
-
var view, block, arrayBuf, store8, rawData;
|
|
3440
|
-
var blockEncoding;
|
|
3441
|
-
var blockDataBuffer = new OutPixelTypeArray(microBlockSize * microBlockSize);
|
|
3442
|
-
var lastBlockHeight = (height % microBlockSize) || microBlockSize;
|
|
3443
|
-
var lastBlockWidth = (width % microBlockSize) || microBlockSize;
|
|
3444
|
-
var offsetType, offset;
|
|
3445
|
-
var numDims = headerInfo.numDims, iDim;
|
|
3446
|
-
var mask = data.pixels.resultMask;
|
|
3447
|
-
var resultPixels = data.pixels.resultPixels;
|
|
3448
|
-
var fileVersion = headerInfo.fileVersion;
|
|
3449
|
-
var fileVersionCheckNum = fileVersion >= 5 ? 14 : 15;
|
|
3450
|
-
var isDiffEncoding;
|
|
3451
|
-
var zMax = headerInfo.zMax;
|
|
3452
|
-
//var resultPixelsAllDim = resultPixels;
|
|
3453
|
-
var resultPixelsPrevDim;
|
|
3454
|
-
for (blockY = 0; blockY < numBlocksY; blockY++) {
|
|
3455
|
-
thisBlockHeight = (blockY !== numBlocksY - 1) ? microBlockSize : lastBlockHeight;
|
|
3456
|
-
for (blockX = 0; blockX < numBlocksX; blockX++) {
|
|
3457
|
-
//console.debug("y" + blockY + " x" + blockX);
|
|
3458
|
-
thisBlockWidth = (blockX !== numBlocksX - 1) ? microBlockSize : lastBlockWidth;
|
|
3459
|
-
|
|
3460
|
-
outPtr = blockY * width * microBlockSize + blockX * microBlockSize;
|
|
3461
|
-
outStride = width - thisBlockWidth;
|
|
3462
|
-
|
|
3463
|
-
for (iDim = 0; iDim < numDims; iDim++) {
|
|
3464
|
-
if (numDims > 1) {
|
|
3465
|
-
resultPixelsPrevDim = resultPixels;
|
|
3466
|
-
outPtr = blockY * width * microBlockSize + blockX * microBlockSize;
|
|
3467
|
-
resultPixels = new OutPixelTypeArray(data.pixels.resultPixels.buffer, numPixels * iDim * dataTypeSize, numPixels);
|
|
3468
|
-
zMax = headerInfo.maxValues[iDim];
|
|
3469
|
-
} else {
|
|
3470
|
-
resultPixelsPrevDim = null;
|
|
3471
|
-
}
|
|
3472
|
-
bytesLeft = input.byteLength - data.ptr;
|
|
3473
|
-
view = new DataView(input, data.ptr, Math.min(10, bytesLeft));
|
|
3474
|
-
block = {};
|
|
3475
|
-
blockPtr = 0;
|
|
3476
|
-
headerByte = view.getUint8(0);
|
|
3477
|
-
blockPtr++;
|
|
3478
|
-
isDiffEncoding = headerInfo.fileVersion >= 5 ? headerByte & 4 : 0;
|
|
3479
|
-
bits67 = (headerByte >> 6) & 0xFF;
|
|
3480
|
-
testCode = (headerByte >> 2) & fileVersionCheckNum; // use bits 2345 for integrity check
|
|
3481
|
-
if (testCode !== (((blockX * microBlockSize) >> 3) & fileVersionCheckNum)) {
|
|
3482
|
-
throw "integrity issue";
|
|
3483
|
-
}
|
|
3484
|
-
|
|
3485
|
-
if (isDiffEncoding && iDim === 0) {
|
|
3486
|
-
throw "integrity issue";
|
|
3487
|
-
}
|
|
3488
|
-
|
|
3489
|
-
blockEncoding = headerByte & 3;
|
|
3490
|
-
if (blockEncoding > 3) {
|
|
3491
|
-
data.ptr += blockPtr;
|
|
3492
|
-
throw "Invalid block encoding (" + blockEncoding + ")";
|
|
3493
|
-
}
|
|
3494
|
-
else if (blockEncoding === 2) { //constant 0
|
|
3495
|
-
if (isDiffEncoding) {
|
|
3496
|
-
if (mask) {
|
|
3497
|
-
for (row = 0; row < thisBlockHeight; row++) {
|
|
3498
|
-
for (col = 0; col < thisBlockWidth; col++) {
|
|
3499
|
-
if (mask[outPtr]) {
|
|
3500
|
-
resultPixels[outPtr] = resultPixelsPrevDim[outPtr];
|
|
3501
|
-
}
|
|
3502
|
-
outPtr++;
|
|
3503
|
-
}
|
|
3504
|
-
}
|
|
3505
|
-
}
|
|
3506
|
-
else {
|
|
3507
|
-
for (row = 0; row < thisBlockHeight; row++) {
|
|
3508
|
-
for (col = 0; col < thisBlockWidth; col++) {
|
|
3509
|
-
resultPixels[outPtr] = resultPixelsPrevDim[outPtr];
|
|
3510
|
-
outPtr++;
|
|
3511
|
-
}
|
|
3512
|
-
}
|
|
3513
|
-
}
|
|
3514
|
-
}
|
|
3515
|
-
data.counter.constant++;
|
|
3516
|
-
data.ptr += blockPtr;
|
|
3517
|
-
continue;
|
|
3518
|
-
}
|
|
3519
|
-
else if (blockEncoding === 0) { //uncompressed
|
|
3520
|
-
if (isDiffEncoding) {
|
|
3521
|
-
// doesn't make sense, should not happen
|
|
3522
|
-
throw "integrity issue";
|
|
3523
|
-
}
|
|
3524
|
-
data.counter.uncompressed++;
|
|
3525
|
-
data.ptr += blockPtr;
|
|
3526
|
-
numBytes = thisBlockHeight * thisBlockWidth * dataTypeSize;
|
|
3527
|
-
bytesleft = input.byteLength - data.ptr;
|
|
3528
|
-
numBytes = numBytes < bytesleft ? numBytes : bytesleft;
|
|
3529
|
-
//bit alignment
|
|
3530
|
-
arrayBuf = new ArrayBuffer((numBytes % dataTypeSize) === 0 ? numBytes : (numBytes + dataTypeSize - numBytes % dataTypeSize));
|
|
3531
|
-
store8 = new Uint8Array(arrayBuf);
|
|
3532
|
-
store8.set(new Uint8Array(input, data.ptr, numBytes));
|
|
3533
|
-
rawData = new OutPixelTypeArray(arrayBuf);
|
|
3534
|
-
z = 0;
|
|
3535
|
-
if (mask) {
|
|
3536
|
-
for (row = 0; row < thisBlockHeight; row++) {
|
|
3537
|
-
for (col = 0; col < thisBlockWidth; col++) {
|
|
3538
|
-
if (mask[outPtr]) {
|
|
3539
|
-
resultPixels[outPtr] = rawData[z++];
|
|
3540
|
-
}
|
|
3541
|
-
outPtr++;
|
|
3542
|
-
}
|
|
3543
|
-
outPtr += outStride;
|
|
3544
|
-
}
|
|
3545
|
-
}
|
|
3546
|
-
else {//all valid
|
|
3547
|
-
for (row = 0; row < thisBlockHeight; row++) {
|
|
3548
|
-
for (col = 0; col < thisBlockWidth; col++) {
|
|
3549
|
-
resultPixels[outPtr++] = rawData[z++];
|
|
3550
|
-
}
|
|
3551
|
-
outPtr += outStride;
|
|
3552
|
-
}
|
|
3553
|
-
}
|
|
3554
|
-
data.ptr += z * dataTypeSize;
|
|
3555
|
-
}
|
|
3556
|
-
else { //1 or 3
|
|
3557
|
-
offsetType = Lerc2Helpers.getDataTypeUsed((isDiffEncoding && imageType < 6) ? 4 : imageType, bits67);
|
|
3558
|
-
offset = Lerc2Helpers.getOnePixel(block, blockPtr, offsetType, view);
|
|
3559
|
-
blockPtr += Lerc2Helpers.getDataTypeSize(offsetType);
|
|
3560
|
-
if (blockEncoding === 3) //constant offset value
|
|
3561
|
-
{
|
|
3562
|
-
data.ptr += blockPtr;
|
|
3563
|
-
data.counter.constantoffset++;
|
|
3564
|
-
//you can delete the following resultMask case in favor of performance because val is constant and users use nodata mask, otherwise nodatavalue post processing handles it too.
|
|
3565
|
-
//while the above statement is true, we're not doing it as we want to keep invalid pixel value at 0 rather than arbitrary values
|
|
3566
|
-
if (mask) {
|
|
3567
|
-
for (row = 0; row < thisBlockHeight; row++) {
|
|
3568
|
-
for (col = 0; col < thisBlockWidth; col++) {
|
|
3569
|
-
if (mask[outPtr]) {
|
|
3570
|
-
resultPixels[outPtr] = isDiffEncoding ? Math.min(zMax, resultPixelsPrevDim[outPtr] + offset) : offset;
|
|
3571
|
-
}
|
|
3572
|
-
outPtr++;
|
|
3573
|
-
}
|
|
3574
|
-
outPtr += outStride;
|
|
3575
|
-
}
|
|
3576
|
-
}
|
|
3577
|
-
else {
|
|
3578
|
-
for (row = 0; row < thisBlockHeight; row++) {
|
|
3579
|
-
for (col = 0; col < thisBlockWidth; col++) {
|
|
3580
|
-
resultPixels[outPtr] = isDiffEncoding ? Math.min(zMax, resultPixelsPrevDim[outPtr] + offset) : offset;
|
|
3581
|
-
outPtr++;
|
|
3582
|
-
}
|
|
3583
|
-
outPtr += outStride;
|
|
3584
|
-
}
|
|
3585
|
-
}
|
|
3586
|
-
}
|
|
3587
|
-
else { //bitstuff encoding is 3
|
|
3588
|
-
data.ptr += blockPtr;
|
|
3589
|
-
//heavy lifting
|
|
3590
|
-
Lerc2Helpers.decodeBits(input, data, blockDataBuffer, offset, iDim);
|
|
3591
|
-
blockPtr = 0;
|
|
3592
|
-
// duplicate code to favor performance, diff encoding is for multidimension only
|
|
3593
|
-
if (isDiffEncoding) {
|
|
3594
|
-
if (mask) {
|
|
3595
|
-
for (row = 0; row < thisBlockHeight; row++) {
|
|
3596
|
-
for (col = 0; col < thisBlockWidth; col++) {
|
|
3597
|
-
if (mask[outPtr]) {
|
|
3598
|
-
resultPixels[outPtr] = blockDataBuffer[blockPtr++] + resultPixelsPrevDim[outPtr];
|
|
3599
|
-
}
|
|
3600
|
-
outPtr++;
|
|
3601
|
-
}
|
|
3602
|
-
outPtr += outStride;
|
|
3603
|
-
}
|
|
3604
|
-
}
|
|
3605
|
-
else {
|
|
3606
|
-
for (row = 0; row < thisBlockHeight; row++) {
|
|
3607
|
-
for (col = 0; col < thisBlockWidth; col++) {
|
|
3608
|
-
resultPixels[outPtr] = blockDataBuffer[blockPtr++] + resultPixelsPrevDim[outPtr];
|
|
3609
|
-
outPtr++;
|
|
3610
|
-
}
|
|
3611
|
-
outPtr += outStride;
|
|
3612
|
-
}
|
|
3613
|
-
}
|
|
3614
|
-
}
|
|
3615
|
-
else if (mask) {
|
|
3616
|
-
for (row = 0; row < thisBlockHeight; row++) {
|
|
3617
|
-
for (col = 0; col < thisBlockWidth; col++) {
|
|
3618
|
-
if (mask[outPtr]) {
|
|
3619
|
-
resultPixels[outPtr] = blockDataBuffer[blockPtr++];
|
|
3620
|
-
}
|
|
3621
|
-
outPtr++;
|
|
3622
|
-
}
|
|
3623
|
-
outPtr += outStride;
|
|
3624
|
-
}
|
|
3625
|
-
}
|
|
3626
|
-
else {
|
|
3627
|
-
for (row = 0; row < thisBlockHeight; row++) {
|
|
3628
|
-
for (col = 0; col < thisBlockWidth; col++) {
|
|
3629
|
-
resultPixels[outPtr++] = blockDataBuffer[blockPtr++];
|
|
3630
|
-
}
|
|
3631
|
-
outPtr += outStride;
|
|
3632
|
-
}
|
|
3633
|
-
}
|
|
3634
|
-
}
|
|
3635
|
-
}
|
|
3636
|
-
}
|
|
3637
|
-
}
|
|
3638
|
-
}
|
|
3639
|
-
//swap for BIP: it's always easier for clients to handle BSQ so we keep existing logic and introduce a swap here to minimze changes
|
|
3640
|
-
if (numDims > 1 && !useBSQForOutputDim) {
|
|
3641
|
-
data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(data.pixels.resultPixels, numPixels, numDims, OutPixelTypeArray);
|
|
3642
|
-
}
|
|
3643
|
-
},
|
|
3644
|
-
|
|
3645
|
-
/*****************
|
|
3646
|
-
* private methods (helper methods)
|
|
3647
|
-
*****************/
|
|
3648
|
-
|
|
3649
|
-
formatFileInfo: function(data) {
|
|
3650
|
-
return {
|
|
3651
|
-
"fileIdentifierString": data.headerInfo.fileIdentifierString,
|
|
3652
|
-
"fileVersion": data.headerInfo.fileVersion,
|
|
3653
|
-
"imageType": data.headerInfo.imageType,
|
|
3654
|
-
"height": data.headerInfo.height,
|
|
3655
|
-
"width": data.headerInfo.width,
|
|
3656
|
-
"numValidPixel": data.headerInfo.numValidPixel,
|
|
3657
|
-
"microBlockSize": data.headerInfo.microBlockSize,
|
|
3658
|
-
"blobSize": data.headerInfo.blobSize,
|
|
3659
|
-
"maxZError": data.headerInfo.maxZError,
|
|
3660
|
-
"pixelType": Lerc2Helpers.getPixelType(data.headerInfo.imageType),
|
|
3661
|
-
"eofOffset": data.eofOffset,
|
|
3662
|
-
"mask": data.mask ? {
|
|
3663
|
-
"numBytes": data.mask.numBytes
|
|
3664
|
-
} : null,
|
|
3665
|
-
"pixels": {
|
|
3666
|
-
"numBlocksX": data.pixels.numBlocksX,
|
|
3667
|
-
"numBlocksY": data.pixels.numBlocksY,
|
|
3668
|
-
//"numBytes": data.pixels.numBytes,
|
|
3669
|
-
"maxValue": data.headerInfo.zMax,
|
|
3670
|
-
"minValue": data.headerInfo.zMin,
|
|
3671
|
-
"noDataValue": data.noDataValue
|
|
3672
|
-
}
|
|
3673
|
-
};
|
|
3674
|
-
},
|
|
3675
|
-
|
|
3676
|
-
constructConstantSurface: function(data, useBSQForOutputDim) {
|
|
3677
|
-
var val = data.headerInfo.zMax;
|
|
3678
|
-
var valMin = data.headerInfo.zMin;
|
|
3679
|
-
var maxValues = data.headerInfo.maxValues;
|
|
3680
|
-
var numDims = data.headerInfo.numDims;
|
|
3681
|
-
var numPixels = data.headerInfo.height * data.headerInfo.width;
|
|
3682
|
-
var i = 0, k = 0, nStart = 0;
|
|
3683
|
-
var mask = data.pixels.resultMask;
|
|
3684
|
-
var resultPixels = data.pixels.resultPixels;
|
|
3685
|
-
if (mask) {
|
|
3686
|
-
if (numDims > 1) {
|
|
3687
|
-
if (useBSQForOutputDim) {
|
|
3688
|
-
for (i = 0; i < numDims; i++) {
|
|
3689
|
-
nStart = i * numPixels;
|
|
3690
|
-
val = maxValues[i];
|
|
3691
|
-
for (k = 0; k < numPixels; k++) {
|
|
3692
|
-
if (mask[k]) {
|
|
3693
|
-
resultPixels[nStart + k] = val;
|
|
3694
|
-
}
|
|
3695
|
-
}
|
|
3696
|
-
}
|
|
3697
|
-
}
|
|
3698
|
-
else {
|
|
3699
|
-
for (k = 0; k < numPixels; k++) {
|
|
3700
|
-
if (mask[k]) {
|
|
3701
|
-
nStart = k * numDims;
|
|
3702
|
-
for (i = 0; i < numDims; i++) {
|
|
3703
|
-
resultPixels[nStart + numDims] = maxValues[i];
|
|
3704
|
-
}
|
|
3705
|
-
}
|
|
3706
|
-
}
|
|
3707
|
-
}
|
|
3708
|
-
}
|
|
3709
|
-
else {
|
|
3710
|
-
for (k = 0; k < numPixels; k++) {
|
|
3711
|
-
if (mask[k]) {
|
|
3712
|
-
resultPixels[k] = val;
|
|
3713
|
-
}
|
|
3714
|
-
}
|
|
3715
|
-
}
|
|
3716
|
-
}
|
|
3717
|
-
else {
|
|
3718
|
-
if (numDims > 1 && valMin !== val) {
|
|
3719
|
-
if (useBSQForOutputDim) {
|
|
3720
|
-
for (i = 0; i < numDims; i++) {
|
|
3721
|
-
nStart = i * numPixels;
|
|
3722
|
-
val = maxValues[i];
|
|
3723
|
-
for (k = 0; k < numPixels; k++) {
|
|
3724
|
-
resultPixels[nStart + k] = val;
|
|
3725
|
-
}
|
|
3726
|
-
}
|
|
3727
|
-
}
|
|
3728
|
-
else {
|
|
3729
|
-
for (k = 0; k < numPixels; k++) {
|
|
3730
|
-
nStart = k * numDims;
|
|
3731
|
-
for (i = 0; i < numDims; i++) {
|
|
3732
|
-
resultPixels[nStart + i] = maxValues[i];
|
|
3733
|
-
}
|
|
3734
|
-
}
|
|
3735
|
-
}
|
|
3736
|
-
}
|
|
3737
|
-
else {
|
|
3738
|
-
for (k = 0; k < numPixels * numDims; k++) {
|
|
3739
|
-
resultPixels[k] = val;
|
|
3740
|
-
}
|
|
3741
|
-
}
|
|
3742
|
-
}
|
|
3743
|
-
return;
|
|
3744
|
-
},
|
|
3745
|
-
|
|
3746
|
-
getDataTypeArray: function(t) {
|
|
3747
|
-
var tp;
|
|
3748
|
-
switch (t) {
|
|
3749
|
-
case 0: //char
|
|
3750
|
-
tp = Int8Array;
|
|
3751
|
-
break;
|
|
3752
|
-
case 1: //byte
|
|
3753
|
-
tp = Uint8Array;
|
|
3754
|
-
break;
|
|
3755
|
-
case 2: //short
|
|
3756
|
-
tp = Int16Array;
|
|
3757
|
-
break;
|
|
3758
|
-
case 3: //ushort
|
|
3759
|
-
tp = Uint16Array;
|
|
3760
|
-
break;
|
|
3761
|
-
case 4:
|
|
3762
|
-
tp = Int32Array;
|
|
3763
|
-
break;
|
|
3764
|
-
case 5:
|
|
3765
|
-
tp = Uint32Array;
|
|
3766
|
-
break;
|
|
3767
|
-
case 6:
|
|
3768
|
-
tp = Float32Array;
|
|
3769
|
-
break;
|
|
3770
|
-
case 7:
|
|
3771
|
-
tp = Float64Array;
|
|
3772
|
-
break;
|
|
3773
|
-
default:
|
|
3774
|
-
tp = Float32Array;
|
|
3775
|
-
}
|
|
3776
|
-
return tp;
|
|
3777
|
-
},
|
|
3778
|
-
|
|
3779
|
-
getPixelType: function(t) {
|
|
3780
|
-
var tp;
|
|
3781
|
-
switch (t) {
|
|
3782
|
-
case 0: //char
|
|
3783
|
-
tp = "S8";
|
|
3784
|
-
break;
|
|
3785
|
-
case 1: //byte
|
|
3786
|
-
tp = "U8";
|
|
3787
|
-
break;
|
|
3788
|
-
case 2: //short
|
|
3789
|
-
tp = "S16";
|
|
3790
|
-
break;
|
|
3791
|
-
case 3: //ushort
|
|
3792
|
-
tp = "U16";
|
|
3793
|
-
break;
|
|
3794
|
-
case 4:
|
|
3795
|
-
tp = "S32";
|
|
3796
|
-
break;
|
|
3797
|
-
case 5:
|
|
3798
|
-
tp = "U32";
|
|
3799
|
-
break;
|
|
3800
|
-
case 6:
|
|
3801
|
-
tp = "F32";
|
|
3802
|
-
break;
|
|
3803
|
-
case 7:
|
|
3804
|
-
tp = "F64";
|
|
3805
|
-
break;
|
|
3806
|
-
default:
|
|
3807
|
-
tp = "F32";
|
|
3808
|
-
}
|
|
3809
|
-
return tp;
|
|
3810
|
-
},
|
|
3811
|
-
|
|
3812
|
-
isValidPixelValue: function(t, val) {
|
|
3813
|
-
if (val == null) {
|
|
3814
|
-
return false;
|
|
3815
|
-
}
|
|
3816
|
-
var isValid;
|
|
3817
|
-
switch (t) {
|
|
3818
|
-
case 0: //char
|
|
3819
|
-
isValid = val >= -128 && val <= 127;
|
|
3820
|
-
break;
|
|
3821
|
-
case 1: //byte (unsigned char)
|
|
3822
|
-
isValid = val >= 0 && val <= 255;
|
|
3823
|
-
break;
|
|
3824
|
-
case 2: //short
|
|
3825
|
-
isValid = val >= -32768 && val <= 32767;
|
|
3826
|
-
break;
|
|
3827
|
-
case 3: //ushort
|
|
3828
|
-
isValid = val >= 0 && val <= 65536;
|
|
3829
|
-
break;
|
|
3830
|
-
case 4: //int 32
|
|
3831
|
-
isValid = val >= -2147483648 && val <= 2147483647;
|
|
3832
|
-
break;
|
|
3833
|
-
case 5: //uinit 32
|
|
3834
|
-
isValid = val >= 0 && val <= 4294967296;
|
|
3835
|
-
break;
|
|
3836
|
-
case 6:
|
|
3837
|
-
isValid = val >= -34027999387901484e22 && val <= 3.4027999387901484e+38;
|
|
3838
|
-
break;
|
|
3839
|
-
case 7:
|
|
3840
|
-
isValid = val >= -17976931348623157e292 && val <= 1.7976931348623157e+308;
|
|
3841
|
-
break;
|
|
3842
|
-
default:
|
|
3843
|
-
isValid = false;
|
|
3844
|
-
}
|
|
3845
|
-
return isValid;
|
|
3846
|
-
},
|
|
3847
|
-
|
|
3848
|
-
getDataTypeSize: function(t) {
|
|
3849
|
-
var s = 0;
|
|
3850
|
-
switch (t) {
|
|
3851
|
-
case 0: //ubyte
|
|
3852
|
-
case 1: //byte
|
|
3853
|
-
s = 1;
|
|
3854
|
-
break;
|
|
3855
|
-
case 2: //short
|
|
3856
|
-
case 3: //ushort
|
|
3857
|
-
s = 2;
|
|
3858
|
-
break;
|
|
3859
|
-
case 4:
|
|
3860
|
-
case 5:
|
|
3861
|
-
case 6:
|
|
3862
|
-
s = 4;
|
|
3863
|
-
break;
|
|
3864
|
-
case 7:
|
|
3865
|
-
s = 8;
|
|
3866
|
-
break;
|
|
3867
|
-
default:
|
|
3868
|
-
s = t;
|
|
3869
|
-
}
|
|
3870
|
-
return s;
|
|
3871
|
-
},
|
|
3872
|
-
|
|
3873
|
-
getDataTypeUsed: function(dt, tc) {
|
|
3874
|
-
var t = dt;
|
|
3875
|
-
switch (dt) {
|
|
3876
|
-
case 2: //short
|
|
3877
|
-
case 4: //long
|
|
3878
|
-
t = dt - tc;
|
|
3879
|
-
break;
|
|
3880
|
-
case 3: //ushort
|
|
3881
|
-
case 5: //ulong
|
|
3882
|
-
t = dt - 2 * tc;
|
|
3883
|
-
break;
|
|
3884
|
-
case 6: //float
|
|
3885
|
-
if (0 === tc) {
|
|
3886
|
-
t = dt;
|
|
3887
|
-
}
|
|
3888
|
-
else if (1 === tc) {
|
|
3889
|
-
t = 2;
|
|
3890
|
-
}
|
|
3891
|
-
else {
|
|
3892
|
-
t = 1;//byte
|
|
3893
|
-
}
|
|
3894
|
-
break;
|
|
3895
|
-
case 7: //double
|
|
3896
|
-
if (0 === tc) {
|
|
3897
|
-
t = dt;
|
|
3898
|
-
}
|
|
3899
|
-
else {
|
|
3900
|
-
t = dt - 2 * tc + 1;
|
|
3901
|
-
}
|
|
3902
|
-
break;
|
|
3903
|
-
default:
|
|
3904
|
-
t = dt;
|
|
3905
|
-
break;
|
|
3906
|
-
}
|
|
3907
|
-
return t;
|
|
3908
|
-
},
|
|
3909
|
-
|
|
3910
|
-
getOnePixel: function(block, blockPtr, offsetType, view) {
|
|
3911
|
-
var temp = 0;
|
|
3912
|
-
switch (offsetType) {
|
|
3913
|
-
case 0: //char
|
|
3914
|
-
temp = view.getInt8(blockPtr);
|
|
3915
|
-
break;
|
|
3916
|
-
case 1: //byte
|
|
3917
|
-
temp = view.getUint8(blockPtr);
|
|
3918
|
-
break;
|
|
3919
|
-
case 2:
|
|
3920
|
-
temp = view.getInt16(blockPtr, true);
|
|
3921
|
-
break;
|
|
3922
|
-
case 3:
|
|
3923
|
-
temp = view.getUint16(blockPtr, true);
|
|
3924
|
-
break;
|
|
3925
|
-
case 4:
|
|
3926
|
-
temp = view.getInt32(blockPtr, true);
|
|
3927
|
-
break;
|
|
3928
|
-
case 5:
|
|
3929
|
-
temp = view.getUInt32(blockPtr, true);
|
|
3930
|
-
break;
|
|
3931
|
-
case 6:
|
|
3932
|
-
temp = view.getFloat32(blockPtr, true);
|
|
3933
|
-
break;
|
|
3934
|
-
case 7:
|
|
3935
|
-
temp = view.getFloat64(blockPtr, true);
|
|
3936
|
-
break;
|
|
3937
|
-
default:
|
|
3938
|
-
throw ("the decoder does not understand this pixel type");
|
|
3939
|
-
}
|
|
3940
|
-
return temp;
|
|
3941
|
-
},
|
|
3942
|
-
|
|
3943
|
-
swapDimensionOrder: function(pixels, numPixels, numDims, OutPixelTypeArray, inputIsBIP) {
|
|
3944
|
-
var i = 0, j = 0, iDim = 0, temp = 0, swap = pixels;
|
|
3945
|
-
if (numDims > 1) {
|
|
3946
|
-
swap = new OutPixelTypeArray(numPixels * numDims);
|
|
3947
|
-
if (inputIsBIP) {
|
|
3948
|
-
for (i=0; i<numPixels; i++) {
|
|
3949
|
-
temp = i;
|
|
3950
|
-
for (iDim=0; iDim < numDims; iDim++, temp += numPixels) {
|
|
3951
|
-
swap[temp] = pixels[j++];
|
|
3952
|
-
}
|
|
3953
|
-
}
|
|
3954
|
-
}
|
|
3955
|
-
else {
|
|
3956
|
-
for (i=0; i<numPixels; i++) {
|
|
3957
|
-
temp = i;
|
|
3958
|
-
for (iDim=0; iDim < numDims; iDim++, temp += numPixels) {
|
|
3959
|
-
swap[j++] = pixels[temp];
|
|
3960
|
-
}
|
|
3961
|
-
}
|
|
3962
|
-
}
|
|
3963
|
-
}
|
|
3964
|
-
return swap;
|
|
3965
|
-
}
|
|
3966
|
-
};
|
|
3967
|
-
|
|
3968
|
-
/***************************************************
|
|
3969
|
-
*private class for a tree node. Huffman code is in Lerc2Helpers
|
|
3970
|
-
****************************************************/
|
|
3971
|
-
var TreeNode = function(val, left, right) {
|
|
3972
|
-
this.val = val;
|
|
3973
|
-
this.left = left;
|
|
3974
|
-
this.right = right;
|
|
3975
|
-
};
|
|
3976
|
-
|
|
3977
|
-
var Lerc2Decode = {
|
|
3978
|
-
/*
|
|
3979
|
-
* ********removed options compared to LERC1. We can bring some of them back if needed.
|
|
3980
|
-
* removed pixel type. LERC2 is typed and doesn't require user to give pixel type
|
|
3981
|
-
* changed encodedMaskData to maskData. LERC2 's js version make it faster to use maskData directly.
|
|
3982
|
-
* removed returnMask. mask is used by LERC2 internally and is cost free. In case of user input mask, it's returned as well and has neglible cost.
|
|
3983
|
-
* removed nodatavalue. Because LERC2 pixels are typed, nodatavalue will sacrify a useful value for many types (8bit, 16bit) etc,
|
|
3984
|
-
* user has to be knowledgable enough about raster and their data to avoid usability issues. so nodata value is simply removed now.
|
|
3985
|
-
* We can add it back later if their's a clear requirement.
|
|
3986
|
-
* removed encodedMask. This option was not implemented in LercDecode. It can be done after decoding (less efficient)
|
|
3987
|
-
* removed computeUsedBitDepths.
|
|
3988
|
-
*
|
|
3989
|
-
*
|
|
3990
|
-
* response changes compared to LERC1
|
|
3991
|
-
* 1. encodedMaskData is not available
|
|
3992
|
-
* 2. noDataValue is optional (returns only if user's noDataValue is with in the valid data type range)
|
|
3993
|
-
* 3. maskData is always available
|
|
3994
|
-
*/
|
|
3995
|
-
/*****************
|
|
3996
|
-
* public properties
|
|
3997
|
-
******************/
|
|
3998
|
-
//HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, not configurable
|
|
3999
|
-
|
|
4000
|
-
/*****************
|
|
4001
|
-
* public methods
|
|
4002
|
-
*****************/
|
|
4003
|
-
|
|
4004
|
-
/**
|
|
4005
|
-
* Decode a LERC2 byte stream and return an object containing the pixel data and optional metadata.
|
|
4006
|
-
*
|
|
4007
|
-
* @param {ArrayBuffer} input The LERC input byte stream
|
|
4008
|
-
* @param {object} [options] options Decoding options
|
|
4009
|
-
* @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid LERC file is expected at that position
|
|
4010
|
-
* @param {boolean} [options.returnFileInfo] If true, the return value will have a fileInfo property that contains metadata obtained from the LERC headers and the decoding process
|
|
4011
|
-
* @param {boolean} [options.returnPixelInterleavedDims] If true, returned dimensions are pixel-interleaved, a.k.a [p1_dim0, p1_dim1, p1_dimn, p2_dim0...], default is [p1_dim0, p2_dim0, ..., p1_dim1, p2_dim1...]
|
|
4012
|
-
*/
|
|
4013
|
-
decode: function(/*byte array*/ input, /*object*/ options) {
|
|
4014
|
-
//currently there's a bug in the sparse array, so please do not set to false
|
|
4015
|
-
options = options || {};
|
|
4016
|
-
var noDataValue = options.noDataValue;
|
|
4017
|
-
|
|
4018
|
-
//initialize
|
|
4019
|
-
var i = 0, data = {};
|
|
4020
|
-
data.ptr = options.inputOffset || 0;
|
|
4021
|
-
data.pixels = {};
|
|
4022
|
-
|
|
4023
|
-
// File header
|
|
4024
|
-
if (!Lerc2Helpers.readHeaderInfo(input, data)) {
|
|
4025
|
-
return;
|
|
4026
|
-
}
|
|
4027
|
-
|
|
4028
|
-
var headerInfo = data.headerInfo;
|
|
4029
|
-
var fileVersion = headerInfo.fileVersion;
|
|
4030
|
-
var OutPixelTypeArray = Lerc2Helpers.getDataTypeArray(headerInfo.imageType);
|
|
4031
|
-
|
|
4032
|
-
// version check
|
|
4033
|
-
if (fileVersion > 5) {
|
|
4034
|
-
throw "unsupported lerc version 2." + fileVersion;
|
|
4035
|
-
}
|
|
4036
|
-
|
|
4037
|
-
// Mask Header
|
|
4038
|
-
Lerc2Helpers.readMask(input, data);
|
|
4039
|
-
if (headerInfo.numValidPixel !== headerInfo.width * headerInfo.height && !data.pixels.resultMask) {
|
|
4040
|
-
data.pixels.resultMask = options.maskData;
|
|
4041
|
-
}
|
|
4042
|
-
|
|
4043
|
-
var numPixels = headerInfo.width * headerInfo.height;
|
|
4044
|
-
data.pixels.resultPixels = new OutPixelTypeArray(numPixels * headerInfo.numDims);
|
|
4045
|
-
|
|
4046
|
-
data.counter = {
|
|
4047
|
-
onesweep: 0,
|
|
4048
|
-
uncompressed: 0,
|
|
4049
|
-
lut: 0,
|
|
4050
|
-
bitstuffer: 0,
|
|
4051
|
-
constant: 0,
|
|
4052
|
-
constantoffset: 0
|
|
4053
|
-
};
|
|
4054
|
-
var useBSQForOutputDim = !options.returnPixelInterleavedDims;
|
|
4055
|
-
if (headerInfo.numValidPixel !== 0) {
|
|
4056
|
-
//not tested
|
|
4057
|
-
if (headerInfo.zMax === headerInfo.zMin) //constant surface
|
|
4058
|
-
{
|
|
4059
|
-
Lerc2Helpers.constructConstantSurface(data, useBSQForOutputDim);
|
|
4060
|
-
}
|
|
4061
|
-
else if (fileVersion >= 4 && Lerc2Helpers.checkMinMaxRanges(input, data)) {
|
|
4062
|
-
Lerc2Helpers.constructConstantSurface(data, useBSQForOutputDim);
|
|
4063
|
-
}
|
|
4064
|
-
else {
|
|
4065
|
-
var view = new DataView(input, data.ptr, 2);
|
|
4066
|
-
var bReadDataOneSweep = view.getUint8(0);
|
|
4067
|
-
data.ptr++;
|
|
4068
|
-
if (bReadDataOneSweep) {
|
|
4069
|
-
//console.debug("OneSweep");
|
|
4070
|
-
Lerc2Helpers.readDataOneSweep(input, data, OutPixelTypeArray, useBSQForOutputDim);
|
|
4071
|
-
}
|
|
4072
|
-
else {
|
|
4073
|
-
//lerc2.1: //bitstuffing + lut
|
|
4074
|
-
//lerc2.2: //bitstuffing + lut + huffman
|
|
4075
|
-
//lerc2.3: new bitstuffer
|
|
4076
|
-
if (fileVersion > 1 && headerInfo.imageType <= 1 && Math.abs(headerInfo.maxZError - 0.5) < 0.00001) {
|
|
4077
|
-
//this is 2.x plus 8 bit (unsigned and signed) data, possiblity of Huffman
|
|
4078
|
-
var flagHuffman = view.getUint8(1);
|
|
4079
|
-
data.ptr++;
|
|
4080
|
-
data.encodeMode = flagHuffman;
|
|
4081
|
-
if (flagHuffman > 2 || (fileVersion < 4 && flagHuffman > 1)) {
|
|
4082
|
-
throw "Invalid Huffman flag " + flagHuffman;
|
|
4083
|
-
}
|
|
4084
|
-
if (flagHuffman) {//1 - delta Huffman, 2 - Huffman
|
|
4085
|
-
//console.log("Huffman");
|
|
4086
|
-
Lerc2Helpers.readHuffman(input, data, OutPixelTypeArray, useBSQForOutputDim);
|
|
4087
|
-
}
|
|
4088
|
-
else {
|
|
4089
|
-
//console.log("Tiles");
|
|
4090
|
-
Lerc2Helpers.readTiles(input, data, OutPixelTypeArray, useBSQForOutputDim);
|
|
4091
|
-
}
|
|
4092
|
-
}
|
|
4093
|
-
else { //lerc2.x non-8 bit data
|
|
4094
|
-
//console.log("Tiles");
|
|
4095
|
-
Lerc2Helpers.readTiles(input, data, OutPixelTypeArray, useBSQForOutputDim);
|
|
4096
|
-
}
|
|
4097
|
-
}
|
|
4098
|
-
}
|
|
4099
|
-
}
|
|
4100
|
-
|
|
4101
|
-
data.eofOffset = data.ptr;
|
|
4102
|
-
var diff;
|
|
4103
|
-
if (options.inputOffset) {
|
|
4104
|
-
diff = data.headerInfo.blobSize + options.inputOffset - data.ptr;
|
|
4105
|
-
if (Math.abs(diff) >= 1) {
|
|
4106
|
-
//console.debug("incorrect eof: dataptr " + data.ptr + " offset " + options.inputOffset + " blobsize " + data.headerInfo.blobSize + " diff: " + diff);
|
|
4107
|
-
data.eofOffset = options.inputOffset + data.headerInfo.blobSize;
|
|
4108
|
-
}
|
|
4109
|
-
}
|
|
4110
|
-
else {
|
|
4111
|
-
diff = data.headerInfo.blobSize - data.ptr;
|
|
4112
|
-
if (Math.abs(diff) >= 1) {
|
|
4113
|
-
//console.debug("incorrect first band eof: dataptr " + data.ptr + " blobsize " + data.headerInfo.blobSize + " diff: " + diff);
|
|
4114
|
-
data.eofOffset = data.headerInfo.blobSize;
|
|
4115
|
-
}
|
|
4116
|
-
}
|
|
4117
|
-
|
|
4118
|
-
var result = {
|
|
4119
|
-
width: headerInfo.width,
|
|
4120
|
-
height: headerInfo.height,
|
|
4121
|
-
pixelData: data.pixels.resultPixels,
|
|
4122
|
-
minValue: headerInfo.zMin,
|
|
4123
|
-
maxValue: headerInfo.zMax,
|
|
4124
|
-
validPixelCount: headerInfo.numValidPixel,
|
|
4125
|
-
dimCount: headerInfo.numDims,
|
|
4126
|
-
dimStats: {
|
|
4127
|
-
minValues: headerInfo.minValues,
|
|
4128
|
-
maxValues: headerInfo.maxValues
|
|
4129
|
-
},
|
|
4130
|
-
maskData: data.pixels.resultMask
|
|
4131
|
-
//noDataValue: noDataValue
|
|
4132
|
-
};
|
|
4133
|
-
|
|
4134
|
-
//we should remove this if there's no existing client
|
|
4135
|
-
//optional noDataValue processing, it's user's responsiblity
|
|
4136
|
-
if (data.pixels.resultMask && Lerc2Helpers.isValidPixelValue(headerInfo.imageType, noDataValue)) {
|
|
4137
|
-
var mask = data.pixels.resultMask;
|
|
4138
|
-
for (i = 0; i < numPixels; i++) {
|
|
4139
|
-
if (!mask[i]) {
|
|
4140
|
-
result.pixelData[i] = noDataValue;
|
|
4141
|
-
}
|
|
4142
|
-
}
|
|
4143
|
-
result.noDataValue = noDataValue;
|
|
4144
|
-
}
|
|
4145
|
-
data.noDataValue = noDataValue;
|
|
4146
|
-
if (options.returnFileInfo) {
|
|
4147
|
-
result.fileInfo = Lerc2Helpers.formatFileInfo(data);
|
|
4148
|
-
}
|
|
4149
|
-
return result;
|
|
4150
|
-
},
|
|
4151
|
-
|
|
4152
|
-
getBandCount: function(/*byte array*/ input) {
|
|
4153
|
-
var count = 0;
|
|
4154
|
-
var i = 0;
|
|
4155
|
-
var temp = {};
|
|
4156
|
-
temp.ptr = 0;
|
|
4157
|
-
temp.pixels = {};
|
|
4158
|
-
while (i < input.byteLength - 58) {
|
|
4159
|
-
Lerc2Helpers.readHeaderInfo(input, temp);
|
|
4160
|
-
i += temp.headerInfo.blobSize;
|
|
4161
|
-
count++;
|
|
4162
|
-
temp.ptr = i;
|
|
4163
|
-
}
|
|
4164
|
-
return count;
|
|
4165
|
-
}
|
|
4166
|
-
};
|
|
4167
|
-
|
|
4168
|
-
return Lerc2Decode;
|
|
4169
|
-
})();
|
|
4170
|
-
|
|
4171
|
-
var isPlatformLittleEndian = (function() {
|
|
4172
|
-
var a = new ArrayBuffer(4);
|
|
4173
|
-
var b = new Uint8Array(a);
|
|
4174
|
-
var c = new Uint32Array(a);
|
|
4175
|
-
c[0] = 1;
|
|
4176
|
-
return b[0] === 1;
|
|
4177
|
-
})();
|
|
4178
|
-
|
|
4179
|
-
var Lerc = {
|
|
4180
|
-
/************wrapper**********************************************/
|
|
4181
|
-
/**
|
|
4182
|
-
* A wrapper for decoding both LERC1 and LERC2 byte streams capable of handling multiband pixel blocks for various pixel types.
|
|
4183
|
-
*
|
|
4184
|
-
* @alias module:Lerc
|
|
4185
|
-
* @param {ArrayBuffer} input The LERC input byte stream
|
|
4186
|
-
* @param {object} [options] The decoding options below are optional.
|
|
4187
|
-
* @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid Lerc file is expected at that position.
|
|
4188
|
-
* @param {string} [options.pixelType] (LERC1 only) Default value is F32. Valid pixel types for input are U8/S8/S16/U16/S32/U32/F32.
|
|
4189
|
-
* @param {number} [options.noDataValue] (LERC1 only). It is recommended to use the returned mask instead of setting this value.
|
|
4190
|
-
* @param {boolean} [options.returnPixelInterleavedDims] (nDim LERC2 only) If true, returned dimensions are pixel-interleaved, a.k.a [p1_dim0, p1_dim1, p1_dimn, p2_dim0...], default is [p1_dim0, p2_dim0, ..., p1_dim1, p2_dim1...]
|
|
4191
|
-
* @returns {{width, height, pixels, pixelType, mask, statistics}}
|
|
4192
|
-
* @property {number} width Width of decoded image.
|
|
4193
|
-
* @property {number} height Height of decoded image.
|
|
4194
|
-
* @property {array} pixels [band1, band2, …] Each band is a typed array of width*height.
|
|
4195
|
-
* @property {string} pixelType The type of pixels represented in the output.
|
|
4196
|
-
* @property {mask} mask Typed array with a size of width*height, or null if all pixels are valid.
|
|
4197
|
-
* @property {array} statistics [statistics_band1, statistics_band2, …] Each element is a statistics object representing min and max values
|
|
4198
|
-
**/
|
|
4199
|
-
decode: function(encodedData, options) {
|
|
4200
|
-
if (!isPlatformLittleEndian) {
|
|
4201
|
-
throw "Big endian system is not supported.";
|
|
4202
|
-
}
|
|
4203
|
-
options = options || {};
|
|
4204
|
-
var inputOffset = options.inputOffset || 0;
|
|
4205
|
-
var fileIdView = new Uint8Array(encodedData, inputOffset, 10);
|
|
4206
|
-
var fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
|
|
4207
|
-
var lerc, majorVersion;
|
|
4208
|
-
if (fileIdentifierString.trim() === "CntZImage") {
|
|
4209
|
-
lerc = LercDecode;
|
|
4210
|
-
majorVersion = 1;
|
|
4211
|
-
}
|
|
4212
|
-
else if (fileIdentifierString.substring(0, 5) === "Lerc2") {
|
|
4213
|
-
lerc = Lerc2Decode;
|
|
4214
|
-
majorVersion = 2;
|
|
4215
|
-
}
|
|
4216
|
-
else {
|
|
4217
|
-
throw "Unexpected file identifier string: " + fileIdentifierString;
|
|
4218
|
-
}
|
|
4219
|
-
|
|
4220
|
-
var iPlane = 0, eof = encodedData.byteLength - 10, encodedMaskData, bandMasks = [], bandMask, maskData;
|
|
4221
|
-
var decodedPixelBlock = {
|
|
4222
|
-
width: 0,
|
|
4223
|
-
height: 0,
|
|
4224
|
-
pixels: [],
|
|
4225
|
-
pixelType: options.pixelType,
|
|
4226
|
-
mask: null,
|
|
4227
|
-
statistics: []
|
|
4228
|
-
};
|
|
4229
|
-
var uniqueBandMaskCount = 0;
|
|
4230
|
-
|
|
4231
|
-
while (inputOffset < eof) {
|
|
4232
|
-
var result = lerc.decode(encodedData, {
|
|
4233
|
-
inputOffset: inputOffset,//for both lerc1 and lerc2
|
|
4234
|
-
encodedMaskData: encodedMaskData,//lerc1 only
|
|
4235
|
-
maskData: maskData,//lerc2 only
|
|
4236
|
-
returnMask: iPlane === 0 ? true : false,//lerc1 only
|
|
4237
|
-
returnEncodedMask: iPlane === 0 ? true : false,//lerc1 only
|
|
4238
|
-
returnFileInfo: true,//for both lerc1 and lerc2
|
|
4239
|
-
returnPixelInterleavedDims: options.returnPixelInterleavedDims,//for ndim lerc2 only
|
|
4240
|
-
pixelType: options.pixelType || null,//lerc1 only
|
|
4241
|
-
noDataValue: options.noDataValue || null//lerc1 only
|
|
4242
|
-
});
|
|
4243
|
-
|
|
4244
|
-
inputOffset = result.fileInfo.eofOffset;
|
|
4245
|
-
maskData = result.maskData;//lerc2
|
|
4246
|
-
if (iPlane === 0) {
|
|
4247
|
-
encodedMaskData = result.encodedMaskData;//lerc1
|
|
4248
|
-
decodedPixelBlock.width = result.width;
|
|
4249
|
-
decodedPixelBlock.height = result.height;
|
|
4250
|
-
decodedPixelBlock.dimCount = result.dimCount || 1;
|
|
4251
|
-
//decodedPixelBlock.dimStats = decodedPixelBlock.dimStats;
|
|
4252
|
-
decodedPixelBlock.pixelType = result.pixelType || result.fileInfo.pixelType;
|
|
4253
|
-
decodedPixelBlock.mask = maskData;
|
|
4254
|
-
}
|
|
4255
|
-
if (majorVersion > 1) {
|
|
4256
|
-
if (maskData) {
|
|
4257
|
-
bandMasks.push(maskData);
|
|
4258
|
-
}
|
|
4259
|
-
if (result.fileInfo.mask && result.fileInfo.mask.numBytes > 0) {
|
|
4260
|
-
uniqueBandMaskCount++;
|
|
4261
|
-
}
|
|
4262
|
-
}
|
|
4263
|
-
|
|
4264
|
-
iPlane++;
|
|
4265
|
-
decodedPixelBlock.pixels.push(result.pixelData);
|
|
4266
|
-
decodedPixelBlock.statistics.push({
|
|
4267
|
-
minValue: result.minValue,
|
|
4268
|
-
maxValue: result.maxValue,
|
|
4269
|
-
noDataValue: result.noDataValue,
|
|
4270
|
-
dimStats: result.dimStats
|
|
4271
|
-
});
|
|
4272
|
-
}
|
|
4273
|
-
var i, j, numPixels;
|
|
4274
|
-
if (majorVersion > 1 && uniqueBandMaskCount > 1) {
|
|
4275
|
-
numPixels = decodedPixelBlock.width * decodedPixelBlock.height;
|
|
4276
|
-
decodedPixelBlock.bandMasks = bandMasks;
|
|
4277
|
-
maskData = new Uint8Array(numPixels);
|
|
4278
|
-
maskData.set(bandMasks[0]);
|
|
4279
|
-
for (i = 1; i < bandMasks.length; i++) {
|
|
4280
|
-
bandMask = bandMasks[i];
|
|
4281
|
-
for (j = 0; j < numPixels; j++) {
|
|
4282
|
-
maskData[j] = maskData[j] & bandMask[j];
|
|
4283
|
-
}
|
|
4284
|
-
}
|
|
4285
|
-
decodedPixelBlock.maskData = maskData;
|
|
4286
|
-
}
|
|
4287
|
-
|
|
4288
|
-
return decodedPixelBlock;
|
|
4289
|
-
}
|
|
4290
|
-
};
|
|
4291
|
-
|
|
4292
|
-
if (module.exports) {/* jshint ignore:line */
|
|
4293
|
-
//commonJS module 1.0/1.1/1.1.1 systems, such as nodeJS
|
|
4294
|
-
//http://wiki.commonjs.org/wiki/Modules
|
|
4295
|
-
module.exports = Lerc;/* jshint ignore:line */
|
|
4296
|
-
}
|
|
4297
|
-
else {
|
|
4298
|
-
//assign to this, most likely window
|
|
4299
|
-
this.Lerc = Lerc;
|
|
4300
|
-
}
|
|
4301
|
-
|
|
4302
|
-
})();
|
|
4303
|
-
} (LercDecode));
|
|
4304
|
-
return LercDecode.exports;
|
|
4305
|
-
}
|
|
4306
|
-
|
|
4307
|
-
var LercDecodeExports = requireLercDecode();
|
|
4308
|
-
|
|
4309
|
-
let init;
|
|
4310
|
-
let instance;
|
|
4311
|
-
let heap;
|
|
4312
|
-
const IMPORT_OBJECT = {
|
|
4313
|
-
env: {
|
|
4314
|
-
emscripten_notify_memory_growth: function (index) {
|
|
4315
|
-
heap = new Uint8Array(instance.exports.memory.buffer);
|
|
4316
|
-
}
|
|
4317
|
-
}
|
|
4318
|
-
};
|
|
4319
|
-
/**
|
|
4320
|
-
* ZSTD (Zstandard) decoder.
|
|
4321
|
-
*/
|
|
4322
|
-
class ZSTDDecoder {
|
|
4323
|
-
init() {
|
|
4324
|
-
if (init) return init;
|
|
4325
|
-
if (typeof fetch !== 'undefined') {
|
|
4326
|
-
// Web.
|
|
4327
|
-
init = fetch('data:application/wasm;base64,' + wasm).then(response => response.arrayBuffer()).then(arrayBuffer => WebAssembly.instantiate(arrayBuffer, IMPORT_OBJECT)).then(this._init);
|
|
4328
|
-
} else {
|
|
4329
|
-
// Node.js.
|
|
4330
|
-
init = WebAssembly.instantiate(Buffer.from(wasm, 'base64'), IMPORT_OBJECT).then(this._init);
|
|
4331
|
-
}
|
|
4332
|
-
return init;
|
|
4333
|
-
}
|
|
4334
|
-
_init(result) {
|
|
4335
|
-
instance = result.instance;
|
|
4336
|
-
IMPORT_OBJECT.env.emscripten_notify_memory_growth(0); // initialize heap.
|
|
4337
|
-
}
|
|
4338
|
-
|
|
4339
|
-
decode(array, uncompressedSize = 0) {
|
|
4340
|
-
if (!instance) throw new Error(`ZSTDDecoder: Await .init() before decoding.`);
|
|
4341
|
-
// Write compressed data into WASM memory.
|
|
4342
|
-
const compressedSize = array.byteLength;
|
|
4343
|
-
const compressedPtr = instance.exports.malloc(compressedSize);
|
|
4344
|
-
heap.set(array, compressedPtr);
|
|
4345
|
-
// Decompress into WASM memory.
|
|
4346
|
-
uncompressedSize = uncompressedSize || Number(instance.exports.ZSTD_findDecompressedSize(compressedPtr, compressedSize));
|
|
4347
|
-
const uncompressedPtr = instance.exports.malloc(uncompressedSize);
|
|
4348
|
-
const actualSize = instance.exports.ZSTD_decompress(uncompressedPtr, uncompressedSize, compressedPtr, compressedSize);
|
|
4349
|
-
// Read decompressed data and free WASM memory.
|
|
4350
|
-
const dec = heap.slice(uncompressedPtr, uncompressedPtr + actualSize);
|
|
4351
|
-
instance.exports.free(compressedPtr);
|
|
4352
|
-
instance.exports.free(uncompressedPtr);
|
|
4353
|
-
return dec;
|
|
4354
|
-
}
|
|
4355
|
-
}
|
|
4356
|
-
/**
|
|
4357
|
-
* BSD License
|
|
4358
|
-
*
|
|
4359
|
-
* For Zstandard software
|
|
4360
|
-
*
|
|
4361
|
-
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc. All rights reserved.
|
|
4362
|
-
*
|
|
4363
|
-
* Redistribution and use in source and binary forms, with or without modification,
|
|
4364
|
-
* are permitted provided that the following conditions are met:
|
|
4365
|
-
*
|
|
4366
|
-
* * Redistributions of source code must retain the above copyright notice, this
|
|
4367
|
-
* list of conditions and the following disclaimer.
|
|
4368
|
-
*
|
|
4369
|
-
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
4370
|
-
* this list of conditions and the following disclaimer in the documentation
|
|
4371
|
-
* and/or other materials provided with the distribution.
|
|
4372
|
-
*
|
|
4373
|
-
* * Neither the name Facebook nor the names of its contributors may be used to
|
|
4374
|
-
* endorse or promote products derived from this software without specific
|
|
4375
|
-
* prior written permission.
|
|
4376
|
-
*
|
|
4377
|
-
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
4378
|
-
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
4379
|
-
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
4380
|
-
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
|
4381
|
-
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
4382
|
-
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
4383
|
-
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
4384
|
-
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
4385
|
-
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
4386
|
-
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4387
|
-
*/
|
|
4388
|
-
// wasm:begin
|
|
4389
|
-
const wasm = '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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdBKGogACgCBBATQQAhBCAHQeAAaiEMIAdB5ABqIQoDQCAHQShqEARBAksgBCAXTnJFBEAgBygCQCAHKAI8QQN0aikCACIdQhCIp0H/AXEhCyAHKAJQIAcoAkxBA3RqKQIAIh5CEIinQf8BcSEJIAcoAkggBygCREEDdGopAgAiH0IgiKchCCAeQiCIISAgHUIgiKchAgJAIB9CEIinQf8BcSIDQQJPBEACQCAGRSADQRlJckUEQCAIIAdBKGogA0EgIAcoAixrIg0gDSADSxsiDRAFIAMgDWsiA3RqIQggB0EoahAEGiADRQ0BIAdBKGogAxAFIAhqIQgMAQsgB0EoaiADEAUgCGohCCAHQShqEAQaCyAHKQJUISEgByAINgJUIAcgITcDWAwBCwJAIANFBEAgAgRAIAcoAlQhCAwDCyAHKAJYIQgMAQsCQAJAIAdBKGpBARAFIAggAkVqaiIDQQNGBEAgBygCVEF/aiIDIANFaiEIDAELIANBAnQgB2ooAlQiCCAIRWohCCADQQFGDQELIAcgBygCWDYCXAsLIAcgBygCVDYCWCAHIAg2AlQLICCnIQMgCQRAIAdBKGogCRAFIANqIQMLIAkgC2pBFE8EQCAHQShqEAQaCyALBEAgB0EoaiALEAUgAmohAgsgB0EoahAEGiAHIAcoAmggAmoiCSADajYCaCAKIAwgCCAJSxsoAgAhDSAHIAdBKGogHUIYiKdB/wFxEAggHadB//8DcWo2AjwgByAHQShqIB5CGIinQf8BcRAIIB6nQf//A3FqNgJMIAdBKGoQBBogB0EoaiAfQhiIp0H/AXEQCCEOIAdB8ABqIARBBHRqIgsgCSANaiAIazYCDCALIAg2AgggCyADNgIEIAsgAjYCACAHIA4gH6dB//8DcWo2AkQgBEEBaiEEDAELCyAEIBdIDQEgEkFgaiEYIAdB4ABqIRogB0HkAGohGyABIQMDQCAHQShqEARBAksgBCAFTnJFBEAgBygCQCAHKAI8QQN0aikCACIdQhCIp0H/AXEhCyAHKAJQIAcoAkxBA3RqKQIAIh5CEIinQf8BcSEIIAcoAkggBygCREEDdGopAgAiH0IgiKchCSAeQiCIISAgHUIgiKchDAJAIB9CEIinQf8BcSICQQJPBEACQCAGRSACQRlJckUEQCAJIAdBKGogAkEgIAcoAixrIgogCiACSxsiChAFIAIgCmsiAnRqIQkgB0EoahAEGiACRQ0BIAdBKGogAhAFIAlqIQkMAQsgB0EoaiACEAUgCWohCSAHQShqEAQaCyAHKQJUISEgByAJNgJUIAcgITcDWAwBCwJAIAJFBEAgDARAIAcoAlQhCQwDCyAHKAJYIQkMAQsCQAJAIAdBKGpBARAFIAkgDEVqaiICQQNGBEAgBygCVEF/aiICIAJFaiEJDAELIAJBAnQgB2ooAlQiCSAJRWohCSACQQFGDQELIAcgBygCWDYCXAsLIAcgBygCVDYCWCAHIAk2AlQLICCnIRQgCARAIAdBKGogCBAFIBRqIRQLIAggC2pBFE8EQCAHQShqEAQaCyALBEAgB0EoaiALEAUgDGohDAsgB0EoahAEGiAHIAcoAmggDGoiGSAUajYCaCAbIBogCSAZSxsoAgAhHCAHIAdBKGogHUIYiKdB/wFxEAggHadB//8DcWo2AjwgByAHQShqIB5CGIinQf8BcRAIIB6nQf//A3FqNgJMIAdBKGoQBBogByAHQShqIB9CGIinQf8BcRAIIB+nQf//A3FqNgJEIAcgB0HwAGogBEEDcUEEdGoiDSkDCCIdNwPIASAHIA0pAwAiHjcDwAECQAJAAkAgBygCvAEiDiAepyICaiIWIBNLDQAgAyAHKALEASIKIAJqIgtqIBhLDQAgEiADayALQSBqTw0BCyAHIAcpA8gBNwMQIAcgBykDwAE3AwggAyASIAdBCGogB0G8AWogEyAPIBUgERAeIQsMAQsgAiADaiEIIAMgDhAHIAJBEU8EQCADQRBqIQIDQCACIA5BEGoiDhAHIAJBEGoiAiAISQ0ACwsgCCAdpyIOayECIAcgFjYCvAEgDiAIIA9rSwRAIA4gCCAVa0sEQEFsIQsMAgsgESACIA9rIgJqIhYgCmogEU0EQCAIIBYgChAPGgwCCyAIIBZBACACaxAPIQggByACIApqIgo2AsQBIAggAmshCCAPIQILIA5BEE8EQCAIIApqIQoDQCAIIAIQByACQRBqIQIgCEEQaiIIIApJDQALDAELAkAgDkEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgDkECdCIKQcAeaigCAGoiAhAXIAIgCkHgHmooAgBrIQIgBygCxAEhCgwBCyAIIAIQDAsgCkEJSQ0AIAggCmohCiAIQQhqIgggAkEIaiICa0EPTARAA0AgCCACEAwgAkEIaiECIAhBCGoiCCAKSQ0ADAIACwALA0AgCCACEAcgAkEQaiECIAhBEGoiCCAKSQ0ACwsgCxADBEAgCyEQDAQFIA0gDDYCACANIBkgHGogCWs2AgwgDSAJNgIIIA0gFDYCBCAEQQFqIQQgAyALaiEDDAILAAsLIAQgBUgNASAEIBdrIQtBACEEA0AgCyAFSARAIAcgB0HwAGogC0EDcUEEdGoiAikDCCIdNwPIASAHIAIpAwAiHjcDwAECQAJAAkAgBygCvAEiDCAepyICaiIKIBNLDQAgAyAHKALEASIJIAJqIhBqIBhLDQAgEiADayAQQSBqTw0BCyAHIAcpA8gBNwMgIAcgBykDwAE3AxggAyASIAdBGGogB0G8AWogEyAPIBUgERAeIRAMAQsgAiADaiEIIAMgDBAHIAJBEU8EQCADQRBqIQIDQCACIAxBEGoiDBAHIAJBEGoiAiAISQ0ACwsgCCAdpyIGayECIAcgCjYCvAEgBiAIIA9rSwRAIAYgCCAVa0sEQEFsIRAMAgsgESACIA9rIgJqIgwgCWogEU0EQCAIIAwgCRAPGgwCCyAIIAxBACACaxAPIQggByACIAlqIgk2AsQBIAggAmshCCAPIQILIAZBEE8EQCAIIAlqIQYDQCAIIAIQByACQRBqIQIgCEEQaiIIIAZJDQALDAELAkAgBkEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgBkECdCIGQcAeaigCAGoiAhAXIAIgBkHgHmooAgBrIQIgBygCxAEhCQwBCyAIIAIQDAsgCUEJSQ0AIAggCWohBiAIQQhqIgggAkEIaiICa0EPTARAA0AgCCACEAwgAkEIaiECIAhBCGoiCCAGSQ0ADAIACwALA0AgCCACEAcgAkEQaiECIAhBEGoiCCAGSQ0ACwsgEBADDQMgC0EBaiELIAMgEGohAwwBCwsDQCAEQQNHBEAgACAEQQJ0IgJqQazQAWogAiAHaigCVDYCACAEQQFqIQQMAQsLIAcoArwBIQgLQbp/IRAgEyAIayIAIBIgA2tLDQAgAwR/IAMgCCAAEAsgAGoFQQALIAFrIRALIAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY0AAQMyIFEAMiBg0AIANBHzYCfCADIANB/ABqIANB+ABqIAQgBCAFaiAGGyIEIAEgAmoiAiAEaxAVIgUQAw0AIAMoAnwiBkEfSw0AIAMoAngiB0EJTw0AIABBiCBqIAMgBkGAC0GADCAHEBggA0E0NgJ8IAMgA0H8AGogA0H4AGogBCAFaiIEIAIgBGsQFSIFEAMNACADKAJ8IgZBNEsNACADKAJ4IgdBCk8NACAAQZAwaiADIAZBgA1B4A4gBxAYIANBIzYCfCADIANB/ABqIANB+ABqIAQgBWoiBCACIARrEBUiBRADDQAgAygCfCIGQSNLDQAgAygCeCIHQQpPDQAgACADIAZBwBBB0BEgBxAYIAQgBWoiBEEMaiIFIAJLDQAgAiAFayEFQQAhAgNAIAJBA0cEQCAEKAAAIgZBf2ogBU8NAiAAIAJBAnRqQZzQAWogBjYCACACQQFqIQIgBEEEaiEEDAELCyAEIAFrIQgLIANBgAFqJAAgCAtGAQN/IABBCGohAyAAKAIEIQJBACEAA0AgACACdkUEQCABIAMgAEEDdGotAAJBFktqIQEgAEEBaiEADAELCyABQQggAmt0C4YDAQV/Qbh/IQcCQCADRQ0AIAItAAAiBEUEQCABQQA2AgBBAUG4fyADQQFGGw8LAn8gAkEBaiIFIARBGHRBGHUiBkF/Sg0AGiAGQX9GBEAgA0EDSA0CIAUvAABBgP4BaiEEIAJBA2oMAQsgA0ECSA0BIAItAAEgBEEIdHJBgIB+aiEEIAJBAmoLIQUgASAENgIAIAVBAWoiASACIANqIgNLDQBBbCEHIABBEGogACAFLQAAIgVBBnZBI0EJIAEgAyABa0HAEEHQEUHwEiAAKAKM4QEgACgCnOIBIAQQHyIGEAMiCA0AIABBmCBqIABBCGogBUEEdkEDcUEfQQggASABIAZqIAgbIgEgAyABa0GAC0GADEGAFyAAKAKM4QEgACgCnOIBIAQQHyIGEAMiCA0AIABBoDBqIABBBGogBUECdkEDcUE0QQkgASABIAZqIAgbIgEgAyABa0GADUHgDkGQGSAAKAKM4QEgACgCnOIBIAQQHyIAEAMNACAAIAFqIAJrIQcLIAcLrQMBCn8jAEGABGsiCCQAAn9BUiACQf8BSw0AGkFUIANBDEsNABogAkEBaiELIABBBGohCUGAgAQgA0F/anRBEHUhCkEAIQJBASEEQQEgA3QiB0F/aiIMIQUDQCACIAtGRQRAAkAgASACQQF0Ig1qLwEAIgZB//8DRgRAIAkgBUECdGogAjoAAiAFQX9qIQVBASEGDAELIARBACAKIAZBEHRBEHVKGyEECyAIIA1qIAY7AQAgAkEBaiECDAELCyAAIAQ7AQIgACADOwEAIAdBA3YgB0EBdmpBA2ohBkEAIQRBACECA0AgBCALRkUEQCABIARBAXRqLgEAIQpBACEAA0AgACAKTkUEQCAJIAJBAnRqIAQ6AAIDQCACIAZqIAxxIgIgBUsNAAsgAEEBaiEADAELCyAEQQFqIQQMAQsLQX8gAg0AGkEAIQIDfyACIAdGBH9BAAUgCCAJIAJBAnRqIgAtAAJBAXRqIgEgAS8BACIBQQFqOwEAIAAgAyABEBRrIgU6AAMgACABIAVB/wFxdCAHazsBACACQQFqIQIMAQsLCyEFIAhBgARqJAAgBQvjBgEIf0FsIQcCQCACQQNJDQACQAJAAkACQCABLQAAIgNBA3EiCUEBaw4DAwEAAgsgACgCiOEBDQBBYg8LIAJBBUkNAkEDIQYgASgAACEFAn8CQAJAIANBAnZBA3EiCEF+aiIEQQFNBEAgBEEBaw0BDAILIAVBDnZB/wdxIQQgBUEEdkH/B3EhAyAIRQwCCyAFQRJ2IQRBBCEGIAVBBHZB//8AcSEDQQAMAQsgBUEEdkH//w9xIgNBgIAISw0DIAEtAARBCnQgBUEWdnIhBEEFIQZBAAshBSAEIAZqIgogAksNAgJAIANBgQZJDQAgACgCnOIBRQ0AQQAhAgNAIAJBg4ABSw0BIAJBQGshAgwAAAsACwJ/IAlBA0YEQCABIAZqIQEgAEHw4gFqIQIgACgCDCEGIAUEQCACIAMgASAEIAYQXwwCCyACIAMgASAEIAYQXQwBCyAAQbjQAWohAiABIAZqIQEgAEHw4gFqIQYgAEGo0ABqIQggBQRAIAggBiADIAEgBCACEF4MAQsgCCAGIAMgASAEIAIQXAsQAw0CIAAgAzYCgOIBIABBATYCiOEBIAAgAEHw4gFqNgLw4QEgCUECRgRAIAAgAEGo0ABqNgIMCyAAIANqIgBBiOMBakIANwAAIABBgOMBakIANwAAIABB+OIBakIANwAAIABB8OIBakIANwAAIAoPCwJ/AkACQAJAIANBAnZBA3FBf2oiBEECSw0AIARBAWsOAgACAQtBASEEIANBA3YMAgtBAiEEIAEvAABBBHYMAQtBAyEEIAEQIUEEdgsiAyAEaiIFQSBqIAJLBEAgBSACSw0CIABB8OIBaiABIARqIAMQCyEBIAAgAzYCgOIBIAAgATYC8OEBIAEgA2oiAEIANwAYIABCADcAECAAQgA3AAggAEIANwAAIAUPCyAAIAM2AoDiASAAIAEgBGo2AvDhASAFDwsCfwJAAkACQCADQQJ2QQNxQX9qIgRBAksNACAEQQFrDgIAAgELQQEhByADQQN2DAILQQIhByABLwAAQQR2DAELIAJBBEkgARAhIgJBj4CAAUtyDQFBAyEHIAJBBHYLIQIgAEHw4gFqIAEgB2otAAAgAkEgahAQIQEgACACNgKA4gEgACABNgLw4QEgB0EBaiEHCyAHC0sAIABC+erQ0OfJoeThADcDICAAQgA3AxggAELP1tO+0ser2UI3AxAgAELW64Lu6v2J9eAANwMIIABCADcDACAAQShqQQBBKBAQGgviAgICfwV+IABBKGoiASAAKAJIaiECAn4gACkDACIDQiBaBEAgACkDECIEQgeJIAApAwgiBUIBiXwgACkDGCIGQgyJfCAAKQMgIgdCEol8IAUQGSAEEBkgBhAZIAcQGQwBCyAAKQMYQsXP2bLx5brqJ3wLIAN8IQMDQCABQQhqIgAgAk0EQEIAIAEpAAAQCSADhUIbiUKHla+vmLbem55/fkLj3MqV/M7y9YV/fCEDIAAhAQwBCwsCQCABQQRqIgAgAksEQCABIQAMAQsgASgAAK1Ch5Wvr5i23puef34gA4VCF4lCz9bTvtLHq9lCfkL5893xmfaZqxZ8IQMLA0AgACACSQRAIAAxAABCxc/ZsvHluuonfiADhUILiUKHla+vmLbem55/fiEDIABBAWohAAwBCwsgA0IhiCADhULP1tO+0ser2UJ+IgNCHYggA4VC+fPd8Zn2masWfiIDQiCIIAOFC+8CAgJ/BH4gACAAKQMAIAKtfDcDAAJAAkAgACgCSCIDIAJqIgRBH00EQCABRQ0BIAAgA2pBKGogASACECAgACgCSCACaiEEDAELIAEgAmohAgJ/IAMEQCAAQShqIgQgA2ogAUEgIANrECAgACAAKQMIIAQpAAAQCTcDCCAAIAApAxAgACkAMBAJNwMQIAAgACkDGCAAKQA4EAk3AxggACAAKQMgIABBQGspAAAQCTcDICAAKAJIIQMgAEEANgJIIAEgA2tBIGohAQsgAUEgaiACTQsEQCACQWBqIQMgACkDICEFIAApAxghBiAAKQMQIQcgACkDCCEIA0AgCCABKQAAEAkhCCAHIAEpAAgQCSEHIAYgASkAEBAJIQYgBSABKQAYEAkhBSABQSBqIgEgA00NAAsgACAFNwMgIAAgBjcDGCAAIAc3AxAgACAINwMICyABIAJPDQEgAEEoaiABIAIgAWsiBBAgCyAAIAQ2AkgLCy8BAX8gAEUEQEG2f0EAIAMbDwtBun8hBCADIAFNBH8gACACIAMQEBogAwVBun8LCy8BAX8gAEUEQEG2f0EAIAMbDwtBun8hBCADIAFNBH8gACACIAMQCxogAwVBun8LC6gCAQZ/IwBBEGsiByQAIABB2OABaikDAEKAgIAQViEIQbh/IQUCQCAEQf//B0sNACAAIAMgBBBCIgUQAyIGDQAgACgCnOIBIQkgACAHQQxqIAMgAyAFaiAGGyIKIARBACAFIAYbayIGEEAiAxADBEAgAyEFDAELIAcoAgwhBCABRQRAQbp/IQUgBEEASg0BCyAGIANrIQUgAyAKaiEDAkAgCQRAIABBADYCnOIBDAELAkACQAJAIARBBUgNACAAQdjgAWopAwBCgICACFgNAAwBCyAAQQA2ApziAQwBCyAAKAIIED8hBiAAQQA2ApziASAGQRRPDQELIAAgASACIAMgBSAEIAgQOSEFDAELIAAgASACIAMgBSAEIAgQOiEFCyAHQRBqJAAgBQtnACAAQdDgAWogASACIAAoAuzhARAuIgEQAwRAIAEPC0G4fyECAkAgAQ0AIABB7OABaigCACIBBEBBYCECIAAoApjiASABRw0BC0EAIQIgAEHw4AFqKAIARQ0AIABBkOEBahBDCyACCycBAX8QVyIERQRAQUAPCyAEIAAgASACIAMgBBBLEE8hACAEEFYgAAs/AQF/AkACQAJAIAAoAqDiAUEBaiIBQQJLDQAgAUEBaw4CAAECCyAAEDBBAA8LIABBADYCoOIBCyAAKAKU4gELvAMCB38BfiMAQRBrIgkkAEG4fyEGAkAgBCgCACIIQQVBCSAAKALs4QEiBRtJDQAgAygCACIHQQFBBSAFGyAFEC8iBRADBEAgBSEGDAELIAggBUEDakkNACAAIAcgBRBJIgYQAw0AIAEgAmohCiAAQZDhAWohCyAIIAVrIQIgBSAHaiEHIAEhBQNAIAcgAiAJECwiBhADDQEgAkF9aiICIAZJBEBBuH8hBgwCCyAJKAIAIghBAksEQEFsIQYMAgsgB0EDaiEHAn8CQAJAAkAgCEEBaw4CAgABCyAAIAUgCiAFayAHIAYQSAwCCyAFIAogBWsgByAGEEcMAQsgBSAKIAVrIActAAAgCSgCCBBGCyIIEAMEQCAIIQYMAgsgACgC8OABBEAgCyAFIAgQRQsgAiAGayECIAYgB2ohByAFIAhqIQUgCSgCBEUNAAsgACkD0OABIgxCf1IEQEFsIQYgDCAFIAFrrFINAQsgACgC8OABBEBBaiEGIAJBBEkNASALEEQhDCAHKAAAIAynRw0BIAdBBGohByACQXxqIQILIAMgBzYCACAEIAI2AgAgBSABayEGCyAJQRBqJAAgBgsuACAAECsCf0EAQQAQAw0AGiABRSACRXJFBEBBYiAAIAEgAhA9EAMNARoLQQALCzcAIAEEQCAAIAAoAsTgASABKAIEIAEoAghqRzYCnOIBCyAAECtBABADIAFFckUEQCAAIAEQWwsL0QIBB38jAEEQayIGJAAgBiAENgIIIAYgAzYCDCAFBEAgBSgCBCEKIAUoAgghCQsgASEIAkACQANAIAAoAuzhARAWIQsCQANAIAQgC0kNASADKAAAQXBxQdDUtMIBRgRAIAMgBBAiIgcQAw0EIAQgB2shBCADIAdqIQMMAQsLIAYgAzYCDCAGIAQ2AggCQCAFBEAgACAFEE5BACEHQQAQA0UNAQwFCyAAIAogCRBNIgcQAw0ECyAAIAgQUCAMQQFHQQAgACAIIAIgBkEMaiAGQQhqEEwiByIDa0EAIAMQAxtBCkdyRQRAQbh/IQcMBAsgBxADDQMgAiAHayECIAcgCGohCEEBIQwgBigCDCEDIAYoAgghBAwBCwsgBiADNgIMIAYgBDYCCEG4fyEHIAQNASAIIAFrIQcMAQsgBiADNgIMIAYgBDYCCAsgBkEQaiQAIAcLRgECfyABIAAoArjgASICRwRAIAAgAjYCxOABIAAgATYCuOABIAAoArzgASEDIAAgATYCvOABIAAgASADIAJrajYCwOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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';
|
|
4390
|
-
|
|
4391
|
-
const zstd = new ZSTDDecoder();
|
|
4392
|
-
|
|
4393
|
-
class LercDecoder extends basedecoder.BaseDecoder {
|
|
4394
|
-
constructor(fileDirectory) {
|
|
4395
|
-
super();
|
|
4396
|
-
|
|
4397
|
-
this.planarConfiguration = typeof fileDirectory.PlanarConfiguration !== 'undefined' ? fileDirectory.PlanarConfiguration : 1;
|
|
4398
|
-
this.samplesPerPixel = typeof fileDirectory.SamplesPerPixel !== 'undefined' ? fileDirectory.SamplesPerPixel : 1;
|
|
4399
|
-
|
|
4400
|
-
this.addCompression = fileDirectory.LercParameters[eraserIcon_houseIcon_iconSelector_mapDraw_mapSelector_markerIcon_moveIcon_octagonMinusIcon_polygonButtons_polygonInformation_searchIcon_settingsIcon_settingsModal_solarExpert_solarSystemForm_toastNotification_toolBox_tutorialComponent_undoIcon_entry.LercParameters.AddCompression];
|
|
4401
|
-
}
|
|
4402
|
-
|
|
4403
|
-
decodeBlock(buffer) {
|
|
4404
|
-
switch (this.addCompression) {
|
|
4405
|
-
case eraserIcon_houseIcon_iconSelector_mapDraw_mapSelector_markerIcon_moveIcon_octagonMinusIcon_polygonButtons_polygonInformation_searchIcon_settingsIcon_settingsModal_solarExpert_solarSystemForm_toastNotification_toolBox_tutorialComponent_undoIcon_entry.LercAddCompression.None:
|
|
4406
|
-
break;
|
|
4407
|
-
case eraserIcon_houseIcon_iconSelector_mapDraw_mapSelector_markerIcon_moveIcon_octagonMinusIcon_polygonButtons_polygonInformation_searchIcon_settingsIcon_settingsModal_solarExpert_solarSystemForm_toastNotification_toolBox_tutorialComponent_undoIcon_entry.LercAddCompression.Deflate:
|
|
4408
|
-
buffer = pako_esm.inflate_1(new Uint8Array(buffer)).buffer; // eslint-disable-line no-param-reassign, prefer-destructuring
|
|
4409
|
-
break;
|
|
4410
|
-
case eraserIcon_houseIcon_iconSelector_mapDraw_mapSelector_markerIcon_moveIcon_octagonMinusIcon_polygonButtons_polygonInformation_searchIcon_settingsIcon_settingsModal_solarExpert_solarSystemForm_toastNotification_toolBox_tutorialComponent_undoIcon_entry.LercAddCompression.Zstandard:
|
|
4411
|
-
buffer = zstd.decode(new Uint8Array(buffer)).buffer; // eslint-disable-line no-param-reassign, prefer-destructuring
|
|
4412
|
-
break;
|
|
4413
|
-
default:
|
|
4414
|
-
throw new Error(`Unsupported LERC additional compression method identifier: ${this.addCompression}`);
|
|
4415
|
-
}
|
|
4416
|
-
|
|
4417
|
-
const lercResult = LercDecodeExports.decode(buffer, { returnPixelInterleavedDims: this.planarConfiguration === 1 });
|
|
4418
|
-
const lercData = lercResult.pixels[0];
|
|
4419
|
-
return lercData.buffer;
|
|
4420
|
-
}
|
|
4421
|
-
}
|
|
4422
|
-
|
|
4423
|
-
exports.default = LercDecoder;
|
|
4424
|
-
exports.zstd = zstd;
|
|
4425
|
-
//# sourceMappingURL=lerc-v64rYVDy.js.map
|
|
4426
|
-
|
|
4427
|
-
//# sourceMappingURL=lerc-v64rYVDy.js.map
|