JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • 0
  • Score
    100M100P100Q45388F
  • License MIT

Recursively fetch nested Notion pages from the root page/database/block node.

Package Exports

  • notion-page-tree
  • notion-page-tree/dist/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (notion-page-tree) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Notion Page Tree

Fetch nested Notion pages from the root page/database/block.



Why Would I Want This?

πŸ™Œ Use the official Notion API.

  • Popular /loadpagechunk/ endpoint is not public and may not be stable in future updates.
  • Official API can be integrated with private key, so you can keep your database private.

πŸ•Έ Fetch nested children pages.

  • Pages inside non-page blocks are also fetched.
  • Max search-depth can be set in your preference.

πŸ›  Handle API Errors gracefully.

  • Maximum fetch concurrency is set to avoid rate_limited error.
  • On rate_limited error, it stops and waits for some minutes.
  • Other errors are automatically retried. Max retry count can be set in your preference.

Other Features

πŸ’Ύ It saves fetch results to your local disk.

  • Set parameter private_file_path to your custom path.

πŸ₯ž It builds basic page server.

  • /page/:id/ endpoint for retrieving page and its childrens' id.
  • /tree/:id/ endpoint for retrieving all nested pages from the page.

πŸ”Ž It builds basic page search indexes.

  • Uses lunr.js.
  • Page's properties and chilren are converted into plain text for building search index.
  • /search?keyword= endpoint for searching page properties and retrieving page ids.
  • /suggestion?keyword= endpoint for looking for search index's tokens.

Usage

.env File Configuration

Write directly on <package_root>/.env

NOTION_ENTRY_ID = <root page/database/block's id>
NOTION_ENTRY_KEY = <root's integration key>
NOTION_ENTRY_TYPE = <page/database/block>

Create Fetcher and Server (sample)

Run yarn serve to see fetcher running in action.

Sample database is here https://notion.so/2345a2ce3cdd48f183cca1f6d1ae25ca

./sample/index.ts

import NotionPageTree from 'notion-page-tree';
import path from 'path';

(async function main() {
    // Create main class instance.
    const notionPageTree = new NotionPageTree({
        private_file_path: path.resolve('./sample/'),
        createFetchQueueOptions: {
            maxConcurrency: 3, // Current official rate limit is 3 requests per second. Notion api will throw error when you increase this value.
            maxRetry: 2, // "rate_limited" error will not be retried and process will be exited immediately.
            maxRequestDepth: 3, // Depth applied to all the entities.
            maxBlockDepth: 2, // Depth applied to blocks (relative to nearest parent page).
            databaseQueryFilter: {
                // Database query filter.
                property: 'isPublished',
                checkbox: {
                    equals: true
                }
            }
        }
    });

    notionPageTree.parseCachedDocument();
    // Look for cached documents in `private_file_path`, assign to Page Data Variables.

    const requestParameters = await notionPageTree.setRequestParameters({
        forceRewrite: false,
        prompt: true
    });
    console.log(
        'Requesting',
        requestParameters.entry_type,
        'with id',
        requestParameters.entry_id
    );
    // Set environment variables that are needed for Notion API.

    const server = notionPageTree.setupServer({ port: 8888 });
    // Setup servers for listing and searching pages. (will respond 503 if pages are undefined)

    // await notionPageTree.fetchOnce();
    // Fetch pages asynchronously, then assign results to variables.

    notionPageTree.startFetchLoop(1000 * 10); // 10 seconds
    // Create asynchronouse fetch loop, which waits for some milliseconds between each fetch.

    setTimeout(() => {
        // after 30 seconds
        console.log('stopping fetch loop');
        notionPageTree.stopFetchLoop();
        // Stopping fetch loop after current fetch resolves.
        console.log('closing servers');
        server.close();
        // Stopping servers immediately.
    }, 1000 * 30);
})();

How It Works (Flowchart)

/******************************************************************************************************************************************************************************************************************************************************************************************************************************\
*                                                                                                                                                                                                                                                                                                                              *
*                                                                                                                                                                                                                                                                                                                              *
*                                                                                                                                                                                                                                                                                                                              *
*                                                                                                                                                                                                                                                                                                                              *
*    ┏━━━━━━━Main Routine━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓                                                                                                                                                *
*    ┃                                                                                                                                                                        ┃                                                                                                                                                *
*    ┃                                                                                                                                                                        ┃                                                                                                                                                *
*    ┃                                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                 ┃                                                                                                                                                *
*    ┃                                     β”Œβ”€β”€β”€β–Άβ”‚    page_collection    β”‚                                        β”ŒclearTimeout()───▢│ Request Promise Timer β”‚                 ┃                                                                                                                                                *
*    ┃                                     β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                        β”‚                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 ┃                                                                                                                                                *
*    ┃                                     β”‚                                                  Ξ›                  β”‚                                                            ┃                                                                                                                                                *
*    ┃                                     β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β•± β•²                 β”‚                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                 ┃                                                                                                                                                *
*    ┃                                     β”œβ”€β”€β”€β–Άβ”‚       page_tree       β”‚                   β•±   β•²                β”œclearTimeout()───▢│  Request Ready Timer  β”‚                 ┃                                                                                                                                                *
*    ┃                                     β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  β•±     β•²               β”‚                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 ┃                                                                                                                                                *
*    ┃                                     β”‚                                              β•±       β•²              β”‚                                                            ┃                                                                                                                                                *
*    ┃                                     β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β•±  check  β•²             β”‚                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                       ┃                                                                                                                                                *
*    ┃                                     β”œβ”€β”€β”€β–Άβ”‚ Request Promise Queue │──────┐        β•±  routine  β•²            β”‚   β”Œβ”€β”€β”€update ───▢│ page_collection β”‚                       ┃                                                                                                                                                *
*    ┃        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚       β•±      ↻      β•²           β”‚   β”‚              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                       ┃                                                                                                                                                *
*    ┃        β”‚    Fetcher Routine    │─────                                   β”œβ”€β”€β”€β”€β”€β–Άβ–•  promise = 0  ▏──┬─true──┼────                                                        ┃                                                                                                                                                *
*    ┃        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚       β•²  ready = 0  β•±   β”‚       β”‚   β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                       ┃                                                                                                                                                *
*    ┃                    β–²                β”œβ”€β”€β”€β–Άβ”‚  Request Ready Queue  β”‚β”€β”€β”€β”€β”€β”€β”˜        β•²     ↻     β•±    β”‚       β”‚   └───update────▢│    page_tree    β”‚                       ┃                                                                                                                                                *
*    ┃                    β”‚                β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β•²   0ms   β•±     β”‚       β”‚                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                       ┃                                                                                                                                                *
*    ┃                    β”‚                β”‚                                              β•²       β•±      β”‚       β”‚                                                            ┃                                                                                                                                                *
*    ┃                    β”‚                β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  β•²     β•±       β”‚       β”‚                                                            ┃                                                                                                                                                *
*    ┃                    β”‚                β”œβ”€β”€β”€β–Άβ”‚ Request Promise Timer β”‚                   β•²   β•±        β”‚       └──────────────────▢ wait for some minutes ─ ─ ┐             ┃                                                                                                                                                *
*    ┃                    β”‚                β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β•² β•±         β”‚                                                                    ┃                                                                                                                                                *
*    ┃                    β”‚                β”‚                                                  V          β”‚                                                      β”‚             ┃                                                                                                                                                *
*    ┃                    β”‚                β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                     β–²          β”‚                                                                    ┃                                                                                                                                                *
*    ┃                    β”‚                └───▢│  Request Ready Timer  β”‚                     └──falseβ”€β”€β”€β”˜                                                      β”‚             ┃                                                                                                                                                *
*    ┃                    β”‚                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                                                                     ┃                                                                                                                                                *
*    ┃                    β”‚                                                                                                                                     β”‚             ┃                                                                                                                                                *
*    ┃                    │─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─  create new fetcher routine β—€ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─              ┃                                                                                                                                                *
*    ┃                                                                                                                                                                        ┃                                                                                                                                                *
*    ┗━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛                                                                                                                                                *
*                                                                                                                                                                                                                                                                                                                              *
*                         β”‚                                                                                                                                                                                                                                                                                                    *
*                                                                                                                                                                                                                                                                                                                              *
*                         β”‚                                                                                                                                                                                                                                                                                                    *
*                                                                                                                                                                                                                                                                                                                              *
*     ┏━━━Fetcher Routine━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓    *
*     ┃                                                                                                                                                                                                  β”Œβ”€.plaintext += plaintext────────────────────────────────────────────────────┐                                   ┃    *
*     ┃                                                                                                                                                                                                  β”‚                                                                            β”‚                                   ┃    *
*     ┃                                                                                                                                                                     ╔══════════════════════════╗ β”‚                                      ╔══════════════════════╗              β”‚                                   ┃    *
*     ┃                                                                                                                       β”Œβ”€β”€false───┐                                  β•‘  Promise (resolved)      β•‘ β”œβ”€.children.push()┐                    β•‘Connector             β•‘              β”‚                                   ┃    *
*     ┃                                                                                    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ β”‚          β”‚                                  β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘ β”‚                 β”‚                    β•‘ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘              β”‚                                   ┃    *
*     ┃                                                                                    ┃   Request Promise Queue        ┃ β”‚          β”‚                                  β•‘β”‚parentToAssign: Entity β”‚β—€β”€β”€β”˜       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β•‘ β”‚toAssigned: itselfβ”‚ β•‘              β”‚                                   ┃    *
*     ┃                                                                                    ┃ ╔══════════════════════════╗   ┃ β”‚          Ξ›                                  β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘   β”Œβ”€β”€β”€β”€β–Άβ”‚ is Page/Database │──create──▢║ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ║──────────────│─────────────────┐                 ┃    *
*     ┃                                                                                    ┃ β•‘  Promise (pending)       β•‘   ┃ β”‚         β•± β•²                                 β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘   β”‚     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘              β”‚                 β”‚                 ┃    *
*     ┃       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓                                          ┃ β•‘ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘   ┃ β”‚        β•±   β•²                                β•‘β”‚parentToRequest: Entityβ”‚ β•‘   β”‚                      β”‚             β•‘β”‚toRequested: itself β”‚β•‘              β”‚                 β”‚                 ┃    *
*     ┃       ┃  New Requests                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β•¬β–Άβ”‚parentToAssign: Entity β”‚β•‘   ┃ β”‚       β•±     β•²            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘   β”‚                      β”‚             β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘              β”‚                 β”‚                 ┃    *
*     ┃       ┃ ╔═════════════════════════╗   β”‚ ┃ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” ┃ β•‘ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘...┃ β”‚      β•±       β•²       β”Œβ”€β”€β–Άβ”‚ is Fulfilled β”‚β”€β”€β–Άβ•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘   β”‚                      β”‚             β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•              β”‚                 β”‚                 ┃    *
*     ┃       ┃ β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘   β”‚ ┃ β”‚                                      β”‚ ┃ β•‘ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘   ┃ β”‚     β•±  set    β•²      β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β•‘β”‚       children:       β”‚ β•‘   β”‚                      β”‚                                                   β”‚                 β”‚                 ┃    *
*     ┃       ┃ β•‘β”‚parentToAssign: Entity β”‚β• β”€β”€β”€β”˜ ┃ β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    List Block      └─╋─╬▢│parentToRequest: Entityβ”‚β•‘   ┃ β”‚    β•± interval  β•²     β”‚                      β•‘β”‚   QueryablePromise    │─╬────                      β”‚                                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”‚                 ┃    *
*     ┃       ┃ β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘     ┃ β”œβ”€β”€β–Άβ”‚is Block/Page│───▢Children()─────┐  ┃ β•‘ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘   ┃ β”‚   β•±      ↻      β•²    β”‚                      β•‘β”‚       Entity[]        β”‚ β•‘   β”‚                      β”‚       extractPlainText                  β”‚   Concatenated   β”‚        β”‚                 ┃    *
*     ┃       ┃ β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘ ... ┃ β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                   β”‚  ┃ β•‘ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘   ┃─┴─▢▕  promise > 0  ▏────                      β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘   β”‚                      β”‚    β”Œβ”€β–Ά   FromBlock    ────▢.reduce()───▢│    Plain Text    β”‚        β”‚                 ┃    *
*     ┃       ┃ β•‘β”‚parentToRequest: Entityβ”‚β• β”€β”€β”€β”€β”€β”€β”€β”˜                                 .push()┃ β•‘ β”‚       children:       β”‚β•‘   ┃     β•² isSetteled  β•±    β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘   β”‚                      β”‚    β”‚                                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚                 ┃    *
*     ┃       ┃ β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘     ┃ β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      Query        β”Œβ”€β”€β”€β”€β•¬β–Άβ”‚   QueryablePromise    β”‚β•‘   ┃      β•²     ↻     β•±     └──▢│ is Rejected  β”‚   β•‘β”‚     retry: number     β”‚ β•‘   β”‚                      β”‚    β”‚                                                                β”‚                 ┃    *
*     ┃       ┃ β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘     ┃ └──▢│ is Database │───▢Database()β”€β”€β”€β”€β”€β”˜  ┃ β•‘ β”‚       Entity[]        β”‚β•‘   ┃       β•²   0ms   β•±          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘   β”‚     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”‚β”€β”  β”‚                                                                β”‚                 ┃    *
*     ┃       ┃ β•‘β”‚     retry: number     β”‚β•‘     ┃     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                      ┃ β•‘ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘   ┃        β•²       β•±                    β”‚         β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•   └────▢│     is Block   β”‚ │───                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                       β”‚                 ┃    *
*     ┃       ┃ β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘     ┃                                          ┃ β•‘ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘   ┃         β•²     β•±                     β”‚                                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”‚β”€β”˜  β”‚                     β”‚  is in Traverse  β”‚                       β”‚                 ┃    *
*     ┃       ┃ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•     ┃                                          ┃ β•‘ β”‚     retry: number     β”‚β•‘   ┃          β•²   β•±                      β”‚               set maxConcurrency to 0                         β”‚    β”‚               β”Œβ”€β”€β”€β”€β–Άβ”‚  Exclusion List  β”‚           ╔═══════════╬══════════╗      ┃    *
*     ┃       ┗━━━━━━━━━━━━━━▲━━━━━━━━━━━━━━━━━━┛                                          ┃ β•‘ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘   ┃           β•² β•±                       β–Ό               empty promise_queue                             β”‚    β”‚               β”‚     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β•‘Connector  β”‚          β•‘      ┃    *
*     ┃                      β”‚                                                             ┃ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•   ┃            V                  rate_limited──true──▢ move promises to ready_queue                    β”‚    └─▢.filter()─────     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β•‘ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘      ┃    *
*     ┃                      β”‚                                                             ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛                                     β”‚               wait for some minutes                           β”‚                    β”‚     β”‚is NOT in Traverseβ”‚           β•‘ β”‚toAssigned: PARENTβ”‚ β•‘      ┃    *
*     ┃                      β”‚                                                                                                                                    β”‚               set maxConcurrency to 3                         β”‚                    └────▢│  Exclusion List  │──create──▢║ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘      ┃    *
*     ┃                      β”‚                                                                                      ╔═════════════════════════╗                 false                                                             β”‚                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘      ┃    *
*     ┃                      β”‚                                                                                      β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘                   β”‚                                                               β”‚                                                         β•‘β”‚toRequested: itself β”‚β•‘      ┃    *
*     ┃            .splice(concurrency -                                                                            β•‘β”‚parentToAssign: Entity β”‚β•‘                   β”‚                                                               β”‚                                                         β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘      ┃    *
*     ┃               promise.length)                                                                               β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘                   β–Ό                                                               β”‚                                                         β•šβ•β•β•β•β•β•β•β•β•β•β•β•¬β•β•β•β•β•β•β•β•β•β•β•      ┃    *
*     ┃                      β”‚                                                                                      β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘               retry <                                                             β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                                                                               β”Œβ”€β”€β”€β”€β”€β”€β•‘β”‚parentToRequest: Entity│║◀───true───── retryCount ──false──▢ console.error                                  β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                                                                               β”‚      β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘                                                                                   β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                                                                               β”‚      β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘                                                                                   β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                         β”Œβ”€β”€false───┐                                          β”‚      β•‘β”‚      retry: +=1       β”‚β•‘                                                                                   β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                         β”‚          β”‚                                          β”‚      β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘                                                                                   β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                         β”‚          β”‚                                     .unshift()  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                                                                                   β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                         Ξ›          β”‚                                          β–Ό                                                                                                                    β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                        β•± β•²         β”‚            ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓                                                                                      β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                       β•±   β•²        β”‚            ┃  Request Ready Queue                                      ┃                                                                                      β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                      β•±     β•²       β”‚            ┃ ╔═════════════════════════╗ ╔═════════════════════════╗   ┃                                                                                      β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                     β•±       β•²      β”‚            ┃ β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘ β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘   ┃                                                                                      β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                    β•±  check  β•²     β”‚            ┃ β•‘β”‚parentToAssign: Entity β”‚β•‘ β•‘β”‚parentToAssign: Entity β”‚β•‘   ┃                                                                                      β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                   β•±  routine  β•²    β”‚            ┃ β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘ β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘   ┃                                                                                      β”‚                                                                     β”‚                 ┃    *
*     ┃                      β”‚                  β•±      ↻      β•²   β”‚            ┃ β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘ β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘...┃                                                                                      β”‚                                                                     β”‚                 ┃    *
*     ┃                      └──────true───────▕  ready > 0    ▏◀─┴────────────┃ β•‘β”‚parentToRequest: Entityβ”‚β•‘ β•‘β”‚parentToRequest: Entityβ”‚β•‘   ┃◀────────────.push()β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”‚β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 ┃    *
*     ┃                                         β•² promise < 3 β•±                ┃ β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘ β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘   ┃                                                                                      β”‚                                                                                       ┃    *
*     ┃                                          β•²           β•±                 ┃ β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘ β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘   ┃                                                                                      β”‚                                                                                       ┃    *
*     ┃                                           β•²    ↻    β•±                  ┃ β•‘β”‚       retry: 0        β”‚β•‘ β•‘β”‚       retry: 0        β”‚β•‘   ┃                                                                                      β”‚                                                                                       ┃    *
*     ┃                                            β•² 250ms β•±                   ┃ β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘ β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘   ┃                                                                                      β”‚                                                                                       ┃    *
*     ┃                                             β•²     β•±                    ┃ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β• β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•   ┃                                                                                      β”‚                                                                                       ┃    *
*     ┃                                              β•²   β•±                     ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛                                                                                      β”‚                                                                                       ┃    *
*     ┃                                               β•² β•±                                                    β–²                                                                                                                    β”‚                                                                                       ┃    *
*     ┃                                                V                                                     β”‚                    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓                                                                    β”‚                                                                                       ┃    *
*     ┃                                                                                                   (init)                  ┃  Page Collection         ┃                                                                    β”‚                                                                                       ┃    *
*     ┃                                                                                                      β”‚                    ┃ β”Œβ”€β”€β”€β”€β•¦β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•— ┃                                                                    β”‚                                                                                       ┃    *
*     ┃                                                                                                      β”‚                    ┃ β”‚ id β•‘  page: Entity   β•‘ ┃                                                                    β”‚                                                                                       ┃    *
*     ┃                                                                                                      β”‚                    ┃ └────╩═════════════════╝ ┃                                                                    β”‚                                                                                       ┃    *
*     ┃                                                                                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           ┃ β”Œβ”€β”€β”€β”€β•¦β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•— ┃                                                                    β”‚                                                                                       ┃    *
*     ┃                                                                                            β”‚       ROOT       │───(init)─▢┃ β”‚ id β•‘  page: Entity   β•‘ ┃◀────────────assign with keyβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                                                       ┃    *
*     ┃                                                                                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           ┃ └────╩═════════════════╝ ┃                                                                                                                                                            ┃    *
*     ┃                                                                                                      β”‚                    ┃ β”Œβ”€β”€β”€β”€β•¦β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•— ┃                                                                                                                                                            ┃    *
*     ┃                                                                                                                           ┃ β”‚ id β•‘  page: Entity   β•‘ ┃                                                                                                                                                            ┃    *
*     ┃                                                                                                      β”‚                    ┃ └────╩═════════════════╝ ┃                                                                                                                                                            ┃    *
*     ┃                                                                                                                           ┃           ....           ┃                                                                                                                                                            ┃    *
*     ┃                                                                                                      β”‚                    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛                                                                                                                                                            ┃    *
*     ┃                                                                                                                                         β”‚                                                                                                                                                                         ┃    *
*     ┃                                                                                                      β”” ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─                                                                                                                                                                          ┃    *
*     ┃                                                                                                                                                                                                                                                                                                                   ┃    *
*     ┃                                                                                                                      β”‚                                                                                                                                                                                            ┃    *
*     ┃                                                                                                          ╔══════════════════════╗                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘ Entity               β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚     id: string     β”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚   depth: number    β”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚       type:        β”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚ 'page'|'database'| β”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚      'block'       β”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚     metadata:      β”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚GetBlockResponseWithβ”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚      Metadata      β”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚     plainText:     β”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚extractPlainText(...β”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚     children)      β”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β”‚ children: Entity[] β”‚β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•‘β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β•‘                                                                                                                                                                                 ┃    *
*     ┃                                                                                                          β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                                                                                                                                                                                 ┃    *
*     ┃                                                                                                                                                                                                                                                                                                                   ┃    *
*     ┃                                                                                                                                                                                                                                                                                                                   ┃    *
*     ┃                                                                                                                                                                                                                                                                                                                   ┃    *
*     ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛    *
*                                                                                                                                                                                                                                                                                                                              *
*                                                                                                                                                                                                                                                                                                                              *
*                                                                                                                                                                                                                                                                                                                              *
*                                                                                                                                                                                                                                                                                                                              *
\******************************************************************************************************************************************************************************************************************************************************************************************************************************/