@fgv/ts-web-extras 5.1.0-2 → 5.1.0-21
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/packlets/crypto-utils/browserCryptoProvider.js +208 -18
- package/dist/packlets/crypto-utils/browserCryptoProvider.js.map +1 -1
- package/dist/packlets/file-tree/fileApiTreeAccessors.js +1 -1
- package/dist/packlets/file-tree/fileApiTreeAccessors.js.map +1 -1
- package/dist/packlets/file-tree/httpTreeAccessors.js +72 -42
- package/dist/packlets/file-tree/httpTreeAccessors.js.map +1 -1
- package/dist/ts-web-extras.d.ts +59 -7
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/packlets/crypto-utils/browserCryptoProvider.d.ts +52 -5
- package/lib/packlets/crypto-utils/browserCryptoProvider.d.ts.map +1 -1
- package/lib/packlets/crypto-utils/browserCryptoProvider.js +207 -17
- package/lib/packlets/crypto-utils/browserCryptoProvider.js.map +1 -1
- package/lib/packlets/file-tree/fileApiTreeAccessors.d.ts +1 -1
- package/lib/packlets/file-tree/fileApiTreeAccessors.js +1 -1
- package/lib/packlets/file-tree/fileApiTreeAccessors.js.map +1 -1
- package/lib/packlets/file-tree/httpTreeAccessors.d.ts +6 -0
- package/lib/packlets/file-tree/httpTreeAccessors.d.ts.map +1 -1
- package/lib/packlets/file-tree/httpTreeAccessors.js +72 -42
- package/lib/packlets/file-tree/httpTreeAccessors.js.map +1 -1
- package/package.json +27 -26
- package/.rush/temp/chunked-rush-logs/ts-web-extras.build.chunks.jsonl +0 -75
- package/.rush/temp/chunked-rush-logs/ts-web-extras.test.chunks.jsonl +0 -75
- package/.rush/temp/operation/build/all.log +0 -75
- package/.rush/temp/operation/build/error.log +0 -18
- package/.rush/temp/operation/build/log-chunks.jsonl +0 -75
- package/.rush/temp/operation/build/state.json +0 -3
- package/.rush/temp/operation/test/all.log +0 -75
- package/.rush/temp/operation/test/error.log +0 -18
- package/.rush/temp/operation/test/log-chunks.jsonl +0 -75
- package/.rush/temp/operation/test/state.json +0 -3
- package/.rush/temp/shrinkwrap-deps.json +0 -635
- package/CHANGELOG.md +0 -23
- package/config/api-extractor.json +0 -343
- package/config/jest.config.json +0 -19
- package/config/rig.json +0 -16
- package/config/typedoc.json +0 -6
- package/dist/test/mocks/idb-keyval.js +0 -6
- package/dist/test/mocks/idb-keyval.js.map +0 -1
- package/dist/test/setupTests.js +0 -74
- package/dist/test/setupTests.js.map +0 -1
- package/dist/test/unit/browserHashProvider.test.js +0 -140
- package/dist/test/unit/browserHashProvider.test.js.map +0 -1
- package/dist/test/unit/directoryHandleStore.test.js +0 -190
- package/dist/test/unit/directoryHandleStore.test.js.map +0 -1
- package/dist/test/unit/fileApiTreeAccessors.test.js +0 -1188
- package/dist/test/unit/fileApiTreeAccessors.test.js.map +0 -1
- package/dist/test/unit/fileApiTypes.test.js +0 -472
- package/dist/test/unit/fileApiTypes.test.js.map +0 -1
- package/dist/test/unit/fileSystemAccessTreeAccessors.test.js +0 -622
- package/dist/test/unit/fileSystemAccessTreeAccessors.test.js.map +0 -1
- package/dist/test/unit/fileTreeHelpers.test.js +0 -590
- package/dist/test/unit/fileTreeHelpers.test.js.map +0 -1
- package/dist/test/unit/httpTreeAccessors.test.js +0 -1229
- package/dist/test/unit/httpTreeAccessors.test.js.map +0 -1
- package/dist/test/unit/localStorageTreeAccessors.test.js +0 -812
- package/dist/test/unit/localStorageTreeAccessors.test.js.map +0 -1
- package/dist/test/unit/urlParams.test.js +0 -393
- package/dist/test/unit/urlParams.test.js.map +0 -1
- package/dist/test/utils/fileSystemAccessMocks.js +0 -271
- package/dist/test/utils/fileSystemAccessMocks.js.map +0 -1
- package/dist/test/utils/testHelpers.js +0 -124
- package/dist/test/utils/testHelpers.js.map +0 -1
- package/docs/@fgv/namespaces/CryptoUtils/README.md +0 -18
- package/docs/@fgv/namespaces/CryptoUtils/classes/BrowserCryptoProvider.md +0 -203
- package/docs/@fgv/namespaces/CryptoUtils/classes/BrowserHashProvider.md +0 -63
- package/docs/@fgv/namespaces/CryptoUtils/functions/createBrowserCryptoProvider.md +0 -18
- package/docs/@fgv/namespaces/FileTreeHelpers/README.md +0 -19
- package/docs/@fgv/namespaces/FileTreeHelpers/functions/extractFileListMetadata.md +0 -23
- package/docs/@fgv/namespaces/FileTreeHelpers/functions/extractFileMetadata.md +0 -23
- package/docs/@fgv/namespaces/FileTreeHelpers/functions/fromDirectoryUpload.md +0 -33
- package/docs/@fgv/namespaces/FileTreeHelpers/functions/fromFileList.md +0 -33
- package/docs/@fgv/namespaces/FileTreeHelpers/functions/getOriginalFile.md +0 -25
- package/docs/@fgv/namespaces/FileTreeHelpers/variables/defaultFileApiTreeInitParams.md +0 -11
- package/docs/README.md +0 -78
- package/docs/classes/DirectoryHandleStore.md +0 -116
- package/docs/classes/FileApiTreeAccessors.md +0 -286
- package/docs/classes/FileSystemAccessTreeAccessors.md +0 -557
- package/docs/classes/HttpTreeAccessors.md +0 -508
- package/docs/classes/LocalStorageTreeAccessors.md +0 -520
- package/docs/functions/exportAsJson.md +0 -23
- package/docs/functions/exportUsingFileSystemAPI.md +0 -26
- package/docs/functions/extractDirectoryPath.md +0 -23
- package/docs/functions/isDirectoryHandle.md +0 -23
- package/docs/functions/isFileHandle.md +0 -23
- package/docs/functions/isFilePath.md +0 -21
- package/docs/functions/parseContextFilter.md +0 -22
- package/docs/functions/parseQualifierDefaults.md +0 -22
- package/docs/functions/parseResourceTypes.md +0 -22
- package/docs/functions/parseUrlParameters.md +0 -15
- package/docs/functions/safeShowDirectoryPicker.md +0 -24
- package/docs/functions/safeShowOpenFilePicker.md +0 -24
- package/docs/functions/safeShowSaveFilePicker.md +0 -24
- package/docs/functions/supportsFileSystemAccess.md +0 -23
- package/docs/interfaces/FilePickerAcceptType.md +0 -16
- package/docs/interfaces/FileSystemCreateWritableOptions.md +0 -15
- package/docs/interfaces/FileSystemDirectoryHandle.md +0 -187
- package/docs/interfaces/FileSystemFileHandle.md +0 -106
- package/docs/interfaces/FileSystemGetDirectoryOptions.md +0 -15
- package/docs/interfaces/FileSystemGetFileOptions.md +0 -15
- package/docs/interfaces/FileSystemHandle.md +0 -69
- package/docs/interfaces/FileSystemHandlePermissionDescriptor.md +0 -15
- package/docs/interfaces/FileSystemRemoveOptions.md +0 -15
- package/docs/interfaces/FileSystemWritableFileStream.md +0 -127
- package/docs/interfaces/IDirectoryHandleTreeInitializer.md +0 -17
- package/docs/interfaces/IFileHandleTreeInitializer.md +0 -16
- package/docs/interfaces/IFileListTreeInitializer.md +0 -15
- package/docs/interfaces/IFileMetadata.md +0 -19
- package/docs/interfaces/IFileSystemAccessTreeParams.md +0 -30
- package/docs/interfaces/IFsAccessApis.md +0 -57
- package/docs/interfaces/IHttpTreeParams.md +0 -32
- package/docs/interfaces/ILocalStorageTreeParams.md +0 -30
- package/docs/interfaces/IUrlConfigOptions.md +0 -27
- package/docs/interfaces/ShowDirectoryPickerOptions.md +0 -17
- package/docs/interfaces/ShowOpenFilePickerOptions.md +0 -19
- package/docs/interfaces/ShowSaveFilePickerOptions.md +0 -19
- package/docs/type-aliases/TreeInitializer.md +0 -11
- package/docs/type-aliases/WellKnownDirectory.md +0 -11
- package/docs/type-aliases/WindowWithFsAccess.md +0 -11
- package/docs/variables/DEFAULT_DIRECTORY_HANDLE_DB.md +0 -11
- package/docs/variables/DEFAULT_DIRECTORY_HANDLE_STORE.md +0 -11
- package/etc/ts-web-extras.api.md +0 -433
- package/lib/test/mocks/idb-keyval.d.ts +0 -6
- package/lib/test/mocks/idb-keyval.d.ts.map +0 -1
- package/lib/test/mocks/idb-keyval.js +0 -9
- package/lib/test/mocks/idb-keyval.js.map +0 -1
- package/lib/test/setupTests.d.ts +0 -2
- package/lib/test/setupTests.d.ts.map +0 -1
- package/lib/test/setupTests.js +0 -76
- package/lib/test/setupTests.js.map +0 -1
- package/lib/test/unit/browserHashProvider.test.d.ts +0 -2
- package/lib/test/unit/browserHashProvider.test.d.ts.map +0 -1
- package/lib/test/unit/browserHashProvider.test.js +0 -142
- package/lib/test/unit/browserHashProvider.test.js.map +0 -1
- package/lib/test/unit/directoryHandleStore.test.d.ts +0 -2
- package/lib/test/unit/directoryHandleStore.test.d.ts.map +0 -1
- package/lib/test/unit/directoryHandleStore.test.js +0 -192
- package/lib/test/unit/directoryHandleStore.test.js.map +0 -1
- package/lib/test/unit/fileApiTreeAccessors.test.d.ts +0 -2
- package/lib/test/unit/fileApiTreeAccessors.test.d.ts.map +0 -1
- package/lib/test/unit/fileApiTreeAccessors.test.js +0 -1190
- package/lib/test/unit/fileApiTreeAccessors.test.js.map +0 -1
- package/lib/test/unit/fileApiTypes.test.d.ts +0 -2
- package/lib/test/unit/fileApiTypes.test.d.ts.map +0 -1
- package/lib/test/unit/fileApiTypes.test.js +0 -474
- package/lib/test/unit/fileApiTypes.test.js.map +0 -1
- package/lib/test/unit/fileSystemAccessTreeAccessors.test.d.ts +0 -2
- package/lib/test/unit/fileSystemAccessTreeAccessors.test.d.ts.map +0 -1
- package/lib/test/unit/fileSystemAccessTreeAccessors.test.js +0 -624
- package/lib/test/unit/fileSystemAccessTreeAccessors.test.js.map +0 -1
- package/lib/test/unit/fileTreeHelpers.test.d.ts +0 -2
- package/lib/test/unit/fileTreeHelpers.test.d.ts.map +0 -1
- package/lib/test/unit/fileTreeHelpers.test.js +0 -592
- package/lib/test/unit/fileTreeHelpers.test.js.map +0 -1
- package/lib/test/unit/httpTreeAccessors.test.d.ts +0 -2
- package/lib/test/unit/httpTreeAccessors.test.d.ts.map +0 -1
- package/lib/test/unit/httpTreeAccessors.test.js +0 -1231
- package/lib/test/unit/httpTreeAccessors.test.js.map +0 -1
- package/lib/test/unit/localStorageTreeAccessors.test.d.ts +0 -2
- package/lib/test/unit/localStorageTreeAccessors.test.d.ts.map +0 -1
- package/lib/test/unit/localStorageTreeAccessors.test.js +0 -814
- package/lib/test/unit/localStorageTreeAccessors.test.js.map +0 -1
- package/lib/test/unit/urlParams.test.d.ts +0 -2
- package/lib/test/unit/urlParams.test.d.ts.map +0 -1
- package/lib/test/unit/urlParams.test.js +0 -395
- package/lib/test/unit/urlParams.test.js.map +0 -1
- package/lib/test/utils/fileSystemAccessMocks.d.ts +0 -53
- package/lib/test/utils/fileSystemAccessMocks.d.ts.map +0 -1
- package/lib/test/utils/fileSystemAccessMocks.js +0 -277
- package/lib/test/utils/fileSystemAccessMocks.js.map +0 -1
- package/lib/test/utils/testHelpers.d.ts +0 -51
- package/lib/test/utils/testHelpers.d.ts.map +0 -1
- package/lib/test/utils/testHelpers.js +0 -133
- package/lib/test/utils/testHelpers.js.map +0 -1
- package/rush-logs/ts-web-extras.build.cache.log +0 -0
- package/rush-logs/ts-web-extras.build.error.log +0 -18
- package/rush-logs/ts-web-extras.build.log +0 -75
- package/rush-logs/ts-web-extras.test.cache.log +0 -1
- package/rush-logs/ts-web-extras.test.error.log +0 -18
- package/rush-logs/ts-web-extras.test.log +0 -75
- package/src/index.browser.ts +0 -24
- package/src/index.ts +0 -47
- package/src/packlets/crypto-utils/browserCryptoProvider.ts +0 -311
- package/src/packlets/crypto-utils/browserHashProvider.ts +0 -73
- package/src/packlets/crypto-utils/index.ts +0 -29
- package/src/packlets/file-api-types/index.ts +0 -366
- package/src/packlets/file-tree/directoryHandleStore.ts +0 -136
- package/src/packlets/file-tree/fileApiTreeAccessors.ts +0 -528
- package/src/packlets/file-tree/fileSystemAccessTreeAccessors.ts +0 -519
- package/src/packlets/file-tree/httpTreeAccessors.ts +0 -448
- package/src/packlets/file-tree/index.ts +0 -32
- package/src/packlets/file-tree/localStorageTreeAccessors.ts +0 -430
- package/src/packlets/helpers/fileTreeHelpers.ts +0 -107
- package/src/packlets/helpers/index.ts +0 -28
- package/src/packlets/url-utils/index.ts +0 -28
- package/src/packlets/url-utils/urlParams.ts +0 -245
- package/src/test/mocks/idb-keyval.ts +0 -5
- package/src/test/setupTests.ts +0 -87
- package/src/test/unit/browserHashProvider.test.ts +0 -155
- package/src/test/unit/browserHashProvider.test.ts.bak +0 -376
- package/src/test/unit/directoryHandleStore.test.ts +0 -251
- package/src/test/unit/fileApiTreeAccessors.test.ts +0 -1387
- package/src/test/unit/fileApiTypes.test.ts +0 -587
- package/src/test/unit/fileSystemAccessTreeAccessors.test.ts +0 -885
- package/src/test/unit/fileTreeHelpers.test.ts +0 -694
- package/src/test/unit/httpTreeAccessors.test.ts +0 -1571
- package/src/test/unit/localStorageTreeAccessors.test.ts +0 -1014
- package/src/test/unit/urlParams.test.ts +0 -464
- package/src/test/utils/fileSystemAccessMocks.ts +0 -353
- package/src/test/utils/testHelpers.ts +0 -155
- package/temp/build/typescript/ts_8nwakTlr.json +0 -1
- package/temp/coverage/base.css +0 -224
- package/temp/coverage/block-navigation.js +0 -87
- package/temp/coverage/crypto/browserHashProvider.ts.html +0 -304
- package/temp/coverage/crypto/index.html +0 -116
- package/temp/coverage/crypto-utils/browserCryptoProvider.ts.html +0 -1018
- package/temp/coverage/crypto-utils/browserHashProvider.ts.html +0 -304
- package/temp/coverage/crypto-utils/index.html +0 -131
- package/temp/coverage/favicon.png +0 -0
- package/temp/coverage/file-tree/directoryHandleStore.ts.html +0 -493
- package/temp/coverage/file-tree/fileApiTreeAccessors.ts.html +0 -1669
- package/temp/coverage/file-tree/fileSystemAccessTreeAccessors.ts.html +0 -1642
- package/temp/coverage/file-tree/httpTreeAccessors.ts.html +0 -1429
- package/temp/coverage/file-tree/index.html +0 -176
- package/temp/coverage/file-tree/localStorageTreeAccessors.ts.html +0 -1375
- package/temp/coverage/helpers/fileTreeHelpers.ts.html +0 -406
- package/temp/coverage/helpers/index.html +0 -116
- package/temp/coverage/index.html +0 -161
- package/temp/coverage/lcov-report/base.css +0 -224
- package/temp/coverage/lcov-report/block-navigation.js +0 -87
- package/temp/coverage/lcov-report/crypto/browserHashProvider.ts.html +0 -304
- package/temp/coverage/lcov-report/crypto/index.html +0 -116
- package/temp/coverage/lcov-report/crypto-utils/browserCryptoProvider.ts.html +0 -1018
- package/temp/coverage/lcov-report/crypto-utils/browserHashProvider.ts.html +0 -304
- package/temp/coverage/lcov-report/crypto-utils/index.html +0 -131
- package/temp/coverage/lcov-report/favicon.png +0 -0
- package/temp/coverage/lcov-report/file-tree/directoryHandleStore.ts.html +0 -493
- package/temp/coverage/lcov-report/file-tree/fileApiTreeAccessors.ts.html +0 -1669
- package/temp/coverage/lcov-report/file-tree/fileSystemAccessTreeAccessors.ts.html +0 -1642
- package/temp/coverage/lcov-report/file-tree/httpTreeAccessors.ts.html +0 -1429
- package/temp/coverage/lcov-report/file-tree/index.html +0 -176
- package/temp/coverage/lcov-report/file-tree/localStorageTreeAccessors.ts.html +0 -1375
- package/temp/coverage/lcov-report/helpers/fileTreeHelpers.ts.html +0 -406
- package/temp/coverage/lcov-report/helpers/index.html +0 -116
- package/temp/coverage/lcov-report/index.html +0 -161
- package/temp/coverage/lcov-report/prettify.css +0 -1
- package/temp/coverage/lcov-report/prettify.js +0 -2
- package/temp/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/temp/coverage/lcov-report/sorter.js +0 -210
- package/temp/coverage/lcov-report/url-utils/index.html +0 -116
- package/temp/coverage/lcov-report/url-utils/urlParams.ts.html +0 -820
- package/temp/coverage/lcov.info +0 -3597
- package/temp/coverage/prettify.css +0 -1
- package/temp/coverage/prettify.js +0 -2
- package/temp/coverage/sort-arrow-sprite.png +0 -0
- package/temp/coverage/sorter.js +0 -210
- package/temp/coverage/url-utils/index.html +0 -116
- package/temp/coverage/url-utils/urlParams.ts.html +0 -820
- package/temp/test/jest/haste-map-b931e4e63102f86c5bd4949f7dced44f-9d713eb41149188b4e5c0ae3d86d0a57-2ad8e16b24e391b8cdbe50b55c137169 +0 -0
- package/temp/test/jest/jest-transform-cache-b931e4e63102f86c5bd4949f7dced44f-79ef2876fae7ca75eedb2aa53dc48338/b5/package_b5f57afc9ec2c011239b1608ee5bdfa5 +0 -53
- package/temp/test/jest/perf-cache-b931e4e63102f86c5bd4949f7dced44f-da39a3ee5e6b4b0d3255bfef95601890 +0 -1
- package/temp/ts-web-extras.api.json +0 -8850
- package/temp/ts-web-extras.api.md +0 -433
- package/tsconfig.json +0 -7
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fileTreeHelpers.test.js","sourceRoot":"","sources":["../../../src/test/unit/fileTreeHelpers.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAEvG,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,QAAQ,GAAG,kBAAkB,CAAC;gBAClC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE;gBAC1C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE;aAC3C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,gDAAgD;gBAChD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAEnD,kCAAkC;gBAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAE3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;YAErF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACnF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,QAAQ,GAAG,kBAAkB,CAAC;gBAClC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE;gBAC5E,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,wBAAwB,EAAE;gBACvF,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,UAAU,EAAE;gBACvE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE;aACxE,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACtD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,QAAQ,GAAG,kBAAkB,CAAC;gBAClC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE;gBAC5E,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,wBAAwB,EAAE;gBACvF,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,UAAU,EAAE;gBACvE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE;gBACvE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE;gBAC7D,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,iBAAiB,EAAE;gBACzE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE;aACtE,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,6DAA6D;gBAC7D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACpD,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;gBAC1D,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACnE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC7C,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACrE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACnD,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACpE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACnD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,QAAQ,GAAG,kBAAkB,CAAC;gBAClC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,sBAAsB,EAAE;gBACxD,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE;gBAC3D,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE;aACtD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,6DAA6D;gBAC7D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACpE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,8BAA8B;gBAC7E,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACvE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,4CAA4C;gBAC3F,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACpE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,8BAA8B;gBAC7E,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,QAAQ,GAAG,kBAAkB,CAAC;gBAClC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,kBAAkB,EAAE;aAC3E,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,6DAA6D;gBAC7D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClE,MAAM,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC/C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACpD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,YAAY;gBAClB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;gBACxB,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;aAClC,CAAC;YAErB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;YAErF,2CAA2C;YAC3C,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;YAC9B,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC;YAE7B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAC,CAAC;YAEvG,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;oBAC5C,qCAAqC;oBACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;oBAC1C,MAAM,CAAC,UAAU,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAM,EAAE,EAAE;wBAChD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;oBACtD,CAAC,CAAC,CAAC;oBAEH,0BAA0B;oBAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;oBAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC;oBAEjE,uBAAuB;oBACvB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBACxC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACzC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,QAAQ,GAAG,2BAA2B,CAAC;gBAC3C,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,sBAAsB,EAAE;gBACjE,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,iCAAiC,EAAE;gBAC5E,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,0BAA0B,EAAE;gBACrE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,EAAE;aACzD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,kCAAkC;gBAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC9D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC9D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC9D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAE3D,6BAA6B;gBAC7B,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACtD,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAE1D,2BAA2B;gBAC3B,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAC;gBAC7E,MAAM,CAAC,cAAc,CAAC,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,QAAQ,GAAG,2BAA2B,CAAC;gBAC3C,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,sBAAsB,EAAE;gBAC5D,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,qBAAqB,EAAE;aACxD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC1F,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,QAAQ,GAAG,2BAA2B,CAAC;gBAC3C,EAAE,IAAI,EAAE,iCAAiC,EAAE,OAAO,EAAE,UAAU,EAAE;gBAChE,EAAE,IAAI,EAAE,iCAAiC,EAAE,OAAO,EAAE,UAAU,EAAE;gBAChE,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,UAAU,EAAE;gBAC5D,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE;aAChD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,4BAA4B;gBAC5B,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnD,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC1D,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACpE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACzD,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAEhE,2BAA2B;gBAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;oBACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,EAAE;wBAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;wBACpD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;wBAClC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;wBACjC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;oBACvC,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACtD,gDAAgD;YAChD,MAAM,KAAK,GAAG;gBACZ,cAAc,CAAC;oBACb,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,eAAe;oBACxB,kBAAkB,EAAE,oBAAoB;iBACzC,CAAC;gBACF,cAAc,CAAC;oBACb,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,SAAS;oBAClB,kBAAkB,EAAE,uBAAuB;iBAC5C,CAAC;aACH,CAAC;YAEF,0DAA0D;YAC1D,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC;YAE1B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC5D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC/D,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACtD,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YAC5D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,QAAQ,GAAG,2BAA2B,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YAElG,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACzD,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACvD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,QAAQ,GAAG,2BAA2B,CAAC,EAAE,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,QAAQ,GAAG,2BAA2B,CAAC;gBAC3C,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE;gBACvF,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,wBAAwB,EAAE;gBACjG,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,EAAE;gBACrF,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE;gBAC1E,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,iBAAiB,EAAE;gBAC/E,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE;gBAClF,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,iBAAiB,EAAE;aACrF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,6DAA6D;gBAC7D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC7E,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACpD,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC7E,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;gBAC1D,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC/E,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC1E,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACjD,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACzE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACnD,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAChF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACjD,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAChF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACnD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAChF,MAAM,QAAQ,GAAG,2BAA2B,CAAC;gBAC3C,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE;gBACrE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,oBAAoB;gBAC1E,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,aAAa;gBAC1E,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,0BAA0B,EAAE;aACvF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACzE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACpD,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC1E,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,8BAA8B;gBAC7E,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC7E,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,4CAA4C;gBAC3F,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACzE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAC5D,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,QAAQ,GAAG,2BAA2B,CAAC;gBAC3C,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE;aAClF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,6DAA6D;gBAC7D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACxE,MAAM,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC/C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACpD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,4DAA4D;IAC5D,qFAAqF;IACrF,0DAA0D;IAE1D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAClD,MAAM,QAAQ,GAAG,kBAAkB,CAAC;gBAClC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,EAAE;gBACrE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE;aACpE,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC/C,MAAM,QAAQ,GAAG,2BAA2B,CAAC;gBAC3C,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE;aAC9E,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,CAAC,QAAQ,EAAE,2BAA2B,CAAC,CAAC;YACtF,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACnC,MAAM,CAAE,IAAY,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC7E,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACnD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YAElF,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACxE,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAClC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAChE,8DAA8D;YAC9D,MAAM,KAAK,GAAG;gBACZ,cAAc,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;gBAC7D,cAAc,CAAC;oBACb,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,gBAAgB;oBACzB,kBAAkB,EAAE,UAAU,CAAC,4BAA4B;iBAC5D,CAAC;aACH,CAAC;YAEF,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC;YAE1B,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,kBAAkB,CAAC;gBAClC;oBACE,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,kBAAkB;oBAC3B,IAAI,EAAE,iBAAiB;oBACvB,YAAY,EAAE,QAAQ;iBACvB;gBACD;oBACE,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,UAAU;oBACnB,IAAI,EAAE,WAAW;oBACjB,YAAY,EAAE,QAAQ,GAAG,IAAI;iBAC9B;aACF,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,eAAe,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEjC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;YAChE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACtB,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBACxB,IAAI,EAAE,iBAAiB;gBACvB,YAAY,EAAE,QAAQ;aACvB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;YAC7D,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACtB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBACxB,IAAI,EAAE,WAAW;gBACjB,YAAY,EAAE,QAAQ,GAAG,IAAI;aAC9B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;;YACrD,MAAM,QAAQ,GAAG,2BAA2B,CAAC;gBAC3C,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,EAAE;gBACrF,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE;aAC7E,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,eAAe,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEjC,MAAM,CAAC,MAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,0CAAE,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACrF,MAAM,CAAC,MAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,0CAAE,IAAI,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,kBAAkB,CAAC;gBAClC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;gBACjC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE;gBACvC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aAClD,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,eAAe,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE1C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;YACvC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;YAClD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;QAC3D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAClD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,eAAe,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAChC,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YAEjG,MAAM,QAAQ,GAAG,eAAe,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,cAAc,CAAC;gBAC1B,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,qBAAqB;gBAC9B,IAAI,EAAE,YAAY;gBAClB,YAAY,EAAE,QAAQ;aACvB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,eAAe,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBACvB,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBACxB,IAAI,EAAE,YAAY;gBAClB,YAAY,EAAE,QAAQ;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACtD,MAAM,IAAI,GAAG,cAAc,CAAC;gBAC1B,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,gBAAgB;gBACzB,IAAI,EAAE,YAAY;gBAClB,kBAAkB,EAAE,mBAAmB;aACxC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,eAAe,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,YAAY;gBAClB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;gBACxB,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;aACxC,CAAC;YAErB,2CAA2C;YAC3C,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;YAC9B,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC;YAE7B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,YAAY;gBAClB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;gBACxB,kBAAkB,EAAE,gBAAgB;gBACpC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;aAC3C,CAAC;YAErB,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;YAC9B,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC;YAE1B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,YAAY;gBAClB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;gBACxB,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;aAChC,CAAC;YAErB,oCAAoC;YACpC,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;YAC9B,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC;YAE1B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,QAAQ,GAAG,kBAAkB,CAAC;gBAClC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE;gBAClE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE;gBAClE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,EAAE;aACxE,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,QAAQ,GAAG,2BAA2B,CAAC;gBAC3C,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,oBAAoB,EAAE;gBAC9D,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,uBAAuB,EAAE;gBACjE,EAAE,IAAI,EAAE,+BAA+B,EAAE,OAAO,EAAE,qBAAqB,EAAE;gBACzE,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,eAAe,EAAE;gBAC9D,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE;aAClD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,oCAAoC;gBACpC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACrD,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACzD,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACpE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAE5D,mBAAmB;gBACnB,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC7D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC7D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACvE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAClE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAE1D,wBAAwB;gBACxB,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;gBAC5E,MAAM,CAAC,cAAc,CAAC,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport '@fgv/ts-utils-jest';\nimport { FileTreeHelpers } from '../../packlets/helpers';\nimport { FileApiTreeAccessors } from '../../packlets/file-tree';\nimport { createMockFile, createMockFileList, createMockDirectoryFileList } from '../utils/testHelpers';\n\ndescribe('FileTreeHelpers', () => {\n describe('fromFileList', () => {\n test('creates FileTree from simple FileList', async () => {\n const fileList = createMockFileList([\n { name: 'file1.txt', content: 'content1' },\n { name: 'file2.txt', content: 'content2' }\n ]);\n\n const result = await FileTreeHelpers.fromFileList(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n // Verify files are accessible with proper paths\n expect(fileTree.getFile('/file1.txt')).toSucceed();\n expect(fileTree.getFile('/file2.txt')).toSucceed();\n\n // Verify content can be retrieved\n const content1 = fileTree.hal.getFileContents('/file1.txt');\n expect(content1).toSucceedWith('content1');\n\n const content2 = fileTree.hal.getFileContents('/file2.txt');\n expect(content2).toSucceedWith('content2');\n });\n });\n\n test('creates FileTree from FileList with prefix', async () => {\n const fileList = createMockFileList([{ name: 'test.txt', content: 'test content' }]);\n\n const result = await FileTreeHelpers.fromFileList(fileList, { prefix: '/upload' });\n expect(result).toSucceed();\n });\n\n test('handles empty FileList', async () => {\n const fileList = createMockFileList([]);\n const result = await FileTreeHelpers.fromFileList(fileList);\n expect(result).toSucceed();\n });\n\n test('handles various file types', async () => {\n const fileList = createMockFileList([\n { name: 'data.json', content: '{\"key\": \"value\"}', type: 'application/json' },\n { name: 'script.js', content: 'console.log(\"hello\");', type: 'application/javascript' },\n { name: 'style.css', content: 'body { margin: 0; }', type: 'text/css' },\n { name: 'readme.txt', content: 'This is a readme', type: 'text/plain' }\n ]);\n\n const result = await FileTreeHelpers.fromFileList(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n expect(fileTree.getFile('/data.json')).toSucceed();\n expect(fileTree.getFile('/script.js')).toSucceed();\n expect(fileTree.getFile('/style.css')).toSucceed();\n expect(fileTree.getFile('/readme.txt')).toSucceed();\n });\n });\n\n test('automatically applies MIME types as contentType', async () => {\n const fileList = createMockFileList([\n { name: 'data.json', content: '{\"key\": \"value\"}', type: 'application/json' },\n { name: 'script.js', content: 'console.log(\"hello\");', type: 'application/javascript' },\n { name: 'style.css', content: 'body { margin: 0; }', type: 'text/css' },\n { name: 'readme.txt', content: 'This is a readme', type: 'text/plain' },\n { name: 'image.png', content: 'PNG data', type: 'image/png' },\n { name: 'document.pdf', content: 'PDF content', type: 'application/pdf' },\n { name: 'archive.zip', content: 'ZIP data', type: 'application/zip' }\n ]);\n\n const result = await FileTreeHelpers.fromFileList(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n // Verify MIME types are automatically applied as contentType\n expect(fileTree.getFile('/data.json')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('application/json');\n });\n\n expect(fileTree.getFile('/script.js')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('application/javascript');\n });\n\n expect(fileTree.getFile('/style.css')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('text/css');\n });\n\n expect(fileTree.getFile('/readme.txt')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('text/plain');\n });\n\n expect(fileTree.getFile('/image.png')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('image/png');\n });\n\n expect(fileTree.getFile('/document.pdf')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('application/pdf');\n });\n\n expect(fileTree.getFile('/archive.zip')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('application/zip');\n });\n });\n });\n\n test('handles files without MIME types', async () => {\n const fileList = createMockFileList([\n { name: 'no-type.txt', content: 'content without type' },\n { name: 'empty-type.dat', content: 'empty type', type: '' },\n { name: 'unknown.ext', content: 'unknown extension' }\n ]);\n\n const result = await FileTreeHelpers.fromFileList(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n // Files without MIME types should have undefined contentType\n expect(fileTree.getFile('/no-type.txt')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('text/plain'); // Default from createMockFile\n });\n\n expect(fileTree.getFile('/empty-type.dat')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('text/plain'); // Browser defaults empty type to text/plain\n });\n\n expect(fileTree.getFile('/unknown.ext')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('text/plain'); // Default from createMockFile\n });\n });\n });\n\n test('forces content type to string (not templated)', async () => {\n const fileList = createMockFileList([\n { name: 'test.json', content: '{\"test\": true}', type: 'application/json' }\n ]);\n\n const result = await FileTreeHelpers.fromFileList(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n // Verify the return type is FileTree<string> not FileTree<T>\n expect(fileTree.getFile('/test.json')).toSucceedAndSatisfy((file) => {\n expect(typeof file.contentType).toBe('string');\n expect(file.contentType).toBe('application/json');\n });\n });\n });\n\n test('propagates file reading errors', async () => {\n const badFile = {\n name: 'bad.txt',\n size: 10,\n type: 'text/plain',\n lastModified: Date.now(),\n text: () => Promise.reject(new Error('Read failed'))\n } as unknown as File;\n\n const fileList = createMockFileList([{ name: 'good.txt', content: 'good content' }]);\n\n // Create a FileList with just the bad file\n const dt = new DataTransfer();\n dt.items.add(badFile);\n const badFileList = dt.files;\n\n const result = await FileTreeHelpers.fromFileList(badFileList);\n expect(result).toFailWith(/Failed to read file/);\n });\n\n test('maintains file accessibility through FileTree API', async () => {\n const fileList = createMockFileList([{ name: 'test.json', content: '{\"name\": \"test\", \"value\": 42}' }]);\n\n const result = await FileTreeHelpers.fromFileList(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n const file = fileTree.getFile('/test.json');\n expect(file).toSucceedAndSatisfy((fileItem) => {\n // Test JSON parsing through FileTree\n const jsonResult = fileItem.getContents();\n expect(jsonResult).toSucceedAndSatisfy((parsed) => {\n expect(parsed).toEqual({ name: 'test', value: 42 });\n });\n\n // Test raw content access\n const rawResult = fileItem.getRawContents();\n expect(rawResult).toSucceedWith('{\"name\": \"test\", \"value\": 42}');\n\n // Test file properties\n expect(fileItem.name).toBe('test.json');\n expect(fileItem.extension).toBe('.json');\n expect(fileItem.baseName).toBe('test');\n });\n });\n });\n });\n\n describe('fromDirectoryUpload', () => {\n test('creates FileTree from directory structure', async () => {\n const fileList = createMockDirectoryFileList([\n { path: 'project/src/index.js', content: 'console.log(\"main\");' },\n { path: 'project/src/utils.js', content: 'export const helper = () => {};' },\n { path: 'project/package.json', content: '{\"name\": \"test-project\"}' },\n { path: 'project/README.md', content: '# Test Project' }\n ]);\n\n const result = await FileTreeHelpers.fromDirectoryUpload(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n // Verify all files are accessible\n expect(fileTree.getFile('/project/src/index.js')).toSucceed();\n expect(fileTree.getFile('/project/src/utils.js')).toSucceed();\n expect(fileTree.getFile('/project/package.json')).toSucceed();\n expect(fileTree.getFile('/project/README.md')).toSucceed();\n\n // Verify directory structure\n expect(fileTree.getDirectory('/project')).toSucceed();\n expect(fileTree.getDirectory('/project/src')).toSucceed();\n\n // Verify content retrieval\n const packageContent = fileTree.hal.getFileContents('/project/package.json');\n expect(packageContent).toSucceedWith('{\"name\": \"test-project\"}');\n });\n });\n\n test('creates FileTree from directory with prefix', async () => {\n const fileList = createMockDirectoryFileList([\n { path: 'app/config.json', content: '{\"setting\": \"value\"}' },\n { path: 'app/main.js', content: 'console.log(\"app\");' }\n ]);\n\n const result = await FileTreeHelpers.fromDirectoryUpload(fileList, { prefix: '/upload' });\n expect(result).toSucceed();\n });\n\n test('preserves directory hierarchy', async () => {\n const fileList = createMockDirectoryFileList([\n { path: 'deep/nested/structure/file1.txt', content: 'content1' },\n { path: 'deep/nested/structure/file2.txt', content: 'content2' },\n { path: 'deep/other/branch/file3.txt', content: 'content3' },\n { path: 'deep/file4.txt', content: 'content4' }\n ]);\n\n const result = await FileTreeHelpers.fromDirectoryUpload(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n // Test all directory levels\n expect(fileTree.getDirectory('/deep')).toSucceed();\n expect(fileTree.getDirectory('/deep/nested')).toSucceed();\n expect(fileTree.getDirectory('/deep/nested/structure')).toSucceed();\n expect(fileTree.getDirectory('/deep/other')).toSucceed();\n expect(fileTree.getDirectory('/deep/other/branch')).toSucceed();\n\n // Test directory traversal\n const deepDir = fileTree.getDirectory('/deep');\n expect(deepDir).toSucceedAndSatisfy((dir) => {\n const children = dir.getChildren();\n expect(children).toSucceedAndSatisfy((items) => {\n const names = items.map((item) => item.name).sort();\n expect(names).toContain('nested');\n expect(names).toContain('other');\n expect(names).toContain('file4.txt');\n });\n });\n });\n });\n\n test('handles webkitRelativePath correctly', async () => {\n // Create files with explicit webkitRelativePath\n const files = [\n createMockFile({\n name: 'index.html',\n content: '<html></html>',\n webkitRelativePath: 'website/index.html'\n }),\n createMockFile({\n name: 'style.css',\n content: 'body {}',\n webkitRelativePath: 'website/css/style.css'\n })\n ];\n\n // Create FileList manually to preserve webkitRelativePath\n const dt = new DataTransfer();\n files.forEach((file) => dt.items.add(file));\n const fileList = dt.files;\n\n const result = await FileTreeHelpers.fromDirectoryUpload(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n expect(fileTree.getFile('/website/index.html')).toSucceed();\n expect(fileTree.getFile('/website/css/style.css')).toSucceed();\n expect(fileTree.getDirectory('/website')).toSucceed();\n expect(fileTree.getDirectory('/website/css')).toSucceed();\n });\n });\n\n test('handles single file in directory', async () => {\n const fileList = createMockDirectoryFileList([{ path: 'single/file.txt', content: 'lone file' }]);\n\n const result = await FileTreeHelpers.fromDirectoryUpload(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n expect(fileTree.getFile('/single/file.txt')).toSucceed();\n expect(fileTree.getDirectory('/single')).toSucceed();\n });\n });\n\n test('handles empty directory upload', async () => {\n const fileList = createMockDirectoryFileList([]);\n const result = await FileTreeHelpers.fromDirectoryUpload(fileList);\n expect(result).toSucceed();\n });\n\n test('automatically applies MIME types as contentType in directory upload', async () => {\n const fileList = createMockDirectoryFileList([\n { path: 'project/package.json', content: '{\"name\": \"test\"}', type: 'application/json' },\n { path: 'project/src/index.js', content: 'console.log(\"main\");', type: 'application/javascript' },\n { path: 'project/src/styles.css', content: 'body { color: red; }', type: 'text/css' },\n { path: 'project/README.md', content: '# Project', type: 'text/markdown' },\n { path: 'project/data.xml', content: '<root></root>', type: 'application/xml' },\n { path: 'project/assets/logo.svg', content: '<svg></svg>', type: 'image/svg+xml' },\n { path: 'project/docs/manual.pdf', content: 'PDF content', type: 'application/pdf' }\n ]);\n\n const result = await FileTreeHelpers.fromDirectoryUpload(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n // Verify MIME types are automatically applied as contentType\n expect(fileTree.getFile('/project/package.json')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('application/json');\n });\n\n expect(fileTree.getFile('/project/src/index.js')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('application/javascript');\n });\n\n expect(fileTree.getFile('/project/src/styles.css')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('text/css');\n });\n\n expect(fileTree.getFile('/project/README.md')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('text/markdown');\n });\n\n expect(fileTree.getFile('/project/data.xml')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('application/xml');\n });\n\n expect(fileTree.getFile('/project/assets/logo.svg')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('image/svg+xml');\n });\n\n expect(fileTree.getFile('/project/docs/manual.pdf')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('application/pdf');\n });\n });\n });\n\n test('handles mixed MIME types and missing types in directory upload', async () => {\n const fileList = createMockDirectoryFileList([\n { path: 'mixed/typed.json', content: '{}', type: 'application/json' },\n { path: 'mixed/untyped.txt', content: 'plain text' }, // No type specified\n { path: 'mixed/empty-type.dat', content: 'data', type: '' }, // Empty type\n { path: 'mixed/binary.bin', content: 'binary data', type: 'application/octet-stream' }\n ]);\n\n const result = await FileTreeHelpers.fromDirectoryUpload(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n expect(fileTree.getFile('/mixed/typed.json')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('application/json');\n });\n\n expect(fileTree.getFile('/mixed/untyped.txt')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('text/plain'); // Default from createMockFile\n });\n\n expect(fileTree.getFile('/mixed/empty-type.dat')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('text/plain'); // Browser defaults empty type to text/plain\n });\n\n expect(fileTree.getFile('/mixed/binary.bin')).toSucceedAndSatisfy((file) => {\n expect(file.contentType).toBe('application/octet-stream');\n });\n });\n });\n\n test('forces content type to string for directory upload (not templated)', async () => {\n const fileList = createMockDirectoryFileList([\n { path: 'app/config.json', content: '{\"app\": \"test\"}', type: 'application/json' }\n ]);\n\n const result = await FileTreeHelpers.fromDirectoryUpload(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n // Verify the return type is FileTree<string> not FileTree<T>\n expect(fileTree.getFile('/app/config.json')).toSucceedAndSatisfy((file) => {\n expect(typeof file.contentType).toBe('string');\n expect(file.contentType).toBe('application/json');\n });\n });\n });\n });\n\n // Note: fromFileApiFiles method was deprecated and removed.\n // The functionality has been replaced by the create() method in FileApiTreeAccessors\n // which uses TreeInitializer[] instead of IFileApiFile[].\n\n describe('getOriginalFile', () => {\n test('retrieves original File object by path', () => {\n const fileList = createMockFileList([\n { name: 'target.txt', content: 'target content', type: 'text/plain' },\n { name: 'other.txt', content: 'other content', type: 'text/plain' }\n ]);\n\n const result = FileTreeHelpers.getOriginalFile(fileList, 'target.txt');\n expect(result).toSucceedAndSatisfy((file) => {\n expect(file.name).toBe('target.txt');\n expect(file.type).toBe('text/plain');\n expect(file.size).toBeGreaterThan(0);\n });\n });\n\n test('handles webkitRelativePath matching', () => {\n const fileList = createMockDirectoryFileList([\n { path: 'folder/subfolder/file.txt', content: 'content', type: 'text/plain' }\n ]);\n\n const result = FileTreeHelpers.getOriginalFile(fileList, 'folder/subfolder/file.txt');\n expect(result).toSucceedAndSatisfy((file) => {\n expect(file.name).toBe('file.txt');\n expect((file as any).webkitRelativePath).toBe('folder/subfolder/file.txt');\n });\n });\n\n test('fails gracefully for non-existent files', () => {\n const fileList = createMockFileList([{ name: 'exists.txt', content: 'content' }]);\n\n const result = FileTreeHelpers.getOriginalFile(fileList, 'missing.txt');\n expect(result).toFailWith(/File not found: missing\\.txt/);\n });\n\n test('handles empty FileList', () => {\n const fileList = createMockFileList([]);\n const result = FileTreeHelpers.getOriginalFile(fileList, 'any.txt');\n expect(result).toFailWith(/File not found/);\n });\n\n test('prioritizes exact name match over webkitRelativePath', () => {\n // Create files with both regular names and webkitRelativePath\n const files = [\n createMockFile({ name: 'file.txt', content: 'regular file' }),\n createMockFile({\n name: 'other.txt',\n content: 'directory file',\n webkitRelativePath: 'file.txt' // Same as first file's name\n })\n ];\n\n const dt = new DataTransfer();\n files.forEach((file) => dt.items.add(file));\n const fileList = dt.files;\n\n const result = FileTreeHelpers.getOriginalFile(fileList, 'file.txt');\n expect(result).toSucceedAndSatisfy((file) => {\n expect(file.name).toBe('file.txt');\n expect(file.size).toBeGreaterThan(0);\n });\n });\n });\n\n describe('extractFileListMetadata', () => {\n test('extracts complete metadata from FileList', () => {\n const testTime = Date.now();\n const fileList = createMockFileList([\n {\n name: 'document.pdf',\n content: 'PDF content here',\n type: 'application/pdf',\n lastModified: testTime\n },\n {\n name: 'image.png',\n content: 'PNG data',\n type: 'image/png',\n lastModified: testTime + 1000\n }\n ]);\n\n const metadata = FileTreeHelpers.extractFileListMetadata(fileList);\n expect(metadata).toHaveLength(2);\n\n const pdfMeta = metadata.find((m) => m.name === 'document.pdf');\n expect(pdfMeta).toEqual({\n path: 'document.pdf',\n name: 'document.pdf',\n size: expect.any(Number),\n type: 'application/pdf',\n lastModified: testTime\n });\n\n const pngMeta = metadata.find((m) => m.name === 'image.png');\n expect(pngMeta).toEqual({\n path: 'image.png',\n name: 'image.png',\n size: expect.any(Number),\n type: 'image/png',\n lastModified: testTime + 1000\n });\n });\n\n test('includes webkitRelativePath in path field', () => {\n const fileList = createMockDirectoryFileList([\n { path: 'project/src/main.js', content: 'main code', type: 'application/javascript' },\n { path: 'project/assets/logo.png', content: 'logo data', type: 'image/png' }\n ]);\n\n const metadata = FileTreeHelpers.extractFileListMetadata(fileList);\n expect(metadata).toHaveLength(2);\n\n expect(metadata.find((m) => m.name === 'main.js')?.path).toBe('project/src/main.js');\n expect(metadata.find((m) => m.name === 'logo.png')?.path).toBe('project/assets/logo.png');\n });\n\n test('handles various file sizes correctly', () => {\n const fileList = createMockFileList([\n { name: 'tiny.txt', content: '' },\n { name: 'small.txt', content: 'small' },\n { name: 'large.txt', content: 'x'.repeat(10000) }\n ]);\n\n const metadata = FileTreeHelpers.extractFileListMetadata(fileList);\n const sizes = metadata.map((m) => m.size);\n\n expect(sizes[0]).toBe(0); // empty file\n expect(sizes[1]).toBeGreaterThan(0); // small file\n expect(sizes[2]).toBeGreaterThan(sizes[1]); // large file\n });\n\n test('returns empty array for empty FileList', () => {\n const fileList = createMockFileList([]);\n const metadata = FileTreeHelpers.extractFileListMetadata(fileList);\n expect(metadata).toEqual([]);\n });\n\n test('preserves file order', () => {\n const expectedOrder = ['first.txt', 'second.txt', 'third.txt'];\n const fileList = createMockFileList(expectedOrder.map((name) => ({ name, content: 'content' })));\n\n const metadata = FileTreeHelpers.extractFileListMetadata(fileList);\n const actualOrder = metadata.map((m) => m.name);\n expect(actualOrder).toEqual(expectedOrder);\n });\n });\n\n describe('extractFileMetadata', () => {\n test('extracts metadata from single file', () => {\n const testTime = Date.now();\n const file = createMockFile({\n name: 'single.txt',\n content: 'single file content',\n type: 'text/plain',\n lastModified: testTime\n });\n\n const metadata = FileTreeHelpers.extractFileMetadata(file);\n expect(metadata).toEqual({\n path: 'single.txt',\n name: 'single.txt',\n size: expect.any(Number),\n type: 'text/plain',\n lastModified: testTime\n });\n });\n\n test('handles webkitRelativePath for single file', () => {\n const file = createMockFile({\n name: 'nested.txt',\n content: 'nested content',\n type: 'text/plain',\n webkitRelativePath: 'folder/nested.txt'\n });\n\n const metadata = FileTreeHelpers.extractFileMetadata(file);\n expect(metadata.path).toBe('folder/nested.txt');\n expect(metadata.name).toBe('nested.txt');\n });\n });\n\n describe('Error propagation', () => {\n test('propagates errors from FileApiTreeAccessors.fromFileList', async () => {\n const badFile = {\n name: 'bad.txt',\n size: 10,\n type: 'text/plain',\n lastModified: Date.now(),\n text: () => Promise.reject(new Error('File system error'))\n } as unknown as File;\n\n // Create a FileList with just the bad file\n const dt = new DataTransfer();\n dt.items.add(badFile);\n const badFileList = dt.files;\n\n const result = await FileTreeHelpers.fromFileList(badFileList);\n expect(result).toFailWith(/Failed to read file/);\n });\n\n test('propagates errors from FileApiTreeAccessors.fromDirectoryUpload', async () => {\n const badFile = {\n name: 'bad.txt',\n size: 10,\n type: 'text/plain',\n lastModified: Date.now(),\n webkitRelativePath: 'folder/bad.txt',\n text: () => Promise.reject(new Error('Directory read error'))\n } as unknown as File;\n\n const dt = new DataTransfer();\n dt.items.add(badFile);\n const fileList = dt.files;\n\n const result = await FileTreeHelpers.fromDirectoryUpload(fileList);\n expect(result).toFailWith(/Failed to read file/);\n });\n\n test('propagates errors from FileApiTreeAccessors.create via fromFileList', async () => {\n const badFile = {\n name: 'bad.txt',\n size: 10,\n type: 'text/plain',\n lastModified: Date.now(),\n text: () => Promise.reject(new Error('API error'))\n } as unknown as File;\n\n // Create FileList with the bad file\n const dt = new DataTransfer();\n dt.items.add(badFile);\n const fileList = dt.files;\n\n const result = await FileTreeHelpers.fromFileList(fileList);\n expect(result).toFailWith(/Failed to read file/);\n });\n });\n\n describe('Integration scenarios', () => {\n test('handles realistic file upload scenario', async () => {\n const fileList = createMockFileList([\n { name: 'photo1.jpg', content: 'JPEG data 1', type: 'image/jpeg' },\n { name: 'photo2.jpg', content: 'JPEG data 2', type: 'image/jpeg' },\n { name: 'metadata.txt', content: 'Photo metadata', type: 'text/plain' }\n ]);\n\n const result = await FileTreeHelpers.fromFileList(fileList, { prefix: '/uploads' });\n expect(result).toSucceed();\n });\n\n test('handles realistic project upload scenario', async () => {\n const fileList = createMockDirectoryFileList([\n { path: 'my-app/package.json', content: '{\"name\": \"my-app\"}' },\n { path: 'my-app/src/index.js', content: 'console.log(\"Hello\");' },\n { path: 'my-app/src/components/App.jsx', content: 'export default App;' },\n { path: 'my-app/public/index.html', content: '<html></html>' },\n { path: 'my-app/README.md', content: '# My App' }\n ]);\n\n const result = await FileTreeHelpers.fromDirectoryUpload(fileList);\n expect(result).toSucceedAndSatisfy((fileTree) => {\n // Verify complete project structure\n expect(fileTree.getDirectory('/my-app')).toSucceed();\n expect(fileTree.getDirectory('/my-app/src')).toSucceed();\n expect(fileTree.getDirectory('/my-app/src/components')).toSucceed();\n expect(fileTree.getDirectory('/my-app/public')).toSucceed();\n\n // Verify all files\n expect(fileTree.getFile('/my-app/package.json')).toSucceed();\n expect(fileTree.getFile('/my-app/src/index.js')).toSucceed();\n expect(fileTree.getFile('/my-app/src/components/App.jsx')).toSucceed();\n expect(fileTree.getFile('/my-app/public/index.html')).toSucceed();\n expect(fileTree.getFile('/my-app/README.md')).toSucceed();\n\n // Verify content access\n const packageContent = fileTree.hal.getFileContents('/my-app/package.json');\n expect(packageContent).toSucceedWith('{\"name\": \"my-app\"}');\n });\n });\n });\n});\n"]}
|