Milestone 0: import zappier billing, Verae middleware, and Zapier research

Compose-ready workspace: packages/zappier (rate card, portal, Stripe),
packages/verae-zapier-middleware (timestamp + NATS), packages/verae-zapier
(CLI app), vendor/zapier-platform, and research/zapier vendor corpus.

Gate 0 structure checks pass. Product code and research are not yet wired.
This commit is contained in:
George Lambert 2026-09-09 02:37:36 -04:00
commit b4150c8250
1364 changed files with 6814366 additions and 0 deletions

2
vendor/zapier-platform.UPSTREAM vendored Normal file
View file

@ -0,0 +1,2 @@
upstream: git@github.com:zapier/zapier-platform.git
source-clone: /Users/marchon/research/zapier-platform

View file

@ -0,0 +1,58 @@
# Cursor Rules for Zapier Platform
You are working on the Zapier Platform monorepo containing packages for the Zapier Developer Platform Experience.
## Repository Documentation
For detailed repository information, reference these documentation files:
### Primary Documentation
- README.md - Repository overview, package descriptions, all doc links
- CONTRIBUTING.md - Setup, testing workflow, pnpm linking
- ARCHITECTURE.md - Repository structure and organization
### Quick Reference (docs-dev/)
- docs-dev/package-info.md - Package purposes and relationships
- docs-dev/commands.md - Command cheat sheet and workflows
- docs-dev/install-dev.md - Development CLI setup
## Development Guidelines
When working with this codebase:
1. **Documentation updates**: Always update existing markdown files (README.md, CONTRIBUTING.md, etc.) or `docs-dev/` files instead of this .cursor/rules file for repository information changes.
2. **Package relationships**: Reference `docs-dev/package-info.md` to understand package interdependencies before making changes across packages.
3. **Testing workflow**:
- Use `pnpm validate` at root for comprehensive validation
- Individual package testing requires `cd` into the specific package directory first
- Follow existing Mocha patterns with `.only` for focused testing
4. **Monorepo patterns**:
- Root-level commands use pnpm workspaces
- Package-specific commands require navigating to package directory
- TypeScript types are auto-generated via husky hooks - no manual intervention needed
5. **Code style**:
- Follow existing code conventions within each package
- Use existing utility functions and established patterns
- Maintain consistency with the package's existing architecture
## Key Commands
For complete command reference, see docs-dev/commands.md.
Essential commands:
- `pnpm test` - Run all tests across all packages
- `pnpm validate` - Full validation (test + smoke-test + lint)
- `pnpm generate-types` - Generate TypeScript declarations
- Individual packages: `cd packages/[package-name]` then `pnpm test`
## Package Structure
- zapier-platform-cli (packages/cli/) - Developer-facing CLI tool
- zapier-platform-core (packages/core/) - Runtime functionality for Zapier apps
- zapier-platform-schema (packages/schema/) - App structure validation source of truth
- zapier-platform-legacy-scripting-runner (packages/legacy-scripting-runner/) - Legacy compatibility layer
- schema-to-ts (schema-to-ts/) - TypeScript declaration generator

106
vendor/zapier-platform/.gitignore vendored Normal file
View file

@ -0,0 +1,106 @@
# Created by https://www.gitignore.io/api/node
# Edit at https://www.gitignore.io/?templates=node
### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# End of https://www.gitignore.io/api/node
example-apps/*/yarn.lock
example-apps/*/package-lock.json
example-apps/typescript/lib
boilerplate/build
.vscode
.idea/
.DS_Store
.pnpm-store/

View file

@ -0,0 +1 @@
_

1
vendor/zapier-platform/.husky/pre-commit vendored Executable file
View file

@ -0,0 +1 @@
pnpm -r precommit && lint-staged

3
vendor/zapier-platform/.npmrc vendored Normal file
View file

@ -0,0 +1,3 @@
# This project uses pnpm, but just in case npm is used, we want to avoid running
# pre/post install scripts by accident.
ignore-scripts = true

View file

@ -0,0 +1,7 @@
packages/cli/scaffold/
package.json
package-lock.json
packages/cli/src/generators/templates/
.yarn
/.nx/workspace-data

1
vendor/zapier-platform/.tool-versions vendored Normal file
View file

@ -0,0 +1 @@
pnpm 10.26.2

3
vendor/zapier-platform/.yarnrc vendored Normal file
View file

@ -0,0 +1,3 @@
# This project uses pnpm, but just in case npm is used, we want to avoid running
# pre/post install scripts by accident.
ignore-scripts true

12
vendor/zapier-platform/ARCHITECTURE.md vendored Normal file
View file

@ -0,0 +1,12 @@
# `zapier-platform` Architecture
## Purpose
- The `zapier/zapier-platform` repository is structured as a [monorepo](https://en.wikipedia.org/wiki/Monorepo), where separate but related code lives together.
## Technical Organization
- The root folder mostly holds tooling scripts, tooling configuration, examples, and documentation for the platform as a whole.
- The `schema-to-ts` folder contains a custom package that generates TypeScript declarations for `zapier-platform-core` based on the `zapier-platform-schema`'s generated `exported-schema.json` file. These generated type declarations are bundled into `zapier-platform-core` and shipped to end-users as part of that NPM package. Type declarations are configured to be generated via the `generate-types` NPM script, which runs automatically as part of a `husky` precommit hook.
- The individual packages are found in the `packages` directory. Each has its own `ARCHITECTURE.md` file outlining the code for that specific package.
- The `boilerplate` directory holds a "bare minimum" app that we include with each `zapier-platform-core` version (AKA Platform Version). We use this in combination with the Visual Builder to ship apps that that skip the build step.

11
vendor/zapier-platform/CHANGELOG.md vendored Normal file
View file

@ -0,0 +1,11 @@
## Moved
Go to [Platform News](https://docs.zapier.com/platform/news) for the latest updates, release notes, changelogs, and tips.
## Changelog Archive for Older Releases
Changelogs for older versions are archived in the [changelog](https://github.com/zapier/zapier-platform/tree/main/changelog) directory.
- [v14 - v16](https://github.com/zapier/zapier-platform/tree/main/changelog/v14-v16.md)
- [v10 - v13](https://github.com/zapier/zapier-platform/tree/main/changelog/v10-v13.md)
- [v0 - v9](https://github.com/zapier/zapier-platform/tree/main/changelog/v0-v9.md)

23
vendor/zapier-platform/CLAUDE.md vendored Normal file
View file

@ -0,0 +1,23 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Documentation Reference
### Primary Documentation (read these first)
- **[README.md](README.md)** - Repository overview, package descriptions, all doc links
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - Setup, testing workflow, package linking
- **[ARCHITECTURE.md](ARCHITECTURE.md)** - Repository structure and organization
### Quick Reference (for task-oriented work)
- **[docs-dev/install-dev.md](docs-dev/install-dev.md)** - Development CLI setup
- **[docs-dev/commands.md](docs-dev/commands.md)** - Command cheat sheet
- **[docs-dev/package-info.md](docs-dev/package-info.md)** - Package purposes and relationships
## Claude-Specific Workflow Notes
1. **Documentation updates**: Update existing markdown files (README.md, CONTRIBUTING.md, etc.) or `docs-dev/` files, not this CLAUDE.md
2. **Testing workflow**: Use `pnpm validate` at root for full validation, or `cd` into specific packages for targeted testing
3. **TypeScript types**: Generated automatically via husky hooks - no manual intervention needed
4. **Package development**: Always understand package relationships from `docs-dev/package-info.md` before making changes
5. **Monorepo commands**: Use pnpm from root; individual packages need `cd` first

73
vendor/zapier-platform/CONTRIBUTING.md vendored Normal file
View file

@ -0,0 +1,73 @@
# Contributing
## Terms
This contributor guide is mainly for Zapier employees. However, zapier-platform is a public repo. Everyone is welcome to submit a pull request (PR). For non-employees, you must agree to the terms of service listed at https://zapier.com/developer-platform/tos (the link is also included in the [LICENSE](license) file) before submitting a PR.
## Local Setup
Install [pnpm][pnpm] if you haven't. We recommend using [asdf](asdf) to install and manage your
Node.js and pnpm versions.
Clone this repo with git:
```bash
git clone git@github.com:zapier/zapier-platform.git
cd zapier-platform
```
In the repo directory, install dependencies with pnpm:
```bash
pnpm install
```
That's it! Now you have a local environment for development.
## Running Tests
For detailed testing commands and workflow, see [docs-dev/commands.md](docs-dev/commands.md).
Quick overview:
- `pnpm test` - Run all tests for all packages
- `pnpm validate` - Full validation (test + smoke-test + lint)
- Individual packages: `cd` into package directory first, then `pnpm test`
## Testing Guidelines
### Writing Quality Tests
When writing tests, especially for generators and complex components, follow these guidelines to ensure tests are robust and maintainable:
#### ✅ DO: Test Actual Component Behavior
Always test the actual behavior of the component being tested.
#### ❌ DON'T: Use Simulation-Based Testing
Never extract logic from the component and test it in isolation. This creates brittle tests that don't reflect actual behavior.
#### Why Simulation Testing is Problematic
1. **Duplication**: Simulated logic can diverge from actual implementation
2. **False confidence**: Tests may pass while actual functionality is broken
3. **Maintenance burden**: Changes require updating both implementation and simulation
4. **Missing integration issues**: Doesn't test how components interact with their environment
## Development CLI Setup
For setting up the development version of the CLI, see [docs-dev/install-dev.md](docs-dev/install-dev.md).
## Package Linking for Integration Development
For linking development versions of core and schema packages to your integration projects, see the "Package Linking" section in [docs-dev/commands.md](docs-dev/commands.md).
## Releasing a New Version
**Zapier employees only.** Refer to this [internal doc][releasing] on how to cut a release.
[license]: https://github.com/zapier/zapier-platform/blob/main/LICENSE
[pnpm]: https://pnpm.io/installation
[asdf]: https://asdf-vm.com
[releasing]: https://coda.io/d/_di0MgBhlCWf/Releasing-a-New-zapier-platform-Version_su5eD

3
vendor/zapier-platform/LICENSE vendored Normal file
View file

@ -0,0 +1,3 @@
Copyright (c) Zapier, Inc.
This repository is part of Zapier Platform. By downloading, installing, accessing, or using any part of the Zapier Platform, including this repository, you agree to the Zapier Platform Agreement, which can be found at: https://zapier.com/platform/tos. If you do not agree to the Zapier Platform Agreement, you may not download, install, access, or use any part of the Zapier Platform, including this repository.

30
vendor/zapier-platform/README.md vendored Normal file
View file

@ -0,0 +1,30 @@
# Zapier Platform
[![CI](https://github.com/zapier/zapier-platform/actions/workflows/ci.yaml/badge.svg)](https://github.com/zapier/zapier-platform/actions/workflows/ci.yaml)
This is the main monorepo for all public code that powers the Zapier Platform Experience.
## Contents
It consists of a few main packages:
- [`zapier-platform-cli`](packages/cli): The CLI that devs can use to perform common tasks with their apps (such as `push`, `promote`, etc)
- [`zapier-platform-core`](packages/core): The package which all apps depend on; it provides functionality at runtime
- [`zapier-platform-schema`](packages/schema): The source of truth for what's allowed in the structure a Zapier app; not typically installed directly
- [`zapier-platform-legacy-scripting-runner`](packages/legacy-scripting-runner): If your app started as a Legacy Web Builder app, this provides a shim that keeps your app running seamlessly
- [`example-apps/*`](example-apps): A varied set of example apps to help you get started
- [`schema-to-ts`](schema-to-ts): Custom tooling to generate TypeScript declarations for `zapier-platform-core` using `zapier-platform-schema`'s output schemas
## Docs
* Public-facing docs:
- [Platform Docs](https://docs.zapier.com/platform)
- [CLI Command Reference](packages/cli/docs/cli.md)
- [Schema Reference](packages/schema/docs/build/schema.md)
- [Platform News](https://docs.zapier.com/platform/news) ([RSS feed](https://docs.zapier.com/platform/news.xml)) - latest updates, release notes, changelogs, and tips
- [Old Changelog Archive](changelog) - old changelogs before v17
* Internal-facing docs:
- Testing out new features that haven't been released to npm yet? See [docs-dev/install-dev.md](docs-dev/install-dev.md)
- Learn about how this repo is structured in [ARCHITECTURE.md](ARCHITECTURE.md)
- Looking to contribute to this repo? See [CONTRIBUTING.md](CONTRIBUTING.md)
- Quick reference for development tasks? See [docs-dev/](docs-dev/)

View file

@ -0,0 +1,5 @@
# Zapier Platform Boilerplate
Boilerplate is an empty Zapier integration project. We use it to build a zip
providing all the necessary dependencies for integrations developed on visual
builder.

View file

@ -0,0 +1 @@
module.exports = {}; // Ignored

View file

@ -0,0 +1,18 @@
{
"name": "zapier-platform-boilerplate",
"version": "1.0.0",
"description": "A boilerplate that allows running a buildless app.",
"homepage": "https://zapier.com/",
"author": "Zapier <partners@zapier.com>",
"license": "UNLICENSED",
"main": "index.js",
"engines": {
"node": ">=10",
"npm": ">=5.6.0"
},
"dependencies": {
"zapier-platform-core": "PLACEHOLDER",
"zapier-platform-legacy-scripting-runner": "PLACEHOLDER"
},
"private": true
}

View file

@ -0,0 +1,7 @@
# Don't use symlinks in node_modules so we can zip it
nodeLinker: hoisted
# When building from local code (no args to build.sh), the line below is
# replaced with an overrides section so core's transitive dependency on
# zapier-platform-schema resolves from a local tarball instead of npm.
# OVERRIDES_PLACEHOLDER

View file

@ -0,0 +1,281 @@
#!/usr/bin/env bash
# Exit on any command failure; in pipelines, fail if any command (not just the
# last) returns non-zero.
set -eo pipefail
#
# Build boilerplate - a zip file that is generated as if you `zapier-platform build` an empty CLI
# app. This zip file acts as a runtime for all the UI apps.
#
# Usage:
#
# $ ./scripts/build.sh [CORE_VERSION] [LEGACY_SCRIPTING_RUNNER_VERSION]
#
# This scripts accepts two optional arguments - core and legacy-scripting-runner
# versions. If the version is specified, that packgage will be downloaded from npm
# instead of built from local.
#
# For example, this builds core and legacy-scripting-runner from local code:
#
# $ ./scripts/build.sh
#
# Download both core and legacy-scripting-runner from npm:
#
# $ ./scripts/build.sh 9.7.1 3.8.5
#
# Build core from local and download legacy-scripting-runner from npm:
#
# $ ./scripts/build.sh '' 3.8.5
#
# Download core from npm and build legacy-scripting-runner from local:
#
# $ ./scripts/build.sh 9.7.1
#
update_deps() {
package_json=$1
core_version=$2
lsr_version=$3
cmd_for_core="s|\"zapier-platform-core\": \"[^\"]*\""
cmd_for_core+="|\"zapier-platform-core\": \"$core_version\"|g"
cmd_for_lsr="s|\"zapier-platform-legacy-scripting-runner\": \"[^\"]*\""
cmd_for_lsr+="|\"zapier-platform-legacy-scripting-runner\": \"$lsr_version\"|g"
sed -i.bak "$cmd_for_core" "$package_json"
sed -i.bak "$cmd_for_lsr" "$package_json"
rm -f "$package_json.bak"
}
inspect_build() {
local zip_file=$1
local expected_core=$2
local expected_schema=$3
local expected_lsr=$4
temp_dir="`dirname $zip_file`/_temp"
unzip -q $zip_file -d $temp_dir
# Build a JSON object of expected versions and compare against actual
actual=$(find $temp_dir/node_modules -maxdepth 2 -name package.json -path "*/zapier-platform-*/*" | xargs cat | jq -s '
map({(.name): .version}) | add')
echo "$actual" | jq .
rm -rf $temp_dir
expected=$(jq -n \
--arg core "$expected_core" \
--arg schema "$expected_schema" \
--arg lsr "$expected_lsr" \
'{"zapier-platform-core": $core, "zapier-platform-schema": $schema, "zapier-platform-legacy-scripting-runner": $lsr}')
if echo "$actual" | jq -e --argjson expected "$expected" '. == $expected' > /dev/null 2>&1; then
echo "All dependency versions match ✅"
else
echo "ERROR: dependency version mismatch ❌"
echo "Expected: $expected"
return 1
fi
}
check_size() {
local min_mb=3
local max_mb=10
local min_bytes=$((min_mb * 1024 * 1024))
local max_bytes=$((max_mb * 1024 * 1024))
local file_size=$(stat -f%z "$1" 2>/dev/null || stat -c%s "$1")
local size_mb=$(echo "scale=2; $file_size / 1024 / 1024" | bc)
if [[ $file_size -lt $min_bytes || $file_size -gt $max_bytes ]]; then
echo "ERROR: zip file size ${size_mb} MB is outside expected range (${min_mb}-${max_mb} MB) ❌"
return 1
else
echo "Zip file size ${size_mb} MB is within expected range (${min_mb}-${max_mb} MB) ✅"
fi
}
test_build() {
temp_dir="`dirname $1`/_temp"
unzip -q $1 -d $temp_dir
pushd $temp_dir > /dev/null
local rc=0
node zapierwrapper.js || rc=$?
popd > /dev/null
rm -rf $temp_dir
if [[ $rc -eq 0 ]]; then
echo "Entry point can be loaded successfully ✅"
else
echo "Entry point failed to load ❌"
fi
return $rc
}
# Get the absolute path of the directory holding this script file
SCRIPT_DIR=$(dirname $0)
pushd $SCRIPT_DIR > /dev/null
SCRIPT_DIR=$(pwd)
popd > /dev/null
REPO_DIR=$(dirname $(dirname $SCRIPT_DIR))
CORE_DIR="$REPO_DIR/packages/core"
SCHEMA_DIR="$REPO_DIR/packages/schema"
LSR_DIR="$REPO_DIR/packages/legacy-scripting-runner"
BOILERPLATE_DIR="$REPO_DIR/boilerplate"
BUILD_DIR="$BOILERPLATE_DIR/build"
# Restore modified files on exit (success or failure)
cleanup() {
local exit_code=$?
# Restore pnpm-workspace.yaml if a backup exists
if [ -f "$BOILERPLATE_DIR/pnpm-workspace.yaml.bak" ]; then
mv "$BOILERPLATE_DIR/pnpm-workspace.yaml.bak" "$BOILERPLATE_DIR/pnpm-workspace.yaml"
fi
# Restore package.json placeholders
update_deps "$BOILERPLATE_DIR/package.json" PLACEHOLDER PLACEHOLDER
exit $exit_code
}
trap cleanup EXIT
# Prevent leftover old builds from being included in new build
if [ -d $BUILD_DIR ]; then
echo "Removing existing boilerplate/build directory..."
rm -r "$BUILD_DIR"
fi
# Prevent stale dependencies from being included in new build
if [ -d "$BOILERPLATE_DIR/node_modules" ]; then
echo "Removing existing boilerplate/node_modules directory..."
rm -r "$BOILERPLATE_DIR/node_modules"
fi
mkdir -p $BUILD_DIR
# Copy files
cp "$CORE_DIR/include/zapierwrapper.js" "$BOILERPLATE_DIR/"
# Get core version
if [ "$1" == "" ]; then
pushd $CORE_DIR > /dev/null
CORE_VERSION="$(node -p "require('./package.json').version")"
popd > /dev/null
else
CORE_VERSION=$1
fi
# core, schema, and cli are always published together, so they should use the same
# version
SCHEMA_VERSION=$CORE_VERSION
# Get legacy-scripting-runner version
if [ "$2" == "" ]; then
pushd $LSR_DIR > /dev/null
LSR_VERSION="$(node -p "require('./package.json').version")"
popd > /dev/null
else
LSR_VERSION=$2
fi
TARGET_FILE="$BUILD_DIR/$CORE_VERSION.zip"
rm -f $TARGET_FILE
# Build core and legacy-scripting-runner locally. Needs to generate a unique filename
# with a timestamp to avoid the package manager using any cache.
TIMESTAMP=`date +"%s"`
CORE_PACK_FILENAME="core-$TIMESTAMP.tgz"
SCHEMA_PACK_FILENAME="schema-$TIMESTAMP.tgz"
LSR_PACK_FILENAME="lsr-$TIMESTAMP.tgz"
echo "Building..."
# Patch boilerplate's package.json with appropriate dependency versions
if [ "$1" == "" ]; then
echo "> core from local, version $CORE_VERSION"
pushd $CORE_DIR > /dev/null
pnpm pack --out "$BOILERPLATE_DIR/$CORE_PACK_FILENAME"
popd > /dev/null
# Also pack schema so core's transitive dependency resolves locally
# instead of from npm (which may not have the current version yet)
echo "> schema from local"
pushd $SCHEMA_DIR > /dev/null
pnpm pack --out "$BOILERPLATE_DIR/$SCHEMA_PACK_FILENAME"
popd > /dev/null
if [ "$2" == "" ]; then
echo "> legacy-scripting-runner from local, version $LSR_VERSION"
pushd $LSR_DIR > /dev/null
pnpm pack --out "$BOILERPLATE_DIR/$LSR_PACK_FILENAME"
popd > /dev/null
# Replace core and legacy-scripting-runner versions in package.json
update_deps "$BOILERPLATE_DIR/package.json" "./$CORE_PACK_FILENAME" "./$LSR_PACK_FILENAME"
else
echo "> legacy-scripting-runner from npm, version $LSR_VERSION"
# Replace core and legacy-scripting-runner versions in package.json
update_deps "$BOILERPLATE_DIR/package.json" "./$CORE_PACK_FILENAME" $LSR_VERSION
fi
else
echo "> core from from npm, version $CORE_VERSION"
if [ "$2" == "" ]; then
echo "> legacy-scripting-runner from local, version $LSR_VERSION"
pushd $LSR_DIR > /dev/null
pnpm pack --out "$BOILERPLATE_DIR/$LSR_PACK_FILENAME"
popd > /dev/null
# Replace core and legacy-scripting-runner versions in package.json
update_deps "$BOILERPLATE_DIR/package.json" $CORE_VERSION "./$LSR_PACK_FILENAME"
else
echo "> legacy-scripting-runner from npm, version: $LSR_VERSION"
# Replace core and legacy-scripting-runner versions in package.json
update_deps "$BOILERPLATE_DIR/package.json" $CORE_VERSION $LSR_VERSION
fi
fi
# Install boilerplate deps
pushd $BOILERPLATE_DIR > /dev/null
echo "{\"version\": \"1.0.0\", \"platformVersion\": \"$CORE_VERSION\"}" > definition.json
# When building core from local, replace the placeholder in pnpm-workspace.yaml
# with an override so schema resolves from the local tarball
if [ "$1" == "" ]; then
sed -i.bak "s|# OVERRIDES_PLACEHOLDER|overrides:\n zapier-platform-schema: \"./$SCHEMA_PACK_FILENAME\"|" pnpm-workspace.yaml
fi
pnpm install --no-lockfile
popd > /dev/null
# Monkey patch boilerplate package.json so zapier-platform-core and
# zapier-platform-legacy-scripting-runner have version numbers specified instead
# of local file path
update_deps "$BOILERPLATE_DIR/package.json" $CORE_VERSION $LSR_VERSION
pushd $BOILERPLATE_DIR > /dev/null
# Build the zip!
# the node-X segment in the next line should match the latest major version
zip -9 -R $TARGET_FILE '*.js' '*.cjs' '*.json'
# Remove generated files
rm -f zapierwrapper.js definition.json core-*.tgz schema-*.tgz lsr-*.tgz
rm -rf node_modules
popd > /dev/null
echo -e "\nDone! Here's your output zip file (size should be 4-6 MB normally):"
ls -hl $TARGET_FILE
check_size $TARGET_FILE
inspect_build $TARGET_FILE $CORE_VERSION $SCHEMA_VERSION $LSR_VERSION
test_build $TARGET_FILE

View file

@ -0,0 +1,26 @@
#!/usr/bin/env bash
#
# Usage:
# ./upload.sh 9.0.0
if [ "$1" == "" ]; then
if [ -z $TRAVIS_TAG ]; then
(>&2 echo 'TRAVIS_TAG is undefined')
exit 1
fi
PKG_VERSION=`echo $TRAVIS_TAG | grep '@' | cut -d '@' -f 2`
else
PKG_VERSION=$1
fi
BUCKET='zapier-dev-platform-cli-boilerplates'
# Get the absolute path of the directory holding this script file
SCRIPT_DIR=$(dirname $0)
pushd $SCRIPT_DIR > /dev/null
SCRIPT_DIR=$(pwd)
popd > /dev/null
REPO_DIR=$(dirname $(dirname $SCRIPT_DIR))
aws s3 cp $REPO_DIR/boilerplate/build/$PKG_VERSION.zip s3://$BUCKET/$PKG_VERSION.zip --acl public-read

View file

@ -0,0 +1,974 @@
## 9.7.3
_released `2022-03-21`_
### cli
- None!
### core
- :bug: Fix another hanging issue where an action could be invoked multiple times ([#514](https://github.com/zapier/zapier-platform/pull/514))
### schema
- None!
## 9.7.2
_released `2022-03-01`_
### cli
- None!
### core
- :nail_care: `z.request()` now accepts `skipEncodingChars` option to skip percent-encoding specific characters ([#499](https://github.com/zapier/zapier-platform/pull/499))
### schema
- :nail_care: Add `skipEncodingChars` to `RequestSchema` ([#499](https://github.com/zapier/zapier-platform/pull/499))
### misc
- :hammer: Improve build script ([#500](https://github.com/zapier/zapier-platform/pull/500))
## 9.7.1
_released `2022-02-23`_
### cli
- :hammer: Bump node-fetch to 2.6.7 ([#492](https://github.com/zapier/zapier-platform/pull/492))
### core
- :bug: Fix hanging issue where an action could be invoked multiple times ([#491](https://github.com/zapier/zapier-platform/pull/491))
- :hammer: Bump node-fetch to 2.6.7 ([#492](https://github.com/zapier/zapier-platform/pull/492))
### schema
- :hammer: Bump node-fetch to 2.6.7 ([#492](https://github.com/zapier/zapier-platform/pull/492))
## 9.7.0
_released `2022-02-14`_
### cli
- None!
### core
- :bug: Fix `value.replace is not a function` error when resolving missing curlies ([#467](https://github.com/zapier/zapier-platform/pull/467))
- :bug: Handle case where `legacy.scriptingSource` is an empty string ([#478](https://github.com/zapier/zapier-platform/pull/478))
- :nail_care: Improve `z.console.log` and HTTP logging performance ([#483](https://github.com/zapier/zapier-platform/pull/483))
### schema
- None!
## 9.6.0
_released `2021-12-03`_
### cli
- None!
### core
- :bug: Fix backpressure issue when piping request bodies ([#462](https://github.com/zapier/zapier-platform/pull/462))
- Rewrite `z.stashFile()` with various improvements and bugfixes ([#453](https://github.com/zapier/zapier-platform/pull/453))
- :nail_care: `knownLength` is no longer required for any kinds of streams, including `z.request({ url, raw: true })` and `fs.createReadStream()`
- :nail_care: Detect file types more smartly
- :nail_care: Generate filenames more smartly
- :nail_care: Improve performance by making concurrent requests
- :bug: Fix `MalformedPOSTRequest` error when the reponse is gzipped and has a smaller `Content-Length`
- :hammer: Better test coverage
- See [#453](https://github.com/zapier/zapier-platform/pull/453) for more details
### schema
- :nail_care: Allow spaces and sqaure brackets in [`RefResourceSchema`](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@9.6.0/packages/schema/docs/build/schema.md) ([#456](https://github.com/zapier/zapier-platform/pull/456))
### misc
- :hammer: Bump node-fetch to 2.6.6 ([#458](https://github.com/zapier/zapier-platform/pull/458), [#460](https://github.com/zapier/zapier-platform/pull/460))
- :hammer: Move CI from Travis to GitHub Actions ([#453](https://github.com/zapier/zapier-platform/pull/453))
## 9.5.0
_released `2021-07-02`_
### cli
- None!
### core
- :tada: Allow using `await` in inline function source ([#390](https://github.com/zapier/zapier-platform/pull/390))
- :bug: Make sure all HTTP requests logged ([#390](https://github.com/zapier/zapier-platform/pull/390))
### schema
- None!
## 9.4.2
### cli
- None!
### core
- :bug: `ResponseError` no longer fails when request is `raw` ([#320](https://github.com/zapier/zapier-platform/pull/320))
- :bug: Redirecting from `https` to `http` breaks when disabling SSL certificate checks ([#314](https://github.com/zapier/zapier-platform/pull/314))
### schema
- None!
## 9.4.0
### cli
- :nail_care: `build` and `push` command now produces smaller zips (≈30% of the original size!) ([#202](https://github.com/zapier/zapier-platform/pull/202))
### core
- :nail_care: `z.request` now has an `allowGetBody` option that allows you to send a GET request with a body ([#195](https://github.com/zapier/zapier-platform/pull/195))
- :scroll: Update examples to demonstrate `z.errors.Error` ([#198](https://github.com/zapier/zapier-platform/pull/198))
- :scroll: Encourage use of `response.json` rather than `z.JSON.parse(response.content)` ([#200](https://github.com/zapier/zapier-platform/pull/200))
- :hammer: Include `User-Agent` header for internal calls ([#204](https://github.com/zapier/zapier-platform/pull/204))
### schema
- No changes
## 9.3.0
### cli
- No changes
### core
- :tada: We have new error classes! Use them to help improve user-facing error messages. Read [Error Handling](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#error-handling) in the docs for more. ([#189](https://github.com/zapier/zapier-platform/pull/189))
- :nail_care: Show variable name when curlies have a type error ([#188](https://github.com/zapier/zapier-platform/pull/188))
### schema
- :nail_care: `RequestSchema` now has a `serializeValueForCurlies` option, allowing to "reliably interpolate arrays or objects to a string" ([#190](https://github.com/zapier/zapier-platform/pull/190))
## 9.2.0
### cli
- :tada: `scaffold` command was entirely rewritten. Now it generates better code and is more resilient. ([#146](https://github.com/zapier/zapier-platform/pull/146))
- :bug: Fix `convert` command so it correctly handles a visual builder app converted from Web Builder ([#159](https://github.com/zapier/zapier-platform/pull/159))
- :bug: Allow env variables containing equals ([#179](https://github.com/zapier/zapier-platform/pull/179))
- :bug: Fix SSO link in `login` command output ([#157](https://github.com/zapier/zapier-platform/pull/157))
- :hammer: Fix test circular dependency ([#184](https://github.com/zapier/zapier-platform/pull/184))
### core
- :bug: Preserve non-empty values that include empty curlies in request objects ([#162](https://github.com/zapier/zapier-platform/pull/162))
- :bug: Improve `appTester` types and bump Node versions ([#172](https://github.com/zapier/zapier-platform/pull/172))
- :hammer: Fix smoke test circular dependency ([#175](https://github.com/zapier/zapier-platform/pull/175), [#185](https://github.com/zapier/zapier-platform/pull/185))
### schema
- :scroll: Clarify `FieldSchema.list` when used in `inputFields` vs. `outputFields` ([#143](https://github.com/zapier/zapier-platform/pull/143))
## 9.1.0
### cli
- :tada: CLI now has brand new tab completion! Learn how to activate it in the [doc](https://github.com/zapier/zapier-platform/tree/main/packages/cli#command-line-tab-completion). ([#134](https://github.com/zapier/zapier-platform/pull/134))
- :nail_care: Make CLI text style more consistent ([#132](https://github.com/zapier/zapier-platform/pull/132))
- :nail_care: `validate` command now uses a language consistent with the UI ([#132](https://github.com/zapier/zapier-platform/pull/132))
- :bug: `validate` command no longer requires login ([#119](https://github.com/zapier/zapier-platform/pull/119))
- :bug: Fix `convert` command crashing over a trailing comment ([#147](https://github.com/zapier/zapier-platform/pull/147))
- :bug: Projects generated by `convert` command now defaults to Node 10 ([#123](https://github.com/zapier/zapier-platform/pull/123))
- :hammer: `init` command now pulls examples from a tagged version ([#127](https://github.com/zapier/zapier-platform/pull/127))
- :hammer: Refactor `convert` command ([#131](https://github.com/zapier/zapier-platform/pull/131))
- :hammer: Refactor `describe` command ([#129](https://github.com/zapier/zapier-platform/pull/129))
- :hammer: Refactor `link` command ([#128](https://github.com/zapier/zapier-platform/pull/128))
- :hammer: Refactor `logs` command ([#121](https://github.com/zapier/zapier-platform/pull/121))
- :hammer: Refactor `register` command ([#122](https://github.com/zapier/zapier-platform/pull/122))
- :hammer: Finish oclif migration and clean up unused code ([#133](https://github.com/zapier/zapier-platform/pull/133))
### core
- :bug: Fix broken digest auth since 8.3.0 ([#153](https://github.com/zapier/zapier-platform/pull/153))
- :bug: Basic auth now allows empty username or password ([#130](https://github.com/zapier/zapier-platform/pull/130))
- :hammer: TypeScript definition fixes ([#124](https://github.com/zapier/zapier-platform/pull/124))
### schema
- No changes
## 9.0.0
This is a big one! There are a few areas with breaking changes. At a high level:
- Zapier integrations that depend on the new Core v9 will run using `Node.js v10`
- CLI had a lot of refactoring under the hood. A number of commands changed their args and/or name. Check out the [CLI docs](https://github.com/zapier/zapier-platform/blob/main/docs/cli.md) for the full rundown.
- All packages drop support for Node 6 (which has been EOL for a while, so hopefully this isn't news)
To successfully migrate to this version, you'll probably need to:
- install Node 10 using `nvm`. Lambda uses `10.16.13` ([source](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)), but any will do.
- Check the CLI changelog below and adjust any scripts that call the CLI accordingly
- Update your integration's `zapier-platform-core` dependency to `9.0.0`.
- Run unit tests on Node 10 if you haven't before
- Assuming your code works on Node 10, go through the regular push, promote, migrate flow. There aren't any other breaking changes from and end-user perspective.
As always, feel free to [reach out](https://github.com/zapier/zapier-platform/tree/main/packages/cli#get-help) if you've got any questions.
See below for a detailed changelog:
### cli
- :exclamation: Remove `--include-js-map` flag from the `build` and `push` commands ([#99](https://github.com/zapier/zapier-platform/pull/99))
- :exclamation: remove watch command ([#100](https://github.com/zapier/zapier-platform/pull/100))
- :exclamation: Refactor `env` command. It's now `env:get`, `env:set` and `env:unset` ([docs](https://github.com/zapier/zapier-platform/blob/main/docs/cli.md#envget)) ([#104](https://github.com/zapier/zapier-platform/pull/104))
- :exclamation: Remove `invite` and `collaborate` commands. This functionality is now under `users` ([docs](https://github.com/zapier/zapier-platform/blob/main/docs/cli.md#usersadd)) and `team` ([docs](https://github.com/zapier/zapier-platform/blob/main/docs/cli.md#teamadd)) commands, respectively ([#106](https://github.com/zapier/zapier-platform/pull/106))
- :exclamation: Refactor `delete` into `delete:integration` and `delete:version` ([docs](https://github.com/zapier/zapier-platform/blob/main/docs/cli.md#deleteintegration)) ([#109](https://github.com/zapier/zapier-platform/pull/109))
- :exclamation: Refactor `logout` command to only clear the local session, not all of them ([#60](https://github.com/zapier/zapier-platform/pull/60))
- :exclamation: `scaffold` command errors if a file name already exists ([#88](https://github.com/zapier/zapier-platform/pull/88))
- :exclamation: `validate` depends on having a valid `deployKey` available (either in the environment or in the auth file, `~/.zapierrc`). This is a regression and will be fixed in a later version. In the meantime, see [Using CI](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#testing-in-your-ci) for more info.
- :tada: Add saml support during `login` ([#61](https://github.com/zapier/zapier-platform/pull/61))
- Refactor the following commands to use the new CLI setup:
- build
- delete
- deprecate
- env
- history
- login
- logout
- migrate
- promote
- push
- scaffold
- test
- upload
- validate
- versions
- Deprecate `apps` command in favor of `integrations` ([#105](https://github.com/zapier/zapier-platform/pull/105))
- Run validation during build against `/check` endpoint ([#111](https://github.com/zapier/zapier-platform/pull/111))
- chore: rebuild yarn.lock ([#96](https://github.com/zapier/zapier-platform/pull/96))
### core
- :tada: Apps now run on Node.js `v10`
- (docs) update CHANGELOG.md links to point to zapier-platform repository ([#107](https://github.com/zapier/zapier-platform/pull/107))
### schema
- (fix) Make label & description optional for hidden actions ([#69](https://github.com/zapier/zapier-platform/pull/69))
- (fix) Be more permissive with mutually exclusive properties in input fields ([#91](https://github.com/zapier/zapier-platform/pull/91))
## 8.4.2
The only change of this release is we bumped Lodash to 4.17.15 ([#95](https://github.com/zapier/zapier-platform/pull/95)).
No more security warnings from `npm audit`!
## 8.4.1
### cli
- (chore) Don't send analytics when running tests ([#84](https://github.com/zapier/zapier-platform/pull/84))
### schema
- No changes
### core
- (fix) Strip URL query parameters from error messages for security ([#85](https://github.com/zapier/zapier-platform/pull/85))
- (chore) Don't send analytics when running tests ([#86](https://github.com/zapier/zapier-platform/pull/86))
## 8.4.0
### cli
- :tada: Added analytics to the CLI. These are vital for helping us improve our product. Read more about what we collect [here](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md).
### schema
- No changes
### core
- No changes
## 8.3.0
The big change of this release is we started to maintain all the packages in a [monorepo](https://github.com/zapier/zapier-platform). It's more like an internal refactoring, so it shouldn't affect developer experience. Major work includes:
- (chore) Switch to use yarn ([#1](https://github.com/zapier/zapier-platform/pull/1))
- (chore) Restructure and rename directories ([#2](https://github.com/zapier/zapier-platform/pull/2))
- (chore) Adjust `zapier init` to pull from monorepo ([#4](https://github.com/zapier/zapier-platform/pull/4))
- (chore) Set up tests on Travis CI ([#5](https://github.com/zapier/zapier-platform/pull/5))
- (chore) Publish from Travis CI ([#33](https://github.com/zapier/zapier-platform/pull/33))
- (chore) Centralize husky code ([#34](https://github.com/zapier/zapier-platform/pull/34))
- (chore) Move tooling to root ([#46](https://github.com/zapier/zapier-platform/pull/46))
### cli
- (chore) Adopt [oclif](https://oclif.io/) CLI framework, started with `zapier init` command ([#43](https://github.com/zapier/zapier-platform/pull/43))
- (chore) Bump adm-zip ([#6](https://github.com/zapier/zapier-platform/pull/6))
- (docs) Update computed fields docs ([#7](https://github.com/zapier/zapier-platform/pull/7))
### schema
- :tada: (feature) Dynamic dropdowns (`FieldSchema.dynamic`) now support multiple labels ([#48](https://github.com/zapier/zapier-platform/pull/48), [#49](https://github.com/zapier/zapier-platform/pull/49))
### core
- (fix) Fix a callback issue ([#36](https://github.com/zapier/zapier-platform/pull/36))
- (chore) Bump adm-zip ([#6](https://github.com/zapier/zapier-platform/pull/6))
## 8.2.1
### cli
None!
### schema
- (fix) Drop help text length requirement ([#70](https://github.com/zapier/zapier-platform-schema/pull/70))
### core
None!
## 8.2.0
### cli
- :tada: (feature) Convert visual apps to CLI. ([#427](https://github.com/zapier/zapier-platform-cli/pull/427))
- (feature) Add per app version helpers ([#406](https://github.com/zapier/zapier-platform-cli/pull/406))
- (chore) bump travis node version ([#435](https://github.com/zapier/zapier-platform-cli/pull/435))
- (chore) remove babel ([#430](https://github.com/zapier/zapier-platform-cli/pull/430))
- (chore) Add eslint-plugin-mocha ([#429](https://github.com/zapier/zapier-platform-cli/pull/429))
### schema
- (fix) Reduce minLength for BasicDisplaySchema to 1 ([#69](https://github.com/zapier/zapier-platform-schema/pull/69))
### core
- (fix) Be more defensive when creating a buffer ([#155](https://github.com/zapier/zapier-platform-core/pull/155))
- (fix) fix regression where env is ignored ([#154](https://github.com/zapier/zapier-platform-core/pull/154))
- (fix) Prevent raw curies from being sent in a request. Allow removing empty… ([#153](https://github.com/zapier/zapier-platform-core/pull/153))
- (fix) Censor sensitive numbers ([#152](https://github.com/zapier/zapier-platform-core/pull/152))
## 8.1.0
### cli
- (fix) Add a better error message when uploading with a zip ([#408](https://github.com/zapier/zapier-platform-cli/pull/408))
- (chore) port logout command to async func ([#419](https://github.com/zapier/zapier-platform-cli/pull/419))
- (docs) Add code examples and scenarios to the dynamic dropdowns section of the Readme ([#415](https://github.com/zapier/zapier-platform-cli/pull/415))
- (docs) Add example for input fields with 'children' parameter ([#413](https://github.com/zapier/zapier-platform-cli/pull/413))
- (docs) Update signup link ([#412](https://github.com/zapier/zapier-platform-cli/pull/412))
- (docs) Update readme details for version number ([#411](https://github.com/zapier/zapier-platform-cli/pull/411))
- (docs) Misc improvements ([#423](https://github.com/zapier/zapier-platform-cli/pull/423))
### schema
- (improvement) Add appflags property ([#68](https://github.com/zapier/zapier-platform-schema/pull/68))
- (chore) Bump Lodash Version ([#67](https://github.com/zapier/zapier-platform-schema/pull/67))
### core
- (improvement) Allow Godzilla to require modules in code mode ([#145](https://github.com/zapier/zapier-platform-core/pull/145))
- (improvement) Add the ability to skip http patching ([#150](https://github.com/zapier/zapier-platform-core/pull/150))
- (fix) Censor auth headers in edge cases ([#151](https://github.com/zapier/zapier-platform-core/pull/151))
- (fix) Add meta to the bundle bank for resolving curlies. ([#149](https://github.com/zapier/zapier-platform-core/pull/149))
- (fix) Pass correct storekey ([#148](https://github.com/zapier/zapier-platform-core/pull/148))
- (fix) Add optional parameter to createAppTester to customize storeKey ([#147](https://github.com/zapier/zapier-platform-core/pull/147))
- (fix) Fix individual types for removeMissingValuesFrom object ([#146](https://github.com/zapier/zapier-platform-core/pull/146))
- (fix) Make removeMissing correctly optional ([#143](https://github.com/zapier/zapier-platform-core/pull/143))
## 8.0.1
A quick bugfix to resolve a regression
### cli
None!
### schema
- (fix) actually return validator class ([#64](https://github.com/zapier/zapier-platform-schema/pull/64))
### core
None!
## 8.0.0
This is a larger-than-normal release that coincides with the release of our new [Visual Builder](https://zapier.github.io/visual-builder/). It also includes a few breaking changes that you'll need to resolve in your code manually as you upgrade. Luckily, they're mostly find-and-replace.
#### `omitEmptyParams` has a new data type
We've changed the type of (the option formally known as) `omitEmptyParams` to accommodate clearing data from the query params and/or the request body
```js
// before
z.request({
url: 'https://site.com',
omitEmptyParams: true,
});
// after:
z.request({
url: 'https://site.com',
removeMissingValuesFrom: { params: true },
});
```
#### Curlies Don't Clobber
If you were using `{{curlies}}` to render non-primatives (that is, arrays or objects) at runtime, they were getting coerced into strings. Now they correctly stay as their original data type, which is only an issue if you were working around it before.
#### `bundle.meta` has a new coat of paint
We updated the key names in `bundle.meta` to make them more clear. In most cases, they were simply renamed, but some unhelpful ones were removed. There's a [conversion table](https://github.com/zapier/zapier-platform-cli/wiki/bundle.meta-changes) that should make this an easy thing to change.
---
Below are all of the changes:
### cli
- (improvement) respect 2fa settings ([#396](https://github.com/zapier/zapier-platform-cli/pull/396))
- (doc) Add a Docker and Docker Compose section for native environments. ([#397](https://github.com/zapier/zapier-platform-cli/pull/397))
- (doc) update collaborator to admin ([#403](https://github.com/zapier/zapier-platform-cli/pull/403))
- (doc) update docs to use new meta ([#393](https://github.com/zapier/zapier-platform-cli/pull/393))
- (chore) refactor `zapier login` to async ([#395](https://github.com/zapier/zapier-platform-cli/pull/395))
- (chore) make validate command async ([#401](https://github.com/zapier/zapier-platform-cli/pull/401))
### schema
- :exclamation: (improvement, **breaking**) Change omitEmptyParams to removeMissingValuesFrom ([#63](https://github.com/zapier/zapier-platform-schema/pull/63))
- :tada: (improvement) attempt to hoist better errors ([#62](https://github.com/zapier/zapier-platform-schema/pull/62))
- (doc) Document that helpText supports markdown ([#61](https://github.com/zapier/zapier-platform-schema/pull/61))
### core
- :exclamation: (improvement, **breaking**) Rename `omitEmptyParams` to `removeMissingValuesFrom`. In **typescript**, this is erroneously marked as required. In the next release, it will be optional. ([#140](https://github.com/zapier/zapier-platform-core/pull/140))
- :exclamation: (improvement, **breaking**) Resolve curlies to their original data type ([#139](https://github.com/zapier/zapier-platform-core/pull/139))
- :exclamation: (improvement, **breaking**) Rename `bundle.meta` keys (server change, see [CLI #393](https://github.com/zapier/zapier-platform-cli/pull/393) for more info)
- (improvement) preserve objects passed to inputData in the bundle bank ([#141](https://github.com/zapier/zapier-platform-core/pull/141))
- (improvement) Resolve subscription related bundle fields ([#138](https://github.com/zapier/zapier-platform-core/pull/138))
- (improvement) Prune unmatched tokens from request ([#137](https://github.com/zapier/zapier-platform-core/pull/137))
- (chore) Resolving potential security vulnerability in lodash dependency ([#136](https://github.com/zapier/zapier-platform-core/pull/136))
## 7.6.1
### cli
- (fix) `zapier push` doesn't stop on validation errors ([#388](https://github.com/zapier/zapier-platform-cli/pull/388))
- (doc) Fix a typo in OAuth1 doc ([#391](https://github.com/zapier/zapier-platform-cli/pull/391), [#392](https://github.com/zapier/zapier-platform-cli/pull/392))
- (doc) Update the AWS Lambda supported Node.js links ([#390](https://github.com/zapier/zapier-platform-cli/pull/390))
- (doc) Update `outputFields` doc to reflect current reality ([#386](https://github.com/zapier/zapier-platform-cli/pull/386))
### core
- (fix) Can't use unencrypted `https://` protocol when SSL checks are disabled ([#135](https://github.com/zapier/zapier-platform-core/pull/135))
## 7.6.0
### cli
- (improvement) `zapier convert` command has been reworked and greatly improved. Now it generates code that is more likely to work out of the box! ([#380](https://github.com/zapier/zapier-platform-cli/pull/380))
- (improvement) Refactor to use async/await in build command ([#382](https://github.com/zapier/zapier-platform-cli/pull/382))
### core
- (fix) Don't add `searchOrCreates` if either is hidden ([#134](https://github.com/zapier/zapier-platform-core/pull/134))
## 7.5.0
### cli
- (doc) Various doc improvements ([#374](https://github.com/zapier/zapier-platform-cli/pull/374))
### schema
- :tada: (new) Add OAuth1 support. Read [doc](https://zapier.github.io/zapier-platform-cli/#oauth1) for detail. [doc](<[#59](https://github.com/zapier/zapier-platform-schema/pull/59)>)
- (doc) Be more clear about whether hook methods are required ([#58](https://github.com/zapier/zapier-platform-schema/pull/58))
### core
- :tada: (new) Add OAuth1 support. Read [doc](https://zapier.github.io/zapier-platform-cli/#oauth1) for detail. ([#126](https://github.com/zapier/zapier-platform-core/pull/126))
- (fix) Make sure to censor URL-encoded values ([#129](https://github.com/zapier/zapier-platform-core/pull/129))
- (fix) Cursor reading didn't work in tests ([#125](https://github.com/zapier/zapier-platform-core/pull/125))
- (improvement) [Shorthand HTTP requests](https://zapier.github.io/zapier-platform-cli/#shorthand-http-requests) now parse `x-www-form-urlencoded` response bodies as well. Your app **could** break if your application server returns a JSON response body but with a `Content-Type: application/x-www-form-urlencoded` header. Switch to `z.request` if that's the case. ([#126](https://github.com/zapier/zapier-platform-core/pull/126))
## 7.4.0
### cli
- (fix) deasync binary is missing in Windows build ([#370](https://github.com/zapier/zapier-platform-cli/pull/370))
- (doc) Document digest auth ([#368](https://github.com/zapier/zapier-platform-cli/pull/368))
### core
- :tada: (new) Add support for digest auth. Read [doc](https://zapier.github.io/zapier-platform-cli/#digest) for detail. ([#123](https://github.com/zapier/zapier-platform-core/pull/123))
- (fix) `z.stashFile` doesn't pick up filename in `Content-Disposition` ([#124](https://github.com/zapier/zapier-platform-core/pull/124))
## 7.3.0
### cli
- (improvement) Add Dynamic Dropdown example app ([#363](https://github.com/zapier/zapier-platform-cli/pull/363))
- (improvement) Add smoke tests ([#361](https://github.com/zapier/zapier-platform-cli/pull/361), [#362](https://github.com/zapier/zapier-platform-cli/pull/362))
- (doc) Document `z.dehydrateFile` ([#360](https://github.com/zapier/zapier-platform-cli/pull/360))
- (doc) Document `outputFields` ([#365](https://github.com/zapier/zapier-platform-cli/pull/365))
- (doc) Update docs to reflect support for `async/await` ([#359](https://github.com/zapier/zapier-platform-cli/pull/359))
### schema
- :tada: (new) Add `omitEmptyParams` to `RequestSchema` ([#57](https://github.com/zapier/zapier-platform-schema/pull/57))
- (improvement) Add smoke tests ([#55](https://github.com/zapier/zapier-platform-schema/pull/55))
### core
- :tada: (new) Introduce `z.dehydrateFile` - a new recommended method to dehydrate a file. Read [doc](https://zapier.github.io/zapier-platform-cli/#file-dehydration) for detail. ([#112](https://github.com/zapier/zapier-platform-core/pull/112), [#120](https://github.com/zapier/zapier-platform-core/pull/120))
- :tada: (new) Add `omitEmptyParams` option to clean up empty request params automatically. Read [doc](https://zapier.github.io/zapier-platform-schema/build/schema.html#requestschema) for detail. ([#121](https://github.com/zapier/zapier-platform-core/pull/121))
- (fix) Fix null error handling ([#117](https://github.com/zapier/zapier-platform-core/pull/117))
- (improvement) Add smoke tests ([#116](https://github.com/zapier/zapier-platform-core/pull/116))
## 7.2.2
### core
- (fix) Sign dehydrated payloads for better security ([#111](https://github.com/zapier/zapier-platform-core/pull/111))
## 7.2.1
### core
- (fix) Allow to disable SSL certificate check ([#110](https://github.com/zapier/zapier-platform-core/pull/110))
## 7.2.0
### cli
- (fix) Include required binary in the build ([#350](https://github.com/zapier/zapier-platform-cli/pull/350))
### schema
- (fix) Add `copy` field type to `FieldSchema` ([#52](https://github.com/zapier/zapier-platform-schema/pull/52))
- (docs) Clarify `BasicDisplaySchema` directions description ([#51](https://github.com/zapier/zapier-platform-schema/pull/51))
### core
- (improvement) Better `AppTester` typescript bindings ([#103](https://github.com/zapier/zapier-platform-core/pull/103))
## 7.1.0
### cli
- (fix) Migrating by email shouldn't ask for promote ([#341](https://github.com/zapier/zapier-platform-cli/pull/341))
- (fix) Fix "epxeriencing" -> "experiencing" typo ([#338](https://github.com/zapier/zapier-platform-cli/pull/338))
- (fix) Fix failing Travis badge ([#343](https://github.com/zapier/zapier-platform-cli/pull/343))
- (improvement) Truncate `source_zip` in logs ([#348](https://github.com/zapier/zapier-platform-cli/pull/348))
- (improvement) Migrate to cli-table3 ([#327](https://github.com/zapier/zapier-platform-cli/pull/327))
- (docs) Session auth should be using `authData` instead of `inputData` ([#346](https://github.com/zapier/zapier-platform-cli/pull/346))
## 7.0.0
### cli
- (improvement) Bump Node.js version to 8 ([#328](https://github.com/zapier/zapier-platform-cli/pull/328))
- (improvement) Ask for promote when fully migrating a public app ([#326](https://github.com/zapier/zapier-platform-cli/pull/326))
- (improvement) Add typescript example app ([#329](https://github.com/zapier/zapier-platform-cli/pull/329))
- (improvement) Reduce package size ([#330](https://github.com/zapier/zapier-platform-cli/pull/330))
### schema
- (improvement) Bump Node.js version to 8 ([#48](https://github.com/zapier/zapier-platform-schema/pull/48))
- (improvement) Reduce package size ([#49](https://github.com/zapier/zapier-platform-schema/pull/49))
### core
- :exclamation: (improvement, **breaking**) Bump Node.js version to **8.10.0**. Apps with dependency `zapier-platform-core >= 7.0.0` run only on Node.js **8.10.0** in AWS Lambda. If you need to continue running on Node.js 6.10.3, use `zapier-platform-core <= 6.1.0`" ([#94](https://github.com/zapier/zapier-platform-core/pull/94))
- (fix) Add cursor to typings ([#95](https://github.com/zapier/zapier-platform-core/pull/95))
- (improvement) Reduce package size ([#97](https://github.com/zapier/zapier-platform-core/pull/97))
## 6.1.0
### cli
- (fix) Fix typo in `zapier register` text ([#324](https://github.com/zapier/zapier-platform-cli/pull/324))
- (fix) Fix `npm audit` security warnings ([#320](https://github.com/zapier/zapier-platform-cli/pull/320))
- (fix) `zapier convert` doesn't escape sample field labels ([#313](https://github.com/zapier/zapier-platform-cli/pull/313))
- (docs) Remove Digest auth references ([#323](https://github.com/zapier/zapier-platform-cli/pull/323))
- (docs) Add cursor docs ([#309](https://github.com/zapier/zapier-platform-cli/pull/309))
### schema
- (fix) Fix `npm audit` security warnings ([#46](https://github.com/zapier/zapier-platform-schema/pull/46))
### core
- :tada: (new) `z.cursor` store ([#76](https://github.com/zapier/zapier-platform-core/pull/76))
- (fix) Fix missed logs ([#91](https://github.com/zapier/zapier-platform-core/pull/91))
- (fix) Middleware isn't compiled ([#90](https://github.com/zapier/zapier-platform-core/pull/90))
- (fix) Fix `npm audit` security warnings ([#87](https://github.com/zapier/zapier-platform-core/pull/87))
- (improvement) Add typings ([#82](https://github.com/zapier/zapier-platform-core/pull/82))
## 6.0.0
### cli
- :exclamation: (improvement, **breaking**) JSON format only outputs valid JSON. This is only breaking if you were working around the formatting to process the JSON before ([#260](https://github.com/zapier/zapier-platform-cli/pull/260))
- (improvement) Better spinner ([#260](https://github.com/zapier/zapier-platform-cli/pull/260))
### schema
- :exclamation: (improvement, **breaking**) Fail validation if the top-level key doesn't match trigger/search/creates' `.key`. This fixes a bug where a trigger could be duplicated in the UI ([#41](https://github.com/zapier/zapier-platform-schema/pull/41))
- (docs) Add doc annotation for hook type ([#44](https://github.com/zapier/zapier-platform-schema/pull/44))
- (docs) Make long examples more readable ([#42](https://github.com/zapier/zapier-platform-schema/pull/42))
### core
- :exclamation: (improvement, **breaking**) Throw an error for key collisions between resources and standalone objects. This was previously a warning, so it shouldn't catch anyone by surprise ([#73](https://github.com/zapier/zapier-platform-core/pull/73))
- :exclamation: (improvement, **breaking**) Remove `bundle.environment`. This has always been deprecated, but now it shouldn't show up in the bundle anymore. Given that it hasn't held data, this shouldn't cause a lot of friction ([#72](https://github.com/zapier/zapier-platform-core/pull/72))
## 5.2.0
### cli
- :tada: (new) Add option to `zapier logs` to show bundle logs ([PR](https://github.com/zapier/zapier-platform-cli/pull/291))
- (fix) Fix `zapier build` from crashing on missing packages ([PR](https://github.com/zapier/zapier-platform-cli/pull/301))
- (fix) Fix `zapier convert` from crashing on certain OAuth config ([PR](https://github.com/zapier/zapier-platform-cli/pull/299))
- (fix) Fix `zapier convert` from crashing on a number in auth mapping ([PR](https://github.com/zapier/zapier-platform-cli/pull/305))
- (improvement) `zapier build` prints any errors from `npm install` ([PR](https://github.com/zapier/zapier-platform-cli/pull/288))
- (docs) Add note about nested dynamic functions ([PR](https://github.com/zapier/zapier-platform-cli/pull/296))
- (docs) Add docs about `bundle.cleanedRequest` and `bundle.rawRequest` ([PR](https://github.com/zapier/zapier-platform-cli/pull/298))
### schema
- (fix) Correctly invalidate field grandchildren ([PR](https://github.com/zapier/zapier-platform-schema/pull/40))
- (docs) More examples on functional constraints ([PR](https://github.com/zapier/zapier-platform-schema/pull/39))
### core
- (fix) Raise exception for bad requests when stashing a file ([PR](https://github.com/zapier/zapier-platform-core/pull/75))
- (fix) Better log censoring ([PR](https://github.com/zapier/zapier-platform-core/pull/77))
## 5.1.0
### cli
- :tada: (new) Add "did you mean" on unrecognized commands ([PR](https://github.com/zapier/zapier-platform-cli/pull/278))
- (fix) Fix hang issue when printing data on skinny terminal ([PR](https://github.com/zapier/zapier-platform-cli/pull/283))
- (fix) Server returns error when running `zapier logs --debug` ([PR](https://github.com/zapier/zapier-platform-cli/pull/254))
- (fix) Exclude unwanted files when doing `zapier build --disable-dependency-detection` ([PR](https://github.com/zapier/zapier-platform-cli/pull/258))
- (fix) Don't overwrite `.zapierapprc` completely ([PR](https://github.com/zapier/zapier-platform-cli/pull/275))
- (fix) Fix "CUSTOM_FIELDS_URL is not defined" error for `zapier convert` ([PR](https://github.com/zapier/zapier-platform-cli/pull/277))
- (improvement) Less nagging about updating packages ([PR](https://github.com/zapier/zapier-platform-cli/pull/282))
- (improvement) Add "github" and "search-or-create" example apps ([PR](https://github.com/zapier/zapier-platform-cli/pull/259), [PR2](https://github.com/zapier/zapier-platform-cli/pull/287))
- (improvement) `zapier promote` error messages now look better ([PR](https://github.com/zapier/zapier-platform-cli/pull/280))
- (improvement) Remove unnecessary `.nvmrc` logic ([PR](https://github.com/zapier/zapier-platform-cli/pull/256))
- (improvement) `zapier convert` supports static dropdown ([PR](https://github.com/zapier/zapier-platform-cli/pull/267))
- (improvement) `zapier convert` supports auth mapping better ([PR](https://github.com/zapier/zapier-platform-cli/pull/257))
- (improvement) Fix auth issue with full scripting methods for `zapier convert` ([PR](https://github.com/zapier/zapier-platform-cli/pull/271))
- (improvement) `zapier convert` converts samples, too ([PR](https://github.com/zapier/zapier-platform-cli/pull/266))
- (improvement) `zapier convert` respects auth field keys in test code ([PR](https://github.com/zapier/zapier-platform-cli/pull/274))
- (improvement) `zapier convert` generates `.env` instead of `.environment` ([PR](https://github.com/zapier/zapier-platform-cli/pull/276))
- (improvement) `zapier convert` includes input fields to test code ([PR](https://github.com/zapier/zapier-platform-cli/pull/246))
- (improvement) Fix session auth environment variable name for `zapier convert` ([PR](https://github.com/zapier/zapier-platform-cli/pull/281))
- (docs) FAQ about when to use placeholders or curlies ([PR](https://github.com/zapier/zapier-platform-cli/pull/252))
### schema
- (fix) Only require samples for non-hidden operations ([PR](https://github.com/zapier/zapier-platform-schema/pull/33))
- (fix) Correctly validate `children` as an array of fields ([PR](https://github.com/zapier/zapier-platform-schema/pull/34))
- (fix) Doc rendering issue ([PR](https://github.com/zapier/zapier-platform-schema/pull/35))
- (docs) Add doc annotation ([PR](https://github.com/zapier/zapier-platform-schema/pull/38))
### core
- (improvement) Bump Node version to 6.10.3 ([PR](https://github.com/zapier/zapier-platform-core/pull/69))
- (improvement) Deprecate `.environment` in favor of `.env` ([PR](https://github.com/zapier/zapier-platform-core/pull/70))
- (improvement) Support test framework other than Mocha ([PR](https://github.com/zapier/zapier-platform-core/pull/65))
- (improvement) `z.console.log` also calls `console.log` ([PR](https://github.com/zapier/zapier-platform-core/pull/66))
- (improvement) Check for object in create ([PR](https://github.com/zapier/zapier-platform-core/pull/67))
## 5.0.0
### cli
- :tada: (new) The CLI can now run, test, and build on any version of Node.js! ([PR](https://github.com/zapier/zapier-platform-cli/pull/234))
- :tada: (new) Read deploy key from env if available ([PR](https://github.com/zapier/zapier-platform-cli/pull/239))
- (improvement) More specific error messages for invalid installs ([PR](https://github.com/zapier/zapier-platform-cli/pull/238))
- (fix) `zapier env` no longer throws an error on Node versions >=8.0 ([PR](https://github.com/zapier/zapier-platform-cli/pull/242))
- (improvement) `zapier convert` creates a .gitignore for new apps ([PR](https://github.com/zapier/zapier-platform-cli/pull/237))
- (improvement) `zapier convert` properly escapes labels and descriptions ([PR](https://github.com/zapier/zapier-platform-cli/pull/233), [commit](https://github.com/zapier/zapier-platform-cli/commit/6d8014e9c04abb5f939affd19888c447ae1abca1))
- (improvement) `zapier convert` only sends a token when it exists, not before ([PR](https://github.com/zapier/zapier-platform-cli/pull/236))
- (improvement) `zapier convert` generates .environment and gives hint about editting it ([PR](https://github.com/zapier/zapier-platform-cli/pull/240))
- (improvement) Don't require an `id` field in tests generated by `zapier convert` ([PR](https://github.com/zapier/zapier-platform-cli/pull/243))
- (improvement) `zapier convert` adds track info to package.json ([PR](https://github.com/zapier/zapier-platform-cli/pull/245))
- (docs) FAQ section in the README ([PR](https://github.com/zapier/zapier-platform-cli/pull/231))
### schema
- :exclamation: (improvement, **breaking**) `sample` is now a required field in `BasicOperationSchema` and friends. See [this doc](https://zapier.com/developer/documentation/v2/trigger-sample-results/) for more info ([PR](https://github.com/zapier/zapier-platform-schema/pull/32))
- :exclamation: (improvement, **breaking**) `order` has been removed from `BasicDisplaySchema` ([PR](https://github.com/zapier/zapier-platform-schema/pull/27))
### core
- (improvement) Log when actions generated by a resource collide with manually defined ones ([PR](https://github.com/zapier/zapier-platform-core/pull/63))
- (improvement) Properly log gzipped responses ([PR](https://github.com/zapier/zapier-platform-core/pull/62))
## 4.3.2
- (Fix) [Permission denied with `index.js`.](https://github.com/zapier/zapier-platform-cli/pull/224)
- (Fix) [`zapier convert` didn't escape line breaks in app description.](https://github.com/zapier/zapier-platform-cli/pull/226)
- (Doc) [Add FAQs section.](https://github.com/zapier/zapier-platform-cli/pull/225)
- [Ensure users are authenticated before building or pushing.](https://github.com/zapier/zapier-platform-cli/pull/227)
## 4.3.1
- (Fix) [Broken patching on http.request.](https://github.com/zapier/zapier-platform-core/pull/61)
## 4.3.0
- (New) `zapier convert` now supports [custom auth mapping](https://github.com/zapier/zapier-platform-cli/pull/200), [searchOrCreates](https://github.com/zapier/zapier-platform-cli/pull/207) and ["Send to Action Endpoint URL in JSON body" checkbox](https://github.com/zapier/zapier-platform-cli/pull/204).
- (New) [`zapier scaffold` now also creates a test.](https://github.com/zapier/zapier-platform-cli/pull/212)
- (New) [Allow ordering static dropdowns.](https://github.com/zapier/zapier-platform-schema/pull/30)
- (Fix) [Properly replace variables in URLs in `zapier convert` generated code.](https://github.com/zapier/zapier-platform-cli/pull/208)
- (Fix) [Fix TypeError in `http.request` patch.](https://github.com/zapier/zapier-platform-core/pull/59)
- (Doc) [Clarify pushing doesn't reload browser automatically.](https://github.com/zapier/zapier-platform-cli/pull/218)
- [Use working endpoints for scaffolds.](https://github.com/zapier/zapier-platform-cli/pull/215)
- [Notify for update less often.](https://github.com/zapier/zapier-platform-cli/pull/210)
- [Introduce Prettier into development process.](https://github.com/zapier/zapier-platform-cli/pull/209)
- [Ensure all template code use z.JSON.parse.](https://github.com/zapier/zapier-platform-cli/pull/216)
## 4.2.3
- The first build made by Travis CI!
## 4.2.1
- (Fix) Repack zapier-platform-core to really fix bloated size
## 4.2.0
- (New) `zapier convert` now supports [input](https://github.com/zapier/zapier-platform-cli/pull/196) and [output custom fields](https://github.com/zapier/zapier-platform-cli/pull/199).
- (New) [Prettify `zapier convert` generated code.](https://github.com/zapier/zapier-platform-cli/pull/202)
- (Fix) [Fix bloated size of zapier-platform-core 4.1.0 package.](https://github.com/zapier/zapier-platform-core/pull/56)
- (Fix) [Fix typos in docs.](https://github.com/zapier/zapier-platform-cli/pull/197)
- (Doc) [Add 'Mocking Requests' section to docs.](https://github.com/zapier/zapier-platform-cli/pull/201)
- (Doc) [Mark step 'order' as deprecated.](https://github.com/zapier/zapier-platform-schema/pull/28)
## 4.1.0
- (New) `zapier convert` now supports [auth](https://github.com/zapier/zapier-platform-cli/pull/185) and [search](https://github.com/zapier/zapier-platform-cli/pull/186) scripting methods.
- (New) [Allow to migrate users by email.](https://github.com/zapier/zapier-platform-cli/pull/192)
- (New) [Accept changelog for app promotion.](https://github.com/zapier/zapier-platform-cli/pull/194)
- (Doc) [Add explanation about uppercased env vars.](https://github.com/zapier/zapier-platform-cli/pull/195)
- [Improve first promote message.](https://github.com/zapier/zapier-platform-cli/pull/191)
## 4.0.0
- (**BREAKING**) (Fix) [Encode form requests with + instead of %20 by default](https://github.com/zapier/zapier-platform-core/pull/52)
- (**BREAKING**) (Fix) [Don't add content-type if there's one](https://github.com/zapier/zapier-platform-core/pull/55)
- (Fix) [Replace \_.truncate, save memory.](https://github.com/zapier/zapier-platform-core/pull/54)
- (Fix) [fix: exit code 1 for only for errors](https://github.com/zapier/zapier-platform-cli/pull/154)
- (Fix) [`zapier convert`: Escape special chars in field help text](https://github.com/zapier/zapier-platform-cli/pull/182)
- (Fix) [`zapier convert`: Normalize newlines in scripting ](https://github.com/zapier/zapier-platform-cli/pull/183)
- (New) [`zapier convert`: Generate create code based on different scripting method combinations](https://github.com/zapier/zapier-platform-cli/pull/181)
- (New) [`zapier convert`: Ignore \_pre_poll and \_post_poll if \_poll exists ](https://github.com/zapier/zapier-platform-cli/pull/187)
- (New) [Customize update notification message](https://github.com/zapier/zapier-platform-cli/pull/188)
- (New) [Allow to include a regexp of paths for the build file](https://github.com/zapier/zapier-platform-cli/pull/158)
- (New) [Add example docs about computed fields.](https://github.com/zapier/zapier-platform-cli/pull/184)
## 3.3.0
- [Log http(s) requests for non-client library](https://github.com/zapier/zapier-platform-core/pull/51)
- Many improvements for `zapier convert`: [Copy noun](https://github.com/zapier/zapier-platform-cli/pull/159), [Copy display label](https://github.com/zapier/zapier-platform-cli/pull/160), [Copy description](https://github.com/zapier/zapier-platform-cli/pull/163), [Copy important and hidden props](https://github.com/zapier/zapier-platform-cli/pull/166), [Add more tests](https://github.com/zapier/zapier-platform-cli/pull/170), [Converting more auths](https://github.com/zapier/zapier-platform-cli/pull/167), [Allowing deasync in build](https://github.com/zapier/zapier-platform-cli/pull/169), [Converting scripting for triggers](https://github.com/zapier/zapier-platform-cli/pull/172), [Support for dynamic dropdowns and search-powered fields](https://github.com/zapier/zapier-platform-cli/pull/173), [Adding a command for integrations test](https://github.com/zapier/zapier-platform-cli/pull/175), [Add basic tests for triggers, creates, and searches](https://github.com/zapier/zapier-platform-cli/pull/178), [Remove empty help text](https://github.com/zapier/zapier-platform-cli/pull/179)
- [Skip style check on invalid apps](https://github.com/zapier/zapier-platform-cli/pull/168)
- [Add header to docs](https://github.com/zapier/zapier-platform-cli/pull/153)
- [Add option to `--grep` on `zapier test`](https://github.com/zapier/zapier-platform-cli/pull/177)
## 3.2.1
- [Fixes a problem with a sub-sub-dependency](https://github.com/zapier/zapier-platform-cli/issues/157).
## 3.2.0
- [Allow invitations per version](https://github.com/zapier/zapier-platform-cli/pull/150). Try `zapier help invite` for more details.
- [Added bundle.meta.zap.id for performSubscribe and performUnsubscribe](https://github.com/zapier/zapier-platform-cli/pull/149).
- [Allow modules to be objects in app definitions](https://github.com/zapier/zapier-platform-core/pull/48).
- [Use "application" discrete-type instead of "binary" as default content type.](https://github.com/zapier/zapier-platform-core/pull/49).
- [Use un-obfuscated data when logging to stdout](https://github.com/zapier/zapier-platform-core/pull/50).
- Improved/fixed sample and scaffolding code in docs.
- Fixed typos in docs.
## 3.1.0
- [Allow setting a `Content-Type` when stashing a file](https://github.com/zapier/zapier-platform-core/pull/47)
- [Increase dehydrator max payload size to 2 KB](https://github.com/zapier/zapier-platform-core/pull/46)
## 3.0.1
- Fixed node/npm dependency check for 3.x.
- Fixed URL base endpoint in docs.
## 3.0.0
- (**BREAKING**) `inputField`s will now start [throwing errors in Schema validation](https://github.com/zapier/zapier-platform-schema/pull/25) if there are mutually-exclusive fields.
- [Added subdomain field support to CLI apps](https://github.com/zapier/zapier-platform-schema/pull/26).
- [Allowed file stashing within a create/action](https://github.com/zapier/zapier-platform-core/pull/45).
- [Added style checks to `zapier build`](https://github.com/zapier/zapier-platform-cli/pull/130).
- Fixed [`zapier build` on Windows](https://github.com/zapier/zapier-platform-cli/pull/122).
## 2.2.0
- It's now possible to delete apps and app versions with [`zapier delete`](https://zapier.github.io/zapier-platform-cli/cli.html#delete)!
- You'll now get a warning when doing `zapier push` or `zapier upload` if your app's `zapier-platform-core` version is not up-to-date.
- It's now possible to skip validation when testing with [`zapier test --skip-validate`](https://zapier.github.io/zapier-platform-cli/cli.html#test)!
- Added docs around upgrading.
- Improved docs around authentication, migration, deprecation, and dehydration.
- Fixed `zapier logs --version=x.x.x` showing `zapier --version`.
- Improved error messages for [some schema validation errors](https://github.com/zapier/zapier-platform-schema/pull/24).
- Fixed Python error when a create, as part of a search or create, returned a list with one item ([errors sooner, in core now, with a nicer message](https://github.com/zapier/zapier-platform-core/pull/44)).
- [Objects received via Hook triggers no longer require an `id`, and checks were improved](https://github.com/zapier/zapier-platform-core/pull/43).
- Minor misc fixes.
## 2.1.0
- [Connection Label is now available](https://zapier.github.io/zapier-platform-schema/build/schema.html#authenticationschema) (`connectionLabel: '{{bundle.inputData.email}}'` inside `authentication`)
- [Locking is now available for `create`](https://zapier.github.io/zapier-platform-schema/build/schema.html#createschema) (`shouldLock: true` inside `.operation`)
- Fix typos in docs
## 2.0.1
- Fix broken appTester on Windows OS.
- Require the exact version of zapier-platform-core in package.json.
- Document middleware's z object lacks z.request.
- Fix typo in session auth docs.
## 2.0.0
- (**BREAKING**) CLI 2.x apps run only on NodeJS `v6.10.2` in AWS Lambda. If you need to run on NodeJS `v4.3.2`, use the CLI 1.x release.
- (**BREAKING**) Delete property `searchOrCreate` from the properties of ResourceSchema.
- Style checks run by default during `zapier validate`.
- Validation is run during `zapier test`.
- The CLI now uses update-notifier to let you know when there's a new version available.
- Rename `global` to `public` for consistency across Zapier platform.
## 1.0.11
- `zapier --validate` now includes the `--include-style` flag to validate against [style checks](https://zapier.com/developer/documentation/v2/style-checks-reference/).
- There are extra checks around return types from triggers, searches, and creates.
- Some doc typos were squashed.
## 1.0.10
- Added new Files example app with `zapier init . --template=files`.
- Properly exit on node version mismatch while running `zapier test`.
- Upgraded `node-fetch` in `core` (fixes some edge-case issues for `multipart/form-data` requests).
- `zapier test` is now quiet by default. `zapier test --debug` will output details.
- `zapier logs --type=http --detailed` is more clearly exposed.
- Fixes `searchOrCreate` schema validation error for resources with `search` and `create`.
## 1.0.9
- Functions in `app.afterResponse` will now get called.
- Add check in middleware, to make sure creates return only 1 object.
- Fixes issue for deep object checking.
- Minor docs fixes.
## 1.0.8
- `z.stashFile` is no longer allowed outside of `hydrators`.
- Adding analytics to the web-based documentation.
- Minor docs fixes.
## 1.0.7
- Improved `link` command UX on error/non-existing apps.
## 1.0.6
- Fixed `convert` command for `outputFields`.
- Improvements on `validate-templates` and `zapier test` (now supports `--timeout=5000`).
- Minor docs fixes.
## 1.0.5
- Use `ZAPIER_BASE_ENDPOINT` for `push` and `convert`.
- Don't show command help on error.
- Minor docs fixes.
## 1.0.4
- Fix issues in Windows.
- Minor docs fixes.
## 1.0.3
- Fixes fatal error when `build` directory didn't exist.
- Minor docs fixes.
## 1.0.2
- Support streamed non-ascii files in `z.stashFile`.
- Minor docs fixes.
## 1.0.1
- Minor docs fixes.
## 1.0.0
- Removing beta "label".
- Minor docs fixes.
## 0.10.2
- Added `dict` property for `inputFields`, to allow asking for a dictionary (key/value pair) input.
- Added new REST Hooks example app with `zapier init . --template=rest-hooks`.
- Fixed: Now correctly ask for line items when `children` is set.
## 0.10.1
- Added `search` property for `inputFields`, to allow linking a search connector.
## 0.10.0
- **BREAKING CHANGE** Removed `getResourceOperation` in creates/searches in favor of `performGet`.
- Added support for `performList` in webhook triggers
- Fixed: Now correctly copy outputFields and samples to a trigger/search/create operation that links to a resource
## 0.9.12
- Added `performList` to hook operations.
## 0.9.10
- Documentation expanded:
- Updated `z.dehydrate()` / `appTester()` / examples to reflect the new arguments.
- `z.dehydrate('someFunction')` must be `z.dehydrate(App.hydrators.someFunction)`
- `appTester('contact.list')` must be `appTester(App.resources.contact.list.operation.perform)`
- Documented fields, custom/dynamic fields, and dynamic dropdowns plus examples.
- `zapier env ... -remove` flag documented.
- `zapier describe` now describes much more about the app - included auth info, redirect_uri, resources and all resource paths.
- fixed `zapier scaffold` bug with undefined `INPUT_FIELDS`
## 0.9.9
Initial release to public. Read docs here https://github.com/zapier/zapier-platform-cli.

View file

@ -0,0 +1,617 @@
## 13.0.0
_released `2023-01-25`_
Version `13.0.0` is a breaking change release that contains several important upgrades and deprecations. Here is a brief breakdown of the most notable changes (see further below for a more detailed list of changes):
(a) Any integrations that depend on `zapier-platform-core@13.0.0` will now run on Node.js 16.
(b) We are dropping support for Node.js 12, which has been designated end-of-life since early 2022 ([see the Node.js release schedule](https://github.com/nodejs/release#release-schedule)).
(c) As part of internal Zapier changes to the way we process trigger data, **stricter type coercion** for trigger parameters is now enabled by default for integrations running on `zapier-platform-core@13.0.0`. This is a good time to double check if your defined trigger parameter types are coherent with what your app expects at runtime.
(d) Web Builder conversion functionality has been removed. This change is only relevant for [Legacy Web Builder apps](https://platform.zapier.com/legacy/import).
Those are the breaking changes for this major version `13.0.0` release. We are also including some package version bumps, with the changes consisting mostly of dropping older Node versions. As always with any major release, make sure to thoroughly test your integrations after updating!
Detailed changelog below (**:exclamation: denotes a breaking change**):
### cli
- :exclamation: Remove Web Builder conversion functionality. ([#546](https://github.com/zapier/zapier-platform/pull/546))
- :exclamation: Make `--version` required on `zapier convert`. ([#546](https://github.com/zapier/zapier-platform/pull/546))
- :hammer: Improved error handling in the convert command. ([#546](https://github.com/zapier/zapier-platform/pull/546))
- :scroll: Removed references to converting WB apps in the docs. ([#546](https://github.com/zapier/zapier-platform/pull/546))
### core
- :exclamation: Apps can now use Node.js v16.x and Node.js v12.x is no longer supported. ([#603](https://github.com/zapier/zapier-platform/pull/603))
- :exclamation: Parameters for triggers now have strict type coercion. This means that if a parameter is defined as an integer and a string representation of an integer is provided, Zapier will now convert the value to an integer before it reaches the developer's code.
### schema
None!
### misc
- :hammer: Dependency updates ([#608](https://github.com/zapier/zapier-platform/pull/608))
- Replaced `eslint-plugin-node@11.1.0` with `eslint-plugin-n@15.6.1`
- Bump `@oclif/command` from 1.8.0 to 1.8.21
- Bump `@oclif/config` from 1.17.0 to 1.18.6
- Bump `@oclif/dev-cli` from 13.0.11 to 13.3.0
- Bump `@types/node` from 14.14.35 to 18.11.18
- Bump `adm-zip` from 0.5.5 to 0.5.10
- Bump `archiver` from 5.3.0 to 5.3.1
- Bump `aws-sdk` from 2.905.0 to 2.1300.0
- Bump `cli-table3` from 0.6.0 to 0.6.3
- Bump `content-disposition` from 0.5.3 to 0.5.4
- Bump `debug` from 4.3.1 to 4.3.4
- Bump `dicer` from 0.3.0 to 0.3.1
- Bump `dotenv` from 9.0.2 to 12.0.4
- Bump `eslint` from 7.26.0 to 8.32.0
- Bump `eslint-config-prettier` from 8.3.0 to 8.6.0
- Bump `eslint-config-standard` from 16.0.2 to 17.0.0
- Bump `eslint-plugin-import` from 2.22.1 to 2.27.5
- Bump `eslint-plugin-mocha` from 8.1.0 to 9.0.0
- Bump `eslint-plugin-promise` from 5.1.0 to 6.1.1
- Bump `flat` from 5.0.1 to 5.0.2
- Bump `gulp-prettier` from 3.0.0 to 4.0.0
- Bump `husky` from 6.0.0 to 7.0.4
- Bump `inquirer` from 8.0.0 to 8.2.5
- Bump `nock` from 13.0.11 to 13.3.0
- Bump `prettier` from 2.3.0 to 2.8.3
- Bump `semver` from 7.3.5 to 7.3.8
- Bump `lint-staged` from 11.0.0 to 11.2.6
- Bump `ignore` from 5.1.8 to 5.2.4
- Bump `jscodeshift` from 0.12.0 to 0.14.0
- Bump `klaw` from 3.0.0 to 4.1.0
- Bump `lerna` from 4.0.0 to 6.4.1
- Bump `marked` from 4.0.10 to 4.2.12
- Bump `marked-terminal` from 4.1.1 to 5.1.1
- Bump `mime-types` from 2.1.34 to 2.1.35
- Bump `mocha` from 8.4.0 to 10.2.0
- Bump `read` from 1.0.7 to 2.0.0
- Bump `yeoman-generator` from 5.2.0 to 5.7.0
## 12.2.1
_released `2023-01-18`_
### cli
- :scroll: Improve docs about input field types ([#585](https://github.com/zapier/zapier-platform/pull/585))
- :scroll: Improve docs about OAuth2 fields ([#589](https://github.com/zapier/zapier-platform/pull/589))
- :scroll: More strongly recommend use of `z.dehydrateFile` for files ([#590](https://github.com/zapier/zapier-platform/pull/590))
- :scroll: Update logging info ([#591](https://github.com/zapier/zapier-platform/pull/591))
- :scroll: Fix `zapier init` command ([#594](https://github.com/zapier/zapier-platform/pull/594))
- :scroll: Fix typo ([#593](https://github.com/zapier/zapier-platform/pull/593))
- :scroll: Fix logo ([#604](https://github.com/zapier/zapier-platform/pull/604))
- :hammer: Dependency updates
- Bump typescript from 3.8.3 to 4.9.4 to fix a test ([#599](https://github.com/zapier/zapier-platform/pull/599))
- Bump decode-uri-component from 0.2.0 to 0.2.2 ([#596](https://github.com/zapier/zapier-platform/pull/596))
- Bump json5 from 1.0.1 to 1.0.2 ([#601](https://github.com/zapier/zapier-platform/pull/601))
### core
- None!
### schema
- :test_tube: Relax schema on `searchUniqueInputToOutput` for upsert to support dynamic fields. **EXPERIMENTAL: Currently an internal feature. Don't use it yet.** ([#602](https://github.com/zapier/zapier-platform/pull/602))
### misc
- :hammer: Dependency updates
- Bump qs from 6.5.2 to 6.5.3 ([#598](https://github.com/zapier/zapier-platform/pull/598))
## 12.2.0
_release `2022-10-27`_
### cli
- :nail_care: Now you don't have to install zapier-platform-core to run [most of the commands](https://github.com/zapier/zapier-platform/pull/579#pullrequestreview-1145066736) ([#579](https://github.com/zapier/zapier-platform/pull/579))
### core
- :hammer: Dependency updates
- Bump secret-scrubber from 1.0.3 to 1.0.7 ([#583](https://github.com/zapier/zapier-platform/pull/583))
### schema
- :test_tube: "Upsert" feature: Now a [search-or-create](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@12.2.0/packages/schema/docs/build/schema.md#searchorcreateschema) can include an `update` action that Zapier should call to update an existing object. **EXPERIMENTAL: This is currently an internal feature and subject to change. Don't use it yet.** ([#584](https://github.com/zapier/zapier-platform/pull/584))
- :scroll: Clarify how fields accept `file` types ([#582](https://github.com/zapier/zapier-platform/pull/582))
## 12.1.0
_released `2022-09-29`_
We rolled out a change to "migrate-by-email" on 2022-09-28. Now `zapier migrate --user` in CLI and "migrate-by-email" on UI only migrate Zaps that are **private to the user**. This change affects UI and all the CLI versions, not just 12.1.0. The old behavior was to migrate all the user's team members, which was inconsistent with the docs and often caused confusion. So we consider this change a bug fix instead of a breaking change. If you want the old behavior, use `zapier migrate --account`.
### cli
- :nail_care: Add `--account` flag to `migrate` command ([#574](https://github.com/zapier/zapier-platform/pull/574))
- :nail_care: Add `--yes` flag to `promote` command to suppress interactive prompts by assuming "yes" to all prompts ([#576](https://github.com/zapier/zapier-platform/pull/576))
- :nail_care: Print validation warnings at `build` time ([#573](https://github.com/zapier/zapier-platform/pull/573))
- :scroll: Update Zapier logo in docs ([#567](https://github.com/zapier/zapier-platform/pull/567))
- :scroll: Provide additional information about the connection label in docs ([#564](https://github.com/zapier/zapier-platform/pull/564))
- :hammer: Dependency updates
- Bump shell-quote from 1.7.2 to 1.7.3 ([#560](https://github.com/zapier/zapier-platform/pull/560))
### core
- :bug: Fix another hanging issue by aborting logger connection early ([#562](https://github.com/zapier/zapier-platform/pull/562))
### schema
- None!
## 12.0.3
_released `2022-05-02`_
### cli
<!-- this is included in this release, but isn't quite ready on the server side. We'll "release" this in a semver.minor sometime soon -->
<!-- - :nails: add support for limited collaborators to the `team:get`, `team:add`, and `team:remove` commands. More info about this new role will be coming soon ([#538](https://github.com/zapier/zapier-platform/pull/538), [#541](https://github.com/zapier/zapier-platform/pull/541), [#539](https://github.com/zapier/zapier-platform/pull/539), [#540](https://github.com/zapier/zapier-platform/pull/540)) -->
- None!
### core
- :bug: greatly improve secret-scrubbing speed in logger ([#542](https://github.com/zapier/zapier-platform/pull/542))
- :bug: ensure string content is parsed pre-logging in case it contains secrets ([#525](https://github.com/zapier/zapier-platform/pull/525))
- :bug: censor novel secrets in querystring ([#526](https://github.com/zapier/zapier-platform/pull/526))
### schema
- None!
## 12.0.2
_released `2022-03-30`_
### cli
- None
### core
- :bug: Fix regression where consecutive successful curly replacements wouldn't happen correctly ([#522](https://github.com/zapier/zapier-platform/pull/522))
### schema
- None!
## 12.0.1
_released `2022-03-24`_
### cli
- None
### core
- :bug: Fix regression where the global `skipThrowForStatus` incorrectly applied to shorthand requests. It's only intended to modify the behavior of requests made with `z.request()`. The docs and changelog have been updated accordingly ([#520](https://github.com/zapier/zapier-platform/pull/520))
### schema
- None!
## 12.0.0
_released `2022-03-23`_
We're breaking slightly from our pattern of a single yearly major release. The `12.0.0` release contains some backwards-incompatible changes to how middleware and auth refreshes work. For the most part, you'll be able to upgrade to this version safely, but as always, it's worth re-running unit tests (especially those related to authentication).
In the coming months, we'll follow up with a `13.0.0` release that will bump the Node.js runtime and dependencies (ending support for Node.js 12 as it reaches End of Life). We're hoping that by separating these releases, the upgrade process will be easier for developers (only worrying about the public API or the runtime, but not both).
### cli
- None!
### core
- :exclamation: calling `response.throwForStatus()` now **always** throws an error if the response status code is `>= 400`. Previously it was a no-op when `response.skipThrowForStatus` was `true`. Now, that flag only controls whether Zapier's built-in middleware calls `throwForStatus()`. This only affects you if you set `skipThrowForStatus` and always call `.throwForStatus()`, expecting it not to error. ([#511](https://github.com/zapier/zapier-platform/pull/511))
- :exclamation: re-add the built-in auto-refresh middleware for `oauth2` and `session` auths. This runs _before_ your declared `afterResponse`, so you no longer have to account for stale credentials in your middleware (unless you want to). See [the README](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#using-http-middleware) for more info. ([#512](https://github.com/zapier/zapier-platform/pull/512), [#517](https://github.com/zapier/zapier-platform/pull/517))
### schema
- :nail_care: add app-wide skipThrowForStatus flag. This is helpful for backwards compatibility when migrating from `9.x` to `12.x`, but probably won't be relevant for most developers. Note that this flag **only affects requests made with `z.request()`** ([#511](https://github.com/zapier/zapier-platform/pull/511))
## 11.3.3
_released `2022-03-21`_
### cli
- :scroll: Update [README.md](README.md) and add [CONTRIBUTING.md](CONTRIBUTING.md) ([#506](https://github.com/zapier/zapier-platform/pull/506))
### core
- :bug: Fix another hanging issue where an action could be invoked multiple times ([#513](https://github.com/zapier/zapier-platform/pull/513))
### schema
- None!
## 11.3.2
_released `2022-03-01`_
### cli
- None!
### core
- :nail_care: `z.request()` now accepts `skipEncodingChars` option to skip percent-encoding specific characters ([#497](https://github.com/zapier/zapier-platform/pull/497))
### schema
- :nail_care: Add `skipEncodingChars` to `RequestSchema` ([#497](https://github.com/zapier/zapier-platform/pull/497))
### misc
- :hammer: Improve build script ([#496](https://github.com/zapier/zapier-platform/pull/496))
## 11.3.1
_released `2022-02-23`_
### cli
- :hammer: Bump node-fetch to 2.6.7 ([#493](https://github.com/zapier/zapier-platform/pull/493))
### core
- :bug: Fix hanging issue where an action could be invoked multiple times ([#490](https://github.com/zapier/zapier-platform/pull/490))
- :hammer: Bump node-fetch to 2.6.7 ([#493](https://github.com/zapier/zapier-platform/pull/493))
### schema
- :hammer: Bump node-fetch to 2.6.7 ([#493](https://github.com/zapier/zapier-platform/pull/493))
## 11.3.0
_released `2022-02-14`_
### cli
- :tada: New command: `jobs`. Now you can use `zapier jobs` to check `promote` and `migrate` progress! ([#484](https://github.com/zapier/zapier-platform/pull/484))
- :tada: Add support for pnpm package manager in `test` command ([#476](https://github.com/zapier/zapier-platform/pull/476))
- :bug: Fix byte missing issue with `files` example ([#465](https://github.com/zapier/zapier-platform/pull/465))
- :nail_care: Update `promote` and `migrate` to use new endpoint ([#480](https://github.com/zapier/zapier-platform/pull/480))
- :scroll: Clarify on OAuth2 refresh details ([#482](https://github.com/zapier/zapier-platform/pull/482))
- :hammer: Dependency updates
- Bump shelljs from 0.8.4 to 0.8.5 ([#473](https://github.com/zapier/zapier-platform/pull/473))
- Bump marked from 2.0.3 to 4.0.10 ([#471](https://github.com/zapier/zapier-platform/pull/471))
- Bump cached-path-relative from 1.0.2 to 1.1.0 ([#477](https://github.com/zapier/zapier-platform/pull/477))
### core
- :bug: Fix `value.replace is not a function` error when resolving missing curlies ([#468](https://github.com/zapier/zapier-platform/pull/468))
- :bug: Handle case where `legacy.scriptingSource` is an empty string ([#475](https://github.com/zapier/zapier-platform/pull/475))
- :nail_care: Improve `z.console.log` and HTTP logging performance ([#469](https://github.com/zapier/zapier-platform/pull/469))
### schema
- None!
### misc
- :hammer: Bump trim-off-newlines from 1.0.1 to 1.0.3 ([#474](https://github.com/zapier/zapier-platform/pull/474))
## 11.2.0
_released `2021-12-03`_
### cli
- :scroll: Fix typos in docs ([#431](https://github.com/zapier/zapier-platform/pull/431))
### core
- :bug: Fix backpressure issue when piping request bodies ([#461](https://github.com/zapier/zapier-platform/pull/461))
- Rewrite `z.stashFile()` with various improvements and bugfixes ([#454](https://github.com/zapier/zapier-platform/pull/454))
- :nail_care: `knownLength` is no longer required for any kinds of streams, including `z.request({ url, raw: true })` and `fs.createReadStream()`
- :nail_care: Detect file types more smartly
- :nail_care: Generate filenames more smartly
- :nail_care: Improve performance by making concurrent requests
- :bug: Fix `MalformedPOSTRequest` error when the reponse is gzipped and has a smaller `Content-Length`
- :hammer: Better test coverage
- See [#454](https://github.com/zapier/zapier-platform/pull/454) for more details
- :nail_care: Allow apps to pass along throttled errors ([#408](https://github.com/zapier/zapier-platform/pull/408))
### schema
- :tada: Add support for hook-to-poll triggers ([#432](https://github.com/zapier/zapier-platform/pull/432))
- :nail_care: Allow spaces and square brackets in [`RefResourceSchema`](https://github.com/zapier/zapier-platform/blob/zapier-platform-schema@11.2.0/packages/schema/docs/build/schema.md) ([#455](https://github.com/zapier/zapier-platform/pull/455))
- :nail_care: Add `code` type for `inputField`s ([#439](https://github.com/zapier/zapier-platform/pull/439))
### misc
- :hammer: Bump node-fetch to 2.6.6 ([#459](https://github.com/zapier/zapier-platform/pull/459))
- :hammer: Move CI from Travis to GitHub Actions ([#454](https://github.com/zapier/zapier-platform/pull/454))
## 11.1.1
_released `2021-09-24`_
### cli
- none!
### core
- :bug: Improve performance of large requests ([#428](https://github.com/zapier/zapier-platform/pull/428)),
- :bug: Handle nullish values in auth data ([#427](https://github.com/zapier/zapier-platform/pull/427)),
### schema
- none!
## 11.1.0
_released `2021-08-05`_
### cli
- :bug: `convert` command should always generate async functions ([#397](https://github.com/zapier/zapier-platform/pull/397))
- :bug: `init` command - fix typos in `session-auth` template ([#388](https://github.com/zapier/zapier-platform/pull/388))
- :scroll: Add info about header format in `bundle.rawRequest` ([#401](https://github.com/zapier/zapier-platform/pull/401))
- :scroll: An `afterResponse` middleware should return a response ([#383](https://github.com/zapier/zapier-platform/pull/383))
### core
- :tada: Allow using `await` in inline function source ([#396](https://github.com/zapier/zapier-platform/pull/396))
- :bug: Make sure all requests are logged ([#387](https://github.com/zapier/zapier-platform/pull/387))
- :nail_care: Update app tester to support hook with `canPaginate` for `performList` ([#402](https://github.com/zapier/zapier-platform/pull/402))
- :nail_care: Add `bundle.meta.isBulkRead` TypeScript type ([#400](https://github.com/zapier/zapier-platform/pull/400))
- :nail_care: Allow app tester to run ad-hoc functions ([#385](https://github.com/zapier/zapier-platform/pull/385))
- :hammer: Incorporate secret-scrubber package ([#393](https://github.com/zapier/zapier-platform/pull/393))
### schema
- :nail_care: Add `canPaginate` to `BasicHookOperationSchema` ([#399](https://github.com/zapier/zapier-platform/pull/399))
### misc
- Dependency updates:
- :hammer: Bump set-getter from 0.1.0 to 0.1.1 ([#389](https://github.com/zapier/zapier-platform/pull/389))
- :hammer: Bump glob-parent from 5.1.0 to 5.1.2 ([#386](https://github.com/zapier/zapier-platform/pull/386))
- :hammer: Bump tar from 4.4.13 to 4.4.15 ([#406](https://github.com/zapier/zapier-platform/pull/406))
## 11.0.1
_released `2021-05-28`_
### cli
- :bug: Handle missing versions better in env command ([#374](https://github.com/zapier/zapier-platform/pull/374))
- :scroll: Fix incorrect snippet ([#378](https://github.com/zapier/zapier-platform/pull/378))
- :scroll: Update historical releases section to include v10 ([#377](https://github.com/zapier/zapier-platform/pull/377))
### core
- None!
### schema
- :bug: skip checking keys on fields without the `key` property (fixes [zapier-platform#375](https://github.com/zapier/zapier-platform/pull/375) via [#376](https://github.com/zapier/zapier-platform/pull/376))
## 11.0.0
_released `2021-05-12`_
Another spring, another `SEMVER-MAJOR` release of the Zapier CLI tools. Now that Node.js 10 has reached its scheduled end of life, version 12 is the minimum supported version for each of these packages locally.
Additionally, any integrations that depend on `zapier-platform-core@11.0.0` will run on Node.js 14. Node versions are typically fairly compatible, but it's worth double-checking your unit tests during this upgrade (as always).
Read on for a detailed set of release notes, paying special attention to any :exclamation: BREAKING CHANGEs.
### cli
- :exclamation: Remove the `-g | --grep` and `-t | --timeout` flags from `zapier test` ([#348](https://github.com/zapier/zapier-platform/pull/348)). You can now pass flags directly to your `test` script by adding `--` before them. To migrate existing scripts:
- Add `--` before any existing `grep` and `timeout` flags
- `zapier test -g 'cool' --timeout 5000` :arrow_right: `zapier test -- -g 'cool' --timeout 5000`
### core
- :exclamation: Run apps using Node.js v14.x ([#350](https://github.com/zapier/zapier-platform/pull/350))
- :bug: Checks should properly handle possibly null values ([#371](https://github.com/zapier/zapier-platform/pull/371))
- :bug: StashFile no longer throws 'source.on' error when a request that uses await is passed in ([#361](https://github.com/zapier/zapier-platform/pull/361))
- :bug: Handle stashing files in resource create methods ([#349](https://github.com/zapier/zapier-platform/pull/349))
- :hammer: Typescript target es2019 for node 12 ([#358](https://github.com/zapier/zapier-platform/pull/358))
- :hammer: Typescript type of `inputData` for hydration function should be of type T as well ([#357](https://github.com/zapier/zapier-platform/pull/357))
- :scroll: Fix typo in authentication.js ([#356](https://github.com/zapier/zapier-platform/pull/356))
### schema
- :exclamation: add validation to ensure globally unique input fields ([#347](https://github.com/zapier/zapier-platform/pull/347)).
- Your integration's input fields wouldn't have worked correctly if they didn't comply with this check, but now we're more explicit about it
- No action should be needed for migration
### misc
- Many under-the-hood dependency updates:
- :hammer: update deps ([#351](https://github.com/zapier/zapier-platform/pull/351), [#372](https://github.com/zapier/zapier-platform/pull/372))
- :hammer: Bump hosted-git-info from 2.8.5 to 2.8.9 ([#370](https://github.com/zapier/zapier-platform/pull/370))
- :hammer: bump handlebars from 4.7.6 to 4.7.7 ([#369](https://github.com/zapier/zapier-platform/pull/369))
- :hammer: Bump elliptic from 6.5.3 to 6.5.4 (PDE-2085) ([#343](https://github.com/zapier/zapier-platform/pull/343))
- :hammer: Update repo urls ([#339](https://github.com/zapier/zapier-platform/pull/339))
## 10.2.0
_released `2021-02-23`_
### cli
- :scroll: add architecture files ([#324](https://github.com/zapier/zapier-platform/pull/324))
- :scroll: fix typos in README ([#328](https://github.com/zapier/zapier-platform/pull/328))
- :scroll: Make file stashing snippets copy-paste-able ([#326](https://github.com/zapier/zapier-platform/pull/326))
- :scroll: Fix broken README schema package link ([#325](https://github.com/zapier/zapier-platform/pull/325))
- :bug: ensure test files can be run out of the box with jest ([#327](https://github.com/zapier/zapier-platform/pull/327))
### core
None!
### schema
- :nail_care: Add ability to specify "code" param to OAuth2 schema ([#333](https://github.com/zapier/zapier-platform/pull/333))
## 10.1.3
_released `2021-02-09`_
### cli
- :bug: Fix phrasing in `link` command ([#316](https://github.com/zapier/zapier-platform/pull/316))
- :nail_care: Add warning if user counts are still being calculated ([#308](https://github.com/zapier/zapier-platform/pull/308))
- :scroll: Mention `subscribeData` is available in `perform` ([#300](https://github.com/zapier/zapier-platform/pull/300))
- :scroll: Add debugging info ([#318](https://github.com/zapier/zapier-platform/pull/318))
- :scroll: Update readiness of UI → CLI conversion tool ([#307](https://github.com/zapier/zapier-platform/pull/307), [#311](https://github.com/zapier/zapier-platform/pull/311))
- :scroll: Add details about when dynamic fields are loaded ([#303](https://github.com/zapier/zapier-platform/pull/303))
- :scroll: Change 90-day limit for callbacks to 30-day ([#293](https://github.com/zapier/zapier-platform/pull/293))
- :scroll: Fix typos in examples ([#296](https://github.com/zapier/zapier-platform/pull/296), [#297](https://github.com/zapier/zapier-platform/pull/297))
### core
- :bug: `ResponseError` no longer fails when request is `raw` ([#320](https://github.com/zapier/zapier-platform/pull/320))
- :bug: Redirecting from `https` to `http` breaks when disabling SSL certificate checks ([#313](https://github.com/zapier/zapier-platform/pull/313))
- :hammer: Log `trigger_subscription_id` field ([#317](https://github.com/zapier/zapier-platform/pull/317))
### schema
- :scroll: Add reasons to anti-examples, update README, rearrange schema layout ([#287](https://github.com/zapier/zapier-platform/pull/287))
## 10.1.2
_released `2020-10-30`_
This release mostly has internal features, but also ships a lot of documentation updates and a few bumped dependencies.
### cli
- :nail_care: Improve logging for diagnostic info ([#282](https://github.com/zapier/zapier-platform/pull/282))
- :scroll: Document the `$HOIST$` directive ([#273](https://github.com/zapier/zapier-platform/pull/273))
- :scroll: Update outdated command references ([#274](https://github.com/zapier/zapier-platform/pull/274))
- :scroll: Add docs for `callback_url` ([#278](https://github.com/zapier/zapier-platform/pull/278))
- :hammer: Add new example app, `callbacks` ([#281](https://github.com/zapier/zapier-platform/pull/281))
- :scroll: Replace Slack link with one for Community ([#286](https://github.com/zapier/zapier-platform/pull/286))
### core
- :bug: Add `callback_url` during testing ([#280](https://github.com/zapier/zapier-platform/pull/280))
- :nail_care: Relax type info for `response.json` to better match the actual TS definition ([#261](https://github.com/zapier/zapier-platform/pull/261))
### schema
None!
## 10.1.1
_released `2020-09-02`_
### cli
- :bug: `_zapier-build` should be optional ([#265](https://github.com/zapier/zapier-platform/pull/265))
### core
- :bug: Don't censor safe URLs in logs ([#266](https://github.com/zapier/zapier-platform/pull/266))
### schema
None!
## 10.1.0
_released `2020-08-30`_
### cli
- :nail_care: `build` command now accepts a custom build hook named `_zapier-build`. See [Using Transpilers](https://github.com/zapier/zapier-platform/blob/35072e38ee14f5dfaa2e4c6791e270f0257a2a2d/packages/cli/README.md#using-transpilers) for details. ([#262](https://github.com/zapier/zapier-platform/pull/262))
### core
- :scroll: Remove legacy reference to `bundle.meta.zap` ([#255](https://github.com/zapier/zapier-platform/pull/255))
- :hammer: Increase max payload size for hydration ([#257](https://github.com/zapier/zapier-platform/pull/257))
### schema
- None!
## 10.0.1
_released `2020-07-20`_
### cli
- :bug: `convert` command now doesn't crash over an auth field name with special chars ([#241](https://github.com/zapier/zapier-platform/pull/241))
- :bug: Fix missing `deasync` Node.js 10 binding ([#244](https://github.com/zapier/zapier-platform/pull/244))
- :bug: Fix broken `oauth1-trello` project template ([#246](https://github.com/zapier/zapier-platform/pull/246))
- :nail_care: Update `oauth2` and `session-auth` project templates to reflect v10's recommended way to handle auth refresh ([#246](https://github.com/zapier/zapier-platform/pull/246))
- :scroll: Fix missing `init` command in CLI reference ([#243](https://github.com/zapier/zapier-platform/pull/243))
- :hammer: Bump Lodash from 4.17.15 to 4.17.19 ([#248](https://github.com/zapier/zapier-platform/pull/248))
### core
- :bug: Allow resource list methods to use cursors ([#247](https://github.com/zapier/zapier-platform/pull/247))
- :nail_care: Improve types for `z.dehydrateFile` and `z.stashFile` ([#240](https://github.com/zapier/zapier-platform/pull/240))
- :scroll: Clarify v10 breaking change on auth refresh ([#246](https://github.com/zapier/zapier-platform/pull/246))
- :hammer: Bump Lodash from 4.17.15 to 4.17.19 ([#248](https://github.com/zapier/zapier-platform/pull/248))
### schema
- :hammer: Bump Lodash from 4.17.15 to 4.17.19 ([#248](https://github.com/zapier/zapier-platform/pull/248))
## 10.0.0
_released `2020-05-20`_
Another major release! We have some great improvements in this version but also have breaking changes. Please review the following to see if you need to change anything to upgrade `zapier-platform-core` to v10.
(a) Zapier integrations that depend on the new Core v10 **will run using Node.js 12**. To upgrade, first you need install Node 12 if you haven't. You can install Node 12 using `nvm`. Second, update your `package.json` to depend on `zapier-platform-core@10.0.0`. Third, run `npm install`. Finally, you may want to run unit tests on Node 12 before you push your code to production for further testing.
(b) **`z.request` now always calls `response.throwForStatus`** via a middleware by default. You no longer need to call `response.throwForStatus` after `z.request`, the built-in middleware will do that for you. See [Error Response Handling](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#error-response-handling) for details.
(c) **`response.throwForStatus` now only throws an error if the status code is between 400 and 600 (inclusive)**. Before v10, it threw for status >= 300. So if your code rely on that old behavior, you should change your code to check `response.status` explicitly instead of using `response.throwForStatus`.
(d) **Session and OAuth2 refresh now happens AFTER your `afterResponse`**. Before v10, the refresh happens before your `afterResponse`. This is a breaking change if your `afterResponse` captures 401 response status. See [v10 Breaking Change: Auth Refresh](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#v10-breaking-change-auth-refresh) for details.
(e) We now **parse JSON and form-encoded response body by default**. So no more `z.JSON.parse(response.content)`! The parsed object is available as `response.data` (`response.json` will be still available for JSON body but less preferable). Before v10, we only parsed JSON for [manual requests](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#manual-http-requests); parsed JSON and form-encoded body for [shorthand requests](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#shorthand-http-requests). This change could be breaking if you have an `afterResponse` that modifies `response.content`, with the expectation for shorthand requests to pick up on that. In which case, you'll have to replace `response.content = JSON.stringify(parsedOrTransformed)` with `response.data = parsedOrTransformed`.
(f) We rewrote the CLI `zapier init` command. Now the project templates are more up-to-date, with better coding practices. However, **we've removed the following templates**: `babel`, `create`, `github`, `middleware`, `oauth1-tumblr`, `oauth1-twitter`, `onedrive`, `resource`, `rest-hooks`, `trigger`. For trigger/create/search, use `zapier scaffold` command instead. For `babel`, look at `typescript` template and replace the build step with the similar code from https://babeljs.io/setup#installation. For `oauth1`, we now only keep `oauth1-trello` for simplicity. If you ever need to look at the old templates, they're always available in the [example-apps](https://github.com/zapier/zapier-platform/tree/60eaabd04571df30a3c33e4ab5ec4fe0312ad701/example-apps) directory in the repo.
(g) `zapier init` no longer uses the `minimal` template by default. If you don't specify `--template`, **`zapier init` will prompt you interactively**. So if you're using `zapier init` (without any arguments) in CI and expect it to use `minimal` by default, you should replace the command with `zapier init -t minimal`.
See below for a detailed changelog (**:exclamation: denotes a breaking change**):
### cli
- :exclamation: We've improved and removed some templates from `init` command, see (e) above for a list of templates that were removed ([#206](https://github.com/zapier/zapier-platform/pull/206))
- :nail_care: `build` command no longer needs login ([#216](https://github.com/zapier/zapier-platform/pull/216))
- :nail_care: `promote` command becomes more receptive about the changelog format ([#209](https://github.com/zapier/zapier-platform/pull/209))
- :nail_care: Regenerate [example apps](https://github.com/zapier/zapier-platform/tree/60eaabd04571df30a3c33e4ab5ec4fe0312ad701/example-apps) using the new `init` command ([#229](https://github.com/zapier/zapier-platform/pull/229))
- :scroll: Update and clean up docs ([#222](https://github.com/zapier/zapier-platform/pull/222))
- :scroll: Add some clarity around what we're sending for analytics ([#215](https://github.com/zapier/zapier-platform/pull/215))
- :hammer: Mass dependency update and linting ([#218](https://github.com/zapier/zapier-platform/pull/218), [#220](https://github.com/zapier/zapier-platform/pull/220))
### core
- :exclamation: Integrations now run on Node.js 12!
- :exclamation: `z.request` now always calls `response.throwForStatus` via a middleware by default ([#210](https://github.com/zapier/zapier-platform/pull/210))
- :exclamation: Session and OAuth2 refresh now happens AFTER your `afterResponse` ([#210](https://github.com/zapier/zapier-platform/pull/210))
- :exclamation: `response.throwForStatus` now only throws for 400 ≤ status ≤ 600 ([#192](https://github.com/zapier/zapier-platform/pull/192))
- :exclamation: Introduce `response.data` with support for form-urlencoded and custom parsing ([#211](https://github.com/zapier/zapier-platform/pull/211))
- :bug: Don't log request body when it's streaming data ([#214](https://github.com/zapier/zapier-platform/pull/214))
- :bug: `z.request`'s `allowGetBody` option shouldn't send empty body ([#227](https://github.com/zapier/zapier-platform/pull/227))
- :hammer: Mass dependency update and linting ([#218](https://github.com/zapier/zapier-platform/pull/218), [#220](https://github.com/zapier/zapier-platform/pull/220))
### schema
- :hammer: Mass dependency update and linting ([#218](https://github.com/zapier/zapier-platform/pull/218), [#220](https://github.com/zapier/zapier-platform/pull/220))

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,18 @@
# Development Quick Reference
This directory provides quick reference information for both human developers and AI tools working on the Zapier Platform codebase.
## Documentation Map
### Existing Documentation (main repository docs)
- **[README.md](../README.md)** - Repository overview and all documentation links
- **[ARCHITECTURE.md](../ARCHITECTURE.md)** - Repository structure and technical organization
- **[CONTRIBUTING.md](../CONTRIBUTING.md)** - Setup, testing, development workflow, and pnpm linking
### Quick Reference (this directory)
- **[install-dev.md](install-dev.md)** - Development CLI setup and aliases
- **[commands.md](commands.md)** - Command cheat sheet organized by task
- **[package-info.md](package-info.md)** - Package purposes and key relationships
## For AI Tools
AI tools should reference both the existing documentation and these quick reference files to avoid duplicating information while getting task-oriented summaries.

View file

@ -0,0 +1,97 @@
# Command Quick Reference
## Root-Level Commands (run from repository root)
### Installation & Setup
```bash
pnpm install # Install all dependencies
```
### Testing
```bash
pnpm test # Run all tests (all packages + schema-to-ts)
pnpm smoke-test # Run smoke tests (cli, core, schema only)
pnpm validate # Full validation (test + smoke-test + lint)
```
### Code Quality
```bash
pnpm lint # Lint all packages
pnpm lint:fix # Fix linting issues
```
### Build & Release
```bash
pnpm generate-types # Generate TypeScript declarations
pnpm bump # Bump versions across packages
```
## Package-Specific Commands (cd into package first)
### CLI (`packages/cli/`)
```bash
pnpm test # Unit tests
pnpm smoke-test # Smoke tests
pnpm validate # test + smoke-test + lint
```
### Core (`packages/core/`)
```bash
pnpm main-tests # Unit tests only
pnpm type-tests # TypeScript definition tests
pnpm test # main-tests + solo test + type-tests
pnpm integration-test # Integration tests
pnpm smoke-test # Smoke tests
pnpm validate # Full validation
```
### Schema (`packages/schema/`)
```bash
pnpm test # Unit tests
pnpm smoke-test # Smoke tests
pnpm validate # test + smoke-test + lint
```
### Schema-to-ts (`schema-to-ts/`)
```bash
pnpm test # Uses vitest (not mocha)
```
## Development Workflow Tips
- **Individual package testing**: Always `cd` into package directory first
- **Full validation**: Use `pnpm validate` at root for comprehensive checking
- **Focused testing**: Use `.only` in Mocha for specific test cases
- **TypeScript types**: Generated automatically via husky precommit hooks
## Package Linking for Integration Development
When developing integrations, you may want to link to your local development versions of core and schema instead of the published npm packages.
### Setup Links
```bash
# Register the packages for linking
cd packages/core && pnpm link
cd packages/schema && pnpm link
```
### Use in Integration Project
```bash
# In your integration project directory
pnpm link zapier-platform-core
pnpm link zapier-platform-schema
```
### Verify Linking
```bash
# Check that packages are symlinked
ls -hl node_modules/zapier-platform-*
# Should show: node_modules/zapier-platform-core -> .../pnpm/global/5/node_modules/zapier-platform-core
```
### Unlink
```bash
# Return to npm packages
pnpm unlink zapier-platform-core
pnpm unlink zapier-platform-schema
```

View file

@ -0,0 +1,56 @@
# Installing Development Version of Zapier Platform CLI
## Prerequisites
Before installing the development version of the Zapier Platform CLI, ensure you have:
- Node.js (refer to `.tool-versions` for the recommended version)
- pnpm
- Git
We recommend using `asdf` to manage Node.js and pnpm versions consistently.
To try out the latest development version of the Zapier Platform CLI tool, you can pull the source code from GitHub and run it directly. Follow the instructions below.
## First Time Setup
Clone the zapier-platform repo and install the dependencies:
```
cd ~/projects # or wherever you want to clone the repo
git clone git@github.com/zapier/zapier-platform.git
cd zapier-platform
pnpm install
```
Then add this line to your shell configuration file, such as `~/.bashrc` or `~/.zshrc`:
```
# Replace `/absolute/path/to/zapier-platform` with the actual path where you cloned the repository.
alias zapier-dev="node /absolute/path/to/zapier-platform/packages/cli/src/bin/run"
```
Restart your shell with `exec $SHELL` and `zapier-dev` should be available. Test it out by running `zapier-dev` in your terminal. You should see output similar to:
```
$ zapier-dev
The CLI for managing integrations in Zapier Developer Platform.
VERSION
zapier-platform-cli/15.16.0 darwin-arm64 node-v21.7.1
USAGE
$ zapier [COMMAND]
```
## Updating the CLI
To update, pull from the main branch or any feature branch, and update the dependencies:
```
cd ~/projects/zapier-platform
git fetch origin main # or a feature branch
git pull origin main # or a feature branch
pnpm install
```

View file

@ -0,0 +1,49 @@
# Package Information
## Core Packages
### zapier-platform-cli (`packages/cli/`)
**Purpose**: Developer-facing CLI tool
**Key Commands**: `push`, `promote`, `test`, `validate`, `init`
**Dependencies**: Uses core and schema packages
**Testing**: Mocha with smoke tests
### zapier-platform-core (`packages/core/`)
**Purpose**: Runtime functionality for all Zapier apps
**Key Features**: HTTP middlewares, request handling, app execution
**Dependencies**: Depends on schema for validation
**Testing**: Unit tests + type tests + integration tests
**TypeScript**: Includes generated type definitions
### zapier-platform-schema (`packages/schema/`)
**Purpose**: Source of truth for app structure validation
**Key Output**: `exported-schema.json` used by other packages
**Dependencies**: Standalone, depended on by others
**Testing**: Functional constraints and schema validation
### zapier-platform-legacy-scripting-runner (`packages/legacy-scripting-runner/`)
**Purpose**: Backward compatibility for Legacy Web Builder apps
**Key Function**: Provides shim layer for legacy apps
**Dependencies**: Minimal, focused compatibility layer
## Supporting Tools
### schema-to-ts (`schema-to-ts/`)
**Purpose**: Generate TypeScript declarations for core package
**Input**: `exported-schema.json` from schema package
**Output**: Type definitions bundled into core package
**Build Process**: Runs via `generate-types` script and husky hooks
**Testing**: Uses vitest instead of mocha
## Key Relationships
1. **Schema → Core**: Schema validates app structure, core provides runtime
2. **Core → CLI**: CLI orchestrates core functionality
3. **Schema → schema-to-ts → Core**: Types flow from schema through generator to core
4. **All → Legacy Runner**: Provides compatibility bridge
## Monorepo Structure
- **Root**: Tooling, configuration, examples, documentation
- **packages/**: Main platform packages
- **example-apps/**: Sample integrations
- **boilerplate/**: Minimal app template for Visual Builder

View file

@ -0,0 +1,99 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 5 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
5 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/PageMode /UseNone /Pages 9 0 R /Type /Catalog
>>
endobj
8 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816052121+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816052121+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Section 1 \205 Executive Summary) /Trapped /False
>>
endobj
9 0 obj
<<
/Count 2 /Kids [ 4 0 R 6 0 R ] /Type /Pages
>>
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3257
>>
stream
Gb!#^9lo&Y'#!U4oMLW?QiK[=bfu9Hh5'&3@^7m.>t2Vk(`NSpbWmp^q=4@E!rtp_6Vr$[;TXLjU8PW$qt5:\q_Z*TDuP_t6pJr\_jsSP5k>0T6Z5Ne?g2`_p#hV/4unL>F6nt##VY,Mk7@K)jHCDTr\tgY(Il=4+JNn%"_3!k+-os3*KV@WgVH-Z*dcpEJ;<`LY!;HDkGi'\pkpMAT/!`%b*DmeDMluUj=/EOGiIjE<\gMT5NXNO80Qm<r%$$AT`16?3;kqQp)K-jj4<`T4>i.[U.L$1P9:j!0,tM)j$$13:'0gl*tGtt4<-B5B094haRSeU+Gf6a/941OR8U\npN6:\c11ulh1"O,AK7=BWtd-DNShAANjq7Z0&h0kHK2i;G5]1gPhPfW)pmJgDa%4F8h00<!r8<tI(@+sd(jRJh(`lef5YJP4n-C60gtYm8&*t+5i`1tZ9d\+S.9uDnuo+L]XacqFR&+-c"M9>[Ge>o/VZtOg,^>?`*@dAilVCNKC(1IXH*'HLuH8k?8@bd`rg_'Z0Gh7K/%X=fF"K03n;XB@'hY<0VmZ<MR?;E<,u1?E90geEWLI7iH1`B=:=PVWW1r]F?7.koC8WO6"Kbd6*t)[KAlI06'Pn=KD=*u$NlT1>7h))#&S;F!*r.Ed-a<^_bLdIFV0V@JZ1)l42J8aB\c?,GgbF3-a&gr?B$+&#1hjYBJ3'UgEu)MAc/p-h2P_@^^gPaNP#&G+RO8qh9B\fI(6nkZ>9or';:!WiSB=j7`3N.AEqD$FLSf=lmLR/qHZhQA5#V#&2@*re)&pWSB#=RgDPFuP-Zo=kl[X/KGe"#C:u5lFX!DbdWNN3>cc94^UqltYtPn7f[ljnA>`;c7Ol-8KOuC,MNTQ:O(8h1QM"q1V.<5]07/p;`Me%,;;J3RT84?EXJ9hYX$lG>4qmQ-lsdGW!]cE_T0MiSM(N^Q\t-bm`1L.4TlT_c?=&Ms/uMXp&9RU.1KS:1#+msr]e>*%Ed_(iA]uTC/Aa52O4Im9MR^_uY'GuQMZk"&>DjK&$iJ;3H6iSCkYBTq#I3>+I"+:J0>%i1Uo";G2tZaMjr"X&0R!a`pBFioWh1AZ+69-0NQ_/N-prD!Qh=YRK).)PlapO,oj(hRG;8[S]==s2@aN_NEEV2<$u]AYh;)f/>W*D+a1i^*CnneTh!2kBiH49hKL5OlEKYg=7LgdZDfThe4H.:>e`/LW83iIPKe=L?m]-tsb#,`,:PAo]T7gJ8^bG7Q@\b)lUUlj?q@ZHt7\=pVD?D`J1VdA$=.8f(-U!<>94CkXAPj5.eEs["I/QP^JK1q'(d_[q^h7PH=,LR,Aeb%=0$^P6U-b739ts;]ITFrRPC`8e\J,Tt3N7V+SNL"*O%ZX#"(YM6)j3=)W\AG1b!Nb^(F>9FXC>1\Om8"5of@0CP?89^Gj(^?YogY6a'O:?_pG6I2^=-.B.K,1R07t+)QO5W1cp!V7MFlg4W!3=1R^q]ZG$r%^-/Z](o>b^+qUl$X=PFXGkD`4=4fcALmEhM'['2lV\%5709_LX3A>b.R#YKMkQX0IEED[L5[j'$OTU4#[)E+SCWG?66$:o>!JRpkn:7/mD=E(mg+iBK"I23-\r*,J.F"VVi.ll7rQ]TBe>=n<#pIej^t7%dh[5VF)1T8&r@E!aRt27SI9[$.:j#WHGgCZG/<7%h)aJVZ[m8'[>%tVYeu%gdkg92fSG,*)=JPFUQ/Sgc`,YWd6gJX_IKq7P7:IW9-Lu(;l0m&D=qq?.[:A$Xh9Yh>ZSO=Y2gSuM]?cWCA6f_r#0-=\Yd;,uRHp!?]VqKnJO'<@B&HN9j&f31+4"O`SWMM_cL+@(>!Q6a(S[/:E-#h6n&K7h*])ZHce]d"1$2G].W[MDmZqeFl+0>?pJoVm5>BJOhK6H0MYt[p+Q(L2F_A&\0p&;0CTL2<L"bX,/boD8>?1L0F,2d=`fD6_:I8pdX%3"OG<>o>0BM`7iO5oT14Os9[,;6DR;&sTT%.RIds(Nb58/t57#dqXoddsio;NO8EU3R5,4tn87/B1iMnQ-#3@H*S]K8,%,D4A]666PrMOqnE4InBhgh@g"aMH)'S3!*6/1q;ZIjA\Pi:+`c"*>+X%]rZl's^r>S)00gE3pQ#=tg77:Ec=&V>q?G@u$41@G2mb^,M)M?na<Q\IY)_?7\a(7@[g":FtALZ=5-0("\c39Yg9*a\+Gtn[NNF"&Gr&e>`KXXX\beYnBXcSpP-.a3\PsXD^tt7QdBb'k7!)@tO.6KM9Ep3aL=:U-2S4?59BgKAEd$2<s.#1-)!HMb/"<nc[cpS3ko*#JTA'i0Jd.%@h,'#G*qS0X[XAW_85P+8kYrN-XfHGmHV"Yea<@L38V3ZOLp^\;HPnHdZd9V#X8UHHqUVjdKdV%'#P+WOtLp6#oW'>%<!urqS*=+`2d-`Yl("=/b/n2K(EB@>#Z??6Ma,@6RefgnQH;m?&D44jojt7qUg\W_I!2Ul%#Z[Q5JGAZT-WXf2sDa)j>V#d`3>CBTk8lHrX7/,N1rE/!jL@HqdP1#Rh2B8X_O:Ccid+22=dm&G2X^^mX]I6O[<4u\tQiM8_k/a[qaqlXLp>FVS3,]>,Ubtr38p7Cobp6TYQ[X),q^m>n&Y=Vr7ru-c=<a7@HB0ciXT#e1FKO.UU5:^P@[3D$E'#j=mP9RB05-Ig1Lfc%8=:iY\\p(Rl>c:?mBOJW<h*QB>s&%7XHQDaU"u>:rfMfTeNlL*Y/5r,3"=`Nrr6#hA`b+om1cF_K?@cB^b7r%"8eh<Vq6+Z@&Snm6W2WX>2t&UDT8U<E>.[&U)+fJj?(hmIeCl^X8'b?pIpil8.R8::<C3S5^rnr3Zq9Hn3'6A7m;5;D!fr?`gYUOOOipG>'V4#5iTiuD@[s*qOeNRHo?6gt\^^E'$`7O*oa-'5k^:c7m0hNV'1'!1F/oS<;ghteLab;e#1TYH:Q_c'WM0&XkT8&cdYb??]=jPKR.hC6KZ/*B53^eJB8@)MJ+,tPR&0Vn-3'R_mqDu"1p4LnZj,P8A*6Q\e#8Yi$>RTUZI$ELmX>G:g7uGiMcW'I`1`gfS1S+NZ+g'>d)7p^?4`Un<,)r:Fc6OB>X@$$UqP34Rd`Ikd[Z0^-_MMH4\Sh?3g?Psi:[p,</SVcURDj*46bJHqJtNYU[L!1)>fa'9Kf-iSgN8b]ImqGpC=b.j*h8![.sB_"%mUa*#-#k"r"?e'XB?Jk"OT'U'8$VY)hNN7[HZl##MZK5@+3ur"9H^~>endstream
endobj
11 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3141
>>
stream
GauHMD/\/u')nJ01!frTdRl@,I.r&gRktr=ji*3ZoKsW=QK1qQ6?:a*BgnBSJ%oVf;7?BH7RhAO&eRM!]^<p!1V4Ejpp7R3j+?Km"eE<3aC;MIa`7fF(2rF"`Nqe#=kbT8%n*$E_nuQ&Z,53LZ"['sAa;c4Y8CE>An+qLi%^i4LY49fam_XG$9_9[RTbG?kBYq8NT*ZU/a,;/AWntjqMnnQL=:k!MG1daT@;d5/\]ijr.;[F)L8#@BOl:.[G4j.Z40lNVp,VA,ODbDU6aba4tY>B>t?I?B0jd7:m.ZS:nin;9sH6Z,oT($X*c^u'j_Hl^EP27K'+Dnn=n(qV+bSLf9?_6n1qgpI$nYPAFrI39hi0_T.)967gYm@5i?%@fkF?&l:)Jq0k,4>%bo23PM*[ldruE7V^obLqY;&@dae!Gq8M-rY+C]1FM'o8&T5'8$qr`nqDZ1oCF)SnYf$i"K9=Cap8?el]H0u"+m'8\g>qpQ#+_2iBp'd+;jo\Sn&:lfYa!h"Vi_60#idIT4NEJ8Q^Xo<VC$@I+l&Fg?K/t]PLt^GUVLs(A4Dc_NBW9FjE*(p3q7m`"V,$6)YjkeI66pm`jHOY(pO'Lb9O1A].)o_j9;\,-`.H@Rg:0(>B<5@n4"]'jpgsi4PsV6moU@^I*P?d]7+SkZGtqn^JDdYFsGn("$>JUcVl>+Z'Y5:#Qrff__aqj9/pf/RZZVl/ruP70(pmG:;S:;N*1-MK#u&o=p%ncfL"u&f-8Q&N5,i)`UiF\,,)DDH(n<@ZfQ&i6SmYd$Q#V$P;k*g!n[&adr^<5gk[8R'*jBS`K;_Rc9`QWJdI`tb_tG]fJ*eE6@Y#KMet\7'AL=hU[_AS%e2j6*=cV&Q]I]->Cep([rY4!0pildGj+HE\bDr_I/3VTNhFc[a=68J/@-2h>RQg2mfAS^q=jdAi5l5WEOq*1V,W?A7EM#7OY<nlJd&df.ZEJq'g+4C08*.p=n`g4Jlb(WE]@ti<<bB+#^?b#_u$FQ1/Tn\cc8r>%>,m(h==$64a\O(Dfhk[,hJkhVf^<UGo$EQ!--U?C\C<'6n/>N6=i]jT$IDl(!*:p\L@m5W9q0$`n_]-dYg:^cB:T3&L+cI)$oLS)g`*ddKdT%qChfE-/o_<4r34^ml[lIbY?!.S)(gVS@-TK)qINM%]<EGW^\TUY?"f-pMOqJ->IC=.2s;-#dARtP"amIS\988_"Oj7ecq\aHD=&to6#eY;5/[4n3Se%X\l?"iNs<#N)sll\Y^J:<$DH#?G`UFf<CACG2;YE&I_[GCMZ4YGT4UBYTe%53m=c`'\P%^oS/F*@>Fltcpa)nZ,>KQ*<r^9VQ*Ef:=ea=Z*k+@Q7$6l173Wp&\P&"*&j?ZkQSYnRY$Tr]$4a><uA?(JO_*?0EkLuJA!_d[hW$>onM]mfsA=q*%4gmkQ(8j+pO0.GFp`jQ`"cNrGR)s:-R*uURAs2^B4BnPt'k?[o;pFZ+-H65F`r>cEt3dStf;d@u[c"e*DtAD^'L]n-A5b9t)Nfmnap*hOJa1r,LW)p[J+Gq,j_fk(CY_g!1#\FaVrpBlq-gPcIu(>JXSea`FsQJb;BGN'mZaIHiL^V^1dc)8PNDA_MnJ'Zc/EC=eO'03VG*.la<IbF`CR/L0baNf:F'K7_ie&m=_*4Ma5*,7ZOn.,e3Acfcqc3.6??R:jX?Nue6IOWU,<*Z.1\L6$d#_49K29+beoJ8bF9W/?pY;/iq:"cm]oW$Yj&`qo$@1b&)!'7'meml?'qW+(E2F=`D8:2&pbT#5_?B\cmC&Ia0DpO7',6dIp>ct,^&[)9ciJ_.ps`+O91gd^+;#4;/Gh4$ZH$LN9iFunubb7F]gAe=Y<NtBF.)f5>Q&NkWDSkXA&Hk<PNf23l#?%#\2D*&$!j2G7]8sW+2bL*MXr9u6GUb`P4hk:Rk`W(W?CT6T!<mB#5A9GdE&69gmA&=4jN,lI6!`DN.GeE*d$jETcJqt$5*A7Q:G/.B#rK$#p?,+s@I+()U!)$J[\H)kj0*V;>onoeiO$,dRO3f+H3hC6pa3Zon2)NToi;$b'65jgV.H>#_a<I*YkNKuSGES5nChkNS]ZK;m\41201s6'Q&38abj!B/,*M!Frk<+]2#Ls%D=\#MD@Qd4>ke6251t&b-mYhL3/,U@7np$">N?7W:nSJ)=J,-P02&_iBG]UZ'/9n+=e?$Q]TCV`gWF+$scZR^;A=b#'qf=\Z:MP9Pmtb$[Fd&H!7f5.M5;J'bgibg3_,nu'Ltn&/KhOm`^i>\;PZ6/#c\DO(UKYK,I5m#e)Z^PY#HM(t[,V=^?bErin_*G+GNU-u*D.E@)%gQ&$@&2?GuffJR].2mGW.t]EM]S0;)]LImpHan"7'[c\B^OCG>+0p%EnS0U!iL-r;6-15l9]R(><%W5hfiEY3tfC_`s_12Q_2:DmA]roQ*co*SoLJbrqM@l`9"C6gN,C%qId4<:n-3'orG3c0mp:j$6&V4&GH,:sml)<'1XiFL)&aNrp,Vl:s3`9=6Gg"J*j:duDY]XeuC%VLKN@r:84%@scrjq>M>RrMp,FQX7im/QS7;5DVq3L<aR\YEliNa2Ebr0\[R/f5ViliaRZ,poa",LImhL</WtEN@D8;U18(U"CSAc:b$ln,'^bp.d'MU<M=>%&lBf7YGP,7Xjq#Q>fEbF&[=N'SPe+,?++a$E&])l8_*?KGgiD0oZ[f<47DW:Apa,#1T\BsS8LN_U9%DZf[.W\-Yk02LKjoaUCEmtY3UAg2J?*V`$&qqpK'MWk`0m2WR`r</'8ctlTICn=VYjsn#koZP#Ko)K[.,=4-T(S\tt9#@P--nOn"eBp(L4COj#.^X?UpI#,Jmr.ZAG?'m4`2[8aF`'0Y*::q3->&fJ0tmJp,KK2uuoO-a;+20L/-c60CMXBi777L8MmbkeH!p$q)17Lcb!E(.FMJ+\LMC3q7]mEIL<Fg9X\:(N4[2Po2$6)4d_SZgQ]].INas%&;-Dd-W=Ibiu=!Nb%l=Vu;g4s]f,T$Fdk)m7IaYe'FQGH9L^M!i;ib@H^9:FR(d9n2RoF4m%@79>fDdl[)r3Sb9MIs?8Wb6n(8<\u=p8;qK.N]6eY[G/20NW+jl4TN0HDsNcl]8`3Hak_9,T)B2IQFuh~>endstream
endobj
xref
0 12
0000000000 65535 f
0000000061 00000 n
0000000112 00000 n
0000000219 00000 n
0000000331 00000 n
0000000525 00000 n
0000000630 00000 n
0000000824 00000 n
0000000892 00000 n
0000001191 00000 n
0000001256 00000 n
0000004605 00000 n
trailer
<<
/ID
[<f467b9ad1af4c9bdd11dad1a50cae3f4><f467b9ad1af4c9bdd11dad1a50cae3f4>]
% ReportLab generated PDF document -- digest (opensource)
/Info 8 0 R
/Root 7 0 R
/Size 12
>>
startxref
7838
%%EOF

View file

@ -0,0 +1,111 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R /F5 7 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /ZapfDingbats /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
8 0 obj
<<
/Contents 13 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/PageMode /UseNone /Pages 11 0 R /Type /Catalog
>>
endobj
10 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816052339+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816052339+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Section 2 \205 Scope, Methodology, Landscape) /Trapped /False
>>
endobj
11 0 obj
<<
/Count 2 /Kids [ 6 0 R 8 0 R ] /Type /Pages
>>
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4056
>>
stream
Gau0F>Ar99&q9SY(n`NS,;\=JPa%iV8aW<JS+aA"gV+LaTZED*$-?b(Z(n$Xrd;%F;AVuj9=lof;bM.SDEII7N,0Eka4A#CK]q/0HM-,AgS()?fq.<Qbt!)(F8"db>sC@CYrK"dQB)idDV67]k1aE,[QX0$A@]E5)>TLMcTo]ll+;&$J@5Q[ReDC`]+\s<F`I.&U;<Z379\h>/H6=p?,]+?:jGsOV@/Z"\QF]qOEX$@$M'kNlaLR>Y7"LGTUS`!o/3(W'*R()i+J\TOh5%M!a[bM@t3e(n'l?tmK;#\CM]BIC!)e#hIc1!YiRn*Rf."6Q;XR?d&l@'F<.AT%-]-:Y#M3+[9O7,UJ,29n5BM(KHOtWZEagHqA?#*&I+Y:"kfSt=;$*AH8\@mWT?iEN?s#iH,65beqj=F9mU"qX.gkP"Mt)7CU$Q@.2k2cG'=33iHOQ)ILk4R/\@<Z9_Z'm_jTUJ'5n;AHm=M+)*9Y#VI.)"9D,n'H*`q#i$tViKDUX@/_,@;Up`8`XIOiO*O$m,AD7<*<,k>"Z.I^p)'sCF)\7JTSI*,H>`]!6)2imt"!!c[*oPO7g.'5&6,jkA)sR##.eHmTe'pn#$TuY=]ue3HK(!DmZ]YLR,#`bYi_,BS<"pV=E`H#E'*O28;2V0BEYXfQ6r>RoJr3If_%P<I<%)a2A6OjQd"cO1$(_Eg10kA=<4DrfNFYoKEaG.=<3C/\Zr0n>Zk9Y+=L5:$q\.4`Yti2:Y#>(^2D70X`:X-AF,:?;n="T#7%m0,M-+?c9X%T/eNB-@74PB`9bX2S5pE(F5!cY2hGC6#F"haWr.hPq;m-OjhhdjkW/T5N6fiY'3o7f-ELFX6`,Z?u90mg)PT_GdTGW>t0N?,)9)$^$8kYWY"XIFFc8jsq$P7T^<#"EP$GqI-"c]kVAYF`TOK/_?6pV]P\k`nJ<\bUPoV#I,@\jlb(`^=T:c;7-U)/_)L*_M\?nPqlY-mha.PBhnOdXi(lC6@%^[l<4!>!#a53_?[DJTIN0qP#R:D$'9SI8VKI:gb!F?*mV]\/,@(b52_1ZuP(8;-c;T9tXbOS*7aaGqW2aEmh7ZEDf3XQ,lrX4JFWZQ0B0IMcoGb78h`e7%ZV419fd"&or*HkW*K-@QB+oq=A1,W<*t9DS^FBW:Rq;<!U!m7mL.QV!:BkrkcWnKd)?eEMjj:(pV$W;iq1gH(VJO7$#N8enA9;^MB5s#1U*'=qN_6>'Jnc[u;H5#b*OV2/Y%0KW5k))\;dLI)<00@b%eYe'\Zrk4<-2/_g2>i/iDV.%*`9'C"-X#Y?-aB6sViann7QP<t5Q`H*YIJ1BUZ&C_df9:*,['Q^5%d)LKfVu]9HX.eYWK^=%B=:K&"^H"*bB<$nS+O&@LTC1$SVl`+\2gBb<64'iqWb]3K`P'62>Ddd[;_#nR=Sff3cdC!i_c<Z@>2pG*EH_h$g^l:lEB(lO,@rU8:OSE"m68]UM-Z'AL^=1Z-P[D*SPPHITF#a=tNf]Zrp+OWP?]`\2g1b!!479[_>sO[*Y<u7-jGBSb$2/kD1j<L[o8jc]13nnE)BpHL")24e.QBC&PKnm@*);ITOZ[4?Ana4ahoT+2ITNC(?k\0-V)sH#YqZBK\O6b.VU$;7@J@m/dlA2&.tRp0PrRm.1>YJ*JN>/JmOIV@H14ZtqpG*T,HAH@<0,2VNGZH/^Le<%Q9'>W/Xo8nllLLZT(=O_,W#c)NB\RW\S&\Utfq=iY*[Wp>OS?%6PUTQk/$ES7GY,,#aeDP+C.;_8meh3Q6hNPta=Zi8.A<eL_Jm">6^Dq"O8Z+[::4-n,SMYjh>_4Y*..N4'C7]f;4Y>fI*jL+]5[\5E@H&pH3O&bs8>Qlm"&RU*H]h2dP;,j&6<>r%i5V\ga/!]Gk>?B+>mKP.i)2a%6-0k-)cA)_6-lY@.;R\F"QV='4i+><g>B(Ih+,b3.A?jcD)g%#kf9n%AVB\qs#28L$L59tV"k'3HjCb]l"OBeq2mE4)@;^2SN?1ra5ILgYCq&%lCi&th7eSCjo3=7V\"T;VXADpBQH4*O&:#n&#?Fn6?rX+p/F&E)99'Md:fj>*][Q0a[MkrN)r.`Or8Crjl/rRY0[0E<<s?3(6[@:fhoYHdCB!Kb7:M:_KiGbpRVigGeifm>V7d.:$'CU,.["AJTsrWUMI[4*iJ=3f@8_;a2a+l\]=Gq#k9Fb!`]sKVEo5[VEFg+F@csk?98k45GH&+IA)6J#pd!dgalq1F=mLgn;?_(1#,r%a]@FJ*NK5HMqf-jI7M))4P!FHc)[#X'2*\[IB\RQ4?b=E&WL@E5p>@u)/b:)hX`=>6h5)D0MkGsNqHtVD$oDso:fW%22mq60h$5OF!pADGUsl0nWIhm)0.^1%'lI[MqLlbc.cY*4;j8^FDjntQMp4']*(\=aYXD^toIO'q'Ro0%jGp9YdnW&;I\_N^k-(PX2t]q"cef>Q,%LD\MB>=7GM;IVn4<Z6"ecugKQ/+JP(ep=@;-]l/dN%D'YumirQ7/nXkNp__uooAkorGBhO7AFoNR2iE;9(KRf%'<GJK>:6'o5%35NUb\[%1G-M3meI',PZ`pUJ9pgJd?N4XE*p<K1@;XZEiqqTnh$!eAY%98[ZKoZ1__?,%%GgYoooWOsC4'>*&D[:b^`&=$@W!Rs0>S^Ub=t,/+?FE3"akNam[!>)YF'=uTgY_BE'.S@S_7HnB<XD*)_.Q-^,$.>TZZfXE@!`PVk;_KP[en2,0lik]rG1c&;`0V$(-GRCkEM%<@*l`F4;Q=B0Qt6E*ZJqmFZ4Nib^P]rIo]C("@QWjDIT7I&V/*,<NAgoM<@?d8:_1IkW[pn9j9nODmW42LaO!X$+uUBWS8[K'.%i@5j"`2P&`=)Opu:La1X*H"h&X;&T+>`"!.]BJ3HtqR<G#?,rdaL`MSc3,bPK>2RJCX3'Gb+P"?@)7XES*_[&9ZRdN=MId(#@B?`!DjW<VJ`KC*Pb\8*<mrI).nN7X;1(9TG^?aujrYs(CoB[o8B4UHe"3"l*R#=0Z+<WRVYsN8akY?iJ]S\_=5SH#n#eg9[d1'ECj8r-h;*i\s3=1crEkhsN7!SOTiRoE2pTPWhVnsra:8&O_SAns^B_#uDRYU3'&UjXb2l5pLC-1!JV`NCt+aX:uS#MN-RuZ8A:Q_MjHSZo+Y5if'(C#)RG!>QA&_jm-q[M.0q98G@YNi;/I_[PcTYfH3/`$G.5IO)\M/QaY"ckS1-&]fXVkfXtl4e?RP1^'>^Ed)]YSY\W&_sc'P!L+.p'S8I0tuEJnbdeI`Ij@^Wu#CK/L%RK)"6:IJ;G#E8Pb%p[+1ohDV_G8+N/-]@EX_rK+7)AqV)[D0V3I(6PL'k'CbKYd`V%Z)Ra6:bu8[5E<$S^)#tS:/-r.s$'D\!n9tY`0n(g@!@A(Meh,`13BUsn30JD:gFj$:^,\c(ojhJ1Act<$OOsV;#T[\I%LS"9pSc#PGo_NZC&h7N_%R(1G%]-U-Md:^BG/Tdlm9[aV4Oi.J!6gP\:/Ddgc\V#15Xj*.j#`nGE[IO,e@^Ws0I!R<p0!2-c"]J-fmuuKXo;fe$/.XD:Xbs'*8)dq8:/];Z&)s=WffGdTT4jpM(^Q_mB3O2V?Gelrp/%35^p"<9CeS-a_QnOZLW/?k2GNBY!SRi_jd\7Bbpa?U'p$g^1+VgL`sR.=H\eF2^3re?=ssrY$/-D?kZIq1m-:R:JU2q3HA"-jEHq\K>1)k.I&%:(1rb:Ga[-2e1f4a;MQ-knn"L<Bl9=`^hcGZ/kmQA/KhI_qnU6S5enIcO:m[jZ#@K3'Q55+5.fSr$sRXOk!,Cpo</eou?[]k,Q.8E69l**;S%JAC=bkCh;e#Z=Ug'?'9242$(jI@CV>dRnE5%6l7DrFY%E;SGHQ(>:r#JS_L'Iq<T4Xs(]05e=9ToL-47JcCD0>fqqlsF0;Qco-I?k%4g@?#.rY$W7sd+MRA"6V>),orARq>D?mX(lI^"B[5`<p%;YQcAPi0h+Oo9`k:\<4F-B[%S$`l91psNql/D!*lFpuFE.a84>cmmW'`6"1cMe=r?UWc~>endstream
endobj
13 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2470
>>
stream
Gb"/(9mbVQ'#+6EbY_,HMB=$R-'pYnh"<j&l:,O_U'jYH,&3;!!ha,lYO;JhOK;'=`HJSSNLj5d#g<]h#4oPr3ah!g0n7(Li8Xl.G7HSb/7NS<eef0piR?fGh\T$NdgpD:iqesn$ZOlZj'm.^9:]+PC\b3U:mML@7[1"[5/Z=1Dth$kROb6n5[R&_Uf:[;iceM;du&Ujcb;0A,H-i0e)39+-X]ZPD/\_)mq^PH[JCk*>V_msQ4"@*-7Hh$N3GYbHJgUqH4X`t-aeM^;MBK_)V)9!P)#!lUJau57jMXh"_6uac@<NHl2'H:cCRS:#o+71Jq)1gq\bJL<:>gB+($NY?SDi"A,1uhLq1Ub7jI\T7[.:6()O%C-%7RaiI9>uP@3[b0lcKGN%kt5'Wb\W44BiQ-)UMo2Hbbq4j/Hq;$=W&Lo/4V+`K-BJTop\?AIM[(\hLi1;9?SSQCj#AqW$aVdi5pc?O*iY=_@!B^?aAK'*/!oaK12+kF&j-$WEAfZd$0jQs!A?6)!A`d0"EbH3(o4ko`hW;LsI#LiJ>W&l$T8^L]8D*e@3'bsCl(*4!T(\G3:e#DorK'.8WTh;Pq0DMCmBHCIL4PbNuX.2Wj;uAEQqM_6W;SG3N[XNPkZ`I-e0r9k15sm7KBu)/@2kW,mUI4(d&CA%Or_4W7+@.)jZ*??\gs;^u>UiV<=q4t)s(ED"j`/mdJpErb>Fm@pE^c]n:apDUO!tU3NiT0"h,g-r-p,!u&;j2Upe$Vl@3I[6-EnKFhTqLS(47F.'Nfl'g:.b6RXTdC7V./DPUOQCDVt1Go)@Tc5(j/5`JSm8gp-`Is&/"u\q$+kU_5V/F8K*LRYR[]O"=k"Fe#Ta!%53U!W,1]hcd]:al/@K=[Y[*k^u>i$k%`U&q[#q'qZ2H>QWpGX$APn%<bJ6N^c6Oc$@I+@?#bB62;o-s8BgOl9=n^"<C3%4Kp0H"p"GldfmVAHAb$k?2;a+'^"P<h%&2C`pDMqc%L]^&?)%;]PL%H3&TaY7ru`,b&JAkNnYt\Y'(M(6"Q/WDMN^%a99/E$NBj]g[_d/8`F'Y5_]C3M5jCE=FFd8KBr;_<1B+)02JeeA<>)\@utmcmGNf:&`ONPAc?fN10qqd"1*5tH2_icJ&`@"Nc@H:SoBUoS"G5O>(f"F`])2.d9\[40qN,V$&*N=;08mF\/\m2L_sTs7_b-A[[f?hS$SGu2`ZIW6BFZP`!rd&K0o(+eA[>2:=n3!$PnQ:^a_]]?KRBd#47(6XqEFf8b-OB3Op7\2C0=/*fa;RZN:*[r>R1C2K#7Rb*]M+"=4CmUb&i=>C;$4qbHVb96=/?%ajBU.dZWnkEZMuA_?C/DP>?a;LShjp:WWuFmDr89o85P;HNV@rKPO)$jAFj3cV?qoYm[mNe?GA,8JJ7=NJ!"b;"j@C;:qYOYF[rCPHuKFku\uK8&*X9HRnA5q6og6h9m.=:Wmg`H6rM`Q>BB@L7jkZ@r05:0TN>n5=hc)pr&HkJ-+)Op[HN=1EO2nT>um<i'@fBMDi?%`*,YerJiWgTPlRPo[9<5?XQ+N*R;;R)T;FRLX#J1Kq?I<:]e8CSZTY'Jc[ZUm\onM&=X%k)tWG4I.>23FYV)`N&=/l=,3o0D:B#eN?j7BUIh_6\]GsDF2=60l.B^,Gq)4,S)ukg7GJDbjcrc`Cs[urrKVY)0iMCK-VsBKVt`j#Ji/>2IN8BZ=a;6/;>&cob4[.lad^iehb5BIR##UCG)28KU02"_cVKFjC'6WcMmEi7]UG7bs,ZYMi(Jca7h6,qI%LY"7H\H^7DXWk''l']<'iGAaRP6]X)t*g"p^R(P>k1HIpO8",sr84NQ]6VktVe\tb\`ha^LjR$X44SJ`XX#T8r;"as7GGhtEac[6YtfdEc34$LUD7sF"FX>PL^^E\uP*o<6/AG1skEDloNW&bbTTSj`4$aP0`rC0p[Aq.;G?nhIms"AZlqp/=CK@pce.j"9RlHVZ3DcA.&oc@#*bR9%10[/>n,%5G-#WE8/mhk'+XGI4GUZGf>`M)F^$/X>.T`5P@cKp%b<<?UJ6mJS>J``5=Kt+Ulq5A`tL.s%B-K,/XNoQAc>EXi5Np5)=nr9UA%9gT%WZI(8bT//O2'E/9oRdjDQb8OeB2;K-DpmH-,>gMO5[099j*'%qoFn#a\hb*e?B>IE#=Y27n16Hq2X*0UR\/h''Z5ejeCU^8>IV9qVUV'2WIB@GBT,n2]q>[F6++m6c0#Pn.%6r$Sbi/5DUV1Hf![:ek%Vui\rioem3=7"`L6E6p@(P-I]6c$8AsLkRFE-iY>TIXeL1m]@'*$F#f_tcR-lAI5m=6e=31%RN#1:8M=,l[#01+qqlU\4]f']'K;l5"A3*0GZWj*[QYK=*;DiWmYeBN(n@(6!Z3>7r#V:>&]c4fGPMUZqEuGt4Eae3+-L_a9rVa1cbU>&b@B(C=\8LfIO1Eu0=M"nmrW&GRUt#~>endstream
endobj
xref
0 14
0000000000 65535 f
0000000061 00000 n
0000000132 00000 n
0000000239 00000 n
0000000351 00000 n
0000000456 00000 n
0000000539 00000 n
0000000734 00000 n
0000000811 00000 n
0000001006 00000 n
0000001075 00000 n
0000001387 00000 n
0000001453 00000 n
0000005601 00000 n
trailer
<<
/ID
[<2bdd628af6c8c9afd0af687771265195><2bdd628af6c8c9afd0af687771265195>]
% ReportLab generated PDF document -- digest (opensource)
/Info 10 0 R
/Root 9 0 R
/Size 14
>>
startxref
8163
%%EOF

View file

@ -0,0 +1,111 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R /F5 6 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /ZapfDingbats /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 13 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/PageMode /UseNone /Pages 11 0 R /Type /Catalog
>>
endobj
10 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816052532+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816052532+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Section 3 \205 Nostr Deep Profile) /Trapped /False
>>
endobj
11 0 obj
<<
/Count 2 /Kids [ 7 0 R 8 0 R ] /Type /Pages
>>
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4359
>>
stream
GauHN>Bef@(4OT5fZPok>p/Hb"LuKX.nuO42i[4CDU1\?PpO?KP6d"[KH6]Yr:fgM)+f>f_H(Al!Al%gg%YI4d5Y[sYG4=W):=LHFSNj!a/,gk3F/[Y=23,(e[+/*3Q7Q'C\=[i#5F-h(q1L>)$CFPY2f-UT.DYZp?[=8aYOKL.f(2lbs:#0a4%BtVX+Og0^/D$^)Bl7[>756B43@k.n4UmL\WpSB'P1YV6bFoVBSn.7d-m,$Zl=G1'uu&-.NC7qEe9@;.kk4(k7U]pR-6<-1a9=X-r^7IXpn$lhTB>k$>m;6[d4kc+H,d(UnSrhCh<^b;=d;f<-&lbgU>Nk&c`^@i:1L3_NJE<P5J3fYX]Vm"O%4m,bh_YJ5ofBjNB\ra\[7>YGn_-eARcJ't0\b[:[]]d9SWcYqr&(_eU-@E,dh63a'"1&:Ds.r]i@+2S.M#cm.#K<@Q`rr"Cqcd'V@",h:8e)eUBHJOJD,@/[8ntd#Rr-PN9nJ>qcQ:'go,.ius[M4%GQp&&:aBjN+*6TYChmJ&6(`:llOjsUeG6"?>QB$Z-@XScrGP_KthLQ5Daom^=HY*_37@1)AG@:$/+]:GPA'Q/[KK.$0ih!s)peqLrRs8'\gN>4I<3i+%;91W3Y.[]0HG]NuLC`(l(<0X%qQmSJ\.=ap9>.J_;oQqKLN0O6*Yqj=L\A-*^!-(A%Mu\.l<FhMCe"<20OARnMjqE.[8t9%5hB/:qdpG\P_?AhSsrVB966dT9La,q:IRa>q-lI`X"6ro9]eA+s6u%4LcE%G27!#t%1Q@Q\sq<0eWfPbRE/MJ;`Y^$WAKe54jVP=NRG=+NilS5Q)?3XO^YZaNoUHP>NU.;1,W?*M.l>R_,lE+MS"-^1V.HM(o0Mkk)83kM]0Doc72Ns`/ZNIZb0>5VUYVjL6lWH<TKCB8-(fBb\cDIY>XGIFSH$LTN6eZe1]o/6&b_hH%&6B#0*k*hf5*=kkTHS[0*%l?7;adT%47sFI?j7cdgG%iC)hW`R'LjfjV`OWDgg]@3XlWp2QOTC)K)XTqG)JUuD"QeabS%jqU^.R]39VG;?7qnhA2?UuZ>5M`+#/K^h+il/=<3A]fN9ArB&H+_/Y(>lBW]?g;S8T[E->0?f<BV_8m=Pd&(7gM:<ml>>Vl)_#H&;9nB`E^k\<E^jE#1]EOVIn<5,KQ:=)PVX3bPV`01SC%>0SC&/7N3;O/N4pu%Nnr<]n962"qb8Kbmha:IE$hOX!Z+D5E.aa5QifuCJn+VbMh,*8I;j+f$Eb2gTg1+Qi]ETsdUCO;Net#7\3@ngge15-:Lu;TTt!`m0pN&o*VZFcL4qu<8q11RPoh2'a&5WGQ=::q!H"f.HHMtSj9.o\'8&^7oX<n!.&Ps_9Ga-^,Y!o)V&L;HU9Q?eftaTmaZc56Dog];[jk/cW@[:L'<N'L)5esT:UcZQ_hlE7fQZfCgV2e!\Uj'KK?\:Ag&7T,%9EDb2H1(sk,C,/B.Usu9/re&9,A-V9ps6X-,(D:XW_L#RU-ZH$eU<""\eq*je'sUiJ5S/=iOpH?#+O(LVWmjqCr[4M3`HCc&^M02PV#S(7+8HrGGt`*JFe>&R:81&Vu'r.(bu3kp-Z";]1iC5r#\l/ns5;=f",S'DVMSbX9MRaP''3``/<=Rp6r-LV=3R3-YRL7k>G,MpmJ"9k,&l14+^HUMAVM24632n/1&](./f;M?EQbkmTq'PUpF&5usOZIYVicqd._Shupa-hp]6S!3CU&d&'C)%X$&%W(PQ+[<Z]s+hpLq:aZ%%j'$IO.Q",\>QrAeV(B-FY[k6MQ:\W#`*,O^7A)l4G(HRL6a"k[[XbEDA;s%3H&uZ@)=,G7/`L#YZpoua$\H#j-9B$q%7a9o4`-P&H;<.lY@sqsR+FD7"&$++>$nA5;Q\H[G'Z="ZoKf'8`1Zb3`$.[3[ZfFqmett<5ksCSX.rb@5f-[8lU6Ka3m-uP9$Wt)qYGU4n8JC4"0_P`2HN*I88H3N?>JM8`t0.&&T(I[t(Mu;GOtg)#*DQkO!ij[FegO1H)5Dlk#s!E-Al7b]`A/Q2Yo<Fh``'832%);#*R5M]BVaN\iR;r#6gZQFR<=3mXP_EqE$.h1W$i75rF,^i2@<EX()9X.Mm8ZY1h0Zk6Def@#,UMmU6.k7(%'MS0^>d'p[hn#c5MVV,24]g2W<&98XLR=1@p>LFeXoLl^\Oo@@1[a_2BfTqL]rIEADiLB8KkuP+`V_IXh,-<0F.=J!@TrjAoIA2PjVa'r9:B)ZD:$h5/l)da'3(p1S&"`]BEcsm,o\njo5%"8/IX0@TGmu@Vb2(r-nZSj?6/E7joT7AU2HkDXiuF?TT<TrIdm(4&JU`/RPl9X'Dgc'u_.leYg,rZZSk9FZrhT2WfR1$5,'h"4",:!RA5pXcn*+_g5fpU)Ri8f<od6FdbIO#o$Mjn`O8BnsFWPCA,U+f6Qaq(9U:@[H#"5$B^FEFgh:=(D4VIB[$Ba%K@P?Ym.Jg?g1qbDYUYnBbbq4;DSVqd->ZnrMk%YoM06'G8,c9Z:)XD/]2:L+eo13d%<)$$jSmH/n`=3M+J+Q\',8-XQ`K)F/b0UY5rh:Zb:md&\U#N[)\D?KE9AAh9aE6[R!0?c42^NW!m[%.iqh-`mXtB.Fh&F6EVseo&2HhDajG*TK#.[/=RCn*QH(`eA^OCb'<B7P6?f;h!:aU5MTcgX;VNo`%)ohk"UAM*V#4_a]eZ&<J;?ad8HIoAqF-4^T<hPIQ`,-L<@.pi>RI9sQ[PJR1WUe9?FXe2KG2")/W`!N-GS&[80/?ms"cpO8ndKqG0jD'h]=c7bRZ]7,-C2,Do;s*'2"b*?]:/"*JEmuFZ/Z7O)K*@k]Ufj_Uu+[%f<4N$VKo#OlPJcYU$l`..?L,nF&>\HeO(ZHXtTDU0';::^:rAGX4n^qRne<d*1ul8K\*k4U-lu^(Z*%idHhd*fM9\\R"DO?G6`"^jbU&-XZ%7rE+tu!F@m\gGXe,poPT_'G$KD!:MNSqEL(0GZIY*/5mr)5b'(+kE6BHt#9Cn5_%@]$^0:Ol?_6!ihSGQ<oN#K7D_rS%3ArL>HJ(S^.)Q0r.>rg1g9#f`B[Zue'L);:RQ;?;\(2fuV&OgmF-(+&.Vg&PPmK7)47[?bnEV<I4:qFD=TcDibPK`.kkr7FI:C?TF"k2dNc.:6HGFFFX^UrZRO2a7/_fH"hY?&[rjTebT)XUV&W^udQX3\HA!_m(Q@!/?YBOsFHM*P5HhrmM3\J,)\trceFi#[;mlG3C%HuoKh'V.q-%o^E[Y^!s-8oD($F>,SlPC>-V'NbuLXRhn&ZBslM=4/_,uI.GKi*kn!EeqVrHe.6e)-G"m$1LTIo5#C?/4O?Lilm1.3mrr[u^j[)8Y;I,EIb"DtfQMB3Xfd/Vb,2?CL!J7AU=?/8(o[dnibK3AfL/;(@cC!AI!^SOIgR/,8er\?OLr*S=A;q5hhS9NN(Uf^SYe9uQ^_,EcPbbuK^XNm-$.IJd'`Z1/$WXUqm6$ID$5N*1ro,CMlgQ$[V#Pq>8W@[te3M-TlhW(?'3"gn&WkA^aEa($^62-S5dlFQWo5HHgqrK6'=5*hOIlM.s`]`#K;c]=Z=+m!"s9RI=M,j"Qc0NR,XAAQSQ3!rqqC)Z@S!CN0Up>GH9+s2%*c^@WGBd>&mj]X?K'KTPMC.1@WCT^m3PEa&[e#FhJ@to4oOVN&<1^,kIa:e?eV"sT\eMLRsA3K7]C8f@g>#WU\>i]9+_(1q]nr"]sic@U^FF7_>1"s=M<TUF?EUEU/eaTY8'O+#pi,7Laf64+A[5[`-7CM"-o.=+WQW:k-E5*DDk6uu5&,WYn#C9#HKhP_F'E*c]%k$g#J=]@Pg[(4[a>:/KQ`6GRZpRs)BD%^M]=.\31hhrHC;hd$>7paC9eJSNrjL=8^)8n(*0*$ad5J%^\``>WlLYfUa<NdRJTB2n*t/XhPjg[>G_J>DntUILDQrR^<iYarq`M9#=%)?bD>Ntsd,CbF.<ZdsY]ffhHR_=*#=7P3r+Zu&E@A,?h>aj7M_Nq0X-nS_9upWl14GS(rP4NDDp!$ff;(JNN7p&g>>ITRn6^8+V$Z6*6\S9Dp[LVKhf+-j@5?ho^\pm,$gN_:imoWV)<FpJ\VuFWJbrra//1`WF*\>-Bsu;k+9:tI']V#ON*icUAs?Yp?$?!;q1t=u7Q'$4`ACf^>r\JJ2@^i.pqGHG6IM:dD;!o#Eh22.l`IW`DbUMp_TqDJV2m1U0M?=%:;=G$Xk-f6c^i=<G4elEn"4l>F?7cUT'Z(;T)u(um[jNmGN\o\K\b`tG<+q?7m24\%,]26^6S;:/#W-!;863%TRTol\;hHgDr4k]cpuF]%oJNCc2~>endstream
endobj
13 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2756
>>
stream
GauHM?$G$]&q0MXQq+!nU'QXP`:td<ZYd-jlUGd(B9-CB&s?(TKF1&O[D..q!(luR,/&fFa!\,#O;EP[G@l@;!?ZfIq*-G252O*=*s>+72[^b%(W+Eupj@/VpDKs&N/8?94:SqP^4>6M&gSVamj2E%lX00=%ON<bB-f_`q[cL908:Y?5r)R?J3`t/Sr[4'G6<R_JE-YE0^&N_0B[cD$Cl%IjVr+A074L"7')^r^Hu+r'6N5.@5)0:\9t;2#/>Pr*r<u?\G6MMIaF1kiQiQ'dcS%_J)7J/6,mrB\1!E@&<NmO!^H93KBP9KK[(V^PAZGk+^[mVV2E)8QRl-U`N"eJ=k2aTf9P!?8]`_!>:.1J*-QRAm-^homC4=c=h5LV^rfVe]NfW+aDHWO]pYK[=g8\@(Q+ac;lSC-U;5GN_785gDTH0R\K!5T/0G\(_GKQ?P1pm%_T'=IZ%E%4]46j+YAoL?ni'$:ST27$apm)bjEPQ-B=Rd^lH)#')WAl).PZJ3hfR]7%i>..BYInYKYsqk"DbS!:l0s.qBu:>lcd7](h0rJYc<bZ0mJmQ(JOVtj-_i\HW()r.)8gR*+h0</#")lT@sVOdGTI)558Zq+-#uhiI3W=O,it0j8EYq*t@q=A3W\Td:cG4CHf*p"N6>cht>oGc\^4#SN%t`H&)/?M:#N.+d4keD]FNG5CPmoi'iqQe=Wp/isB.1#TA%'ploi*Ld.f3g/X"FE'#Im2@TL+^3t31FN0V[MR6Ji,,@`XfKir`8`[p:RbR<$3GK+NM+)j(%>)L-&)p#L6K/=,gdC'=V<P*Vm*6N'_Ve&1H-Y99/SJkL%h.BZ(7PZ?aa]l;^,q)\"]Hr,3f\S91F[RG8$NmI2#!Yl]u;)kalWg^57'p1*6Z8:afBKMPsVJT"RqZY5aSR`;dt.TlpjoQI'$ag9'u+DOa/WbZ]rq/rs,TJC,i6o6`XY:fBscQ+&!mWBok:Lru;@qn!I;A1hC?(\tWjU`C/72s%%o0d(C",*dFMDprH@EW>P+5fAUBFY<]3,gp,\(Ed8-S.4[r'#mD@n@*[7b@qBH.4]a/=;34C>Ptj"Z]74;SJ>T<ui1n>.WYL..2I\Y"go'XUKBF<*qb0ju<:F>&g`ZErd^r:O\>Ro)'IR2.[?:D4L"*+m[c;W!LW5t<;CIZb>VfA/3mS[?AN2KD3s%Fs1=Yns.[SB+?R_T0Ya"-R'3$[i@aPge+-8%O]?5a:=>,eHp98/-B:Pj1IN"5(YBg4sl=hu((#?/CN-g"E_U(^<^rQS"9]9=!48mIu=fGeRC(\E[bFTKhRZ(=I5-=8"Y(H5mln-i$62!3J-1WW3rr+QQ97a].d%kT+"!Gs,We?ZgSqM?FkXmtkNS2BOEFR^;h;]jTb([nnK)TgCEh7=&VqNO]@>[fVX!lYt>#f^t(>Mf,]O]VpKEu^@\JdcJ9[>!RLeZ2eP4[kuG"2eC++(fFJjIA6[J%&_?,-fdV0TN?6lI=CSEFLe;A+$kU^T+'Wtf!:5UsueZqT-V0O!j#h\qGf\h@7/[u)2le1072mK-2^ch4M1^fgi'rOp#d>1TI"0M.^"IDeq/KEP/EV]N*k^fPbR5o2CKHjg+i'$8s5a4>WnQg4h2jLA\=aX1:t2dHD!4do5:@EU1(ZN^3H5)(,tQlGGQXUQmV.-i5)Quo&cV4P7J6f0OiHl-?2T=-]4"VtS.$#:gK*ZRt0B&`or#iI#\QnJW;'kf0@Ao,Xh;erUZQ2$5ndb=)7(R"IeIPO(J+UQJ4T?q$sX\>ld`B/D^[11Mt%nEMQ'r$'o<+<I0?AM]LJtRtWC.H%>]DZiE!VW>fFJ.OA%="NHp&skM^T/=CHQ$9/DJ^Jp[Gp[--?sip\^XWRlJe<.M)5":JnrBe;KU^/I$C9c]IDa*.Bb]%UJ$Po?"][o\=uUdLZ@TTO.pbdT?TP@G<J"DXTqnaHSUOnM=J7E@Fo@YX%g12`CopOlaR7jQ8!fLH<.9ZJ+"jM'YD3]e8;anfWC!SC$VBC6g5'kqmKgSSF\>cDTi"#kZojfDU>Rq^_$DjQ<SCe"Bq#TepRDD>YQ:\#(($+>NdG]p?^bg[7bl()maI7C`%<h7jjpH^!eXZ!Ss?QlQ]k'WG\bNp[iLk#2PKg/?*OiD-1q5^1%u;']$F5i;U;ijLf#JC1"_.8=d(\+.4LsXdOP=Dq@Cg+OA8Kpq&TRLO8*;]'6Ee`W&.am)5M7,P:GQJ))K[D>$mi1%k]ji@=+gqh_;d7%+GRWN.NkU3+Yfm)@0cD4>V[=n`#)p@l3Jp1)i#)#PR--(?N'RPVSY<smR^eQEMY2[h&[e&>/XnS!8J+"k()e9TNS*B#M*F("h`pgGe@?n^mieqt9@_5o<YFg#@")9[^#_&_mI4DU3YZr!JWZturGO)Fr>Z_m.akaVUh)FS^_d$E98NAYU`YK\tcVi>UjEm6!$1Y^T[^"gFtCh28iom:OBK[G#/*h.WEW+;d8M4dk-eVh!,%W9C!@_/g6#^E<\Eq^VU9!,/gUX>7*eRn5X@3(V:9uBFDUQThKqe$?F",rZ:0PTa7f30quk@-V)BVh(9@B:5IO)<pMTtnW*'3K*U96\%WSDCs&=T)lnD*e&9SV(e:(sP`%*utUjQVto<?.Kk[0Pt$T)'lT]*LP6^n^RCEP3F$q%a8S#T*JuX"K&>7dCtH)U8\r(Via_-)%8]=(;_=OA*,k#(rL2%`&3C;:\LI<\+?;aY<+:Sak.Nl>NgNHj0@Rl'l!ujfma$P\N0E~>endstream
endobj
xref
0 14
0000000000 65535 f
0000000061 00000 n
0000000132 00000 n
0000000239 00000 n
0000000351 00000 n
0000000456 00000 n
0000000539 00000 n
0000000616 00000 n
0000000811 00000 n
0000001006 00000 n
0000001075 00000 n
0000001376 00000 n
0000001442 00000 n
0000005893 00000 n
trailer
<<
/ID
[<f4f3261be7e5ed45eb13081af484a414><f4f3261be7e5ed45eb13081af484a414>]
% ReportLab generated PDF document -- digest (opensource)
/Info 10 0 R
/Root 9 0 R
/Size 14
>>
startxref
8741
%%EOF

View file

@ -0,0 +1,111 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R /F5 6 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /ZapfDingbats /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 13 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/PageMode /UseNone /Pages 11 0 R /Type /Catalog
>>
endobj
10 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816054034+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816054034+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Section 4 \205 Peergos Deep Profile) /Trapped /False
>>
endobj
11 0 obj
<<
/Count 2 /Kids [ 7 0 R 8 0 R ] /Type /Pages
>>
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4127
>>
stream
Gb!SnD,]Ia')p1[ki0LFpXYY4=53'h#L#L9M\eCcWB.2\5oSK],`ORB!%3-fgTPtr@N56.Fi[Qt6NpMZ;,?r1e(mg/UdGB:FS4CH!.GbPqc!gVJFNba9=&#R!Q4HDY6TA6dl+QSF:AJ)HP,,doT%dPFO1G%mlE@?VIOa1%`ml8$I`ed-B'16D1HLRfa^T^*R3jCC`FMncoBu*O#+npi&C)A-tM"!a='3'@hC#McZkra%pWBpaYN_e+D0Rp%FR0hrW;,06>K"6.fL$0Sh%"6$g#"!X]"#!H4KrA)5_8b:u3Ubf:f*amuZu4W7JGZ;KnIS=Wh1Xi5RI@>'W*d4FrV/P9ApV0]H>4`Br;o)&osMkc^h"cSeC45B3*S[\hW,YB1P4I%$rN(`h-)/%BsFiCQ;T>1'^+I_DUR^BDNE&R.%a)f0c;_&j1Ea66\b)WMN$BO0BV><6$(5D[jr&_J*oUV-uM?+XFpWho\\&/r'+"iCiKH_TGC!=_]NiTc!;LO_Ti7W0uegSk_E<K(p>blA]B0e-]&E/cJ`(<SE/.'ue$OYJ,_De]ba]fuF5Tb/&2%[2A`BRO(3!5qgN6[oFdj[20EV8%B`4WT$p3F/rY>6R(m:>@#F?FTQMZ'N,Ta;(tW^=K1KJrS&Z,?G#Kq_.,Se9Mdj;F.U`n70*:OTtG+EiR$Y"g?jG>e7kIUT%AM;^`VrR1/NSN,OBBNiVRur=]S1c&rP"Q;X%Y>pE?VQ$SmS+iGqcY4I+JT>eu23]lC3HUo4(PO/_G.sPT`JB+7O-Q+89BdiCO#Sd6dH(+7/hEi^)!:RT)Q6]ns0pO\\11=uReMaH6nVnI/+C]@$JWDNKaQ?^OhKKQuLQ`LsZPfl22T8TkRinSk-*tCfQ\V&",%S^]6@SN<Mn,-NL"UCnjB/(e->7Hc$t63Aq_&OoBM=?[^>s!ckI`eE]23bH.A#t-oc?cY>nE`*HlJSM6efd]XsT>tTdgLp"HRt4Qt9E`*js`oiKBXkdk,_[H\(BKGW??HjUte"fM?s-_jqA5g)i+=fCoXTY/mHKr?V(O?!/lkZ<;XSGp7"lNg'=3M]FuWK4t`m_8>RtmCg^GbBO]kPfoAJmNk:=U,SnTo/Jk,V%E0Uq(-%>gEJ0$2?m(qqfh$+Vd_Jg[fJ_Qs'N2H1usaZ$Xsj9M-jO"=0)+#EP&PtYHp?nR]ohEia:5l\u8(4l`*G(75^g<<AgL'WY'S$b?d_;S>j*'/ufN&Pc>=<;2ltb</mi7C.&Z+C.)>A,C68cN244rM'(=]A\20@iT5l$6[ogl#-r3dLT[&YY&5C=ItYP5+@;1S(6#qY<_X)I8:c=QHf@0LZj*g]8k%]RDI!n)3)WikStKmNq1MD"iuAV_pak87<E/Y.!5h^G8DYMZWu251;34[-<?SNkk;((g(NBo(1Xlo$nT0bhJGHIeBSW[)UknYfb-CXI0W/<eTH',V4*Yh&K[3"*^rK9-jHMTm^bQN)T"p-"">*,TkE&.aUq&ZbGYG*F<#R_k<7F:i?J!hAV`L'o.&RJ5$dq_AB'>pj#-7MRRK]BU75EUk64."W/gB8^$V%18C#*Xbaj@GE'q\*WPjh$cG7i/e3jT0:1R>luk:u&-i=]Y]!tRhp.VFDRSfSN,CrTpH,+j5+7l5TYSdZ8],'Yb$^TTn<5$P0E.L3'<"7`69:nph4!FCa/jXP4-';9pI7Y?RC`EnWK1HbdOLNA/!$G_HSjt!M;EWrS6e*38`6YumYicZ'#gCoEGo-)$sIolJB$8Ene8i\70,^;Q4?qg_0(.C>=g#+q,_NuIX$N'aXS1;UG>V1@/^ZI)mnd%*IECiW+q`$t;?$3;<1/EUS*RM9cRL$(8K;!Gb[Ve/Wn]5qmO,T*-6UY0D_gmgi]a-St!snGHBk#JcH<?P=mk^(Sl^KT%EbZ0_;?SJD1gq.nB.^K^6C>&8S]>%M[k5j.eNV4>G7s):1F@s(h_^@749GZfD'.W;StV"4D"lHY>[Fdd)I?m4CKNN6RMc'E5=<^oNd>(VRSX2`fN`Fl*,UT&<4/'D<csE"5Scq:NR`kN@*G&N>e*Qc(F,/t/%:O`ps;+0>9_uNN'>+ROS=RPjbgmf3,>(pK:=e&S(0lTPXp'Gh",fK'@A(q=7-;[IE00.9?jk/+7i/C88f7T43?SrnlIAZpATZ8R+\eWZA$f6nY,W&*OAP$O<-tFRN0huZTH)SlpZQej+b@*[?uZI6!8&WXf8a<=#11JYb'Zb`;BR96Ke.g%B.2'o<gJ?0j#]2_St4'ntQ)Xqi!0\')I8;3jTM4p8r,h&cZ]l_-Nog2iT"T;j9Ro/KXH;J'B]MiJjX@i1TAcmq`YtX4hpW\mn^A1Cq#u$>#cZ+BXls9:_O?BaY,j2A7k@XWXN4#EXpBL8EO*DZkdk]/`;XN;A,'hL&a6+0tX8IoCN-0Rn%e+(C,PAF=l,!T=8='Sr,tZkb;sfEBfB!YX)UdA`&CGEa4B<-RbKC\buOC-)%"]aZ!<ZG_.4Ou3Kt'(S!@'LPku.IWqhZLAV=:+8.&_l`NBH$k[_\S:unL<JK[U/)*4M>L"9C_m,KW5;_P5kKR(-pZcOo)EeQ+a]N+="kGb6kk"%"coChl)#&NN3J2^9MreBRjj_c>L]Y;0[kWj,G.I=78-pbiN\b\TNXAG`o&eE-Pu!d8t`8%;,As7;b8d?3>:=c$^>#b+Aq9qNVXP=b(AYBkHlWN7R]JQ6OgC%<tHi$mVaN`F:Bhh48iH]_9XiUF'b(nCFCqGWT]dPKh\TtCbgYE*=?fU[nEBfe##b*"W;NB&n&rsAW?1P=V\^bqo;-QSqLR5$;qIgY$ZA*&FNJuh9p*CHFi6@]&RlI$us)g,S@.\4LVK>V8I)&a<fmcm4QS6EK,9tIX7!,A4-I+#n'h5!K2(lTVc8kK`2NDQ>4aO:Pi*`lna4S3>IX-69JROJQihdcTLH>WGTLm5<uP0&Rl3g&N$l72=mf-6k?oHH/N]ra5AZ/i>G,2Y1`S#G_WoMADiVs6bAYfHi:/3&I*"M/Hpn*MI]e>dG%W-1mUi7*Q2I3jUmIB466*"nThHsdEB!1b(=po(c&Ts@6%d'hED"Mnf@BCANj+r6MWBL:iV&KTXn)\99sf*fBAUk'gA[7n?q!@L8J\ST,e/ERFV+_F#N=;G1S:Nd9r6B@RBWl0Ns`_-:3%);pOp]M^QXPj:W;5d6pT,)4I/'X@c][56sks/+9VHp=.-a)l'F:Zg'gRJV>?s?*nocE.!e6rD1t:NS#%0)7HK*YqY^#8_%r`?*Rjm<lFr%F[Aq0'QcInj_KV@R_Io8(Qe=Q4?HNhqgX=7iUGFm7##<Va&'[UMqt]:D'-Bm.XX,ME[h_7q?975B5&=`7ePN7KD_OiZ7%!]&II,d#=Vo^Ei']R73T3hIF^`!g6YdW4,ui"f,s>FYekX&`FTSc&ZU@s#89cf7lsc:=`kh`O$tH(27ipS:7oD*%8agWTc^'9q`-NX&!,W[O`T0n]0,asTJho"q?">T'c;QORF?hNjfpb>egHJfL?#o*M;C,ah8JWpU[B%M@Smd/?!Cu(23@hk62oseSdLlUZq1eIVeU<Lf/f?qpR%smkuNYX[Cb+fiOWZ\2ue"[r8m]inDX?8p2]B.KD.b-p@J+Tm.U)JI/)[=4`&]crGZ_'N)OUaf2nm5(W5"Tg"#l_nD?;<aL&Dud,ol9fD8%^<%t."[\Pp\Y4:'8n9-K(h4>%pK-h"&cH!E7B34Nj__%k>K^7UTUqUnmEAG2H=^-l&Xp4B<p1b9D;gO^/^>V%p7i9B;W.LauMn7qL(u00LN6]Tqm6t7cg(0bJY-=S6l8O+H\t5U3G#!=1_W\\f9d:#C(,`,$Hui2#oZEg#.B1#;NYg^pEFEN$jDd>r32J='[slgBQQ4+\on)`?54^l2q>A2nKq$*F+Ds]n]5lXB6(C0I:\"&iG#,rfI*9liisU8*oOetkKQ9flT/:<5;_!ib9@M'8g,]\/Gk*>30W%FVPq\%OXa4,BC^LnWX>q&9Ma&@Pa#b1JT/-8/(DEk=O@WmS)6i:p=faWF^Jlj[RYoIu&.c.TY^UXt0"1pr::E97F^Q[!Zj`qYBI',@OA3_9%-)%5F8-!=YFj,0BJ?a\d)2qk62haD_86-Oc6W0R~>endstream
endobj
13 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2394
>>
stream
Gau0E9lo&I&A@sBlqqI@ML\5iN),:?[n5E*WBAYoN%Y_K8Z544"[Li-YO;N<7=Rn!1<O9H8HARjf_9QG>nQSr7GRng#P`NQP7%GF_Y"7,i!"(J$0Tnfs.#25b)gpjR#rgm,rq"_DHs;>n5ch^UVr)L3d4sf0=5CIhM5J[R0W=$NnhP9UDTmqn\b]9YRFPf9=Y,;/J>Q0Aco>TAl>4?_t>J",25Gi@E"\5pg+]E)N8-Z??)fdH4$(]Ku(<HKl<'WOtB*LbSIQRPWP#cTZg%TF.kUiP%uJA!WGnfr,+D4'\DIV>lP8b5N,)Y9XNH5S\9(*Y,F0Y2j@2L.5T2#M^h)p1s]4_NRW\71Cc>gM@1RC9Rt"+iZmIB_Ds8IT&.+G6Y1igP6r((=Q5ZOcj$[<KuLMoCV$ZL/!1*D)"`a'F_.CPO_R-+X9%%-"]op!?Q<.PNd5+,-kYQq/&NHff1mHNhsg;tbUB>?R3(li*"hZg+gWR"D]/d85C,o)V:;eDJbV+9A89d<"j$RDKj:;,$c>Z7d1mb'FeoODT11bXHAn9<&YV*0KR96eEoKN0(5-@$1oJfA$Jm>0EBrHCT2,f<D[rH_i?!Bf@.>^]'RA.pH6q&cYNqHu_7Wf!nK'q0JD*RF-eVEHQk=Nj,HbsE/E&1.-rM?[$@3r>dd$Af)f2rUjbB-8`>UB^1V'o7/8=Odj-_Gq)Whab9&A='9")-G9;YQ!iqEU!pTUY3l;&Se;lXoD<m4asfXF?+@B_#FP7QqRDmeOa8hanPd"&,N!p,3;'ntW?Adk*heo!mWMa"fW@I)-Ik_8d['\(=[Cp_sYV%$kB*Sk?6_>d$W$AgoLUV82ib\Zkn,#/f27dRi-e[4n!d;DnOh(B`tCP8Ca,c38S$-W]K;5!YV-14m@Kj8)mF!5Jn!F,0)NH!`hR0]*=8\NVOc4.,5aO5"lN!_)/Zl(5/F(3du_QahUqG]a38Xs<nQ.kkUqCJ,HCn/UoYToNS0q.VF,\nhNcurHUG],$2IC2UCG.8(n.B@HXkaK.HI[lNTchC!?WJY'AJt`7-MF6f]UnUor?s.Ak;Fh2rFJ@%&(b'UCi)Xr[_1@/<E-!\_/b%9tI<l5>Z*s1h3%rA8+i?(Q<Kd`4#bia.>of,c/.rr(K+%i]]#9Um60BT(4WXmli@Z2n,M39liT#uug>"3XKse23L@,(^PW4R,7Telph.%h$,9D(1@aQ#YA%PaQ1CH,4+dg;V"CoXjMSn_W'/-ep;=NQfp?c&nd+f2G]E->8phJs/rsK\9!)EPI+RK1T0BXEA\D.tHGKeJO-T$E#ThLthGG%`1R>m\>+d(rJH7k4IT*.?2oH?@/3^l%=6bh+>'a$tn"fEd#l#?-GbXB#a4H@)-E:D1T(Q5uZe+gN`s,@mB*qoINq$bB]dn>TnT(0p(XNL#8:aBfAcI2FYkg#Tq41k4U4D`OUVV28[+4nCG=S.2,Y(*,;2<!G*]mIc&7)ntnE\-guTLI/kUL/mM?=A`Kp(0B'&aLo/'_J[n%/o`NZD71bfj44HUX1Tpdm;V.gbI'F-r<<7&#mI43,9%<id`^u?3foWluMYE?[i"(_sK/MYHm(\=k:LY0`7g1ILG?2r;7\TF:eG\MA<#2a&p.a4<J#@2eW(1ZA5RU="hV3E50O:EfU]7F*_q19-bB%PUG!Y%su3[k\"fN/li-Z?m4.>i@sb-%Yql,f(J-5,)6/JDMm,E]QL&d+.GXKq#sF74uSI_>8'#Qa2s*#,)<u5``#arY98>2^V:;ES[d[->;#&4oe`_McaG%"#G7%Ph*p`'.sFM>B[i#rh.YH##2Nt>ND@+5BfAYr;;."mDNqN'KMklGkKToqER^VU0C;1+WLJ]2oW4O$T6:msH$`'[C"Chu05H&=`$:BtAqG<XG2N!i]XOg(d<HFjRHlt@EN[kjK@$d1Sn+AE%Qs4cQBrJu"Uj'B/DiU.@nC7X\3,2kp<L[\iRKh@iNmMg+QVNhY2*M*O%l[d2oR>`]<5l!5&Cu$3fmWGoN@N^/2K-#23i\0B/"f`Z"A0&g94-q=h<q3igd;3FkqkZSbfod>@C*A)g*ou):Zo6h9uW:U2\`N4@UQO_QS=p=(iXR>HFAGPoP%=1a^RTj7dfsefaUu"0#aigRpVGeKT#sO3nE)c!Y$TWS^JuAM#-&W\lo,=A!l)m@@MjZ`06s,4eAN`#]^g@n`9IC[B5E-]Qp%p94PoFuCeG2L7]<)YTOij$US*oU'p?R6cOAN&KEKO;J>dB'UYYonT5OC\O$V;gd3B`!:7R=gY(&Po1[-h9i(\LE1+C1XFpMa%Y.*N.!=4?&+DmZ0,&T26TpqSYI\hi"o+_4b+JD,A:#DF5g:#@,C@T#jX!GM[DXf?=Mte>Ptr?)a@JuE?C_K#K*H'[/~>endstream
endobj
xref
0 14
0000000000 65535 f
0000000061 00000 n
0000000132 00000 n
0000000239 00000 n
0000000351 00000 n
0000000428 00000 n
0000000511 00000 n
0000000616 00000 n
0000000811 00000 n
0000001006 00000 n
0000001075 00000 n
0000001378 00000 n
0000001444 00000 n
0000005663 00000 n
trailer
<<
/ID
[<666054ca7d391a85f4eafb12a9ce4119><666054ca7d391a85f4eafb12a9ce4119>]
% ReportLab generated PDF document -- digest (opensource)
/Info 10 0 R
/Root 9 0 R
/Size 14
>>
startxref
8149
%%EOF

View file

@ -0,0 +1,111 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R /F5 6 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/BaseFont /ZapfDingbats /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 13 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/PageMode /UseNone /Pages 11 0 R /Type /Catalog
>>
endobj
10 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816054352+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816054352+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Section 5 \205 Solid Deep Profile) /Trapped /False
>>
endobj
11 0 obj
<<
/Count 2 /Kids [ 7 0 R 8 0 R ] /Type /Pages
>>
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4114
>>
stream
Gb!Sn=`56L&q8H9-m1c?-fT)_P2]rUMI\e(A6TZ1GTZ_/)E,]tB;R%t87iG"Dr7S_l/<d,2FD,.[:,8hUUmJkl`..ggAr8n3pQ_n!Vg@3SQ?:\/rZ[cpm)Gc>Bi.hqu+a<T+"u*#@0:,s.]_#>E8+C6O,0oEOoQYQ5BC'4+r!)L;KHM^'CD9A\6lF8p3agK?su&]`;u3-IB?d&PpT?`SqClJ\.;7;jf#P"^K.pbP@[+Km;\D(X#rQh_.nD0+(RhJC/9hq>o;c&lJ1+nF*7FNji!%MqTZBK<Q0OB@$5Pn!WaL<o/D!dbQ8+S^=hCITYo"jA@@:$3?)k2f+_6CX+`GbN2^AquVU.()%OoY$&m):/6]:Mam:qGrmjlSWdaD7ILCtXnf._01^01ZJeUMb@NQ3M@s/5mJ%?LI$UF,^^c[!Y.hYVe$*0]ABUOZnnK*FGf#qgcE,C[q>hKJC*Tfti:_R(mU)T_lJ2RE4%(dV&ArJQG[8(HqLsHAEHhRWS%_Z51iK'&=:VunjS>S/:WDT=Ap3R]+X\ukF=\5[So9>&(j)q8"j9D=DBFT+aZ;23K_7HTh!aq+nMV<E6dB-:_jT&Q&RDX;Ic%"5/Ymip9:A(p$!0:hXe,o*]`,<jK5J3$M=hn%qmBlrB<./1JmE`(:&>*p#G8bA.plu"W*j9hCq.eXTaP.5];a1h%:QVGCP7D-MPr[lYKO5q`C!YrS`"O-bi<76b2R0F>^Y0[crr;JMd0n#m].gt+_AcESWB%Rio3d(K#M[ZdSH52-qZ)oj;)5,K)ZG#N>C2r4,t%<b]kD1,%<#<r!5EJ`M+c+!gjB=_al:4@=_*^O`Hgc(+;eCo)`c9:Bt+*oj&5H^.tZ>>U1k-J='^a(Zf,0ji7l%O[%W+UD6"S7X+@\rW^k#SQF\E@q.G'lT6$e+O`mp-8MSLj6W<EO5eV#C0ok06R:-:BB@uq3-Kf_"jbp_5afeT-5IgRL]`d*4I>8]p4*pa/;n;&'N!(XM1OjaMIXqC;8eB%O595$Y^AZ(9[^d-`.=S&SG[Y8B#R3:;p[9h5Q6CJaHH@8O!0O)A>E=5@Cp00CcQZp?.O*epDk)4h(Ho>3NjL*81+2,:9ghL5-'_P.qSr\GTgZJbTr,@>CP?]aM2;O`H>RWjt^(ll2W::2q6aiM$us?ajS:KjM&H[^[377aP3;PA1"8hZMHlbaD`JSfj;:&Y<HP>fIB1,*cjjM0R"5[0mD+XF!k()'.bFY$=g6>+6JUC.HZZe@I>Oe@d^0:k)Q/Vk)T;3ml5JdR6mO*+hqigTL#c9q=?],IMB:_F))V72?3&J$4)q:fY3,BSkN`3'W3p$<DHDKJ&Z6):dp"-nHRi%Wr.u45Y`%`<Wf!]LjVfLpWZ-=_<#G$Rn-(]8[jt4H5FaP[npuPkh;bfN>OelTgp[\?=ae&2HsmQ$2,ggp]b=bi\Q:iEl=eTF&bDYAID!#-&>Z\%mS34]Z)\!YQP!0hP+ZWQN7+2q.-mg$U5"C"Uh`@Y4[smRu:Aa17RaXhHCSR>^>W"b$W_9gTcEFmr$1/A(c:68(Bf7kU%%@?mVQ,@0&`X_al'B'@-t)m9@l$`=_*a4\.-nAR8K31,`#HG!Z*QZD;ogAiu%g,cKY4*K\S)VPZ=D6kgd^^Gpul^4Qr3L.)nlOB!!t_2(2j\f1J+f$dklo8W*!IUO[;$F+j*csk<dO!>+bdsTFc:(<+1'#4,kBD=1^r(KbBX(mWe%)cGk;l#)F,0M@P$Lb0*S\sjfSKTRE4E8J#SM?^[SM9C[V3b/6#.EGI`T`WGbGa^$N(IYKom7TKfl<2k3+l?RW1!JF?.EeL/"%Y_9!e=Sa1PgEbAN,>;/ZFLa]S0AVm[_-M:b5W*Emp21EB[D_9>6YNg!O[L6#)Er:BG9:2hX'Btt@JG?NFAguYi+L^INHgK@Mt=H3;oHN>0mk0Y.N92oBq4#HSdqZ0m#+.@k#.Tib/Zb8P&ZosSP.pD5Z"?*)1QZ@\\Aq/L=B[P8Dn,OQ[f.!k.<TSC1"WLNHl'=OkOl(PuAV-j`2]W?L;\K!cffOoSHt-`i+7]'V./f,6pgDO9!?Xb9;jt#`NH'lQ$]&8clES*<aCSM%g*'8OUi5R5<af[]%#/H7W/C,jPgq5r[botI?_):6b*2(MW;QOjlg*GA#Qc?<7q<A1\&?m)2p5J(Tjn^UQ-65Rjji2e$LYOTR7j[OUM:(qI9t7k4I,g4A^$&?eI*8(RP%^U`6TBa';[4K2AP%N%Gg'1N^G.q&Do:&m/4D(8`"JFT`F(he72E.k@Sa9.,+^JA9:OEC,1W&LALour=IYdIHuRIherq6d*m#KFM$3T3$$oG_VY7r!n*#+G.7?LfC?JEVP9EbB*HO?1n?q_n^:a8$Eif2c]_kcF*rlF;C^G*c=>2sJsmBt7TEdS<@lYV%,\g8hd2Lr?[cTT1G@<.]be8OmjjYsDhfL;\Ae.$SU-)eKV\LWKNi'+:A$Z0WYb0?$7mSo3gJk8`\I&9iZ*5Y<DY\CE70HZ-b_ilHb"knRXe)>E(%?hALP%[r88"%Kj9DlPKZ7jShX\VVD=96TdP\3Jd8+-*60fG7EbGC`:LSMJNNs("'mjuPnP2hUCBRTUkOS(ilT#o?p$26=hVVG9hq/HT.1F_Cd;X8Cd'DZED?,&bbalE]em"P^?IMZab75M]#Zb%a!._,&k5)ciaOpQCetP/RSUW%NeN-r[[>u/#^aK%/WUmJ'06I'TINS]b>-i)!SEW4$,\,>7$8l@Xn2\TW[:-'Yf<0WQ#3"EhZ:2q$p%f"%+X?OZ6P+?b:?l(?et*N`9i?;+;h]'k-VpY%I->K%4*d+#+%WLg(T$1>malf9iI>Ca"K'64coN:(6WK7:lMrt\m<9DZflP15`24L.<P>JB9UV2l?IG*9k$6Ke:S1f$);90mG][_$\#%$Keq4<nB8sIMC-O3EkSEI,9t=9ODMGHEa&H2(`&_uH,g_/_*=0-Xm[ZB49*6L:Y42P0Mn*XNi9^n=WPW\B7c7:IA&Y]=5VNGkcaZd*1DSsgYucX4K+5S#2MHpaF,\uE;(ABM28`?MVW.>H9rVcdnbDQK9c*];CH(-GA03MqC$UUd%j,6[q6E2Uj85jn8^K.^Ruu!@^FFD*p#N8a(0.[,OR+-Mri_@hoQrh,Sa=Fah5OlW,h0U/E_d8bWB6*l,&GE&(M,qE@\j^W>eP:'QJJtm<P^!(_3_GrYHTlpjYBTYh]*Q\t]Mr*o+Fpjn2U,5&QIq>PG:1rrpg=,So2`hg8WU;b\-aC;D(+Y@u$!R&)%:HW:_^AWR!mA`RbC>6h].p+j]tFIS.jV)GXb.R3r(fm*SYS7.Y?X;k%Hj"-8Rn3-?lGhS`^<O.%*/`CmfrAQ(th%rcQZ/^9.oH$.^/nT]-j@j/cb];'->0Z^?W%r)=a%EQgiKJ\2HJD9b192C`_rKh,U>S$P8N8PZa2rf]U0O/XBV<1EVrlV(SkCQVjZ*CdS.V'?>N,D>)q_d3L3IQDY<98(Jc4soQT[C"WOA/D\!;ML]3!n<hjRbRpR[r&2*#\]VUsLL2;dl"$:FrAC]0ikc.T)biMo4:K^<W5\Y\"#UU<ucho,O.Q2u</N[lo&T?c^O\qS+*6;3DC+tL+)S.?5ejU/Ytp(V6$>h=/Mb(OGs=!S3taBTHM0gRn=(g,!B'rW[;G8P;jc<F?3icF8tT*XG%S9cHTDOtEBEFIQO`VDPJ9IUjN"!)s3f?T`A4;4tNnH'Jg"hE^39jtkRQGEYVT/];0[bNIP#Y$nb\k+SaMfpQ(p]2K9NUd_4=CG$uq1`QXk+je^J9O&7DqYJ$*FO.f[i9XKR(A"b*HkI2S[WS0VJuMF(:_XtV/]FXEu$h4.1X*iEY3YJ59(.5ZTO>GC1k#XZUPVRlS'88d;WLe=P'+;pK>mV"0;\RD8#s4OdX(H#"'pS5ulknj_)\f:d'@-'A?g%APU&%qm]1:Xj5)"DO0(@@L#YDBf57S7s2sqi?eZq.-l9$#nB>!2J?mZc<3c/SE:LeH:1Mt-?c<6]A"?0C]ir=Ea?J)b^#COT+RmYX'Y^VNDfh0\rAb1q.HBL=$roC".MlmE>E.9.stDI6Z&QDXg[D_4YECp1TCpD;#t>0"lB!b:B~>endstream
endobj
13 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1795
>>
stream
Gau0D968iG&AII3lqp>E'EO)eBV/No>.'3fg<-2r?RQPMOH9SQOFH9BG6(TNA4L*]32<aT_;j:hI_3D`&odA.bl8pnpiQVt.ftC@@Kg<%9ORB#/f0.i#GbYi;eHF\oc/i.E#a(`*=/>KJOL%nf5WtOo`,T,7YpRLL!]?IWbXe=%E!BPk>bc,;5f[;YkV`s\#Y8!o/s0jaWSFq3bK)bZ36I!oqX('T>FK`3+[-#$aV671\M*N'U;3W#-*ui3+5X#iW?9:WoPVu6=Y#j?;qK6pMl>"'NV;tU[#-!Z9!](j`-FR@Vq?5]L?u5,f:/m^e.-GREW3>>&1obORok:LH'tm(4Se:$W]Crq&.h"`KEia_Tg%7A1X#M@R<u9Hff.<dC+PbkIH"H]!\_/>S72C*(ia=pu$D5,]j,Fi4eHT[TdVX:#*aC`7(S*q?R,bBV/DmH-]kN'\<[6f-,sI:>"ji_ZN[50lR14:4-"fQr;9)^^5E-9aKPP2CQf+*.0\1YAk_<gLmGc_(u8Ehk?3@MKn&Q&;s!`)X4$^PA.8JKul/l!Z7X-8C-Sg^koET$;NF7>lE1QZl=U`)pjf=e'@jJ$TRAOoY)-'p&L8Bo@mprCa7CdbgI;I8WY3>'4]]9k^IL9:i&6>E(keOcl?B]S/(=V57fcZ7_`"YB2#I^3XAMecQW#O-FaS=7fbZ@2>C=++iC@YH+c<g_Mc8Q1!fa,P5OjSnIaMoZ+p!eDd\cA`5Ydcih9aXD0Q@u/b'rH,hkmOc\,c-dNY'm,kE([mA/N<;A<ota7W40Dcm!1i0r_`*Q`+4f3&9W&i*cL?pu93b+mR8_mGuEO62;bU"9eNH@,p@6["NOZatM46aF+U*e&UW.S['c8M;__$BZFEn2/mkQ(Tp,J]<d^>\>`>53>c9a0_D9pB$PZ\7.U+>CtJK"u>_q)pEKpmuASN9`GN39e<]hSYaD@5F$EM+5([XJ[+n,Ap,`0%%h\Ura\f9bkoJg_o=&@e*^QC:N=AR`t`G=V0Rc'G&`aO@X3QY.A[CiHj?quMX<fZ4?FXWS^2jMQ4dcfc-XA7SX=1i0ITU4dDN@4r[l%I8<._VEkH_H*iA=8b]O2$4a,.,Kl3aUlf4L>`H+m2.8#EfjmcNT-/D&1msMgbXK.CqbA48A?`P;:?L,MN@E[r:,6*4DT8jYhNebSj>B&_Ar=q6`laE[-#5?0nDUEY()nU`?2!@F-DUe,E-f+!^)tgd>Y8a=o..'Jq2bLNR`17gso_2*8lB53.k#XJRq.Nba@=ISj]Vnu:^Vd4cJ(Z]P[&NM$c5:I^7W$mBqPjqQG)p`,.@AIr@/;Rd,3(*Xb]._'KdkK88bYjuh3WuA1?45UbQ)RUOYr+:#A+]i"\W.,e-2^0Qokc3Tcc6aUF^lBr?dM%<uW=YQNft19<:#@Achn>fk,VOgO8@-V5@[s7)Ism:q\b9BBa*!VO(2VF].o)Jc$tQg?_i95QpSML:QAj/>(j$e.Nk#*YlO@3lih[JK!$':EO\5.Hpc_ee]6#0J/@E*=5*c<)onm`abi.!A4,(Td>Ct_pR0-ib#j<@a1rJ]l]@LB(8ug/E*Y\CO5@,#M/`1*^"@FPp]'ZhDI.%SYNr3([&h_$(`J,qG2LZrWMC.cg(Z(eb1Q=]58a(<lhkji^>&7N]Ct2)TDWmbj$0ZccU\(k=lmcq8Q+d7'H'HP]Wj@`'+!H*c_0;iq/GqGO7C'GY[<(T"YY3(gc4d`<n2^R&e/\4%b.VI)`&8m'/V)bm2MkCjpL7(Q=X5>uj)B>qr+&pssaFp^\'[Qa$~>endstream
endobj
xref
0 14
0000000000 65535 f
0000000061 00000 n
0000000132 00000 n
0000000239 00000 n
0000000351 00000 n
0000000428 00000 n
0000000533 00000 n
0000000616 00000 n
0000000811 00000 n
0000001006 00000 n
0000001075 00000 n
0000001376 00000 n
0000001442 00000 n
0000005648 00000 n
trailer
<<
/ID
[<98af89ff09d5ed189c85d2efcd85015d><98af89ff09d5ed189c85d2efcd85015d>]
% ReportLab generated PDF document -- digest (opensource)
/Info 10 0 R
/Root 9 0 R
/Size 14
>>
startxref
7535
%%EOF

View file

@ -0,0 +1,111 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R /F5 6 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /ZapfDingbats /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 13 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/PageMode /UseNone /Pages 11 0 R /Type /Catalog
>>
endobj
10 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816054607+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816054607+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Section 6 \205 IPFS Deep Profile) /Trapped /False
>>
endobj
11 0 obj
<<
/Count 2 /Kids [ 7 0 R 8 0 R ] /Type /Pages
>>
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4354
>>
stream
Gb!S/gK*(Kp78D>:L-^'65N;#n.RN&+XPXS:4"%,Ol`i27CS:&';*g95C:^I^47ed+R<RG1t^5Iq`am<(nfoM+b'_/_##jV?5d4=0V3jCe[dHKL0qtkIifQiPI@I`^bm/1*CP-Z1N^NU%+%\cE#flSbNZUL"(H_4^l1-u$cWdq2SlUCCkj.fNokRL)jeTDkZk?B`OYJ*ra.R;@Hcm\6q#]G%$E"RCr,+i0:BKDKqHigo@ORT):.0Upb*Ka$n"+JOmk%!o9ad?g(<]s[?>dhkrJOl1G.@-6G0:R2kVO4f84[GB51b^=409A6-bZ2*4Re!B2(Kn0UBRP,VpLI1Un?0Nn1#o!'!6DDS-:T/um)Q92bdt+sTu;9o"3h&a.-GaDrtW,lA`$Z$D";!8Z=)])DVW8fb+BLcm8sAsGL2n:6FhN\ndu]/DG)-mge&2SH6o[i^W>q/->Dm\'7;&Ai*65.A.YqFh8R&Ue5C3dmVl>J,]NUD`RuP)1Jt%i*OufQ?eo6JdA5a3[Ma4hG/,<GT1=FV0f$+\7Z=,?>)79-eV+T&u\@FG)%Zb^Mb(4Mk_4>*Gl5LB:AfjI#`#e!G$;j%oIZlLq&^]*:IU!7i@V?4,?7pG08]=PeQ(N%TgaoIese/sU6:EFL7S(;;;1^';5[/@=k<@rX?i%=?N&cLY<18Wg?3G%)TF[a>'D_r<@\1_^=iQ>j<9h#l9]KmQsU+iJh/:N]n*=)lLgHG#X,^0&2t\iL\1ZCF?@XE;^%,J=N=Ga6j$d2)3o5rRa#`1Kd.b;,#AWL6(&Ous&6&@-oN$r16RZdJoPOQD>gk6s\,`C(0=(2^l',Rjp<8>:KhK^jFibBI/92bD6OXqN5W@Ej6C;ML;8(-]akOAACc6bIJ_Okm^O@Ff7+6\>NNE/OR6MX.[/[RHka]99IiE@-e3_:?N\488tC1NAIFHZB#c21.9o^8U#:0WMhb1'2osc$7$P[%u-3Os$geZRqn?Su:8pkp]D@R?k0e!I':a6?SdeC'W=qP\i))8YM]UW%<8;1-Ub-T(la-$sKB6,!pJfkJr*]*OY916?WcG')7]fSa^mH;APHF^a$b[nU(j9TCC`FFcd`/ObZYiNlp9*0.?$cM1E1>n(cC$+0-I8$UKO<C.2H..i?(&qtRS1.q<[D?X?\^1,;o]ntK<MiO<!Q(Y+BO[+1&H:b.:WP6B@tRbTRnZ7"B_pSNbTgZ5t?bg8sN]..sp1oY4apC(-D3tE0`0Y7O\!KUm17k\-NGp-#OEIunu/<ROTK@E74mNE1Xi]sSCEo\Z1\g4/d=aG13qbqlJK4!.bBJdcf#6>a!1`1cU_2kK/cl)E]<<bX5Z&m4Na:h\Fq#\6g$kDToY"MCU3oilq8Ohd(s31o+MXnm$G?TD%C>23(XLH8u:&)edl]pPo6LDtTJqlp`Ul3,68(#b-2=Je2HeYb^]?VBi"0q8O#=HrPXjND3*XG^QC3Qt8:PBn.H\T]3_i+u)Fp&2@:Jouu&KM9Zjb^Eu!a+Mr)db=^:Mm`HL5iCGf,+T]GA(Z29R$>K09RoM,".Z3'1`H0_ns`Nj8Z`GJ;Q'U]k<U"+\aPV$U7qd!!@/J5\n1#OiIJu6\^lq;eL6c'tgh-H6!+Y&nbo&n4BDd;hp>WPa<:fS&I$:Rq)`arUCK=G=M;1CUH8k,,dD!&$.]*;M"WA1_%WP)_AMbFZ''`/D,Pq&M0"K\_W`O)fKVs>t\OCaKh&X]Uj"d<8-sMW[_5OI^XCiFLI)K<0]"A%N%4gqWm'OJZ[%/hUQ-cF*cMfFJfe]qbIRb.=r%o$W$:4I,fULIPSe]kD*:(JP@Q]6)2!$*96LS,C'#'V2mcoPfN;p>jl3&l3B^N:n[98aED8b^EHJSGCA9A&[G(^Vjl'g>hk:@H$oX$3%1mNP.M)dpE</+/3GFGhUe-E]-L.t5F`/=s*f;'K6-seC"g=Vl+n%rIg0#kd.W?S0]s-(YaCR1"-cO,_PDZ\hJ\T%QONoV:K\BP+"fa;;;2r,k;(,F&"kI;NlT%e&a*X2jYJ7/i'#Dm#<t?UiXe9rgCO8jS_+0>(p[-]r4C2O7V1j_lXg+TXtq+-O5\:6X2-OgaX4K,of92'S[('AK5lB#*RVR0biQJ+[*+T22Fh'!VBj.[%]R+kZ`5q^M^pm<FcB^'AtJ2HkK7V+KsQslb6#L-[,2s:`#:eL1b*RQ*s(caRBBPm4\"($Ss/_noV0NL9![h[Ws`sT)N=TMXjJ61B0-@gAHW%um:3<4JmdQX=F.E-2!$N8&P0u\`a6KY&i7<18Cdbk.S'\(+YHTC%EZ3CY'\jJb\kPdS!$u*@JAom7.O5GRjGfjXR=r9_3]tjRT/Sj9`3RY_DpAf$6HD=l)SV\Y6FY+ig/Mo3gjAQ`:mEHGHl[gW;t`=F\ZfFLeTljE\+'6VVAp!$'o!j7Y;a&Z[O:Mo%oAY\b63\,u$'nK1!e?)T3:?P#6IEd-5I-;=?Qf%(AZnPYi#S?Ec;\ANq-I;[,8=Iomuk?8D<a/%?pAll$TTqn/ZoK\O62YZiE/BuB*XVqtgL0#LJ([9M]MOCPh>3t>4d9m\OO;Eq!ULrWCfPrblFFu+I2,!'H]9l1opP+n,q1m->o1I9P%gp7`<XF/IA3e:BXk`jW8!RS=`j8Y'XcNf;oAdUF&dt_WMq)jt9A(>QirHrTea)W)53kAocCE@e0ZroV#gcOiWR4]NtD:X>&0^IKpHsj<a&,>h(cHTV_A^e`VX`1dGDiq]d,.[FA2V^sP*c7.MTPr5[I"r$hDoEu9&4TmN+)1dK;7$LSb@Go10UV\f9&`#CY-3lEG)5tc>SRnMWp*5\cYa-h4,c'^19BFQUt?G@NJL)l+/X=91cG^6_(GWP)Yh=uI`>bI@d6/lTeG?Qk]Ap2nWAn:HJ'14-6d`V./j,ODXd0T+.0c<^,9&%42?h6fFI7*T*Se#aHt=(GW;N:+bKj(hpCGW#'KgRX2JtnZMQaUiDc?hMjsZJ>BCPl)[+e/FN)2M.ljXZ/I^:@S5.)SE7B2=.qLXFM_)%lhb_Ir*JR%!CHDRZEQ3%#&V:0R5:.TlpjkuA9]b!3)Y+pj`#]ujDE[]<aSY"VEm9IqokfU@_s>I82(HACQhF1#:!9SX\@9Q.*>h[7Nb4(jlki3ZOVA[]@SE9S$Z`Q)FEHS(3BJ^5?-p;kc>FP;gDlUVH%rpK?r%H%aiW8Ln:cp+3hu5P4O+Kl9m+1Vgg=JA[e+hne+k7!BuW\DYUUnQPV9;a!hO0Q-&h>7:@gj+4\9q3Sr(6p(.(H3J@YP+O6IW:?dd3d'<>\?6+I(,L;bG!6'XWuV-sui=j3ii1+@6GTBC(Z1Dl]ioq1qMcHpC^dBNm@)X;&[AK,`g<?>g:HWme(QF$EX.8Cs5Xb0tG-77q*M#T[.La:)#c5%:Vl)='6kEmuXZ8/:u;Q!LG#"]Ei=Waq;G(u`I$$eY+'%*j)A\X""+QjTkVdnFcK<'5t#[[a)(/p=-H\W_b*el@[1VX3:aGPgrC.ni\Lq6*+ZAE^MF#cFTDP*XeH!h:@"tHa]-4SW)jBp0cZ1Kg<B&T'qEf\l+[t'1kmed.\/_-P9TqkhOggP7d-X`4$A`N/gG6A@gYF.LdfS<VN^2_j71_.AR\!dhikX7al?HI"R$g;dScW0-3"P*s-Wo#DSZA5P]m=NH[;GLSj-7OA.)Nbgrf"j?WqH1AkQiepg;C-<RVa%3+.aW4a7sdk4PDqKt#Rt6cnGUa;PXOll<d?;dNaM[F+@VFo]S0scP,Rr:ZlMHp?ChI:0G!K'-iWEmeaC^3raCu[g(L_;?up/BmET%MLA&9tf8dSE_OoFnGl#9pS)L1DXTj=<9*#r,?[-`uJ]).>D9DDW*]<#ZL@2I(^<EUfs5A&:c-^8:I[#M5H4[T_>NdbF"2@FS8KA$'\ZZUhBGCdJ@fHbTNE3[2CX1P_*i%LkD`]d7b%'4LZ3BA0e%1aa;TgYsT\!5)[R&6s&%pEaG6:We[TW^H-rU\94>YO.pVY^[ku-4%E2a8P6,RQmOQ!Z7^$T4bS=V\'[2n%0X7N@!C,Ob&HBYZlW3R^s<GlX'((G"qM'eXne#<Q-[R5#W0W0L:6U5VCk*;+a+h5N;R'K(^Pgq8;BEeE`-ZNtLFZU<.01m-&OA^*\pj\kG:<s0_#5u8fG)S'=*-b2&;*&TMj?dVU,\0PKUB(GrR_Q*=FlSN\^[;$UlZof;V;YJGU$=4TLs[S%GhStV2Aeo`5-"UnX%CKO'-\J68Wa%Ec$E[1EN<0>5H!,3+6k\#T!UG#mEOJTk&,Baf@o#foWA,P<d/Pa\%'skh")m;CD'=SVlAG9gNp]!a%0l0IG6;tMAQ,2oY]KTVl+:@01U!R5:0WK/H~>endstream
endobj
13 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 737
>>
stream
Gau0@9lldX'YO<Em*Y'n1(m.9oThE"=/M/sNkWRWgM-^c,i\[X=+JCLBg-._kqE5'4hYFal7E^$^Z]X_/)WP-if\mKA/imO7*)NMOj/@!k]%t_,XKX@_L-oq#=H/[c?q(S6_fT:ACUYq'AfK9I@UV<KLJ"t0sWt)+0R=rBT':(%UEA=eiI:J8.18Ye`r-[lV\lb[8XJ[/W6?'euAe*[]\0Hc=p3EecgG0/%5ko>PjA$MVu(r\,Kr2SYGZLVNrM8kp4Kep?S8e:.G;JCK[5Oqi:$.DkZ?,&([`&_AsPcbHa7'PR#aUJ('eiAcpLKQDWMB>psAVVL#H!=+<B_/RXc[KEcNI-jZS)(*"S6;&kBVP[qIR]oWXZ(mUn*0B?A_^sD;m[opiHJCJ[XY3b`g`%iM+OTEMZ-U5k3?ua+J'p5_^LEJ<abD>04qcQ)3<oAPuZOictqC$)&4PH"jOJ$N=)M`;Lf[.Nn`\DY^2>1jkd*9QCVt(krKaX)KnjLb]lM'?I]uRucjhJ+VC:EN[,WF7=G]D37%A)C\;l,d5:_S4;QG9*dG-hL7p<`JUR-58pi<Q^0i3L%1Dlf!ffQM^Em2I.]H8k2k]$fi&Be/F!#";lAbEMJ'+3FG9fnq,sn=sJ74<HV=:QD+[8&Ga=;'(l[=n^E!0Yd+:HiKrm++>B-=%eKM%@V`C5Mb!u3Zcb!fsM0$hDnXes7^M8c-u<4FYYE>qVG;6qI0(*0OJ@1~>endstream
endobj
xref
0 14
0000000000 65535 f
0000000061 00000 n
0000000132 00000 n
0000000239 00000 n
0000000351 00000 n
0000000456 00000 n
0000000539 00000 n
0000000616 00000 n
0000000811 00000 n
0000001006 00000 n
0000001075 00000 n
0000001375 00000 n
0000001441 00000 n
0000005887 00000 n
trailer
<<
/ID
[<02ac18805564d788929429f5e0f4ba96><02ac18805564d788929429f5e0f4ba96>]
% ReportLab generated PDF document -- digest (opensource)
/Info 10 0 R
/Root 9 0 R
/Size 14
>>
startxref
6715
%%EOF

View file

@ -0,0 +1,105 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /ZapfDingbats /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/PageMode /UseNone /Pages 10 0 R /Type /Catalog
>>
endobj
9 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816054923+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816054923+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Section 7 \205 SSB Deep Profile) /Trapped /False
>>
endobj
10 0 obj
<<
/Count 2 /Kids [ 6 0 R 7 0 R ] /Type /Pages
>>
endobj
11 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4270
>>
stream
Gau`W>Beg[&q9SYQq+'^B\kE4l%9YigN:o_M;@S`pk>Fb#r,#U"DLq#4o<uX!:V2c,&&:EY'k+X]F8C++(i5)65Gs`CWZTJ#4UaZ:+n3'Cq*W"jVfc,I"6E"7t2L]c'=l;KFld"r_G:3DHNbNq%agUAHfdQL?#msksN!B6=EnBhgq7*A_UTQ;RS5(HbSH/TnfOa(3"Xe&s?=-SC50n!j9t]>-]pDYMh(VMNY&4cKRKSTAhW/`;B-g:,e^6=)daGDLR,hN^QkE1]BR=hK!r("4U@$n+iZ<YG(?.c4f;VV7Zu*eD1hM>Adh.J`#[?9p1C>*!3XXD80!j/dNoaWanbkP1P4ceKoe4Uop_^bjdpQ*a`9h\UE!GYTn>,!7Nub!<G7/ZPs!q-RBQ53/.`h$hp1CX.!*tRqU+)W;.o1kC=HBRVq#t?W01(E3eYcB/kk[*^&B&?]GQP%U9O(nWa\Ui7X6._3]Wkjmq7:4OZeoRZPDZhXLZVPPRsXg,OJ<9N/T28q_YDj1qnWdlf/K.=#Td*\]B(4,4fo(uI)bn3Yar>@Z$jFo[8TZKqjN7`%2pN"?acGe"b_Gkhc-Duh]%r8G_Q`/$;gOW0_J71![G$A@P;Do0JS^WeXMNQ5BUf\<=IN`aoMZS*'Z=F6%_&T!q`D&O3A078)0.=IoJ,%I>rZ!fkRLc,C=E`8mZ%`6.nD%PhK19cKG?ftEh;N(We&6p!2W@.T;33@ttil+Y#X_flgaL-3Q?IiftH(9l[X=J][4ROrC'B%IZlt01T>G3SB"&%Wq[\P4Q:4Op_.F#scM2QVM&h"#7B,-nm=5YX'E=,.V.[I;\`(8Kt"3er1\LM;/QQ)S*%,SAFN#JcZaLd/nGub&lA5gFR7%Y4e4Jdlo!'e;_?oELa1$V.s"<*8nh_N,CJOWO'#=biE*TENjE\nmk$Bd&S/5J4IU>'0Q=33M#q<]\SCH4Pu2V;2`qQsL*#o$,^Jq]foF]B1Sp$!pof:A'(2.D;Ol)jET#3`:kEO&%cd2esfL!LEB7B:Po2^mE=D:U>Kfshf2VV_/ffA(s#5]Tu3G^*dm;tYn@/OtE'+sO&Z@:iY?6n(I0#q_(FMW"T6!S-+u(7<h`>a_kTWdC!,"ol;s;&<bE%mB$qR^=M.#StlE)g0fg3G*/9em>R^Jn-4q)>Tsh,PalW7Xf$sGeH"A01ce9p:1%ISrmi`4X31uB-`7Gcc?Xa)+b=l1\-/ZA!s#I7D*euI,7@-]s*(\dkgt_#](c]%130U;BnQg?tL<hA4B;o2\.$o,u>(cT7UAOM3BgH*$Z/Ea>q37:+T&k$IJr\7Ce@r*j5i.i!L,3Dc'H8M%"]8]\>[aA(6M$XKE!,aC(:=3FXRK3QDc7(.0VqB8Er[C0Hch$T(e^(oIo7L?%3B.NuJ0KJD>A&fF/9M+eo&T(CDaN+EtWep\$#4VXNH,3p:;X>/#@4Tt)eM?"TEVS$BJTS6MbC/J??C!&Ccf#,mAC#TD:*P0JbYVM:3i.?U9@Gj^Q]Ic][U!r0D\6p3!0k9+ZAL[#bpm@e2d3#GX1jgHREUJ,<C/4A#8h+qm!UnBj4i)YkN%W!u&Sits*l75[3s_PSe!*!d?o:5c(G;aD0%O\)^reaqL,l5AS<O:STQrsu9`LBV:@[D9^hua8KGH#qYG#jO,Y_.LPO52dd_P__GWl)\@LEi2@TQ^bfj!E'h7f>.SJsSk>7LZr#L:M'N@@)kO;1P#D78fnJ2hV&[[:q^-6ijl-P@.n-tK=b8ot%q;ZpU`0N-HMk5fDQ&7Pd,-9L-'Z5k+>(n,hukrq.KSF?Bs.<p0rE>t`LJT()^R`ff,%Gj9n`s'#O$%[/W>G%hZj.F6TroT<R&)M;Q/=H)i''>P<bR+q8qXAH_3C9SKI7<"+.Io^DfCp3QANp:fLI75;BdY@U2LR6Cnc+$$=ACN'a*rV1`MN[N.a!@@<4]nZNkC#*M0Os3BK[#3JLhM3_9:hCE,u>4Ok2>7bC$%9M"i6`NoV;i?[,5e=a"l82C3o38Wgd/>hNaKjC1MXD^%9f8J36YCRC@E:a2=HU0o<t@O7G;'e(IJ??IS[?>">D3h:U;o8pN'Km)<Ki)6P4;q+JuT2<K:^-aMn,&[l`[K,&g0Hmp7K@!Qppo87+d"ZU@Z7i!JbEA%Z9Mj=fmu'pW-F=L#^iEr+R1T+0&XkM;Zpk=+ZZL`u90.ZQ#4%"(dO_H\3!R#iA&MNu1@6)I@B&G2riT'4.83oT%1,I[?tDm0"di(.Y,aE1H^(-f78[/%B1QPEOcg"+*qNo:Z5>#%(Y'ZMKPFGI`U0]>kt83]@_jQ?>Im>SFkg>-0IMCfb=s,c@`<M1?P6mN!n(=)^FE97(=5M@.-MX]F]o(Q-CC&Z]A4Wu^p;G_4:d!R%qf.I.a<EHQ_g(ACF"!]UUS8]?-L53Nfia/UQ]t*+tm0uNobC]a'8IgS*K$^m=?ne:;_IPWBMqZTZb%optM;'I5g_.X`*=hiJrhq@[*JRp:9%apeY>hO/s7VXnkc??SUSLOiBmPDK8Wsje(^oP0q70UQ_FUr)Zoc`isn:O@\9#5o*t`LOU.>W\Vj[Q-&_a\<,O!G@.Q5.Tq]#F(4k8UgF[^=0Z4VlLZ>\M<54f!bS'0:m@e-U>nX*3_.V,X>'LW4BXK8(X)8*UFgfZVQZB%H+^ua9YOf<5::&@GGJh'EM,6:Hf1\>SQ0NRfE3R8ZC`I!$Mh"@q[sHh$CkT6=L6KR$$f-'/@V$(4k[TjV;N-L1SsntN?THr9A,Fs'!e7^N:T'X'uj.#VC9;47FkZNqG+@@h5A9a>LNCQ^r,PQDl=QPIqTs_X&KI0]^$996D^c.og\f#Nb'^^n`5WLft(1NAH\^k>)G9u&)*K82nU<?QYF+lCKe*t7uE1dKbJ!dHUBW>)NF1'"rT_FF&IiC$T2"kIq9!j#plh^r,U*o;Gls8A!`.G2[,Qsf01r8l=[%:P.Xf&(0nNuS4_nSk$djp6oGg)#cqiHP6]X$cJkkm4lb1[\7_j^3Pf.k^cH!hjs+A92CULJLaSclO,7>ip;?>qN7kAc;OkF.10c34I#4?t9Z!e6?7cZG\?kFBdp2)ZG`6W"+_eOT[lH`r@B`W>AkesO)o/Ke!J#qo&0]e7P/U\4X/pa+cp!aTK-dY\dtb&sE/.4]g)*h3`.RM&:K;Tu;OXV@"8=WQW1F'Gm23[\o\"s>=[D7Ic/09Dp<90:Yc?/lM?W8Rb;L]:otUGE(M\d?:mEnh"\FPc<b-pJJ`,fTPKU,rN%?AqDTl6IX0>jI[;a^@M-B*gO%$OPcH/5c8`s3$VLAGDdtORg%Bi;LC?@ND"iLD8fL.s$^krs:g8ULX>SeAt=TpmV$*T_R;WB6/;:OaG"'1#>m<;IK/&B$fl`+T_C];d%G"OX\V#oHZJ^-mlg(OOiVrs[X86Y4&hpNso/nh,Lh'hl81o9)NOP+ANGiW9;d2"@'SLZV87WCb;B*Q=nA_k0GSB1Vol+,[38[ZPT0g%m<JS/\7WKB20DTe2="t,qB2pA\R;e(N;FRjVgY$CmqKIc6N$#bDJ-CRf`\luu.:Mt<=%b26lcYeX[EXeJWj[dLpI/?Xu9Xn,!p&u*Yq\3*cRrY^p!:&N86HYEK*3/Jk8JbU"1+Wo)G#_*El\RiU[*N[-]m>=DlWWV@f+U@!ZpKIZ3mpf'*nD!S.@P89@Jd!QD,'XR@q;`ZRJ%UrlO@qbGFlU2c',mK8*c0)[`^>>O`HL/1Z`LK;ok]d3]5l64n0Us4s$[T9i!^%a!m)R*H0UmRUa#!C75J/lA<9E'!AmI-i@0!X'!1Q_c;h>X.F^DMJ"A=Ca87=./tlg@,"`+P]OTn`9hF])tL20(%TbNW:RJ>edct.CMbqG0="iGA9\P?Ib#Cq$V@=F`]Xm;TAO&dqAs?Y5,6$L?1bYE\okL>+8,N+hGuSD5O.r4h>XA%+*Gf00'lULG,k_WeUJV'^37Y%OXj)uXEiEgYX<QHGjPu%@G$B5mfIR??Ye?>G>"O!0rM`I1V@MCEC/'UhqA=:2E45ScRUE^QYX$V?0rtY[AT;PGWjp%CCE9D"5[+RF";DV[(@Gl.onk+M"tY\^Eb]Ygln8N4Y*8'eog)c^$5LhhNLGKJl1I37&n3]I)USrG6h!PdmC\HT%pgLKL.rp%;l$SAp'M8m<Ap]UYTm:_!a&T@u^@^1^Q5`-krUs?+3iG_#CNZ_!\brIRW8DD$<LiB7<jVg"L>&Cu'B6+cW'"bG<ueV4S>\F2mXtIc-sXG*PrX[NHfF`q4qZrrRBii@b~>endstream
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 385
>>
stream
GarVI_+qm%%))BchJkn-,\`IN*!ZQP%5_aZ]hD_C("RK6J[)u1/KKX]ZK*uop@H`Hi"Vp3Gm-l?>ho\lM6qd==FbLR=mE\I@[L,X70n=6Bj./nn,(A`UXeBu"NcInlFFcl.dm:WN%u!"\>cOo_j9_@Hs7NTd$S+pQEG*tdio_o0(%WH1p*0RZ#oeR?T2mO.('^*Qa:Kj7f&#7U/UbZEN2cK&l.`;+9@CMF>JV6JI`gN1(9BIduj9f%i-W4#6HRQT'^_P.,GPVClt7$a5]Bb/n.Oc-guP73#%o*r6\eQoTmfH<6/#a+rX$S(sVCSFb.KlY,j3XR7XB?,ZF>)5++'JrJO,IHEas7P]i$j@s1s2F]!&$dBUmp(Bt!#I08D`Hg1~>endstream
endobj
xref
0 13
0000000000 65535 f
0000000061 00000 n
0000000122 00000 n
0000000229 00000 n
0000000341 00000 n
0000000446 00000 n
0000000529 00000 n
0000000724 00000 n
0000000919 00000 n
0000000988 00000 n
0000001286 00000 n
0000001352 00000 n
0000005714 00000 n
trailer
<<
/ID
[<3a46c8cdae2db388e3640bd8e02d47df><3a46c8cdae2db388e3640bd8e02d47df>]
% ReportLab generated PDF document -- digest (opensource)
/Info 9 0 R
/Root 8 0 R
/Size 13
>>
startxref
6190
%%EOF

View file

@ -0,0 +1,111 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R /F5 6 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/BaseFont /ZapfDingbats /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 13 0 R /MediaBox [ 0 0 612 792 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/PageMode /UseNone /Pages 11 0 R /Type /Catalog
>>
endobj
10 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816055104+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816055104+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Section 8 \205 Syncthing Deep Profile) /Trapped /False
>>
endobj
11 0 obj
<<
/Count 2 /Kids [ 7 0 R 8 0 R ] /Type /Pages
>>
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4172
>>
stream
GauHOlZ:f='*%C7@R#"*918;%.@SPPT<3HXj$mqKDT6$+&sCmD":p1HW7+!1((Z:e/<MZ^>TDKB!%rH"5O8c^"#bTgl=[I,\9ru/XTORkO#(a&bD4,b\9U46n!RZT#-Kh:JK*UpBSl,B@lpI4!R#VU5o>.6L&SjtJ^;Z(R'WXX_;c/B]ARpkFsndETbWTB!Hp]IE.1M+RL)a;j=_Fh6V>:UnR_53Y1PMmF@!5W=]=u]3"b`Q77P^"OVD`lnP=E-#P<0f,3-Guf08ed="up)DADb/3"5?Od.IJ/"nSm/hLVB[h3P]8"5e,(U#CDd,E]2=#<]P7\7H_a.F$h&ZWWI>pFt92O]Wm^I*:sgPp?4\c>!&BSHZ1TpClYBjO^_SpfhLn@PqL-!aH\Tru3;,^-l7W4fiX,HiGdtiQ/go5Ykd57YUo7Z1F;<.s)#FJAQtC#\t!],N"'55FlBNh'E2IL_-p:Kuq1,E:LTm_9g0c9-DsZo1T2U*mTP,"!?*YY7pb;$@P=dJ\>()8V@BjbCs?f>@Arh.b>\kjWc@$KLA=.3[p"52Y:su59/YO*X^j.V_J"gR5L-`\mUNqOY)&s,3G_QjS\+4\C^8oN!Wd+IkBX;&2-+UI0Y++9@e.o$FrOV[1CF09NVaOq3%k%U#D_>TWPHW^+b'i%",1S/MB0kPFL)F/@:W^*@cGB#f2_h9$j?kEcB<AZp0[pFdt&op.B#K`B6E;fqj&-8lNgPZC0mYe6c=q".TT/lQ'Y'DXqD:]+VheR7OUu>8<5ub'Sa5jDU+a*X\-F_-**%7AMkUONVi@'Cra!+*b(:Hils!juF$C7N&g5E_Y.W6m8:0,dSa?JqBGhJ*ZJ3Huakdo^%\?6f[SQT$A]J?hA:_Y#.*T4Qf9_T&):TN[O3j-f*]eT$ddF-Z$a@Q_s'_QRRhVpJST".7=mbUuHsMTV*_<!Z8Vp=;mrm"VPfUi3,9+ClRhe>*bmKGde>;5Klr$#t^g]:g8@(=`f$(\H(H_=U:-+n,*'Xgq$NU"["et!L-l1Ao"<Z6!21lBKAu);=b"\9"L6sSqt@#C.2rA8R$UXP,XpZ.<fr/Me&EqS<:0]^2DDIUhN/m.=DFXMteVhYeEKWEf>AWed0eEWkZuZrIWpV2FTkJUcheAbL1WBocSm\1-j:4p.h)_+'&k283mD=AWM-cHW4*Gp8EbP-`FN].S;0s.GNB?fqX.^Z:@'B4Xq-pHdkF9ULK1f7m6&W`uZ^-jR92n^E8=lK;!kebFYpU""qU#"p>#Km#EV#"35H[@=Xcaj)`HU6W,')dUYs)]qX`q>sIN=q)p!t"p8%FXkT(tB1fMYWkjFlJ:>U=1dqIQ(E??\$gn.d,OE[B!,2YbG6*8H.=6dBiL05^^c:DU.DDb]LsE+*R]UgnP<t%##XJh>(IT,&15T/pS%t3bM*u;"c/rJD2951e,4f?%K*smgHOMhda^XmiC'-[OP*?\4?QAgfRM/Jsk1$A-JB@\e)`FdkB=i^uod`dooOcP]r'ETR.9nVl+/<-"Qn!.KFek[.i.rut1PgCu)oFI-"=atG%";[G\ih4!9%me>4]sBN9FGq%,`@g*:!\.m*tC";#S'-Y$;S5N=,%&Rm\3$eP+fe2&EE;0o(6P,"eUMjX:nJ8,/nfa@q1/`cFr"DlP=lh-,:(X#)`c!#lQ[=oMJe&Bah%/!^@lso_#QIK&JNl4)DpQ*1_TZro,kE=h8<5TKi!>%@mQQ*aJ2JJ^-Im.t680R]5[0qDf_[r%Qd#`?s]P7RPoLaV8P>WTk0kQ4O+%RUK:O24]3pIKZStBi'+2+4S=Ki`2gdrS(_`jZM;nB0t)GpWi<L">OtCoC2CLN,6+h3r8^#2[gf^3kY<3]RF5%02K^ad5OZ.oD1CGKFTqJU'8ALj4+9Oe!tWSr-O"ZHg-c[p24[00R(m@mf*@7Do\n<qSl;[RoV99q/oEKO&A:Xoc?nmZrQ^GCXCIkU+s,ON+FonO&-4m1A#T)2Em[5amtCsANfR4H=OdnJg8"1*K5q5M?Vu&&"bRHWH(`IKjhc^`Ulh'=,*t"^4lFb'tg>o.+e;2VJ:l;8?otH]+,QM,4JT5J6XO;-7u1ImHIl>H4+f%ZtMR5]X,S=_$qh#N/".3c"'\!SVU<Jk^)>/T>D?>E+c0qMSI8N!X!1Cg).-=m-966dMi[blS7T68&o'oh_d,kKp<`gZ!*<l2rb4h@Z7cN:h$\_(7RTmF/]sqC@rCdR.CBF1/OFfHJDh-.hI#o!Fi-`4Tb.'R)VmpJYs):<l*&kN%ct)%5bQJ$HM7T.U\`Cc6`"-Kr.$`.:Xm`#VgeZaF^f`Skq(.TB0I%?m2Aa&0Ia:-cd0.P9cFXCb9a5ALdJMEDLKY=JE[U+L9Y=]<#ibn#FVUnRD&"/L*!A#]bSU-7Ub<Jq%,Z#l]&8h?-D0Nb8U,,qa'^]uf(Xg_0k/[l@YK>]CK+$<`\3(jCP2TO5Xh"G^=Yl3"Jl*>-)?7OsG@2t,ZS7C7k;D[f"NWl4saU%]RfDS3b;Z^s</e3TdZ]bJJ&KQ>,3UGaF@qebHB%+0(N?;<Pa<?fOW/>Q^1PT^lFQHSLE?pkoiR>gB'+K7sd;DJHZTN(0[VUIGG]#-;]53P'ZBBTl=JV7Qtj@47s"P8pb,a/D-\+!(hnAcQl<u(t+,l03WgNj8E=j1$#Y(Pc0%!%r>r4dG+1N=lg9BK.(\76uVkI:Q7>V>*frE]H_iQd%I.7qJ[m7kNV%5-"*)B@Os)hk<J*JRUIcFI-JU2?/,11&EZNRVr\gF?o6b6(I]RX&;KE!2U<`0t1aJMbKE$^M;E:r6)5qCGUK5qQM%kq9,+8iR$@b'g1eZu+GXhG4lkJ&Ve`Wg-2t.SDY%E4*;U2>$"#(=E=KS]eZD)kq!;pp/PGe(fc=e<s-UhNh_qLVYE88OH`H?"22>j??]n6L2+?O6R_^FG@^C7]!.L$l[HsLS!*-)C*]3\D[?UF"Zceg_<Ok((sHk$sf(fD`QjPDG/jSPpOG30ecZLJ4'u15I"RQ5TQoM.s7qAk88EJ6IHCVYZVUo@e`[XRR*uH-C#1,0dCRVS-abj:&,2/ZoMtjO>jD6L,J\+OlNq=b8O1e/@$f:RZ_&Y$ER>-e>er+TQJR,NcCs28uhhf%1o]7[&+_DU5X1$[\Tig>iH$5+c4f+qVKt[pqdGP(B&@jDe,*PW\-J.jss2!AoN'49Q<ueEuThQ$2XM,`H4H4KXJk:c@)&b<[<YPO+mg^He%%244+;R++<8DKi"(bI!PMdFnZ:;L[X(OGTANBOdQ#,@a=uBH;rdHLVU`;&"G7"rR].h?A!">Y[`_T;dU@1J>(8Y2&oF:!kn$_miH?o7qm=1K3P*,mE+G[-u%S)BmaRA^Cmn@?]M<MY'>5bd-]=9?h'X$%4@T:X52pJ3cLhFU>PAPWM$&![Tf!PD5%QIR0q]U_e;nn[jaLMN8##UgFtW=$8QN\o9JV83mD\D70uNijuB+>"Pm[QW=_^od4r).^)Ql'qsH,#3T`^H,B)f9)]2cQh_nDkeiW07]t(+/ogXYISL1j^]sjbYgl;*PHTNgjmP^&H&XZ;e0a>d\c_,F9D2(7^K[=ACa[pLm6s@pm-huj+j$?rQDH+!lBnd#'f6Su(AS)ZG<mg%A]m#t32qF_dY%06fc'(g)_$c^o7Dl5ZXmVDEYEdn&m!frA=Xh=5\c>2-+fdtIMX3\,f2X;`Z>,6lL9..[l>kZ^)!uL7lP&An,IY^1mD?gseTUPY7A>Z??g"F"-CL=0aXajmX1\!q?3^5!Sr.sV/Yu8k421Vh^PaA,p2;<qLZm#"mfd9,:pp+1RpWRKAXd>amM)'If<3pV12W&"i#^9h@b2Z)\ljO:G'J1UKh?jKG5/MYK;@p9WDB49r'HS,LIWsB3H!HT1=mKAmXb7+@R21#o&b`j/=<b#QBstER.+439FDh=XO+h%<6_j$bT+=SAr=9KpY++SV$L#aPV,sag_:uRc3-LN*@PcnIFBuP#[(WQoUj@^asi@a9pECUru]+m;"QN&d.\_g$?;*nIYSk4,J1$4*n'uuL"QB)b!7I`T@<45*duSPdbXn_pGMW9fSl7O9==8<H1UO.W]n,FVZa"V>*tK\=f#Cq<9XKUr;VXIZKCUg8r[t$Y]^#0`@m:mC6cpcVicuZgWR.$X7cFsj!9*p")%W9U*ch^~>endstream
endobj
13 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 225
>>
stream
Gar'#:CDb>&B4*eMKc.pbun?PFH#Qs;7K+LZ*%^">2mB4I@Gpe4ErXj5MflUXqcr!)IOepg(B-.Q6;gqO=:h,4<43\K!P`Vk?:rH]eeVF*"`*^=#i0tVL62_A2C(fn$O-.;NMHKH]bOg/20^jJ[RtD<F<3>&TZ/!A5Aus95Q0>'S\U2TjLShr*f<^^8hKT[D(\R[:Od8F3#lm!mBI6qp3@kc3s%.4D"~>endstream
endobj
xref
0 14
0000000000 65535 f
0000000061 00000 n
0000000132 00000 n
0000000239 00000 n
0000000351 00000 n
0000000428 00000 n
0000000533 00000 n
0000000616 00000 n
0000000811 00000 n
0000001006 00000 n
0000001075 00000 n
0000001380 00000 n
0000001446 00000 n
0000005710 00000 n
trailer
<<
/ID
[<620d678ee4f57bc538000256adb4c47c><620d678ee4f57bc538000256adb4c47c>]
% ReportLab generated PDF document -- digest (opensource)
/Info 10 0 R
/Root 9 0 R
/Size 14
>>
startxref
6026
%%EOF

View file

@ -0,0 +1,86 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /ZapfDingbats /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/PageMode /UseNone /Pages 9 0 R /Type /Catalog
>>
endobj
8 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816055345+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816055345+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Section 9 \205 Matrix Deep Profile) /Trapped /False
>>
endobj
9 0 obj
<<
/Count 1 /Kids [ 6 0 R ] /Type /Pages
>>
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4089
>>
stream
Gb".?=]=?Mo:979:FS2;KLVjKQ)YCUKObUFaX.P2%.`&BXKLb@lVr?2f0(A#2V8XUSNM<n/Ws_Am[h/)B4,-,%o^5q#iLJ"35/k;/@_/NEsr<AhSJ=0_-[GKHIK9\+o%@Y^Olg4%;)o.a2"nro0!lugN.bkK5>^]^fU]rL:[_">JP%YgEXeBB6^2FMplk`34ofRLl74Ino$76RueH8,`D4,3)?8*'6=cKEZrpGcZhbMB/'p`\]isHh4JZ\/KAUm7)FGmT;TU`HUYT.e10H`Ds6/&B\BQeN-Iu/cX<\b2i2]91l[W5<O@fU:rjo:&_pTVf+8H/6DSRa,uY\='6qi]9R^]3h#O^4=Hi-+=<@^t&Go%03>$$G-N$6*3%JWQ?@ZT2l2SP$bT[`(R%kCmlecWYe/MCKZ":p4ltQt^4Q>GJ#DQmeNf/hcoHF_$[71XYgE-r8okai7l(S*E&AiZB52U(I^/,%d6sj`'8bZ/[NUPeEA2*eg&D9C-a*Q,pQKalu5k_K#Nu8_C,I^tdMUq@7E"J0i6BEEq)_Hb/q*]fj*#Tg?`'fELJEaNJ`ea+e@#UV<8J_i3qT-#4`TJ>:RH%*9%a+LQ?lb!*GC[)8EN]O^R9LK<!Eb=GJ&bM^eT+`ObZ$p;T"-Q`4<)%84Dt4<-k"^6V(A43r8CJOb#s9Rr(n/<Vk,T\g)'T5*gXD]US?E9[Xu-*e1GXm-JYXW$mFb144SbQDu-jnA33h/1p7"/[nPO*mL/f".UpI,*`%#=!HcjGfn_h[i8INV,6:(C7:e"P:B%q<M)JL>%n^^p)=_MLEe<LdZ#!]`?R/f?E.%c]LYnH/aA1kh,k-[TcR?ZPrL9+<=hSq:4NWD)E?N[RDd?=,ppWg-jT?&%A/ejQ@NmQRUB)Vh?$Q^Bf&\3\pgY-]^DF4%N*=iT=DbCJe>;D/"qo>FZ4Ls`Gq+Es"ntGB08_SN3BiIf1lWcM_*.C<W5f4LZ'oK5C-Oe`F`emK3K%=3n?@>724AC/(!&6H2(@ajZn01,!&?/pQDF<N&;l``_kiYNl>Y$]17l<@W,#h_+-LH,U&L#Ns(mVDQqfcHU23e_(\L%%]+3qKf\@<"f3bRcfEsnJj*F0Xe2%qnlZ'S>7obeUa43O?ULJ"%UE8\<'gV(&oh`u5:g),C#<fuKTd#l,%Cs5kbCA<0[5H'Ir@Z]4@?+>:Q*6CTOeHm4(to`h5;mCOk.h#j\>5d(lN3kb;C!Z$jfNb%B*6FH8Ibb.*e&hf5sQqrGIhsi2inJFXop^nb=!6]-q)+./BJjOALdP\mO6H3;oFA><rk(`.O*9$kefcnN\jFq"<sGQK:l</(hH*o6dme@js!1+<nXq/SnttjX-pP[*7oe7A6pNp^dQk02WC4:%$NeFkIVt"VT&(bdGD3SQaqk*VD]2WX?4qO*87j'"ETV"5XIhhk=N1.U(rd@jk)EMWj\mk7:cL'@ueQ$RYiot[N7H@\^!u"c=G+-:;S:LN-4&%3HE2;Il;Ca6Yi'?R=(jh`-n=u1n"Vi/X'+XaQ-l4+dgD'091XGkD3@,(LM,!Or%)ib;d9`kP2J`\1')K65`7]aTXsVRSYl^bF#3<+HWOG&1(H@4]0[&'jnG9b>>-(YkiS_nl\/C.0PN<0]eE*QQ7RBN#]akT*j=lQ3D>gZN5?,0%=_+qW`<3A!'dA@Z6&=4eaE<85OG_6D^u'P"W1'BC"jDf,\%TlZDHKCP03hU9[ua5WV\1%c`OuM?hJB4+*dSW5VTHg&\DmkY;[0AG#Zdjj`^bi1CnqJ?s`bllD^n0)sPo\S;c?Y9U`A_Q!@K6=9_qHmJ^/2>-k*^K/,$XF'[SG'IMpklSR[61iO1NcYE+,l/NX'am,uNHKmP%b%j/.Ii,$.KT[*<^%2l\1/&4_M@ShF\:%b.mIVR"kJPJ=Mo/G;4*oYq_tEqG[=/T.BO"GfZ47UUZa0b>\IkpTn4"Q,bbO6_([pCr^26(U'S>^W3t5`VZYONZU*[cP[8IjhfI7F6+'5#N\Y^c7ei"#f[bt8lO.7ppL+^(O9DoHi.-_2i\E]Di&OE5DRA?+=NEbgR%7a,G^Y.2QHK#a-ncnV+QhVVEa%Xg![[OOb'X[f<p#):<uEL9)<P1tDOsoIe#"nU+2/hh43Y,$hr&^GW91$p)D71/WJH?Y1X'hf6%R,qV/diJ%`PZ#cX>L"m##l(ON:<[ElC%:Ll.P"Jt"Hb<!M0_q@GiF&R%TFAbIN,LV-/M8j@6>&^3[pMg5]AX+E"LZD:/;X/?ANT:ia6aO"LUk-C'g(<Iit>=:S-WWYD=JB)Y-:belU:tmOiAV!N;79_59KGT$"SXCU/jp3c08<3ed-eW/*Oc2qD,g%R&;&Z/jq!F,.A%t%T?msM*]RMj].++oZ$m5FJo!g(m2!/8=GB)A[[rT*d2/Q^d(:W%#aUI":=<50o4[H'MR>>KH$%)jDA0c;kZFbNcOk')fp1^)KW(!sFZQ7WI=.<f%/)6k(F`DEVgnCstAK3?.n6mq5-NgjcbNX+o53E)i#.+;J,5"=Aj!>sM8EZq)i_*-c%B9aB<T*jq*:i%Z!%qe',hZ].G9Ra-N(3u[^-*RR]k+dRV43@MMBhpg>rWu5&Pk/RIel0`-`&A#iim:\D&`?\P_F_umbj[;$eh1NmUZbBcN:KbM@PC;,NqYEM2am%!Z3O5:l8S)8BW^GTd28Mj9'_NcT-D1bO@#%>1ItL+B*2m6Z@GC$WLF%e&kO)35ePj'll3&8LRCYcS4X]kV-OtcuK^nO61+okjVDVeC6j`M*=?ETnF-es--dG*,B#%n'6J[(-E'<>R.Sehq_n/<TCl&rm92hU7Ki"j_\GsZW:&SG!%(3SKL!=XM<jo<>^W:ad9NgkZ%5SZtk#Q`>j<T/6VXu'EIYL&7J,%eb/t,MHs3MT0f81/#^"j_/R;5LQ9@;G&9g+COTd:>#o'/a"U[:8gC6%B/Z[%$$slMPSu)npjaW#FUEdWYEnb6+#'NN73N7!V?iH#JTOi!U`B0YP_n6aQB6pEh/es?(c`IOWfMs9Yb3>2%#)jZ7$luj4a+lYNKXN)8M44kHn#3AVRs)TfBWG.IH-$n_:2t6BERm<qnQ!7hqS6]*AFB+R/K'R<\#ltFS<\c]F5\BYs/&h(G__PdNX0Q>*tNJK3k%umN!4p2HYIe.Oq)#hinX5;:p\6e/uYh&D8VfSXDHrI1:FY?)lYjS,Xm@Q[R+2<a'+&!k.GK.gbsfESKhU1pNcBf_t;u'A@^oN[.XX(t*'!LpY8#+hDL&F&c,Qbn]LR"mCa.8d,2oJQD"sr>*g^m:qdX"$G/&^e;/+Q-fD:;A!5/NpGNJ%Y=@[NY:s21^V<P[7d_kcM__;AK76l2/>7>63=WC+h@#'=J:E)&%FesTbFF9=nb:6Xush_r[o7pd'?kpBMnNAENY1@/<A5ighh(8d/>Z^:(,Vc=eUb/(9`XJ[e_RCBAX@o'jS5`q]Yb\0QL!ig`c'7$bDYq=$R:[h'X2MM#.5QWJtX*.dI93LT2cf&8"/bQZ_]G+j>D^.lZ9-b'pQZ*1q@EEW:!C&:;MqjD&bI98:-sPR+3G0*I>rX%e)F?%Y0+P\I>N;)^=Rl3!*A/%tA?T;jJjC43hXC"eh_pHnFW2(Yc!%MddRYe8u:PV-_l\lh67775C]9%=#io%A4n4m&ldgj71MNB-[!ZPp191##qp%TSKkk1W,"C5eS*&LcAnd"e:XXs(kA=`p6-h_c(Ug>Ae7IFh.Pl=?/@!2f13F8'r0k#^^jT$MYAiO9kf1$n;>,AZJ@khLo1;3;<b=Y_FKhe#M;9D&WN:=60RcH$hg+hYJ+9W.4##BT7#npN?,I/$,]Ts!+h8XT`d[<7*'Zeem>@nW=p/SC&u\;'-A075>\]m%&-7e;=H2`E+<DTj"Sku]k8gJ4&XOB?5A(b(%-3KL.j>PF@`29g-INrp%H%@YaF*L)t@gKn4lAT_Kdm8c,>l3u@_F$VrXOmBo.=93V[L1tP5[aB'?NB@8'Zr]LC4*YdoC'SWn#NW&D<EkBl[c,jK3@O_3SkE=)15.**F]8ZDZ0[,<;OfQsTU/SqX>PajR#ZWo>e*GGO#GBb*/&tE!>n(&2u~>endstream
endobj
xref
0 11
0000000000 65535 f
0000000061 00000 n
0000000122 00000 n
0000000229 00000 n
0000000341 00000 n
0000000446 00000 n
0000000529 00000 n
0000000723 00000 n
0000000791 00000 n
0000001092 00000 n
0000001151 00000 n
trailer
<<
/ID
[<2ad1a8eaf869d0a227841d7506d51082><2ad1a8eaf869d0a227841d7506d51082>]
% ReportLab generated PDF document -- digest (opensource)
/Info 8 0 R
/Root 7 0 R
/Size 11
>>
startxref
5332
%%EOF

View file

@ -0,0 +1,92 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R /F5 6 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /ZapfDingbats /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/PageMode /UseNone /Pages 10 0 R /Type /Catalog
>>
endobj
9 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816055528+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816055528+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Section 10 \205 ActivityPub / Fediverse Deep Profile) /Trapped /False
>>
endobj
10 0 obj
<<
/Count 1 /Kids [ 7 0 R ] /Type /Pages
>>
endobj
11 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3971
>>
stream
Gb!"tgK*'"nsut_V`ePlZL5$WAOlk/=d!3FB4`61BhN<TK;@(u,ok7!ZerJsXU@&>(+@JpL(iA193$,d]t1Ja`#hYP%MO@O@i/HQ@+d6*K&mn'N3D/eI.6S,X.JS/`Xi4+a5:<WrJ"le,MrR?[]I:=^i4Z[0R_#T#7/OgiB&_g&@N%6ULF$&g%,Z&2"Ya3*5USq*qH\Z=Y0R5&R<AXR*%Ng-h(.`=jH1m<T9V9D_,N)[Eh_d09oA;@/LbZ5Jck.6mV\3r-:uKjZF(r+LRY_cQE#Y3OBgQGs]/L&T>K^dr#fcQ9-omNaL7a_o"g^Pf@TXgMa'HGFW;bS]e!gq$ESMXF!eqYKI4\i.=J/M-TS:r&(-Oa>^67O<5SQ4hE'@GGKi3G75/a,3GD\ZVhNGS%+g"i.fPjA.:/>TQG>TAkN#!/L;?*4N"/mi5#I"59:ZU*Om/.`ih:/"J.bs/bno9+Ot6@n4XoMdY&HT2W>,"(@!]PdRNkg>aj06CAGMo6i:]80?B]2_&(A!\*Pn)>E8&]2nikUi/PB]0?@?Z!5h5rp'<sEBQLNs!Yl7QmVl_3a:o:2jrC6_*>g$<B7hpZ7j`X`5jCePN>%p:6I!QCH4D_)V-mR:Vg!Z6BQGg1CmuA&\HZ115Fl<L6`h3/D4@N8Cd51@2Y[cbeS!_??BZ.&]NSKd6^u/jQBeeNaMjr+pf9D[&8PY:^U(H*%N,Gh_:]apl;fjZ[FX;CP]7*\96O7i(](/.]01Pt>!BGFEm>;OWb:2&g9E6]DNsEtLr[\TpQ#(Orkj!hd@,tk1)(/CO;A:mhhcFZ=Y:("b':t@*)aHkkc]&iY^?a$6433)GOD^h'',5"iO:J,n/D;aP7-.Zc]N]AQ\srj7l"Ksh8qOdQa",fW2lUc6_5$-kJmA7f@s1nN=ZGWm9_2Id:ZrVU_EQ@+NjgNNo7pkJLQX>"W0#NYuAh\eG3[_r%afM/N-38*.n6VnSmZWq]_IF7A`faK>h;./0%%>ZbcF[JCSt5Q'27(>!W-=4[q'A]Bp$B:%pFJNU0,>M-10AagPu@hJth;QYF9WR3D#G0jil`aD%EMXH`d%k#*X=J&F.7P#_Sj3Q5JIB`!Vc^[C[X(jRYRr,GUr,5m38I,jk"DKDr+>b0G>fEadTm:Jb9Bh$HP2uVBFHF5tTqXp1e7!mm)7"8o?[&\%5oTs/X44Rq2J#PmgF/TDBc^*?n2ap?qaPIaEH9mn2Z8!8u=WUO^g;qW72uFe;Hu(F^o[!>#9FX<SJK;.@ehU(,(V<g9HH5GS"*+K]jKr#C1drStit@%\4u$'Y8>\oH8LS`%QUc!H^@<%O$X9.aj)W"ti//o(&m-&<_U9`$`1&9P&L13fpR<AV.#a:U:3jPtD@j)fVD=1niWt1&/4M0(.9/*Y`?!Q<FXk3mc&oTgn'#g<c&LPaWTRF/amLH%[c)kS,K["B^8po%H7i[+A2`?5PU^.t^_lH%m.]j)R<Z"+R$MZ"!_*#1p\ol%1;QX3Wm&IQQBl'iCss:@n>6n>UcGq6Q8.;\=uAoQd=IfnP65*7-.mdG.0]^QTL>(se@c:DUl5n>!LG5>%qM4tNf96]@_OHYF/E?^EP3iBM-_'`1PA=$?:iOa+ciZ>3gPR@E.0J#;BnZO>)9OREP<4t0$^X8HLqG*3D\fH4g.WM0N$)j_L:4RdL6m_(@)R`5e<lW6`-kVm`bXl@Lepii>b!m=HrXTpo_WMkBorjFT]DK8kj>8N/"2cU1@h+:od!;;I[rtHY/JXXcecQ[g4@!eSC\C"1gK]):cjNi50olF-s-/e#2\Wh'(8MHXFL0`S4LVoUPSVg)J_7I3SQ\SnmjTXEZ(KX'$C1Y=?k;:0G/%<C-=l^XBLJhiFFUY<odB`GM0D]mSpsnb="C&UA4_L/e,RfO)?Zk@U6sdJl/6+/:(,=h`Do\t4[c:X?8dG(ZK`j,T#K'Rf2oTdWBCb/R%/N?[m."/,c@iJTaU]u%i*oBeB"-0iG]gtJVq0h&%YQ9+c[Fe9t^\kLbXSRc,1),k@WU_#^?eJno&/;d8/($?$m0O35gc?bkrao\Io1D-oP?L!&2bPY'bnK!1=laY3Em3Q^kiNb)g*'N@!'O'=#9N>uV[;06q-MQD1,\%"i.q#gEC_huIAhPO9=qT3'r(o#G-.R@Tpt#0:HL(rGBIcm"ILYod,qD$17*Ork\WARI(d;I/!=OHp^;n$WMJa9;A!DjJ29JDoGFak/"P)'^l@KU-6eAe=P\S?sX#7$(@DUnMp(`Ea2*4STDsFRO)c=Hc&a"*HbLm;<4T^T9.<rUUeY\QbAVl4E1.tl:c"/%59kohbm(CBK?;dCj2[@rd?g,V!*0uGQI$%oP'VXk(5*V6q73&Y/FnKu4a7;]4O+XdN4$;]BFj+q)4G#+:nT64m<s'XJ%?aVGE.FA?SH>*gSS&nK"n'WJlajgr#$kkGklk?Xl.`*FL\i0/Gk\eLjH)6t>d$3*IfC()LM1_8D.0bRc=^gV0P=hu*mj-R?W;TSdkIQ>X&#eGW.K@'j#NPbbkElY(R/d?A9&rDlfT1E"ETd*8`=VLAkpu@Kld.h*3''.3g1hlPHo^<(9ljg;k,gR+DW.[;c^oJAs/(.U]lH8j11i\93!29=^q4d3#bejV@1XS4MfqS*j(j.;r2Usb`t(q=0umo-lnVtEC[-6h4H!7Cu=`*M4@XIL3CaE]qGmuVW@mmA;W?9%>^.Q=ob"[&t_oZ0j,mt<'VR/N*%-pRj;E'Xk0:J7;+Bn6[_kNBLP]?`8NIAD3XjTV;b8[*i5dWc1R;Nhkph.]#\IE"R0XdRT+XNPb+G/d,6i7Bd?3>*mZRsVF7fQ&4c08Fh>q=72.YMAFs9YgDc+#<dBa91d!K<Z;IkmOdE)q*`<bO&=&AISmk6@0!m(6PUWb$?UXk#:;Dg"$Dsc[LhsA%WEPfU.`qVsVR`WXmTGQ^,C2$kqF#Cr@!klBNTk^/B5%mI]p@FN[FYo?&k-9]X[GTF0\UT5NCk(;$Zl&bZqo3_QYp3'Fg:6qT"]BElb3dpZP/`)118\nl-I(7[d_p4X3Xf740nNo(PaT+K!TpQmoAI6[bpP@%]Xnpi1F,6Mf2gn3s^8a+$'Ql1V)>d\<ceNi,<-WU@$!]/9Q/L;]SqHBXBOoG2,c,`qI?UjpI]$H`7n=&(qcE@^P/%qF-@P)9"$F/FS"+pJpQ,F3G,$=1dd+Ins&-CFcm;$3kO5iqL")G"RD9$e&\Mjh2F^I_]#`Z4>H8#D*VsQ?I3*Gs;FMo4:rnIBOs*?]%pdmY:hLeB<%t)/Jtu97]\?;u6U0W\TJ5:XK%,d^=t;rK,gu(pejkI6hZA4eBfXU9kE-p;:m9AV9jI/)o7U&<5=Xotp3D/`?)*F?^I@3nLl)CpT+,mqaha^CsCQ]m&D6(uGkM9u>mBF8[=+CF8cVqh?R$.r!Qmme1u!6O@5hT,2n'`RnLp_F)J($I07ikA7blekGK*:+Ml9fj!hp]D1+c#sFM4VE=*Kl3o;/dJ(>qnZ2<%V8hf4)sVbI&uV9u%6dqX21==KTA0"K%t.4%kEmbQC[++<>^97HpK;,*RYG^`X7nI#C6@8J<PJsB>4$j8DjtI6C:+/HY!;6]7(VKLgRmW\Q;_@>:Ie*&pI2smEq0!IpL;VCS<`7GW$=eOMCn.JNi)Fmkj\bl:aOioAOfpA%@t0Jo`Ot:?U>F[hoIP`Gt.nZ$:[7QP]-B6L>!+-bg:;-8'O[.jNMqX7_ekJmL-iYmp5R4c%!OtmJE0/]mIS=q.Y\&WN<(*Vt%kZ`JQLPZCO6/,<is=88hqjL`!S/a7'gPY.s:>AHup&H5r74P4#t*P+apjWWrJ(eKPV5"!c?%6+*4[`TdmW5N5h2A_R[D29#&7`NWUr0E_:ED]I;-ONNf'>qruqboV:rm%($d]uGEs-SoNk`p%k8o5DSS>R8Kr0%5W+6]l^gD`3[2^TMihMMTDtc-[Q8P?"5#*;gW,8G<&~>endstream
endobj
xref
0 12
0000000000 65535 f
0000000061 00000 n
0000000132 00000 n
0000000239 00000 n
0000000351 00000 n
0000000456 00000 n
0000000539 00000 n
0000000616 00000 n
0000000811 00000 n
0000000880 00000 n
0000001199 00000 n
0000001259 00000 n
trailer
<<
/ID
[<c6304a427b27232e540cf37a8fc0751d><c6304a427b27232e540cf37a8fc0751d>]
% ReportLab generated PDF document -- digest (opensource)
/Info 9 0 R
/Root 8 0 R
/Size 12
>>
startxref
5322
%%EOF

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,74 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Contents 8 0 R /MediaBox [ 0 0 612 792 ] /Parent 7 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
5 0 obj
<<
/PageMode /UseNone /Pages 7 0 R /Type /Catalog
>>
endobj
6 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816060329+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816060329+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Section 12 \205 References & Official Links) /Trapped /False
>>
endobj
7 0 obj
<<
/Count 1 /Kids [ 4 0 R ] /Type /Pages
>>
endobj
8 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3190
>>
stream
Gau0E>Edc#(4P^ZELs&K/dU@N8aSmCe!]IVFM]k.AuiB76.c7'[Oi]V&5r,[pIN#+3Y5p3;I'T:a[bObkrVC*2H]`eS,]5ti:RM5Df)^!Qn?,IL^181E'(].Ht?A84eDj2EbueR;LD5Ub74UnLh#27^^&j'hT-$h0!A*=h8jeKQD/2nQL/J0UQATdLSM0mH>cp(Z<Yh2Iq:?.&t1J,9[ueG&a<K)(!@<K0_:2pRd9Fo),5:3Wu!Je"LGkZTIg`*rZ2$1X)<\</6+p]cdDUBJO;!/nOim+0hQ29N:b^*&2_cR).WVQ*8p#4EIAX_L#/%_3>\*ln'Q+VG[Ln+=V`aBLC]:HO#Tkl*RC;kquTeoaG@Z&1cD6-[Dmec'i*ChNGBJ.CNRM-Q6hf5G%d#b)NUm0Ht6,h)dHjg?g%s//s_46_6M@[^Yh/5=V_h<?J0t_:FYUr=?/.r2J2`g`PI%1Oh_i[52$[7G*%jTKUrV`^KtL6h%Y7W,%LP:_"?9*_75VBRHMn%@G@UJ7Y$Z/2mb5om>f4N\n)8_fnq:VCmcIk+VL1U-;[B%^1&5ME$dW9I99.6;Rln;AeE','2a-PZP[3^"%_s1M/Ogk'EXdo;Q*K"e:KNZ+ALdcIM*8/1s-22.S;*b'l6_a/>Xc#(hN21^L)c619)i,/Hp3]Lb/X\V9!,@>r?"j(Kn$Ggg?^pRMQ<288oEEe9]7b()-HfgRu7g:?MpF=C.dcca=/fm)qFU=6(dr1MVcQn]b70j*1i]i;_mKVrj#D"><6kTXSPq"JNYFbd/Vn>4@o%Xo200kIF)3V$7k.:nWhC=ON%)_lh!,oHkl9N:ni.p>@$>YUQ0MrZT;X3X-2@7"u3b`7eDQ/0T3?.T+Go]kJAJ+WqoW:?=#i[b<hU915pn$):*kQc9833KGZJBZqS>pmU4O/X4="/M;ZLka`o;+fRCcJe6oJcZb.09fV-'!R2eNWSUUYPs!)XFof[p."E:S$%@V'b(2#\'hbS[Faa[pChli:8F4Vm_oP8$-oBFST/P+#e$b3dmtJnqLB3^\kt/`#^d_$:^3$dPYm**YJ$_]j=QT?^]c7M<]bEab_u(>;+"qoR.d$SQ3Ff:Z+r?'(@E-p!SGW;'19g,&0/3fi1OOk.]fimkf8t&o>m_^l5/-g+Ac?pZ>BZ;G-]H0DkeMa6)Ir]kGN68>N!SKu"%UXjGTnM*>AgUnm2@(P0/Qr^Cd?V<0&)!Id^BUIWcBuH<.\Q80e*Dj)b@ErD#4RF.N+smI@0pBX5.%O(t=F8,`'JWV/=gQb]C[J&rB"(@nfc4&VsijK_:_k9GDtT8ERO4Ged"(=MenI@EgQu)[iI3>pk[1TJlg$*)1PjdBSq6anU6ZRt@L-_REou5!#2s%(g./40We'i,R7TV`VJGSLmq_7>;'CZ.'I`$u(i4SA>=.__/4"JQP=j*kBI)Z-KBT^"_eY&(`b()J+D)h[K&<Zg+^24NFMI3t!cePIK#$Q#%OXT^s2Gf*b#f(9J(AX*m<0N+n'S#!;IaJrAjG$FjDfpf,JV8Z":"<k8:1OcX#>a9OP^,u[E;NC14dH_X73L`loPFNH"/kXt&/NUoKG2XW\Zd"K>F)AROhYW;]DGaqN9G7g'pB--LSXKc-"A7(rt>KnBjq3Hs4e0^q$QF[5!(*qsfEn`YmQfp,FjIKlGDcgK44DIItbUuI]'FE@#lBOPi<E'PV>bCt`P+$/koW$BgL?dZe;$gE3P&jI)bG'B<@-q(A\&mhH+K1VO)9\)F_0<oRZ)hU*^NHLD3G5>kqKC;BR&`b#\aR`SL>p5mX=3T-NI+oc]Z>+ri7TJ!`8u&&REOF?5QHcooQe1S7/>c/[2g#B@;Wh`n\1p3jBoLLZ7Z^Re?!bf51#em#7#BSJ9s]Y2%HMB#uZ*`\Y?tSqjb%_+\@I`Canj`,@^2.V)3K68Y]9Y?VTmsPtd2":WAuJ(Su46iho15g%_ME@0lVV)pcN6>g-d4jQkOqDKq$!IuS5\OGbI)*0kcl@P!A4l=b1IGij"\Bgsq.XIRm_kIq7B!0-Ah9=A_Dd*YINFYU',`EG9hk*"+kJO;!4YF*"PJWD"Lo-2RPkQ=A_U_"uLViDtD*JLmMB;%F#0q74>_\f_Yh2't>#_TUq'3/+[pJg5[U(#o8^:A[%T&"g>:X[l,7t%%D(QBi!a$k81D,)$29AFTbSf!X:KR[D:Y))!)j>/=KX:Oc%Rc;\hA,2ZL)Hg]5!$NuT_4!t);ZiY87u&^`OtA,[2m#"#6Rf`gh5>W(.EbfV$f!8E+&$kan9rQ.J]=;3DCJ;aEfYB_X]%.D3((6*j0f>=A6dXK42F0l_@q?/ch5H[?dC'</Ya&t,g*C=l[qbm@O^Pf[B":JT!@Eo75nKGA97U#B@Z9LH`YV2?>S>K#NSBo>6:CFV64C0i['n4>KLYe12Xd7h=]4uqZkA,@ZSO3*>g$0/):?R(lL8Ue\8f2a44ZqaI()#=:A*=`-SH!Z;A$#+(#Rud0Xl*>2iul8@Yr#ShYXAdq#3-5?.#?E#($4G_HGDQWnEslB=D,75([@@gs@?BZq%ZNa0$XNREDt4S$1jYs?CALJ>Q/n6VbiPTu>#8pPLupOhNT!<#gOe%?JW>]2#dF>"U]GYMD6.`Gp9KnM&KWZr&?\s8*A>k!Cq!^;0l'QI",'#b\Qe&-c:?a*'ZLfQ'Q_E)eVp0fTNO,'FmWN'_71u<1_.b!sg5r[(c(1o'Se?h-`4g^5].W0irDH\!V`=gKn3efT+b.uJRQZT#T-ZjgSSomLCHhQN+:uI>8ng`im[uae`4:$p\LGsQ\#GHuLH"01V]UtPb8VT\Ta(_]B$oV:U0tRkAUNj>GgXeb"8Q/oJ,)5`D;MgT%*o</<2s%a/SeruR*7.(i&s0iBe)NOWX+<\jB3];UgTmaP''^fSe[a/b^;8uaApKNiD*4VNIlkA_L[]MtIlI/Sm6)e*h"WU&OlZ-)I]J`Y>;_s0g9_>?b,VTarmPU9rg+U0'itl%]Q`S9'DKd:E:&ThiJmIocR=GVl>X!EPQujd,C\+@^**@0VR(a`ahZ\Sj5."-rGraD9DPS;2##dS70V"$Fd72eOpt[]]">)`$*W%@hD_A)3auK,9kg,7\\nmARr21'e*9+9<+5'LqDPdmmZ!iEop2),eq;$2Fs[#jPk8%R!`A+ng]qX]p6N2\W@Wh*rrKu50M_~>endstream
endobj
xref
0 9
0000000000 65535 f
0000000061 00000 n
0000000102 00000 n
0000000209 00000 n
0000000321 00000 n
0000000514 00000 n
0000000582 00000 n
0000000892 00000 n
0000000951 00000 n
trailer
<<
/ID
[<296d8a6f1d4879e85d0cdf9ab1619fda><296d8a6f1d4879e85d0cdf9ab1619fda>]
% ReportLab generated PDF document -- digest (opensource)
/Info 6 0 R
/Root 5 0 R
/Size 9
>>
startxref
4232
%%EOF

View file

@ -0,0 +1,86 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /Symbol /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/PageMode /UseNone /Pages 9 0 R /Type /Catalog
>>
endobj
8 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816060611+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816060611+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Peergos Private Encrypted Filesystem Value Proposition) /Trapped /False
>>
endobj
9 0 obj
<<
/Count 1 /Kids [ 6 0 R ] /Type /Pages
>>
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4301
>>
stream
Gau0G=``=e&q9SYkXRWV+l"3BLFlZ62M^\@Tm!cAd`W1AOqRj5AcPBa<bd-]G0f+)%3(O)-&EmtT'i2RcY5FJj,]u8`[S^XHap_2^iA=^%ZYK'E;q!9h7rgPPuHN'O"D.lcbW7oMP"+5m>OC;/D"m90EB9(rQ#I7/RBSTVkNRqI>YDfRW^r\*C$j(+N2It1UssT>V0IrG=k!&K#>2O<pNc%B5f@6T!.a;Vm#(Y:UpE7L0K]_LS+'KQV1t-NGC-kA4pt]KVK+YO'F@-p:,2RQOZDa5\uH4_e0Zdc6s#L7fU_rOs?H:-$)ohRDDf3f1EeY`X;7SEtB5E01?A7;EaPmbOcR@,@&uuQf:'q/DhL;("Z1dfB&aN$ZKrAKEjGpi)[j/%Nd!3qr'm3KTW\N#nt$DGuj!6qZF(?!BABBlW/rr_T0S#$q(S1nJVE1GfGY+^Tp0bncP+51_Sg!\msWKhu<F$e'Fm&31`RnS\X=5HDmI>Kqqp?Ebs7f3(@g&NeP*ciC5<pP;(CWm]`YKkaMk=#F8kuDK@tL7`;guH_KIZE;p>g47]Kc5_@Yb7kIo.=t07mAdD'7=r*9)hg2O_`\mg'>MB-e[UN0tLgiN+AQC4I,RB>([LkEu?,6&0jrC7TN$!+g3.h?n!7386d.7O=+e-^jcZ:@qQd`TD9I&u']A!WEOfm&IV?o#/,Zk+(OZs=@W`ndJ$#'R7*P(h-@cBP`[bqBk0L-Rm(uH&;)(9GCBDb?>I$a"FT@<Lk!YWf*ABgG'KiDm)+^o/h:kE3er!?`l*-E'UeWQtbIkE;>OYW6nI"9PA1+l1Qm'@,^PHd@j;I6RFEQAj!OGcOs_Fn?P9<Ot*fmXe57^S[9=q?mcaTBVTccZHZ:n5eoajbq.3(??"i![LZ&pq1oXT=8#XHk&JpJ6lU^QK;,#Z_^6M,Gd)EOe\$I>IHB?6pd2"l>IsM:lN=/G1X@\0c"-"@!^UK%S1R\Xk9*gCiHHrEqAXX$h-R'HT-ZGfd5pmI>\]+E5?i4a_K=r8laiTjt\uDI8/j\ImQ8b?2)d_2n.iCZ%s,<$#p`dC"@3HS9*\kh2_gl59Jb)hBjfg"tAXs$W-*b.o5?IRG+$+W0rargbB;)tp/iGkVL4eA?PDOE6e!+OD1gia7M>aoH2Bn9=>HE.bC+[eDo>/BdAlGO^.`Hk:3<?MC4H5b6"2no]h%Tb*oROh;d8b1\"6"Sn<&]imWeD0E2QUFK?rMsaeq<]^rnVXeALf4[Ot[GgQ3DqK&[W9DA)>XHGgB;lr3ld;<&ofm:E5)eB,4>JlX";is1X3DJT^/1LLdiMm$jLF&3A^EeDMT?0Q%ERZEH!IY&8cIZFN?';TaX^.F.2ZCmB_E-k$6E\H_%o^TR"XCGk]Vkm-D-'YV\rD3TfQFG0XB(Q?cFsJ(']%`^(NF1MgL1_d'7gPH:bRW&9n9#PT!n1\HO'h\RQmG-4,Z9YVC2cD\1RnG<!GeNFT34Zlo/UIr*Ru6_erSFHH:S1RR1^:N]=gC+d5XXFGb_/YZQ:lM<Q9DKn^d/[A,n8=\.>7u,%;Zj^72fGYXq?GY[cGYmj*_orn3SD""=aHiuI6LkJ>YT'"L=;DlFebD8t<IT.V]VD5mJ,85uNY4i8Lq!%)5$;N<6&t$i$D'1?MuAK+g/MY@U7K\7r-r,<q*#nP4W/c_Sb0i0EG(X5%t)[FUnHX&`u(-XQrIN]IMtcUQhsW2aKqA7g8<@I!f_b3rtRc@N8iZnS7;>?@NC*,1F5EW^6W?$$6?Sl"1WE*.Nl]@LLKsB^/kM`rE&fF=UJ1Y3NRLT"]Qn?YYr>l+7re$pSHB)!0nY(Ok4f2S#4\gV+bK+R9ZWlFa[?'cIRY0?/aT:oKrlGHEXWKEgr5b01&n3c+1R!]Y:qOK)/9cX?,:jGF@>6B'q*DVmnZ560<mrVq2OpPOn'5GElQ^83-*&:'7[!C*.!l])%WiK3Ecr<X-@&JfhHA"1*%o_)albVuqlV#!2,]V"J*Zf/Zl&jDI"DepiAaFhd"e,.-lX<;64&G)9Fcn_lgnhG>SSlBKa/lb=(k!/'N*)l>EQp0[.gb=\(BJF!]HBt&K#d7$,,Y]D[FIImG;Br`E.IgtsZ_h:8Ej3"*5G=H^AfGh_.Z&<dN)I`T2\ePQfk;Zmq=7Y6u%Ed$Y@+CnEH]a3FKPr\tqKDK?R(aShg>6i,"Rjt/:ue'L8uM4/HbhpA3F*)hhP>YDFmJ]WpBF@*f/OAj%?A.+AV6Xo6!:gSIT5c"l,Z?M\J\a#Ed\"`j"o7@rn@#=3b)C?2,7h`nikq:/MBo/nhr-lpLjF&o2PJ3EiDL\ZjkKa"fC0R-aMu3lAt>7cg8p2l5L42d-\gKMLJK2d9X`fMLJK2nQTo/QBH,&et;7eobH9uXKUhHobH9lXKUhHop*qEihL,QYn:oe-(bj)Q$h`E`[*PLFQYQa?>Ws<]M\?dH*qY6f::26o;]@nl!R0;p.PnK]Aem'3h+tq$4U>b<#j)$ltG\bf\J[jI`h=$_jfKB:\kV<H<-_s0]Y"Qr,O.T6A]DJfulW>(NrtY(=]8)_ROc1=B[7Y!C`unr:kgM<^dWL4Yd*\#LAgI:DV\PkDj$Q5Oo=*QCF(uPPT"IOF'TGpGqBW;H?%d-A<:;#AH1^!%aD6YX4V#d8p+@)8fjEa=1/#)tI"/TG*'>")H\E\YR)$Tks7U:1T'I%9H4<CLI"3[nH)'X#$,q(pQ3Dp"W<$kXOg.r"Iiu6A7T^(B7qKM(="];p.G40=^Bt=om/nqjj5h0XAqu(d,<GAC:HVl78IS.1jbGd&/r21MVWC/Fe"n!B>I#&nH44d-FW:\WWom@f<CZDhZ4a<VilK(IP&7Hq]+[gir30eP/,Y=T];.EFnG/$4]^[+/jE5kg8hBOmb:8h8GZLrDB;o_^/P$r)!!/jV6TH-?&WI0k1YlfuR8B#kco/l^8(7FBKCU5Sj)aW+tSu@T:&#>s^MWF#JL8WLe%E2//1FY`^iEkI%nPDj:$K-iQ<LTBLOHO4q^Xd)[o@7!QMc$1=.;,Eu+ej2mc[c.+5gjq4kg<qoHM,QE\s>#t55o.g?$`_b/S5iWs2`(J(IGiM7B4kQA`?4B7oSB)ZdKI=UE``$t4QIo],0@b<`?+[grYMB@Ceh0-Vc5CB2PH)uYH$b@ep`jlMheuW\mU3g_]ll);D_3*`"\U\^HiT4tYL$J[T$;9rFhc#NH]`ZpIaCZq1_E8;^i`sk32s11V?0ikHI"7RS3dsp]/U;V1Nqn]Wb7(V0Tkpgic@7YYVg;tQTHal;i5]rp2k<:2p'V'%O[nUUPrZTmL&/;H(n5PQ>[K/K)Wd]c2l"/P+lF5HXKrF/L!(Z':UG-3?G!=&%t]2_\A0.M,Km#?(QBQ(+(KJ<(o/5O3d"Q>q"?<S'c"Z65iQ/<^F9S/(A6^Q/.`t6LFaRdgUn=_;`L$(#I%96R&Cb17/OmD!qeW>X's*e;%^JTg-U)Z6GC:PSF@'=.@ms9QH>ejYG3iB4l[E(d(/Q^[Uo-Rg2kaLd<TBc3@EO#Tn`J>#.`08n^n@nUjiq9;Muh"hu^9eg-V_Zg'JMSZ1Bqjf,D,`K1$.;?sZo*^6+HgL3'b3iYDTT-eVpl(1c%]u4e?9/J,WD/EReQ%rh.U;KE(Uf8E0W_#c[[Y?5d193b:<BL/:)9HBR*25ISZ!?fL^#UuoPAOk4#g.ck4lud4D;K]pkc1,PWLYlHJ=[_.FCIsAC.2a%=+5c3j;(A6[l5q?$YZ,UYTRVf^`@b[DXNj-5qZ"\3[s(q^-/t>Ae^s\+Pq*[%i<iAQeJo3]Y5S8.@W)(Bf39F'Gu(uEIDqA/lEV\V/S#l;O4jB?fcZN+9EX!b$]U3HQVsfK-kBg9b>N>[pHPh0elqnc=h"A>G]0S<\(j.9!4VY@V)i!X<35JcC6TY_2Ro+`Y[55g+Q3kknbN^S*%Tp-crXST9O'4:/,gI"rb.eTHeDF*HNF-h+fA8NcSCa+:LRm<aL-'A,VgN$U#=j',aF<n@Gad[Mh%o^)8W'LN2'2\Lh,^3F:>7AO]7[hWJ?t']*ldOmdV9ppVU?#p[BFRGT,3?S_7A'ZYC[f4P:r]&TGZiXgQpb`!T2e<>7"nqb9p1k/L9!rZ'#^T1;b=2=%C'(bgaD6Vtc[dCu^\K0n0:AF$\Rub.@hTNe@1[g'5AIUa$GCe99T>Pgd1.$m)lgI!m.7%!b*i`3'1u=m:CKO_;/I!oJ/D]%V`3nD$el\+G75e-/C&%9"r[E^Hb:+V:6USS-MGS^ci8O?:o@ld%G'N72B&dQc\>&FK1uC^TA?XEC]_XiNlG<T~>endstream
endobj
xref
0 11
0000000000 65535 f
0000000061 00000 n
0000000122 00000 n
0000000229 00000 n
0000000341 00000 n
0000000446 00000 n
0000000523 00000 n
0000000717 00000 n
0000000785 00000 n
0000001106 00000 n
0000001165 00000 n
trailer
<<
/ID
[<3841fa26f49bc4fca05b373c11761792><3841fa26f49bc4fca05b373c11761792>]
% ReportLab generated PDF document -- digest (opensource)
/Info 8 0 R
/Root 7 0 R
/Size 11
>>
startxref
5558
%%EOF

View file

@ -0,0 +1,238 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 8 0 R /F4 10 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Contents 18 0 R /MediaBox [ 0 0 612 792 ] /Parent 17 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
5 0 obj
<<
/Contents 19 0 R /MediaBox [ 0 0 612 792 ] /Parent 17 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/Contents 20 0 R /MediaBox [ 0 0 612 792 ] /Parent 17 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/Contents 21 0 R /MediaBox [ 0 0 612 792 ] /Parent 17 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
9 0 obj
<<
/Contents 22 0 R /MediaBox [ 0 0 612 792 ] /Parent 17 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
10 0 obj
<<
/BaseFont /ZapfDingbats /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
11 0 obj
<<
/Contents 23 0 R /MediaBox [ 0 0 612 792 ] /Parent 17 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
12 0 obj
<<
/Contents 24 0 R /MediaBox [ 0 0 612 792 ] /Parent 17 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
13 0 obj
<<
/Contents 25 0 R /MediaBox [ 0 0 612 792 ] /Parent 17 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
14 0 obj
<<
/Contents 26 0 R /MediaBox [ 0 0 612 792 ] /Parent 17 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
15 0 obj
<<
/PageMode /UseNone /Pages 17 0 R /Type /Catalog
>>
endobj
16 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816050116+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816050116+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
>>
endobj
17 0 obj
<<
/Count 9 /Kids [ 4 0 R 5 0 R 6 0 R 7 0 R 9 0 R 11 0 R 12 0 R 13 0 R 14 0 R ] /Type /Pages
>>
endobj
18 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 862
>>
stream
Gat%`hf"u<&BE](/+,-]()Ip"?uK>#9U`C=D,Hr!idj[,!D[L\Wr)++(t'[H.W(&2io>(Rq0q]eKc!$24KAtM9*lu4'I\U>!Qk_(niL*@d6g=b9G)nb*0[.u_e>LD1&;Gi%Jis\M4s:??;*bYj1;=CM6Z9d,m+q:&/s"a:`t_F9Vaod_6[6o?,PZ,<N>do[ec&b@F\!-(u)S3:u2;=+0bkZa]s%0B"Eu/g6j"be](]5dP,H.GsW/1)tHhNeJn9/-Z;E#F:>#Q-,l[=OqaMWos]`ROUIHUi@IQ'!CRWs#e9jPp#4dKYTbA%J$j7e[NEik[ci9JCpGQ+KGAmOV6aI^>p3koc[oFO6K!'J$q[\hVfCS10.&GV.:q,N9oBt>l5IsEQ`r7<cG!kI[]nFKg"13'Xm+I,@q`P^T!]K]LPs<bBBRf]HgihN8Wg:PrT'>2NuSe(n1"?/2\34cN$L,>Pg01n2@<BT"5M2!`E;)@=:`]PX%_m4pU_DVVsJh$4JS^n`W%aN.dOJ+O'n.GL$bQ00t*m6[qtLl4+b.)e:G0g7)[ij=]s3%2q#e`-c[ZMX1NY1i(<f-\A\KMdGu4@NO#RfeF#$Wf/gpqMMu(9c2nZ$MEaLKLqY4Vq3o]h5gDi>7a`!;:Tu89["I(36T:UbNAZd.<XpD5$k/CC/E0^B/&='haa7Nk5.FNLgH4NG,SeeAY(ft\OPXIkg&g+r'o$-I3Z\SuQ=Ljo5Jj@c+o-d>qGC;>d$\(F\9?_2\Q2PKNVon_mBsgp3,YM=g8bf$X[f6l/PX\R!iKmn/Z%l3OB'XEj*NS"!2<m":>0?"B!?V$&XX>7H)oI?B%DUb36QL%:pS?8pB[M.^8-F`~>endstream
endobj
19 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 580
>>
stream
Gat=h6#W8I&;BTNMK_a?E3R054a+0b.TP2?!lnPJ0O)"oVoIJ%s*\N=8Yr9sMC_C))=tNZ]p[hMC%9[/Nkhs?`L;Dee3/'%En!%XWfpcrJ%;OV'Ki;:FN/RJ(Q*hOc3kr716iZTK&7jWid]WL)2Tl"GiG#Zl5=65S*cm-H<`KMZjd[$E,@]8FH62&l46DL>?_'LVio/g!$iWMe)uB5;<3la;5M?E#$+:"a>rZP-2-uoLjUB03M?5@W64+bR%@(1-6Slni$_CkVm#Vt4m@,3b\rJU5E:^fbf-]A/4)cZCka;/cAu)lWV,Bs(h]aL-+Sh0iqVf9i+LHJN'[ng[.ZR?+*Y`"i#+"'Qk&k'X!T[U\8JlBT,$??L'qaOlcm#0-)Y`092nk_SdL;].L^Vr469C@bP=hB)/$?DFg,`XDX;6V?c:W'i(F`rRI+L`inQ/kefFFRT/;OcO"L$s$&?cS4"HW;31_kQC;SAb9/f$khFu5/-abM&$?Clt[^nCS#92E+jW<f"3^(/h\k!l@#a4.Nhj`1R")a(r3SU,\N@>(NE2S'M[;GSX?Bs8lH@I/nj:;adH]S~>endstream
endobj
20 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1871
>>
stream
Gatm<9paQl']&@2hPu>Vi)n"Od&rfaduuV&-\:\tUG2h7fTn%E@E>Y@Q#-%P!tD/`"#dIW54?,P!M^2Zk!-2(kfo>uh_8LO:$9IS+K"BnH8k6hdp^MH,c$[DfSm4gKl!85$6mL<A4XNZM:4.%^$%]mgWG88!cfMVoQ!GsC6o+rmSRLF.j"mg<^jjtjonJode'A7q&-A'[G`eV2N!9s`hO'8+GnNk#Rcem1`-]N8;GSPB(Y3Z:?bOi'TXJDF./Uk9G5oK4Kpb:S\b7Y#[-BhR]_',55NojSI;-@kll4-95-qT8ngqd.OqTT+n(/,fPg3WWJoBP=sK\5]UU#2]+mXcPW@SL9:C^[/pjs3b$5M(N?Y^W%q6d,`NbM]b2nRogiBFElpR4>X6`_taNR%d2:(B.0r$5]G-5pqg(]4sm3#u81`<q&Y$H&URDoMB#TbEC035WKr@F9H73YZBA#q*&cc9)"^V-$TRF41%*+7-D![(omEK<o,lV8dFmTs-\\LB>H6ng61r5>_'O!hPE:_8iNh)AdIChb1)@a_sUrgEkpdV`r(pF!rak:iD7dOg2V1'2bNLk4>p$j_o"24YH-?s>ap/kTJ5Iu"QiaDqKWbuobe.>Td-%'U5`:217)O^$Inp)QfT>tCF)7pp49$!"d?OJOLQhBQ$WP)RO/c`,@8W_DMrcOGE%n3ATugkc8d`q\J-On4P=ke3f=2qT?Gc$`3kba-+J'EMr6hubs>iRYTrh8.AWioT;.g82#hV8&QqbV2b_N`-X!)5lM(5)e!=Q03R*H1n@q!6GJ;D>J=QiFis+,g&f!.LY"o./;LVHIW5l(%J<HA]Ci?0\aJ;_1O/4V1mY.6=tYHqRGl9<Qi@d*[I)H^X-5s<:DG[7@bkq:$$L`E&+rYX%2osWi/`MOTu$+e$D5_c>K(=^`VrGW;n]P7.)*B$ngp#,T^q_:q*i?#t\6>L4\l*^-Rpi=tQ$c+\.i!kRoL[.q;T<e=,uC)b0#Lm79>XZD],?+3gMBdaJWM($lSDVGr*fPdB!UY$.1e^6B?q85?Xehgk\a=9;bX`2MNlB#4ci_$??uO(:X21>`B'9Xld7*M3DbLD7*#!$p:;gCOW(F]9KWOG>=0_=:8piA?H_==O\h"h'$(9Cd4!9)C*m1>Vb>8#%urD<.8pqd-etT[s4YD5a+YqFijq0OT0E9TMI44`[[!7sbs)URJX[?9!J()I,N;Lh4"]/E^9i:7cKZWI9J9(?*EF0\gh5o[.JHTU_lachl%C(]9?>\po?AmMkdJ5e`K?lh\"]jXp\j*X4R6"aO[fD6fNZMH,L@cs"'Xd5>Y/gfKDhbo@\)X7c'*`+/N@oUf>p^Dm"nS8ln[47h#hbSC&DVSn(B#,CBHf\o:Z((Mc7NIuo\bk4`,H2b)_N89j;;)"$NTtAf0RPQ1tYrOYPk0T\Hjq?G:8])XY`=p`)Z%F-BO^53B&+UhuT<d[&MPhI+p<W*M^hqfS)TQ?3W>"_]bk%$E'W/_>i[5f;Y2TEBqp[?\p?U"*fs;0cnai$We^'9Krs&6J:Z6^1nt6mkd<4?[i:1sd)WKNBYNN^aCPRYd3<je9c`NZkXOs!n>Y!c]EP\]Vp!n-kG?bNpV.DS>?*6H3c.r6(Q\4fc3^<.)=fdL8qC,VuR9fCP3_`?"lF(er^$Y9YV]C]JFlE8^6Ip8'f9cd)\XVIRpBqI;X3nE9D:X#MImj.gkU/#/0Ri:g[F<W]hc%%S_;65n:d<Lj+FZprIP:<9S9%[22Yc("edjWc_#*H.58o-@f%X5*1o0L+h1#phIj+`)Gd%tOm:r7XFl%>>p4<7l5"Tr'd[b43EnY[9V0t,OXUfTUCgTB\acAd>fMpb92LY9PlMM#:Wk0V~>endstream
endobj
21 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2749
>>
stream
Gatm<hcJQ%'7K&IQq+'^KdBt&naVhH84X&\[F;kZZBj)8(.kRpY&)n.rk#M"N=FBm2B:#Y+A9%&1\]b:X,spf$2s<<-i,Nne'!iiLo,5#qa$jOf5r`1q<K;BmMp=_)"qr*Xp&5m*"P@CU+dPs@L@F6rieI,ZT(7DE#0HjEl<qKdDm8Ie5d:1D'n%CS".d#9oLQmdY3*>dm%RC'/055IL__4`^/B2*n)$7I5qT<dBF^&(P>T7MgH-Hj(R3Yl*jG9KmtkUr]%c-7[*!I#GZ5S0cZ,`Mh4.P6t6?>F+2H`l0Zn*lS:?^KQNuk1WT2RLrS3"%RZ7:-C=\b7ila0Y5^3aC0akC7YSqFs*Sd'Oh[ZF'qM]WMNkicV)1#KeU1+j,79njk@@2k%K.V0Z)R'3)quskRVp:2+hs;J+KH/%1+J9,3mlXKfe<^/UGs1=FM/LRUGe9US]^;%[#^W<KsO`ZZV9$u=g]Z^X"TZT2^DK(/#PrTP-dL\`%c_M6*k@4N\>F-5g!8t[!=3qWt_2KD+L?%gT#ICB<B*g8uEIpPY7:g^"ei=)7jSu<[O^Jp2]m[TIC3pq;FY=JkuXX>A7+d,PGU-6D9m#0hJ*[95Un6E3-\AB_Z%\JLP]Mdg`n+?8([8%f`fa^W6j194:6JUqm77@\;3CikZM#bA;fGk%,lR-EQ"q$>J@%h0-Bgh7GJ+%o*m@c#D-($,RMPN7>:T88fe195EXT"T2)Mr(//'>6`X?TW"MP4G`".^:pX\9s5rW"jLT6j.q[*W0M<7IgD=Jlc,e7V*s?DO\,V4GE?Zn"s,$'D)^%fSD/T!+>[YPYs9r),-PgPhWN<=ED-25dC2U,,&>XTlr]Ni!YRqb@Hf9VY>*Fk!EsoYBnP8H#s^nf;OW;'.Ud<6rYGlcOfH'!a6??U:QgE%4_hXNoF+inX%YEOrHV'"6FsQ_pUD?g'$[H8rJ]kMZU*B-j4Dab(BBoiLbq!;>)B\_ah0Q[ltqa8//GN\gftT""-P-7KL<n>,XE8>&D$%rT^MlX4_R"-$&D!=4<Wr/+/-r2OU<H;RWqG/BFG.kRGCn98lQ,n47E>=;C#D16:Y[Rb$7I(jDQZ)X,p*r#g\Tg0Pr/76ZT_6)9n+4(B>Bi4+sFQMeb-IJAaWI^L!O]R;g!AC^/`n7.pj=%uFIZ_I,?`7fC.6X2qK0-sW$]O<<o+hmD0X6Mm>+Yiq6=,j!,r:rYLah'clT.=e"T,ZO3gl&l^e\E=B!>d*N<;1i2ib8,YePDeMVUeTI@W#e\e;3=c3hn9-2MpuFAO#Uu[b8G`C!hlgflgjr6_H30)OL+QQ^Ggj2USIsanp4kG'u[5TKk"?e>20V"_^`^:.i=DF1qA3_^j2Ht*.o$\,I;Z.M-2I(Rn-Ho*AD$,*#%F0RCJT+94U&S+U4TJERs`l@Mg,(G!CF+q<?9pB;cnfVA"'P;g\9,f\4#Ymqpn%Uo"S^H]Q>?/m`<S-DaDcI&faG3qUDV!n"ef#_XRHD$ChfHc^:"+:\Wb4F4D?Gr]T?Kb"UMpknSUgcWa)qaZbO^uSjf7"ZFqJo.d;Y47e-Q,2Rga"ci[#/6Hln/8dbpW-bRG>G:KKDb!snFbfL$90m]pG3e5ds6FU4PI3PD;[-J.^_c$f8EuW6++K2h/G@M@<J!f1mE9r'[RY<YqECi(F]5[Q(H:u6YJ,IQ(\t+*l2'!_/ud7/3(.kbWcsM;#p@P7Bsgh[:QR9cONT*LF$(![Fanh:%qQt2LusD\^C4%)S9kG>nf_npCYck,Ls9`Jd3jgU;0#M:\:ei^mK>9\7aW.H"p81;mZjs/%Oitr>t#%nl7]=&"l"d1LT0Wj-</F<XDUIWkW<O>\^^oa'0Jlhb$Z?FEMpj3OW$HN8IZ#Xr%4"'Z-[PGectTn&-%@[6!m&LJYPMO`hf!<bVK-I#PXFDtnXfZX]l1m9J2W4EN9-rR+?ha/a:)a,M%/qP.5fX!4M^C8<WmQGa.@cP%Yrq<)I]4t('qU3m"lIRa3U?7nOZ6J3?/q#mq'fnMH0JE*$R2C\ki<N[JZmhcS3)7I]r?/=@2fUSSk9N\Q\i[X6,4=[e2,`Y@edGTdJ"445,_$@AAc,p;Mi9L%4]T!mdPSq2,36T;dkPtA9j,ZEr4uKt@>/+#mh58LR;kcJU,VmQQ[*1-Lj8=`V#@TTPI!&SS!Bo5m\5_o`/:c0Q2<=q6RT7#O).B9oZ;?A6q_dG!Q_#l*^V=Chi0Fl6LVkr2s*a@'o?9IsMENJ?iI/`1G4W>]a.(U"^Qf)CYg3V,0MR_Q\P+2mLFQ(H+-'Q`n@48P=/VR(%JS\H.tc:mRjtiKSOA]k*<+EFMBIq+YCB2b+YXW.e:t.3RZq_*[uO6=Hu`mBdT^sg=MN%H98WJ[B/*$eIh).<X;>iuGk]s6fAXs58]=).%,pPh!tUu8E]/b@WQJ*XkE1rk<e=U9Q@E?a$G&d'3"F!`G907o')#XL;Ae#]*fo1;?,`+[D!JH#e]FmSd(KLE=04F_=f`<8B0+dqN^(64B^"@`TYMQ1P!4:;^t33#rVA"$N@.Smr5H3qfY%jK(7FoZq_MOlHB5YM?ZAp5=&:OYhos@V0`$[F/]%=ZY=)`h_>f4&4?RU3e!3(dRbm40ChANuWP?-2*P;t(r0u@g="7YM`:&*X#+;U\=L)/$RC-6mZBkY]QtJHigBUdirr=.[a"'XXj4f:"f(=:*mB%0b7#'D?$GS8ffomc2\GFu(/W]+n0*9hu_]5OLRnb@2#?sUNbl~>endstream
endobj
22 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1215
>>
stream
Gatm9968iG&AJ$Cm#gR(Zq.mj9,#?\2+a6Yb[c%H"Tk#'.Qgf5Pg'(%/kAR"SCj$>3h2?-=R7ZSa!-'u>tOY2'u6:IY3-*:.:`T-_fuI?Haq8%rjbW2OlJW!qGR`uG8-U<&gS^C'ZB#t1.c04^.Imed\SW*g%rs)f+>X5)Yf%i`][Ma]\r3X#I;+6dS4N\G7WQ)6<Sq0.G.6:'ZNIreeu^XW(MB`bAemhJu^cD!U$T4CZ%[]8df!Y.H%\]$eSZaL36dHX`J8G*\qS<;_e0'HD4`@ATU^>r'ommDbcpkSM#01C'X-mN:+G!)dY=k6co+hXXQ5a05,-')j?mok!j\J<g=Ij"*3F:k>B4=Op(!@FBsDXSdnt$j((7mV\=lAl!Tb$#gld>R>hN`9=tK1mXT2<Zt'?IUGSRX#=cZS?7[uSIYU3=8h$C//ZVPBL8U(YC-nLG@C?1PEo]d'B2X,rSCh>WkCpbt3h-@MRP^_M,Tb4Y^qcpWFDEFZ1-*KqWr6fL3j^tX'+2t2164/;G2[_aG'MY#/D^Tf%]]hie\>-!pSqNu,k8/R_k#)"hXlo^7Eo[T2WQHbO&B85^pT;>f`CV22LCPkNOl,@NV/[ZnA^?5N=NT%j#:X;UYc<i!BuUr?e.J,I@caLPU8cG_p:C0/NU/ffTP?X<rm/[Y*!cAX>,U6i^i%l>-WQ3Mbc:mVF#5ff!AJO-&@@T.>V`KPN5^>?Ub`XJ^5H6PG[C()"Z@bEs%TY21i!\MXVdU1.gkJ'#s@,1XL=r['%%1`s0#M$ZfGc7=DdV^'j[_,@iF\#P:,rpj:pIAZ4#%L,RF*>sDr?d:E+R=E+[hbXG>Y_DT!gZpC,jT;pG"eHb!$Y5cJ1o7KDNE2I&]O"8*?X:N`8O@Z(P689BgV)@+K,F=sb6/s5]NJE-.[cg'@82DD"6l`>?N._ZsJeUWpH5m%n42K3^\aVB7gf-QHA4'EB(Sj8T,m'O<QfN1akqacFe5)")EUDlu#)m7U3,`i[G1a2XcA*u%TgQ:UQ*!TH$2(#ZL*VB63/U5$o]OQ8qZ](g1Z<jo7=gtj#a!f<]e48%3I/*ABRq]s\/X(Sj63JYNi!/WB4eck0-9b`K@-KGZ6bNA;trM^GWK&+PoJjR6cnA&pXiJM5a2)tMP_s75pP3r2%LA\j?o)"Y_Zhj/rc!1pQEq*Ea+t4Mk.+q]2-Cfh9K"udSl%]l<gUPT8E~>endstream
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2450
>>
stream
GauaC968iG&BF8='ROpW1!Q'[BMV>@GLC2(-h]82Lk9.a,f,XC>kQQinK9,<TkL-ilmT,(Y./r]"FaHF!'G5jjf-!t$1Rd4Y&?GlI(3O9(HN_prrI',0E/]TbU4VO@P>Y1j#P/$]eo;qnNAOc(>o<m(qUA:RgX?!%DL4_M10mFW;J!jlXf"i%;4M*iUB=$2/Db`<:D:$Rf&coE;pgD?V9Pnpc=^b(XBm.?ic=%qYe9fr&@qh:85Z;('-Db_G<N055o_&W@LUI;]jm)\GOie'Z[mW=.ObC!*LD?WgQ6i^f:QJJ)IOH73N`DC'1<T3,DgU6MA4$0-tDJ[.*<XQ0%ih4M%sVB9,3)H@ZPFBY-`5S*PrSq,\'n[]W'J]n/c*<)T^OPtOu5]0>Hulab2A!LORDQ\u4"K*&)SO>WbtAN2L+r>iM7,&Gs'Wfn?dW3.n,[l@kT>NSB2m2U@(3YYtEbuk-ANYMg?en)mf"a<_tqC"*XlL92f3Dg&*hJL^iUBFd'3$G^55K+t3b#U"\WGDpU+/+TH8t=Oh.o/&Lbh`-WKp0Xpj+EPMW@Ql5S,P1hqqaco<UaQ`j/!,&f3[H3]8f3.f3p`-3XDfl@kXEqmJ8`DPBbM3hK'(FMeKW?s/t,7]/P#0,"?JHi)h_aLKJ[8ru7U8fX;2a%klVRa7&7AgHPI)jW!nR"4,BoiZZ&]>NbGY6>50I,'Eh1f(UcZbso(8hL.>%P/PrKSLF'Z\F2+k(;?p>GIKMTj0$i2fjgT?]@WgLK-5@(lXO"-h#iZVj6dT<$*E[Y`./m)Z/]##re@Uq#]/4mXo*.*Q=J<ekOR'^o[l>9m8'P81qU=4RtfH(Gm='O#;dF5-@2/`RN,n2kjJc1A&F0&8>L/"/![^6d;u=[-*MYY;;jAMW5LPPLsul9W61-/>@<)K\,P-k(gF3=RVduN>)2tOn9KsC<at7!mE8:SlqIrao4>f@00c0<,(D(_TW%tp)%(55(_UNb(^fXO00c8_"llj*55J!$3AF!lS%R`^(r,"`$<WVa[Y7CS#b5@]2O9L^756Xa4_BN"%:+e>%:<^H[m1@e\tKO,eb>T-.QmDchhEbm:&^E#*-daj#:2c3gPLZ%VS8+qPFIC['\Y]O8@/h+B%+271n%5=I&9`iH4L\sm2dW#jT[Aolsc5AOi\[kY+a(G7P"qPfpqoYb+Q[ND'kXsW:r9>;;HsT<:U5B1j*`(66pHI6DNCYKrF@rq48$s5&s\/Fa;*&`5`rHTn8BJ*`tA?(+[(da?lTVF(I7H)leu6g`V;;gAlpqg>IWN]8$\a\\[%H+#siY2gN65h,W,q,HCZK->-+J@Dl&Z-BQTQpF)G,h$,3*nqJMKF`3(&,]8u9UY\q'W9fVW2Gj3b]e8l5@oQ?^%"jgfhR$4tM3ZNhD:aLk,hdu$1tiiq1tnBEZY?$@&e\bM&X!J[$mF".+:dc?P<3*PY9$*4-;[IA_bstkHH`=:5!Fe@2*Zo82*bin2+!,+2+2,r%7Q(F%ZAgD,&/G3PhVqUYHf@='=`<7g0NJ'EWR^kMXrsj:e2OsbU.1X'9Zg?Qr$=hP`R;/OAJIeN0'8BK(.iQ(chVFKHmR%/]Br%Ko\&JDp#_0F&DI99(jR3lg_OCRO:D\`,o@U&?-VK:oS65:oS6;&?0HV:l/u'&?-Vg:mE%`bLu\5[]Jc&j]04Q*1qR3<bWXXo8MRc8a#9#:<t;YSPLKe:Re0ln)qrYB_N0Q.E%"0ZQph%X',7:7+KBa*k#5q;;,`E&Bm]5UD(5[KJ"aJMb(p`&\:Md/dhE:b.m!:c_iZ2Dut8H=>F4VMgY2kgdki*>!O%^UQb,n#D\A!\<6+#pEi#d%=1nI@+'g_0fa2$%gIYi0>9BE_nd1e#:;PM$u.6dhP:VdUR)sfn6drK<Si(d3p_ht]XM:[5HWLT%gI1+RhjE.JEd&TE)8d861l5LcG"<]HpirnII#BkFaK$;P#N<Ao$H[6Y,%VqRcKSg>Y$%fX%j^=;ccja=`s;^)?cb/*UD4;/P]m?;b!<?C-I(p4,CK&3k;_KGg`!((W%;>\k@W;lT_;"q*uAckgd@ma+g3Ua$f1IIGWQi8%V7cYm5$?H+sMOHSD)if0A@D'^sr8?F_3nI)E8G/!,NmHnF6[MFt/5:%d`S/@QYLgLZL[;!H4N)D4qnmZopgMsa>X0bL5-Mcu.a&c&*NSO:Ds^+?s@/h18"g>RY62.f][*!*InLRKq."l&S0Pq#1^s&t\/#&<%S\e1LS6iic/C[a?>F3#lnXCW]58%&NNJlu!$\n&qSVV=3^=TH3I?2c_MG.63Pk-*mc)HMIU>aDHpa^kHm=l[iT$I"\4m^TrJGpAYnbErVi4.Wc-4u[9'gQr'(MLE8[10L`VL$W"FCo]lTM`PMtHnB+So8GE^kr^Vj2dDoGkDpT%KPnYP[Gj'IjPoc?#Q7GG:\+`+rrMmtFDh~>endstream
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2205
>>
stream
Gatm<?$"cA&U`36Qq'.[B`d4*oFtBfjAN]BkGZOe?^AKXg`3O+mk-$[IXQMX+K5kZ:37tc-l**4me$-ncSD1C?:fOjCSD>`o_r>e8P41Q-*t^PmQT%ch::,XUq^t*V.DF"c+#Z'VTF.Hcm2>Kj^LuKCb]-h(Z]a@#aCih,>*s*.3cdA.uAR8S'VBu>jC6=R=bEMmu>p&HePiLXk`Feh>N,srZph0$a7TtR*I)NIM[(:a&i;RROlnKCl[m6<bXJ<BX4/+lWHQhrr(!X-Yo0Q;uEh4o/u#AQ(0'GM\T^KA;3).)?JHQkd.q-F'_Fn=3TtHl[p/1qdQ.f<dGH4R7k37HF6Eme9rmcVmsNGi_SUXmHFD"gL&qq;R(Ja2;N]hNb]uFl_`+@%`].bf.uHQAeV,J/uYnTiYQsTgJcD;>Nbal+idpdTM3WU3p<\EGX.aM)o`g\pG"cO_&]WTOb,_B3gC.]bHb7-KZP>:ko]uZI%"X"+96&W4@A%.Y11itXpk-!X/\sWn5hU(&0J,<ImZrB"[J;V'-o$oak/jpEd)=$(UQ>'_51nIE'q?:Fei]EI;TS^NkhYqg,r-eR[qu@8,6Ik'q64RR>S[*heEI#@LnII#8NUu?(jm,3jn!6XQJjAgX,LIZeJVI\CNDQW!d@+AdeG4)J3l=ZN<_^+NTUCgO^qR2(hh[1[U]L)u=T'S)3#MT;gtG$5F9C[t4.DXhiPk/Qg]WitGK[a1ZLYrQDh#j(ah4n9F+m,s^AF1nrR%/Wd`s\ZZ$#H^eeNiIbk`&)rd1.+-EIY",;A6>AJ(cW*!^UW"P)Ll;];_"!QG1<tWI9df0^)[?"I`rB9<=Qqke/F9bp`f5#tGj8AUD3kE^>RN>.:r(gdH,c\rBQ+3N.VBrP>DIlbX5607<,iI<.%Yt4.^VqVNc#+`#B&1_hAJ.>dH9f1-QLhW$hC'S_b_Z&[pf3S<k9,OBsq1Ul-LoFC:o;fG9XS[]Vl`ml72Z#5^mX)1Jja##G;A3F^isP$iTb.Ia_:h7*=0i2OWa&-Rt3E]-u-/8h,&ClK3p;!IBq..$Q6:R5p`IJrhN!l"]`\C>PP\f5%XD3(q"ca,Z#hPS3pBQGH"^/q3s7?qejC`_2%[BTlZjQ2o'nI#klX<7gS)H&uhncTObU!P34P4KH7k]%:@dd@eGiITF;LDo:dLo=#n':S0jh"rE^\LWV;FZY[4!m8/nN(fE?*SLOt'YEsEnZt*5g'*4/g%,4YiRM[S0`]XhH"Q)_ta^b(D3@]=JHkc'i%<g<GY'82r%sd`@fG'nZ54sA^$>eH=C-o?K6t_e`&=o.ZqMPeq>CPf45Xdd^_W(?+WrX(q&2A_=8V*$q)Jo+$XcMuC*:?TBo#[5B!gI3M!cfO)2A`b@>@DZ!Whj,7P+P;#]?pHTAMhI\F6"DW8quOcD=TT<MG]CaN&I.9?eu5ET?[[VP"`/l]mSqGE+,h"92L`-<u)i50"&RsZ/rY[B^<ULA>l0bjVEI#lnQpS0+&OpN?W*kPNlg]]a<YU1Fo.+F_c*Gm%79'cp:Y`a-jGp=u9?=F?P9\7f!:#X&nk5K?R,^H5St:)7P!b20$MCBlR?s&'+WSnk90q>jt%3aM)N0KEqi=%KJgOEGr5SQMJWbgF;R"bLdpl7C<S[Hg?-UaP;h]TEh!"l%pgj_alB:ka8b<RN0e:faY)B)`h[YPM']URLQm`O3Upo^g61a<f4V+e(PQn5IPb_BKpB(7lOJ/,QU/>QGf^*)Y4&^mO3@6.jEO]Z4IPeNsjF8r&5oJ+%A:/c95D1JRd8DVf>,V87'87UK<OU)!"uC$[!Ad6&UMn:4j,Yh,j>`UXJ9i$eP7f]sDD6[Mf^._/Z,rR_FuW*DAY"^!X*aRh5jk>(.RV)"7L&e^'dkQ!C!8"L6@27Iad82t6#3Bt=N;L[9D,[2e,6:)?!3g^VoQ^#+_E3-_!\\_]5/[,#9lI9@Lam:FlH""/tdo_gsBS?XB=E]e11)NF;XjgD56H+[d4^pr1#On=A[j+4IOTg`u_[(3;no>ocZF=q%sT)OU'klKQ7ghmAKSdr0eCm$Bu=1[H?):IGuI@h80l\bZ^PA[SO(QU[/Mi;m$ZZ+KrKPW>8AW@T!_3D)p0Dr?/:"=lP^X*X4iJ0XcmRO9s4SV$27nsHjBd,=nEg!rs\u5Rr#=(fp'dhapUW0\&Q_*[E[\LNST1]Z"r>,[E"qL~>endstream
endobj
25 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1185
>>
stream
GatU3gQJ$c&:O:SoOF&a&P1^?D3E0);G#H]pi3?4(sB?7J67onb^TN!!!0M_fk$$Z,INP,G97pELk:U&XZr!Xi:RGYHO?"RC(&N;0!%7QgXY<P"`9C9%0:S`N%mY9)Yk'QUGVI'+HGmp[L_J;JOHm*7[=I.))BdUTk8`3&bpFZ'o@`Fpa#DPeOs"-_WmE3pD'm\S@1r#2QI'Q>l(rQ4ptU+e,(;049nF8Z,id2mG/tiG@oc&%.>W-S24'[^pBHn_[hk;Ll4AH6Gc8PVYe_.1t&qj0Hr^9ciD*4L[D,GM0(c_,]Y,6h\m9:.gXB@*NXIXZ?R5eQ@9>=%4-'cauC]Tr>E"td<)?Oqk'-7@l9bl)N<8#@;7/Fcn!g*m)"Q"qPaAlL7<M@1#oj2,LSOCh(ju?<gME=]2@k;jmEOo_6ObX>X"-NgTHB,QZTf3h_i\$DS)j$T%EO%<iV[-d[MMZ<&9MSn!,B&>Kb_,[6L`a+u:b$l#)AV.[eAbRDN=T&&<_]ON'3;0-?M1/c5i#;,kf#2lY`GWbtO002@npU8VgMlRZPkeQ!J`?RM5=mum9_-a,bBC5#gc9SJBO$^'PR&`L-^5C2#63$T6,G=&u-X@L6HX);m+aCCgaG]TkJJC</YW$r=X4\s!$R>U=K[=iV#9e2K(JSoepM<ZCu6au[hSRX3fVH-?m+GQ`J9V?T7I?2,ZE_<(IRFB*0jo*)m4S*5\-_f6o7.Ff+r/_=Tg#.gZ+mtB'Or9$S<,0oi)K3S(l:+Pr,RM,OVW#Vt?Pa6p6)g*PnT.SPhgad,Yj)mar1?H7Ac$_(h*GlP^`1fb+fueP%_$UW[$uA76h<Le2u5I\q$Yue/*&PaKUcp>;pM:';1"Go-<5/^kGi4DkQgZY^Q"oCa=KF669SV3FLf@O<4o<67-:K`CU.#E3[#B9o-F2Q,Q"Z9^#i4^f!7>*s1gBC5I^hu8[HtJhkiNR=V'Rf!:;aWSiO48o8WO%EcZWkIZ>p)2_q!>AQBSqa.j>oen4/h)=c'5n1ISt-b<tOHnuh)7ri]d&Qdkk\:kWP[5HCQ8,R_(3d0G,kr:XXAF2UkbtO`r\oUF`[ngK,$-j[53V;:)>JY:qa1AiANk79B*4e+i]6Ja/kZ6u:=i3UX=hp_fi_dKZEG2(A:Z;e`*0LOI2mpQ71O\`hqH@71p_WFOUic~>endstream
endobj
26 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1555
>>
stream
Gatm;hiHbT&:WfGQq+:\k8-_JhY']keQ)!N]-,qQ8giX9n88l:[KG@_lT98VfDlB2W^7&#O2pk:2]dGT^rK7/Su_qeZi]\h!'pmk%0SIBK@TF0^Dd&.$<kWkLGYBl0ohC3%i._:,Rf8]M1J(:/G0ZQgCZIR3oB.t5eeIgFFNE(lSp'Wa>[AoP&Ur<b[;l8Ktfjfl5<X;fR<e<:Od:I-?6YE$jW=!D+'O@S])F81(U->!g:R^@MZc>YG9OJ/7>mlnN2NfV8jhfNZNU-H6.L%2W4nFE7'G!qLF5j3fbIe*FO8]kHLZ(e2.Dr;c.3>-((7MTQhcJJHNalVPMdA[c?_.B0`q*PhMcJLJ!DTW`RPA!cXE%K(%)ZQ4P<\=)Vk2%K-j%p3gSEd:8Ji)oC)p0'5Id_U4mq13<H[_YH>k%CP?OjN;@j;-(gPTm0&bIa<#6T[-Ln=R<[tP]=:[3>dSrEPT[_@MEkC4R,+M/u8$+kOLmrRtS@@Vd^k^cRH:\;(aY\(R'F)%oJrenM!h+R>.ZN,Kb4A(>'2*;=L6SO\Fm[0q,f6#?Q!(^-56h!1lNQH"TgI5C20eQsIBP9GUrKQVOT)C%KrYq[^-0ddT)j$o<OHLV;n2)_8'O<G[H3Fe'KMoO/S_E2,n+6OsJcE3?WI,>fDr"P0IdL/22/ji[cbS=1?@QoIK9?*UFmW@Q8Qf^jPmWl>d9C-1YaXX!C[VLs,)R9*gOZtD<9KGuSm)b9H;g5',=a[KfuIRX>9kd?t]R[H?mo,3TiPocB#bM!BKDn5[0IoLHuRcA\c%ZE1F?Q[!5+d8u[G\O)gfHDemGcVacN:*H14&&,NdDU"43sFFL%EB;=hG\SP'#>G$(+`U*9[;8bK]BUnD(RO"S0<:4!]jg`Y8M&8Q&qS$q<6,TeG4@,_9%Fr5;-gA\.RsE%YK7<]>4]bHn?3os)NIOVP:"^@9tNof]4b"S@Z_/5'e@uIp6g(i<uHJ90I+h8pfrKA7pdI(jC5j5.h(]-1D/Y%K<e+!.2=CeBOh=T6$KR5/O&#oig)`6Ja7YmO)*&LL^)9dl?JJG&:cE*-lL9>9=LM:p84?]B&0YMR$o^p7'4dbkL=BcaRbsGUG90HP"`o<i``:M$jBWAPl;n>qa6V=2/Lf$]o/*LcoS^02qL>_FDWKmLELFJjV/4b8i&9]]i4YQ)r0QhJ'+t]euFhGAKVnA3s]`Pc/$_WC3)r:T"ke4Z75`ldc.sN81oJB1^;8q0:E>lkSb#U+f997]SE3c"^*'k)T7jnJ<WK.1N:%m-!a.UC3h1IH1(d,.oE!([A/%E*WeBFAkGf2"?dVBdchXc"Ui@0XEeH25[JH$ntje>O=8dZb6sN5`O`5-W38?f;@<4?cH6NCi=(MBhPQtNIm?-&-d^YKq']I0ij39jCk.>4K+ScEc#u!l5/L[s/OtOH0;AZ)`dfpQa`+;@;4eM8>=1CZ-$JPfP't100,UE"FdMhXkqAmq9l:pg`EZm%Q:cnXk^qR)U$k5`Oj@AP&\a2W1'H!C4eDt!(I[*BT@I^R@V'OXA(L0rW+cg!J^~>endstream
endobj
xref
0 27
0000000000 65535 f
0000000061 00000 n
0000000123 00000 n
0000000230 00000 n
0000000342 00000 n
0000000537 00000 n
0000000732 00000 n
0000000927 00000 n
0000001122 00000 n
0000001227 00000 n
0000001422 00000 n
0000001506 00000 n
0000001702 00000 n
0000001898 00000 n
0000002094 00000 n
0000002290 00000 n
0000002360 00000 n
0000002641 00000 n
0000002753 00000 n
0000003706 00000 n
0000004377 00000 n
0000006340 00000 n
0000009181 00000 n
0000010488 00000 n
0000013030 00000 n
0000015327 00000 n
0000016604 00000 n
trailer
<<
/ID
[<4ebbc0a1d9954c5f0245f9b47d4292e2><4ebbc0a1d9954c5f0245f9b47d4292e2>]
% ReportLab generated PDF document -- digest (opensource)
/Info 16 0 R
/Root 15 0 R
/Size 27
>>
startxref
18251
%%EOF

View file

@ -0,0 +1,334 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 11 0 R /F4 14 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Contents 23 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
5 0 obj
<<
/Contents 24 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/Contents 25 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/Contents 26 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 27 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/Contents 28 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
10 0 obj
<<
/Contents 29 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
11 0 obj
<<
/BaseFont /ZapfDingbats /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
12 0 obj
<<
/Contents 30 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
13 0 obj
<<
/Contents 31 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
14 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
15 0 obj
<<
/Contents 32 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
16 0 obj
<<
/Contents 33 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
17 0 obj
<<
/Contents 34 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
18 0 obj
<<
/Contents 35 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
19 0 obj
<<
/Contents 36 0 R /MediaBox [ 0 0 612 792 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
20 0 obj
<<
/PageMode /UseNone /Pages 22 0 R /Type /Catalog
>>
endobj
21 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816051446+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816051446+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Decentralized Platforms Comprehensive Comparative Analysis) /Trapped /False
>>
endobj
22 0 obj
<<
/Count 14 /Kids [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 12 0 R 13 0 R 15 0 R
16 0 R 17 0 R 18 0 R 19 0 R ] /Type /Pages
>>
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 984
>>
stream
Gatm89lo&3&A@sBm*Y&W6m.'AA(i3!FP;aRCO5Q*,&GZSLBAs(qs1jbZ=>gb&"SYlA7/R6]sf't,5fjfX(m1Z3F(?9TFCBKd"E[+Itm9:E^-8X9ePp3,]giL@<2+d_Y@NLT+Dpg\Y)2)V5`B<@ZdIK!5"Y,(j_!s0kuZiJ41V2lXSA1'9StG049+&Q#=7"Q2.Ni=B*_P>?e]qaF?PU%aL+g,M9WkYkU>0'3HG)0cNu<B^;eNV/DfKck(BK8fuWNNN@<K497QbHNdap[!kSCSl1`2a9=]#nImNWRW,&F1)BHu8BTUJU%%I0V!3;C8EM'_&QGu^0j^C<?TfQ,e%hD]HK2]3ZmX^3"V!d0<%U[grOBoOrXU.<#,Ya3k:NcKR_hC,]4p**=gjSEi(A;%MmaH5D\k@U?D1[LSraXR%FQl:lE#`:lFa=m&,_IVll+tYdqjd+([8't268GG8oOWFdJ\S'\BtI,_E**9_)rlm-i_Bkjb"o+/^[K,?=eU9AA#+;6*rpGMKL&IGU3)*nX6fd7Ntqh-K+aP<]1+^piU"->+Y$Vf^ED@8J_=R7!\nHRt=$Wj!.#Ci3M*Zc=7YEE<(*,lP2g>^Bl)&E>#Nu"I*\%2Fbdq^1jLA<@'9+XnD0sHjS\M7MO:+.:Gq&m1)dmZUu=aMW<l+5u'4P[?h4DcM1eXT1&YRh[EURpmskhQKt-cB>AT2=d25OLa5UQ5ju$r#Q.f\5+"YAK-+_udAj@haX9G55eDcdf6FD[G/k"jA^C]d[;P0?Y2'L.0b71LTPb-CiSJj=+`61MHNBjk!4/$1'\ae(1%i!':LQ.%.bH-YX/Tf4eJ4e6^>:Kf,7=4uEMKY]B!BiATRf/r+ppI8?WoQR5R9QEe)s=aNEfIfA#uDcjT+K=$*^BeRhC/2cdkF&1A44u"E$AqI&92pJpc!t`2a?]mLR9FoibQ?=Pu_&[7*ot_0`<n;S0(A[6aM[a"i1e+,-`C2?~>endstream
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 725
>>
stream
Gat=igQ'uA&;KY!MRdORf#9X/jH??9[:6Pu-1/Ct9Yap]:*#+U5(+eeHVh=hO;/'GPKYsAs3)"/)-qXb<#*2k!O()pGQ^GA4CJO1)d!i=0,+?WA1Hdsj#IeF!hD,2j14*`,0i!,!fKL1blkQTKS&`$nREssMB)_YLY/>^r1]8`#/QV0['ds.[kFHM%)o9=q15\u\FC54^fUBs4l&M/OqM*FUH"6aASIAV*:D]ZlJ]tpP!!@hh&4j/(K9B49@$IJ_ti2X8*A)VoZpD"H2g=DEsA[`W&h,C#huM^Uc\N>I5)6671?WI2E6C0oEW"7`pQVFlQ'e`V7lNTeg$.f=VOnIb^*t;2SP@Z2?[l^C^/#<TH_@F2#@*2_FOl?(;`iag_o?LlRDsF"*`%Vg>H)H8YE"2K/H9Y3?/sMP`:(;7f*k,Tk^CPXf^POHDf;,%WP;LJi[d+FV\$#[\q\d"cHQQ;ldrh;4tuJ%2]P[UGAas@"":)4C?(D;)@.Mma-p/H'#a]6@2$j[qc3ol0GIW#2[m#Cq\\41>Za/%d+69:*$]37@M\Ys&ODu(q.S7`o(?b=%h3jgnV/TKiIsr-&-:k-_Iui)GBJPl(<uU<nPM7?J2V(_hY?I-gt5__`HUshH9Y7JdL7;:.BA1Q<NP0VKDe3F..2hbLGh.G&DD5e$,+65>!,ak`D>*%/rZ'8@mdj[MOK^=-o+Z/XhEKkSZa>aUa7qj2h~>endstream
endobj
25 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1442
>>
stream
Gatm:9on$e&A@P9R%q-q<R[8qos#sO9o:cH@fs:.Ke&-/"qmnuP]r[*ha^:^p8_sC=;\8ROW;)\I.N)EVYGuBSMrt*\+K!o+>KYYN^T>3[/EZ?[MSsKLgfEi_onlY,oIKVI3POtPmL&p67fGH-1`Zn:,B3;"bMS0r&JU5`1E*Ya4OON4;%sK\ECNrC<s9ORRZ#K-#LEGp6W#NhtT=gH9Q/8d2du@`5?DZ/q>(VR`uXi8sYCg.M_UKNsct02O(@FaUCs&D-i*f/^loG1qnAFI?l4<*ke5In-Je5^__i0/@'(`gH-<j/*4imCTOGbR_:3'Ojq>DT!\t%H-RqBE`l=YRT<VRN$bkU<b:BlOl).pJofN"b$+c%K%aE)SZtlp<.q4,jJKr3U9O!SdNpnlX=SXEA8N7#,dXO.SR4fjcK#=:.dbp3gaf/?e6oO4Z$[Mn(Xbr3GFGY7<1D6<>-IM"QBn<OqQPd;>q8o@hN5*iV3$]*!0eC#E:(Y1@Tf&3$7RE0E6J%)T(6(Dk7PE?kJeO4k6C6UX7e;56mSjTHYDGgALFS_BTAc@-uIqY&iNbh0HM&;)$NK0e(3;^*uPmX#*]op3;dj>l]TC+Z_Nhm.u9%F'LJ7jTVtj%pN&V?o`-jF#=6S/Sj0M3C8I?$_#X7QB6M:,ET[Sc7:.7`&GgH$]<K=QSM[nib9b-S!CIhHXTruBG02iV+ZWP;2bY,6N9FmG`SdE/oG`V@K?/1Z4/Pg>lckeTS+gFh97!Z,D_?[rMCrNK@FPc4CL81)Wk;g<_YMX+,:-\_pNs@=BT<L[:1?D2*7OQI87As'H,bHhm@\U[jIf\O9*Sn"6:rXQeD27h-uB%LUG+D\'HFf]TsEO;Ctfl-7]heh&?cW#ff^FoP,$NF]2K`/.Z(]YK@:r[0ONLB!`STDJ^AHp/QMpP]Kju>cMu!cPf6Rm,jLoogbVsHV?0Q2GmC+.\#P1;0PjHb<l+)QWpo(K&5Nt<$$/GH7LfkuDC_!9$M)$[\O;db[nCdPC/mAj':>WEI?n__6]uiS7Yg@O\oV[8n.]Q4Y'D_FeeC*l"%,**4k.9n;@'/a]W.$Q012@!'r`PV(n]!!OhFmD4K/"Pkl[aJNKrb_r-.uEr!g<Gkd.h#N8k.Dlaf1`2:O^<UPe/>+fT.e:"/?Gg=IFtIFBZjZGT:UdQM:!pFXA#NBV6hCYHR5iqD=%)rJLo9=?dGkL`AhDcm(0K?d>J\pR3mV5]AO2i>Td<2"DH3ab1?"?I<np?eXc7.!q_1I-1aM,lhbX64N@"`*Y^SOC^%o1kIFZc,fNG7m)G8HR2)7`"j/,(@rqb>&dM_sg#o?TtS>;h6:mT_0e))oQ"Tdnpj@>"I,m?6S6Z]?TB%hh9"4a)6nFTC"3red!!t"f4>m.p7ToF+Anr]aPXY(,4li7@Z?dfa-,QD*1&S9"Od61G:GC~>endstream
endobj
26 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1166
>>
stream
Gatm9;/b2I&:Vs/\Ar,S<)^(JCO=3]V;'?,hI9kGH(i?Dc%I9@P*5/1qAs?28<A!9OMZMkLqN2jn*[e$K,OViqA10fY:FjE_gpjQC4XX93NPE[Dl^3?B5G.^<qN\09ib*k^!G>i2&1`pB<87.aGO_=cRNn'1BM'Ip][`[_Tm]I$+l)9kBR9@_Y/3\+#.T6[+]Ek^l=!XW`+HRAW=HTeNL!_MELm8h[;'U`2%u**W8P?Gs*g;;ROT(Z@K#/o4H;+TD)tF7<UA'ROk?a%Cb63X;Z7]="O[eZ8j)i%7)mLmL+/_<^,f<`TK/D9FBH=id\#-b5!4@/A6I_5<gK&YaFo_`6YH(&^.lA_>."#cs#%H^sBYl#3F2#QhA22h)Q'$i2og\6gniq_Wnak93<CLNV.AqNH"bYTS,MtTiE$0h?WE*bq\Vqn@nWOlIK\r.AfVuXe?u]",GaUG^:&bMkjHUc1?\?M;TK!Rp1a_ec[hgMG*3\HckQ)FaSfJ)TCWr8iD?qED?HITrm8LW`@?"M+kLl2^3('fh@dU%!M,s^8I`NjWb:2IAV(BJl4Y4eJFIr(nNf7m%?BB@CpD28gN01n7]aU&_*brIQ=Lg/_m!u,H4/LCf-qeZ!pX_G.>8uaA+S'aFB_fnu#u=+touGpq%<:M9her/7hE+.*ip7CKNXJEOR<pK+eO=MP6f&VG_u_;;i"[-#D>9@kkV'kV"%V#/3U$g8Vf.n6Uh+WN$GT9385onb0`:4*hQEJOU\uShB<p2:C>q77r)N:6,'Z'&_ipABn%lGZ5t(EB@(3hP%F>)m+MW#IdBiXP7]h^)X/j-O61R;)\6N3csc-Q3o62S=dm!GA?2J%mk>+90kQ'rKZ$0GT^"6_j-p8lA%7EhaS8DlV9e)K2a#e`s!!c/Onf`/'ZZa:WZb`?6_pTkkMi6cr0ZDWr/ZE'8>#k?u-gq@&(jl`q7387NP&\<!KL\bs3KE=^IYn>:tB[>SdA>o2Qk+_7(4F/&&@bo5%:T7<M_6PCnQ09K8:#'9t*\(lqFPe*:AdUSZ(sWUE1Bakg?$2rg.ZPBhOFhZO`[,M^Y9S"X'8\kAEA5L;orFgaA<I_J@Fm=YmK>FGt@OVbZ#^sVF%[YOTLlMWBCo4`=g83(KDTg>U;eWZ$0K<[LtEq@._E:t"n\9'h~>endstream
endobj
27 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1144
>>
stream
Gatm9gMZ%0&:O:SbbKA$/#KK#@s6<8.5lla$f)W6d*g!IQP*;]G2dt!LQn=`?F54b!sV%_1M=un1W*Tq5N`!h#2hiLQT#=T#Xo1R%UphM_6:i=h[(7Y9N&IG=<=:1!SmuscLR2c&2KQJ#m=*DBCci0G!a$tA,HUiL15qR+s/mhOf)%V+&uNSBD5ZJ-f.n$j;iiPi>P@*Xl`OZa/r2*4"1)Zik7_N-iLbG'Ff:b\>Mj3dilrpKRfnW0M3MpZ6[Y(#(QS0C&OA-`-EDWFHWm)<m5ZJoJ,P.p2reT$Bi+O"q,XNWgKh:@#NN3:u&t\=VY%i3?!g8JWdLH5q"$<7b!$]E2hPC(d&qS$iC#7fH%GO&"VdUKglpfC1C'^kj;!l2/4Dr%+)mi$;(A%W`&sC&iqTS]KDd1RsR9P4kI?SLaMmOTkSfsPbeb^&qZKa%!1DaGD^l=7sJKq,b>Ng6serN<`YJX_SO#cEa('MN$OIi55@,DB0dNXo>hU#1[^D9&tH=T8is)-2V'7'-Iq`cN:lfR,$/-e<GBE<f]."e\U`Grc"d1e.]c'sE%a&"_p*$oY!d`S'Chg],W9c87Kq=N)o.R)&_Q_oe5hg0DDuNB?=S;EBg#`GlE)fE_<aQ[@LaCW!ZD=2_7N"^Q)\Us$4>Sk13CLI:/Wt\W)4:%Y\K)>LO)X=QFrLP[hXH;6K-2j(eHf5hgW&jBHi/Vg<D#8aXGE&AJomFa,VY!]\A8U^>Q9V6A'%7&_8+*0ke4'ICK:<R]ZmM8R`pQXna]aA?e)rgpLmqM.[cFW-L&T1N%*6HWVdE7J4fLGMHs'0S1ZFcD/RNZ$$>f!EOmZ6(S]:c$FWT[^8-DDF`&!;=J2#\`T4XN+8#!5D+KeNk2TdH%S*TM1HSM1.0mC-JgLC,FLT-"A5&QVhUq.gtEXL.ZMHIZ&u'a14XA>ki-.)&KiVg"300Rnr6&+0LkH;>;#ZemXUXGUnpL&2,0b,^ASqM`d.>[egU0^f&2fJqkeFuD1mm.bKc9iVj":W9.4/k(E0o6pUKbY#oVgg(Ph1rD2(@'d0>KWF)\:d&MragP&iHPIPd]Slr8W9MD-\q?n^5lTeh9Q$.%W$AhU.,aO,B;`kAR?f9!EVnRcIT4a#WU`XY]A#K$)RdJ~>endstream
endobj
28 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3725
>>
stream
Gatm=?$G$]&q/*0^n\Ll1#du&U8K83)RjnLXd%X_p@ne8+UL"tYQ/?,qs3td!(rQZ=K1'8*nR*A!G:K>SNBZl#5F&2n%<,rh1E?>(pc21M\V/V-tA0.p0mLVO&p=GF#_%SEBK4M=FfR34G]o1QpjRdO%2PQV5%ih(br^Q"_7)JI``E@CaUc/Sa@"l50G-n?#mPT\mjhh2!eDHPq7XbM(O0hMgs+1s2**GrR8"JLu%*d?gpQ@cA"<uBTf1/PXXV@1<j;%gX!'<\$BJrF;cJ#X(:g32Fl6+o4Tt32&9c-PY>M+8hN<t.#E[?T*Fr^b5(24MV2WRXFB#a&]3XQ4>7_PhJO$'`Y?M54c<f*9,gV'4p1PSfBhj6>F)AQQ$D?_U?%#Pc>Wn:%-)KH^=\FlCi8"XMCgZg9dQnV"^>ltDkc;s'="ch\&I$0gDi"q-#6ZRP,Uq#bc"e+mm\h.E`F0cEinl?hD/5ig.Jt?@aU"E8VX"pR,*X:_rWLc"7lEWk,cQAlnti5G'W].Z'1>@NRINVnc+F,>iiH3196fAT!.UJ(/-<0(\od)F1JFcXC(*s4u70`5GAg:"aF9Y]/2[f:"B>X[tdau1l8-Jn^)R[ecU`Y_VQekbApT%Brk`X`UJOpKd's*0"5cOqblEML?2TX.sfFt]IrRW==MM7+5.sUZqHTu\J,_g<14QUbQ8%ecZ@Ldn9XOG%7ueE-gB,&c<,r?0NHL5V$gG0a^1re6A$b!^?ta`KY@h4iq)!g)G+$2P(H9CC;nc#>%/d<.;I>#*^*cFghjdaZM(_AFU/C-rb/,D'b6-B\A_*F*uj[nmZbqg5$5WQO4[O(L`G5AG_nA=Uu:?d8g/j<3)d5]Pt`\ge==VU@.7FH]:qKTo40]I@D)q(6:'R90t9LEUZM-,4sZb(3-(3.M.)Cj'sB%n^;s>Q@+C$oF+h>Rr8()Y@InkF/$7V`DHfgX\cXnXMXYWU]t:fBVqHS-Nt10RJW76NbWif.@i`CKZ^fXIQ@o8Y%`BLia/r>6bU9+=&S\tS,e0Adi^@10PO-t3qG(9mdT*./E8Ff%(P^$m0AAh+_6TQ:8m"iM\G<*/6T8Xi!s2n3I'WgA(%aK)@mJK5gbJlId^/:_4N:kr7W06?d.8bTc\HaILf0>LoP]$^jd>ppTCO]U]o4YBKCNoL\P.:[BTt6'rW>"``taECQMEue`4@Q(=IVRmElT'!6t)LR2o<49kIbO=N\/#iab.'Yct82I2eR'p67Z3c;oe'4O+B$2?@luGZp_IM!@iH;(st/\%jn8;gs7sGCj[+%<2QN)\H<*]k`5d7GUIMA=RUP>Jpo'qD9e&9%m>\q6Wdh5JAda]8:b(]bW(uj(9T)RQ0_`)+fa._2]JVNgINNFmA]^d-:doSQPK:@W_(O=(A6C!b`V#h^_)?q4K8T3%_$dEep>5S0VQpfUW1]GYoGUN_u$tmb6KJl`lFF=0j6$9!COYcUIA744grr,SjIE'ZaRk\YQ)e8K8@InF?CBC,RIjb<SJa8nkqe532=MV#olAKj#Fo[[bfUBppCY`%T8jC7O8533Pt6+BrluNnP7D\%ph9''[etPfO@^3<cFGI(2oO`YRW#E6jP;?oAtq2(cqriK>>D5ndbV\\t3lcJZm%Lb\*-ehkpboFtJARWtX2F)\&B9Kh2shZSYBP+RV>NN=O=EWo)b7CnI3DI\#st`J^bJ.D&?(:b$]W!-RO=9b?\F;g`X`Y55e"<T=Oo=K`8,l40[rR0$6VV=+^L,Smlm<ufoY]glS)(PO2F/0;=g"GS94G.8b'+_)LV+gb!q,Y;=^hP8<$@t4`kX-U%<akgT>J(FOS*tP]c_Ql?80+$qLY4/aP_@1IMj!1nh)SlUiG6p_^MF53#ASF&o`1d,g@31%F'DI6`KID-TU<MUU#7VDQ;d4c85\-k.M;pQ]'D]#F\pXJ"S3@E;(Z.@83<^YT+i#VR(l:CN$11:^Yp_nDhcb_gZKk3:$-hdB/D8V_FJhe0qY544_:c[6E;oRg-aK,2cl(`a@N;5d..MB4fpq+U#d"kK;[Ee]XIZ@6YsCON6DJ.`qM<eY"/lfI+rV0$?"`LC'L4o4D`lQCJU[EW'&s[4^1ln;AEGVGa%77)ec7[oS,-Oo31FMaiA@!jHOlVug?OQ1WtbKW$0"[GN/5_AMPq++[b38jj<0,2mJkT)g:#O_TuX-Zh]bJ1E#;C(5M=Rus47c_rHOE7N4[ai)'hStRMQLA$FFNJ8It=!OHq.!N/1orA&%OX5l;"LU\!t!i3;08)W5%#p#;4_9OB9dOSuF3A=O$UV=G1q]W>(8&0Bb3JH+s0o=5g/WeT-RpI3@GcN&AEN.*^a)i,cM,0f7<EZt":P>i&;:[tYu!$Q1Q..c+KlS,<mRO"+cVrX(aV<(n3T`j9!Y=W"rqQ2]bfHltP#^Cr@"%ha-92(<<NUFJ`8R`67+a)1N\>IC0M8XLe3!=e7XY=F`]O;!H6XP4n\iDoSV^H"W4:[&@67%@7W-V0(%n'ZIacLF<ZdAD@6j2<Gm!8`(YlOWL-dlhOZ831#?UAPp$SJNPGpJ;Wp1VGeN7&$FF>GiJa:1I2->&3-"9i@"^E1#)G[?n?iS):88ClfX6[%FR;XA<BI&:LNOQ&!g[R@R.(9ohm.]9>#"4l>p:n%-NcY`5s$E]Q;<=)F33BJV6]iG<jb)-(h'jYf9)@o22I,SAdgpc$28Nb8C*VKHrQ.qg`V,c,FSWlQ2<DBrAFU=`;hW!rbNZmEf'H(*8`VK9#'m^PL$U%Y$:HmU7oKs!:i?(CH$@+$&#f#(BIQsj&_S]#('o'!`A/)2n4:LF-mRCb([=,PI^NT?#>o34)g7@'K0(D8iL$g;8W"tQ=bk?rlSj[cnNtus)<ZH.#1nA0@/Fh![+aZ;0b&CWd^_F1WJ%H%GJ\EW'R0np=U*)>D(4UQmR\09S`e^DTa7in>"R%>bf+725.)r_>8A.+LgD+Fh5X-Bj]o*f7KmEte#`3Y)A]eBNd4QdZ)g=('BKfo[@/O*'ko>#GVGoicP"m@fU%s$%F^GM8:X>\7W8CE;;DhV5MJ'ad4%)So"!j\[_*LclK4p?AZ_.W[3;TQKqVcGfIFo(P-*<uU\5U4BU&?"/>/;f%k&NS$d5G%b?>+O-9*trqW9Ci^aE>nmem6/CLYl*V=<K.r*4"MWWI0_h^Q5l\G&dJ#IU^3:o^$fb)N7#kI3DNr;"Ce_^rR.&P/q6V(]GLhm&*cpo5O9W>ud7-M1!]QHZ;e9fPbhu\Vo8inB$$tl/Y8Y9DBQ@W?2^roEDnU'r)3SpP(;qndX?/^a\*W3IAZgLA\P@-dDZ/.Z;$;W)ZK(VHH@:A3r6J@91.,*(J4</UHb(7Y,pCctcFWD`F/<l;R,?Y=`25Xei#4[m,Kfn*0_#^irW;MsF3f&\DeKi$*+O&&U+Q/4tEiMsJ]1,00<$F)'cuK.FV;IFpl[_j++PRfnB.`V&?giAc"(7:.IiAB1eqGH\S2(_6$#%!-_3[XN([WlI;[;K;ohk0_;(*`Xq#*YFca0T8N^^N<\j]6t+>Hm-6=/GGE.pbDpHF/!s"&=58&gB8#'3tK9l4bA_$J/?@B@q&p,Bd515K1Xq@nFbm/(t0mn#9J2`5;)rJ&2"#j_enN7>*?:98Z[rddGHDHR1g$I4NU#NIc2;Mf<.h`@U#ik5h')95S-o[n\?C8Q0+`A0J3R]^*:-8QQ>ni34\oA2-cP3Oj*1BrrEWIEt\~>endstream
endobj
29 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2357
>>
stream
Gatm<?$G9d&:NGC0or+8>\q-DQ_rH3h4EtN>3KZBnfhn$e_$$8aX$;Xn!.]V8-j%<HT2==[PXG"kKY)7lJiKQs)Cg+dt5<K%Om?MZ(c1S$u']K=,V;&]F12Z7q6p+M5"C:)t8+aNi1oN6GY>oN1q0nj&nU:NCg>2@Bjd`IM@`SO^n'?_S1AVo`oC-c4KI,4>&LhH!FOBnKn1`?"ZA$l0dns(4Xfm3u>hRGWZM45A:3[Zs+BY*Sd78HHX$PkV[Ju<Pa1SMn9'M?[(^'`@U>WKJp83C:23;jLpoqCmf8u.MaS167]*GPm,[m^KnQpX$t<U73^^=$<nP'i@9[RUMr]s]IK;q#8XjL84A)pKGBtD6!b6/QUsupX<Jn?OsdWr4:.&2C-8)q\SBU_/8<!;U[;B1!e\U&17dBV#O5R!32P&B:$P"_@X_s#WXU6:`iq<Z!Sqe!%BYmMU@;5%Z72tjV6WcX"Eg_9Er2O%]qIi]=Db9[iU>M,7X:D)&MmqC8P%#^Y&06PGJSsK+<!uN@ingSUuX6cL:!-u%]'VB88).';(`I-ghJ.e/ZPTRY*g"s\uQ\pgmnH81'%4!m9BY^S68A+3"l;A&:YD6;=g+,3-B4bkp)B,_D]'=(L)=0P#YfYY?'qn9AIP'h:X6I#2ruc2t04$1`Xf8J^;-t"NP5e>hdaJ+:s$]H'[DWgLMj\au2SOqOD##'iqFo.oHuV`36Sl.5:HDT%CKbbg$5=h`)8G,TdB2YL?/>7`:ga9V-giO2dsJcmMb5c]*h]pkr$^-j:#OK,Y\#@*,sT3+_MGCE_<mAFKb/\2@ukW?lf?d]4S:F!`/(-$r[F/hFmL\[u(TC]mV'UhcP-O";`nO6n<+X?HetJ+bHOE_Q's`\tf@Npf&u%M$o7*&O*$6t(R+3(9H@o^PgFf4:jQj6O'b<R3hW8iV5eKILY0r9GMURm+Qikn%oQ`<llTrgH5m3I=;.V5H&j5MelBO!/$^6/^(!5*9+J5H:DoQ="<='MM"^heudBd6J"\%cr7PVGJY36,&kRqnO=G39!(S/5"8Z):1g<Ok"9UEch[Cg7Ih#fG'h!"8\gT3JiYLJjqg^`J'c\;[WK!6.?d^<-_eBT[7``@I],LIfAA[l-b8ZZk?IX.T!W_d#D9+or_.8G@t1t8nEC0'eI(3CL;&eRQjt.%8,e_18EN"VLnGmn_bZkNscuBb^&?N4qkYen+bhIMV>8g6Bb,_i-_S@D1]hYjTO[p/)3b9k`t@mE^06C=@[$m.BrBKe$t>OpH]XPO6^-j0K1H0/rC<Vh0G`5+ZpE[39]G`nP+ef_bI2N1.!D,dG$M@1Y`I:!n!BYje:)&)j6,/O^-.>frW9(JAkk=5P8IL_g>5Z8*=rBW9X_+q\9u`JU4TR%dr5>b#)/[e-X1%1N*h"4?[*npA:BAhga^&Q0#0]Q<GQZ8=`<LB_Z1.MIt>g4oM+J6N3X>-([)/"Ppb-Cl`-FHD6!lV;(=]T=j#d_4<_gNm%N0ALK]d%,m0f?s7PLC>AXh=(\blY6uKem_#[6mCDDk'N2eBI7j=KlI'fUY#a(ab2Cb3E@S7^e8O&Hs8#'o22i$+&3K#LVSgM)l5gV47ST>Y!pX[(3EOVY'q)?UPXa^q=&p983WX1X$JiS("r8%c!W33r<)G<uP2uWLdk9T@%%DZM[+GU9c_u5(I%@Emj(PkUn"lOkWq5TtjN7sMn?F_)WE?'rEo%md98T+c7:Z76bGB,JNc//!G!)),jEMKXO:h2Aj5Jb"ld*E/1UUuY]lBLDB7AZ!M5*EMmlI9o]c1jK0",dVe=V,6ND3^kYkQ?sDaTmT6BX7=DM$k!2ZTV6*IjW0rm\Q*J$Qoq_siY<B+tcO_e:\-LN(+3n1&<hWs-Y&l+AA5`U*on<U(Rac/"fN"/G_i-Wf`YnHf1ZR@l7gE7h=iHK=5-@,c:7+4dlrUIsjU$<dcDm`a**nmkV(f7)<<dZ(d"c;dG98mfbJR=&!\0IAY^92NKb16&.8oYH7$YcbTL$`$#608mg:^3%XT]f(nE0%SbJq0qS+kM<eo2qZ*HWa)Ip8<,56:1?IE?TPIXCJd<dddPua<%.=(\784m-\-XLkK`($]s\BF*QHlq$Vd*&:2$01]=N8[M7_&'L6400RWp>(Gm8N*r[3Lj\O?./Gb.uDfFakB.mGL@1kdVWB@H+s["OBPW4$Q^?sb(GF.X*MgpBpd%sfJMJAbF,npKb/G=FGk>?8dX,+uifkoYGgUZ#nO?@TMF("1bg.";Hd^m]#HFs+$C/c..IPpM+A:iZXqL3(Q@D@.h;>gIEhQPN`u$4FR>@O5EJ[f,d"K./SI^Y%mOH[!-2*.0fMYAVTX0^7DCo>hK*~>endstream
endobj
30 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2086
>>
stream
GauI:99\'h&BF82.JfF-161HDY!")aRB93N@hLc`U+l_6Z7TOT8_?hRXbVIq=^Znu];Q%,(@Jq@dLSQ=1C3NibeI]un6lOiDAfYaAd`!<OML2n\=$WN^LHVpBnjp''g[QZTKcg-.l%;p`)rV-&B%_7LDdJB.h'F@nRIs:(cqd7S(O-hr$i06<q(Re$K0/K54USGQ^-pHn57_OhTASNn0d[/=c2W)beCp[NUG,*Hp-dom!=o4%rD)q7[,8LFtK1OE>h3+VbrR1q"!0>@udW6.>f67X+KSc`QSZIA=6.G)?^@9M@'bpkd6sn)$T7WcVW@(PHW)m@8<3Q/k:12UBu)d9[@J>1tX(*,Rr]NKeWGabuIU(1a<9`U^6X_4b!0R<]p1?c8WIljtuZ;Qc(8h`M$WuQCeR%-=5YMr_>l)-XOW.Fe8r*qFs>)EY]kF8U*9$Tijm/FW-o?ZP90I39*'Eh&>0ni:2[GeoRu='P8rc0g3*u=fD/,+SK0BleCH.'E,mk6.e7Bg8-h?*%RakE_52gWoX(kfI4J4\%ghV:63H>olnt5?(HF()DmJKbN<TOD9@;RS)s1e=aJbkRIC*H8)krTjK^4]Is69Vnb[66iuK?9/09.k6b?XuC>&1N8sUU_U?Q$8L:>I?g\=UQ0`mD#EWR+63=?IbS,mH5fSe92H;r!H.*:O$W)Ret?a>rK,c&.f:]"0M9:1V@hc)bo6oR'f\Fp]KF>5h\8*fu%9pV@oRjpE'2O0d7RnV+Z9dSu<VHYKor>YQqI4H7VNTY,*Rfb>6p9K<K29:,eNc8pAEG'/E3=@g3SDfr2bjmo#c4b.X4\IcbE&tkXd_i%oKeMD/XaK'?!7@&-!Za#aHI_S_36/M;e2Y1aj=K1fEea&1@\/+6krHPY#1N*:-0P%M>:Q((mn7_%8m]=qW+FY^qarH,Vk-47[_6h'YtZQXfcDa."ZN!@Kpug2*SY+FQ>J*3a#92f"@_[8p(tQGlX&-DC:l+\0AtPg@hdL)C52$$C-GHmV.Pje;R8cTW>VA.e1ApVo*1E*qtW5.<m,*M2B=>Z-(s!NjVaZ'77Qf@VIk&oXldMWSX9GHC*YCXA82<^.Q%SjQ!+;nmL/[EMa\p2J_/bD.e-KOODWUA+kg.3ggb=b3Q!\AS7\3bbV21`cAQBl28_9(:g0g^Ae*8-qhA9RMsHYnH@B4lHUd-<IFS(\9[0e8V5@*:dkW1IWEGD+e-sGuC)1?cH%UcUpmZE>WHrhq<`1b;Lf/BMXr$aKY.`@TED<<B\/qd7"#a.o(2PHX$T=EA!Ll^+Jk\.A&:*_#S+:0?YC;?hX@6@:Y*7$+GeIFUf[jf@p=:.9249oLRS$:Q9r;L#VGaa"PGoG"WRNKLAFg#LH]-S?%<));IGKcUijC_:XLf3c?gpu0e\3]GJ!>-R.-9kodOclS43V@sR*k=TURF.2hHQj!GjDDJ5+a(Mh0G;X2jBGB-R7D?7_4kD8BdWn8^GVV-g(G5lkBAH4&lS(`:.8<7ou08.W+F%^g3(1Wo"=MLS(iRc]?RuG0Z#scC8Eu(Tj5eM$G\;4)_ci)t3HBKq.b/[I]-pi'hGN(<eed(ju.tq9Tt+=mCBJ%)-g#Nc^ml4JW\[1Q$p?U4[i:kmZ6QYAbZNI&s^t.@0&)l:d,@%U+`$Q\]?1f"NGfD(PX7i6?=AbZR#Ch\&GQ;n(=D9,9U3CE:VLIPY2NCCMkfT.FMO.%1k4amO5"I_LX0`<E%Lg^K6`9XX5Z\o@@BV31.3I/;h])&*r^S06:4E=djBb^Sc8Pc@f]Ekh3rm6LtaD6;Z!>G(fa/\E``q1/FSgYBOI?,H=.2."J++4.1oXQ4CJn7^M!`EG+08.+.iWD[T%^'ha,kils:-2Lj&mjhp9h34MI@FdT)9qrbSO8$C+YEO#.C9`k458`5d=0aZ"(ih\9@"rDtV$8ILJ=R:bl;q3Rej:H(s2!H'f9oCtY5G<B9o]1\)W*L/e0N3IQD+sCYH$ubNkNlo!A@[-Fb$SjgR@8IX1jFrms`[8HrHJIR"(s@[1Op7-$7ds[nAkF$e=\BqIi8k)L>47j$h.2i%Z3d"A`VOY5SS-QX+t~>endstream
endobj
31 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1624
>>
stream
Gatm;;3T]l&:VB$Z&c6o/d>g@p*j]/ST^II[4p'r]Eh_L'j5Q&):&'Nq'6o>>`Nlg\RFpGaO4htgMai4@[c9iL];WgoO^f^]o=J4d<\H*&gapaMf.-*+)^(ek9@lS(,)Es#I#8gds.;#'[>Vs9,A;edj1E[A9Kmc(8(!?BjJRKN8f,eSU/JS1nn?Ri6'GaY&.qpYNWB'ZF.RK5jSGarM..,++1eA@GX)-dLi\^`5=-!(@WSt24H8]'P33U15Y8QheuIR=])J07Pd.u>!6FQc'$B71orkN@?s<>/rH$&q+$)Mq_7#C):.;!U\0a=G=FZbCH:&T@i]\X=j"-=9Fdc=Q>EO],am>*6UDO#k4f/mnd^R_2p0g0rmoYg0th)BM#/p?cCHp#fA8A(@]H(cmbY+FA-Yk`rlC?N]ffd^orc6\1motJ;p6?F\@H'83W/EA^C8_q<c<T'<NC.A$FT2YQCLNJ[^9`[7E)'UZaT#,?rDA7T-qgqNB>G1:0VXL9MQ6GafWMgId^bfJ*,BsV55S&,WX^!ju?16qS8WJ$BJ4%*5QHF^PaqOjcu4'(Kas9Ob_1>HCcG@ic>usk>sDW:"+BCgq"2c$F/E-_r36,)j8Y1Xt`WL9ZN;HE[@Wp:OC_:W`ntDWUP1%cMV^bNFNpL!Dk4=5rCGnE);09?r>Go3$A3tK<=9*p_tIS%sND]?arof\(.AHQ4Ft$EXrV^ZjqV()`\CWTr]6<Un\OIVj<%;!8b_B-lk7(H#B/#BnV15[Uc8$m1?jKp(AR2JV$"&i*\XD4!P4dDaPf9dW"@4SM%DlOFoB]7`gPr_I>NdSsP*\r#,Ia1WH!WA>qm"G+S'>_b24(Am/`f7iKMTKbI)T]Z5!@6\FGD2>\Q60@K4JnV*`XLNl6QC#T!u%XWCq@F=:eS7NCnqZMV>UEDi#>(9pJmq8un*"1C<9":&fQ3ZXua7`bjPTcWhe/NXnI9%:kMY`Z0+edn:fq@C8Q`RmQ3/6:oC)j<Sgp)GkFp`_@&2nJE@M@#r,*O9*LeP!r"5'904USp_N35u[j)Z2(c$Qnb<8p9_P\Vc40(rL.;>N7$G])6h9gBe<^4;01;oP=/H+9]7JR5XMd]0F^"@9#B0Uec%4bZbZo5=a\aSZ$+B,QmohbSn4^'B1iOP4%&b+1/tjrPYLL*4Q63IgUo2kY0X#"aA3k"/Hu?bjB#&&]uPg(Sd$QQmoajHEcB.8u(4_tQY5H[0f]o0\*"SMW0dAqM5*;81'`RY3$qb&>1KV!k-AO9c+#"[>^g1u#&i?WR`KE@9aM?#d.ZQA(RIpK+^OX$`B6)-3*U#uL,D^j^6uPKbZa!f#lEGM5l6P2Coc"!Al4/$eZ8+Im&B+k;gg\KESZe#*g^[M;?uPNCX+r2@j0!+p&d%eIbCj?._\U(uOEVVf`D.R+Xt5PJJrrG%Kgn=sX@6]LQFT48Tq<5J-%_!-bXpr*[@NP]ir7a/Is:qsl;dj5U$ij%sDP3%$t'TKtkAh6^7c>IQUJkd*-cRm`Rh_^luk@sZ`VP!*-R[NSf9@$ZY-;0:%3[fucj@6)nF1D&h8ChL-1gP2d5:5tam.A]Ud(IK"qtZpAN2W$0lfYU*p[h*.&?"X/@gqS`'=LD'*W~>endstream
endobj
32 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2467
>>
stream
Gatm<@<:Et')h6*dH+.`#6IIf!q4sq3Bk+G?I!^&[J@%CV1^Z<'+9eo)8U?mr:bOo'%e&)Q!7TmAO)iTmXG,Gq[GFmn?U<rBLVRlN;?U6fac7>ZA7"mAj=^SG4OCEh5p6r4:LS]j^SCa>P>iRq_hT;D$RdFQKo'6JPTj'K#?sRq(Bom385V22.ug_jNbi@W=&5V/7V7rVn5hT&W)ILo/2_hVkN)oQY//PQ"Jof=+8$Pa;qa0`hs:Fo`6/)@-GEWJ)n,2930t2j.T3Amn[u1F%+":fQ-I1UZkEaqI=jgTKg;-A.<OA1WGPe*V!!WNofXq*9b_*$.T/mduBHhUmp[38TVrBl$???CrLF+ihQ5_O4ihbqE]c/93,n6>LKrM[HW6fPppi`ZT#+F93Q&&Ppj,-Z(r&hXR=G(QB>!:f(^)JN's@F$T!]Q91FcZ19oe`W_Wu$.)SUG.*RJh7[!%-XHl]\5on+nbHE,CpfE7&RB0g$KINrm<@'_FZ/Ps^#00FBa.n2IG4`CYKsk3LTr*E),".uLB21L,8=Nu6\:tiB3s>>&3p#nr3Lq(43e+9h>c5'`.Rm))V1.q.qX(X_Va\"<@,(]q92r2nZ1sY^@9^(Pb4uj://!4Z%lRho"4-#JPlo8kht(+Aq)T7f''h_aQM%f#_m=EA1DR,XEY0Q$"cg6Z4?Zm5&&/_drR$cea*e%O/i?IoL_j2D9!4J\2OY$U*:m0_BSCekW#&siPW(/=m3&(r/8$8LK;(U`$HM`[CdNH+OI%PAi/QW'p_&#&PQIOrM4*Q@c8'LiGt7&492->:Usk:+HP4TLg0>RWDaJ$X8fhUB5Cc0@s#s+pDpVP-E(cf-?)gQUWCpNsI;W;l4o\1pUl]U_m#*>\g+9dDZ3[56(?5S%[$Xn_Gt`^_kmnRnA<TE5!()D+2Bg%=QN:Iu\_EhMhF915QhDb0k+XE)4O*&[U?$+*p5=K`a6bJfhr;FW[E,j_d\kR9a2uR7"`MKURD^$8ib,]eMWfVj2BNq9L&#;l[:q.q4kE2:h7PYhmb)Ln09Le.N,-"Sc^*OYMlN$)a!9srns+#KI!M[2Kd:aDG[>:8k9J!u36)0mNau-(U/Y[_ldGam-R2)5J%V=I85s=I.XYMV.DqClGIp*Fg>1$e9/F$242I48h>YS;E-"+Q^75b\T,g0he"3T;+W$X'&AOMqRf&CZ[^)^OZ>BuF_t!6(::\:9#q@g@!'B]*On&Dlo4*LE*<V;*-qY(@bB'\ZmUmK)ANeN^$C!<[-pp6Yn)RZpoTTn)lEpO7is1h@<\6bs1JbTHMVTYW,&;Wsk`K%TTTjKThqQ>/h)sBN\PJSYA63nr;pRkSUGc)'d@ZjLcTpaM-4,`@M^/QC0mQMeV$_M)n#,A8e\VAarArf0;5sMa(V8@q,r*(jgX<mG<[^N!qegns8[#8Bhusft>83\/s3mSM>sPNo\_<dDT.'+0Oko$Cn>5\mQ_/IJ?YS@6KE/52og6(clsA,3Me5hQ+9Xl]H)7u3"3<9sQs^HiB!\a#XsM5t5J-B>9mi<YrK]_8D_%9=jUXg*%4O7tXW*!9!XF:-1cqM@:1`BV!i#d.2<^!=nZ)&`hU%1b\DL-HUPQcUPlZKS,5JQXXnV_iX]*(W"g<(4iRi9lZ$XommGi:Qj]Te?Stk\QNM%iX13@5F'#,edVs`VZ-Tt!)4\t2\N"]KO(O+L&ZX]^H&k$mB8$o.o0/*X:6r3)E\$#:m_=#BFD;i:]'oTJGHU@`Nhq^HfWuafQJjb\<f1.^6Eucp`$G'o!T5)8+YeNcrhX0c=AN^]L/!U*D/+a[0i%c%B+IcR,YM5c\D"eZYE)FGNXr@$"X!-UF@&[oC@tWsa)(>$>j"<p.LoQ`.\bJsAM.C3)1809;i'@Pnr@j_sdI_F%cT=1a4P,0^U@-BCD\p0o8F8&^f2.E?W@JM$'8`MK>tsa5UP8$@;r<"mgk?$FJl@D%@2,\^c,+tK@MSGRPmgp?STIFk8MQQo0M4_@&;2^:F@fa%Kt1#ZKFfA9o@%I69!U!^Mo0gulohAfUO9eN'kS<r-Xp=CFNUFNe40IC@'YN#@KAX=oL*!&&kR_-#\+lOTu[#+1MmN[NH_\M(L/",?gpb<!E%>b/Z(B9T+Gk&j*>0-7rtO=1<_T(5T>Q]/VR%c&8Jg`)i9q6=IGUqS*\G:VkPI[BB6cBcmrVH[K=Kh4O]O4KF/NWRbBu3$<\,4I[JNb#jj*O9ie]JZn+Y[dnM0dhC+5Dq,s&%&B8jaLur\da.@`bf+T1T;7"s*;>7:h?;:DZ\\FM;hqgWkkY%DrduO_3+>F(Cl*>r3/=<,.?2lu"b]1Y)V2?eV2aZb4p=Stlo`Y<h1EJcd@aF8O6u@DB8ll!K_I[.!fhm#1=]JgNF5/>io246slQlg5i4@PHY3.V=Z#0F#H,B^oFG2f,Xqh!F=1ICmBdI`$&^jVU1YIhn-gR@V814E@jVS)W~>endstream
endobj
33 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1757
>>
stream
Gatm;9lo&I&A@sBm&?be(*ZWjBcRj7m`.;H)ll-t!g+u>%106=-q4+-h$$Au3-$mEBJebC-$&h<mX)R(#Y+HC_V`!-GWUQ0G7d4tbSCa9,(\E1]UrL.EtrhA:/^pDMl%\p#O$LHNM:,*JV^'L9.(k%Bp+HRYfeO((@C+B@9-7l(nu#+ST<f-<59HBYE[)_2cc5`CT:QAjc"WlZbKrB,JX0fqL"!)gq>q+%K5o<?,Tl$+X$#D4J%KtA<V8,7.BI(.ik4_+IPtn9NNN&Sr/qJ8K2^b^4"9L:;iqS&]"o`&rVQKLa3usjk0hB&(YuhRrZ#8ep24=kHT's2#,ldDm/+omaYM:m6`\EL0l%j*hQbi=Y.q:8hF,+QO:,*V$jAerob=fl2hZ*H?p!7A%eD5P-:\e^I$!j1<"c$j\=#nKE;sq.=Ii(&H`]g.#U0G'\.):YDa7d(L""_9)Kap"/9'>[f]+0NF!5EO%Uud(9e;\^r\]/k6Qj?43Qfk9!^NH9,tbeg`$=b<RMp1hd44\<p+q.oTBbo<Ni2srutr'Pt&"A'M%U)`?:C_9]Nq<88t!Ys%=e8P"S>+)@?2fiUBl/KMRu)WZnGDJ3*j@S;H=tC5teng."4j:X4u))&(j5!tTEa*kgiIn.]FO"O,(Fr&D2Tm>Q0<<=_+Oc:]X#V/gA6V-,FM4P^*FZiN;.E<\`&@-jTVgVSPa+A7br;i]H(o]f\L7Q5a]0#?_eW\oXDf.s=oj?d^=Xl,2(90C=o1C$i4V(1E$:>8-+(-O@k207V'(DcXMh,kq>lhi<aa`MRFdX@d#TS<WQ<K;h=@4WctmW%^,6+H_p9/a<u?a=4'Qu`Tt9!TPC_&CRHYbLP1?W>qgl)jg1G@5[i_/X18>5='0eM/Y"Sl^)4CV>p<K%XfGp4=AOeobZ82RK]sgRg)td,;W/oUu*D,#']TX'=!gq`tu$oa+.&.]?KP2/h+_-X#pU4<VIHft0"52=8`=81s1qO6q2V-^)T:/5MU_3a&YgNUeTgG<AVPQ?)li[>8uO^2k,[!oBZkL%=XMmT$*24,Lh9S69"QO='1Z_)*$(`T>^Q,e<07SmJdeoYj77I$6s$=;]bNHY2:6N<a39lM6atNk1XF.M(p,=-"K(0A^/lrALscLkVhHXqu2rW:S\O86[LMQL<=UMJ!t()NM_i9tM+5Ha[K_C8P\Qn6fVg@9'2?;KT)/hH&)iDFHLHG6r4i-%6<j%W]'t$T($QJ8!d0!q.gTcrO'96?E>^'%86INQ2'(f\0M];VMmO`*LILfs"SRDRV-VrUnSb%YdCg@;_&U3m5;?,q\iC1*TYM%J;\n2d+Shg=r4>NTb_5T;le<#,`rr<F:e:]],Sslir&$>!';L9(VV:j06HZQFjQ4X6f@[>"Zt,mb):G)e2)7dUJaD1M0CVS^,"!bcu]1-?/n8psPPUk?]-bm,GGoVn8n*D*+?%AD9\=p?/4%[`Un85%D,,Du,HH<$c>N7;"XY6:+_[6FVq)oW<I$,'g:#%O9p@e,+?a8oD;,<19hT2`uKOaTD:b_,#23H0,LW9[r<FVcJ6cM-Yh8[tn:-h"D0:3&KmHRPiDNQ4d!Z%eoBRZ7+fif_<bLa0H,XEG`kkZ1qc_8uFg--H54Q=jt_Xna?@.lWQTH^+aAf?<Bc:DXnp:0Tc"BfOL]Sb:VF+6/L)mIbE"`+Qq6Po3nej/)BYnHTrJie!OGYF0AZ"*/Bi+AD?)L$N#tBQLemk`elGm*K6Ro#-Rq-['-q<~>endstream
endobj
34 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 697
>>
stream
Gat=h;/_pX&BE]".IJp['GDE>AT+'F:7JgH96ct+JT6KM^^Q^<m*jRJX:6GC-Y*N$hu>>/T.^G(V-1<XZ3&rO"O8S'9H`$jp5fO,*INfX^Lm8>oVjhZE/:Ga0]r]pEC_f,JoO&(5VD_]-&"CLR:>rf^'deHC(nC#?^l5(kL`5mICg4f`&ZV0nkh\XVQd'h&_DA3F![<EEV0O1#Dh5[<dpEYB#d''U!T7T(UG99k8RLpL:Fr*..Bgl@9A#JQ$m6F?5OkqFua@keYHW(r'T!8#O+37'/K8CS5*X?QMmg>R"(;lf=g)0-BI+Gr$3P<S^s'Pk;\mV]-]g;(/EQ)(KE&pA26B^)DV1DZ)H/KgC$(,^FtQ&9L;s'?>!/=i2VD:8Wtn`QUpq.Y!u2@:OhOg6U7M+BHqS\=r:5:1&(U]R6J)@N]M/;DT%qgj8(sRY@MCAU<=uZT3&K@$^.Hs$>Ie/6_gVk$=/LZ[%pV[EGO^Ai/@$BK&KFoSdf=,c!eL.X`L)$Vl`n$8lYd-2*iMs*?g(uQ+kJh,&9Th/MQTLP^U[G:6_0+i3*WU>[M0i+Du0k-I0Q]=P)QA`G!YWcH"o:ggRbOV&mk_cZrqo9a`N?nYH3aH`"cGd/-h,=9.'`7BP;`NRgjPbc@2N)&g5j1LF0((M^csbsr(6VE?TjX?L4=;t7eA`QbP(&]<rQk@+Oa~>endstream
endobj
35 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1010
>>
stream
GatU2gN)"%&:N^lp5sHKY^?QDQ?89H]jteaRMT:`/;t4rE[<`1IXP;[;BS]h)%SMEO/-(,3SN;!$6K1[rT#uSeJ.j='W;Pk"ji?a0`;@1e'?8Lh4BR7>TD*&M(o"^$2*L1VEfN$#B9klLr4c[K2+LqN:-9B0[2>]%lC5+a"DELrrO7[6>058@=T(!r*YpdQk]p$<2FU-%&QfSrSV(2a58Bq_%oQM/)9u[0E*)Q&5bR^K.$^TM#:+@iSh4De<)bEUCm%d/VD0[ElOk+3NlaPV;d\P6\`J)]cnD!Zan:8aOud*^b[<Y"0qp=PQnKCQ+!n`T"p\E59i7U10GG%V3X-jCIf/CE`#qNV(+19C+3KY*9Oc4dL&eHSf\X@,1^-[b2=>eW^L+)02Xk(&E]I8n?NQBeU1VP@l0s5!Sf282;I)K2aiV3$LuDh5DH#BV7Gga;e_TKS8abf$[90`C1S,]=hg&pJQZ'A;K0a`D!_l.4?>Q>!$)SS5TU<,;e8]lFle<$7^]hM+gUZ-*&F!5oh<M&3)M_"hsVO92F*=t<dIOUFo[K/H:!/&k`"7G2`q$?,Rdkl\/X=!:'<\rJm3uNEaab=I+a#qBNKeLad!O8/h+<4A9)^+`lpHr(84]U_^fLY0urIk&ppScCOf"2']!;*E,>7mD,edH:6Irr#"W(4@f")`OSj.,JjW*R-:jrPl>\EBqP!?#L#a2O3=]ATD/,(skPHOnK8i?;$LTYD#a_\?V-T._3>r"F'9k6)b1QAM3h2bkY]o8<@^TT'C45)!?u%b+Da]2p65osW`KHp#\I3RLM%fEE?sG!eNoRuJemIbfnZ?U-fl$(l#"*<QVf40R-PR1ZYX8>lA_`ZS>2V<q1KNe@a:q:?A8.7X7Uc(`/^iPd?_h3L"n%jf\q9A1d[;3[K9qKTX*8.[.qYG0+ur0:'RNnD/l-T?"6>5#L*g,>pE?6$[3@sjnIpMIG<o6%pm=Do4*k4mj=c+e>M&S-eptJnTdO#/k7<F[H@G~>endstream
endobj
36 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1180
>>
stream
Gatn%hfIL2&BE]"=6q0B+g0q!G^(D=UpOjZ&U/-TL)49VT[oEVZ68,@^QiVKP*5[\iu'CYH1fkZY1?7]`J`C+X9?%.iPUTSnK?Wf$(M"DH^LZHs':_0AJjB:9G/_i(NA4S/kI5gN^lV[L#D`'&A&OQ`sX^n:A0*,9=4'enZD3"=<<RNJOrirOn4O^Q]V2soImQ0hg#+.WS_S2_%T$/KEEk;6JOX@H%+t0'8Km,&6Rdp#lA3?6'=2KNXC"jB/<0$d>_gmf"_U=P*_i``;'"p)kI_7*-'5J@i[m;=uW$]!\;TTi3&/a:"9:*#!T?qUeI$o*_(.&-8!Q%9edLPY0E"$2FJdr[;.Gg#_NkKA$FMnRXI0*RGYG/mIEP1FsD]Q6Gkq+?bYJm_.kZ2bT9fO*IL`2+5PG9:=%oo7=M)p(#EnsWC*Mm'HLR)ku5+FFE*U_`cAe+Wb)OFV'9EGO`@(*-#6\++SnZZJ7%L&!Pcc\/!uZ'@F;#N%MkFeI*E&%%ipI4YNbcl>JHAP+4G<4hj8E:eLUr/"1O\s&&8?2aF`RqTVTUj7*HMbO%c*5^#aA`1$/_>PghIP70C4e^a.BVO3ig@)Ybi)]8jGVCUS\V-**Hf^Z3-HWYJR2Ad.BMeZb<-?5l*Ccn(ABTf\(J;3/i2A-G-o+am^\eljP("3"HJOm7cQjCWbi%GYkJ?-)ppn,eN!'XWC/U>UX>/_/>p@mRMJgf74h0K=+Hp]\6HkT3jB16'E0kW1T4_.PCk0(B"P5rsmD?GhsD7kktIgc"PeVE)dR`ci>iX]-2qHe'=8An105:1#67Bde5.`t5]"%aiNm)FN:R//bUq'7jpG!j@U!DI)`?16X7>;\uXMdHY`\8aNp`rhU>XQ8)_1%_'QYpIO)PM8[T+E?%>lW4I;Id.Q9,M>JbH/I8U(2i:JWL@Dn!mG7&bpR*Q>q(tKoN)b1[o):m>>UOPPKR<\3f1^k5dZEGO\rbT@SB,cXZG_&KKQ!=h;aZo[F92DjP$Hq'N:*,*B30];b'[ebFFr?g]HE//<l;@EI<0lgB(/I;\/!IK@RdMa7"--8Ou15Y"`"aZG"Yl(]Z)YGE5r)[eAN6ZgWAl'=)7;1r2N)pj]K$a.kG6+'\`ojAZg6BkpCGPE-f^#2CAVXhjue[4tB:T4Xt7IV!6EFMH42rp`JE6j<X~>endstream
endobj
xref
0 37
0000000000 65535 f
0000000061 00000 n
0000000124 00000 n
0000000231 00000 n
0000000343 00000 n
0000000538 00000 n
0000000733 00000 n
0000000928 00000 n
0000001123 00000 n
0000001318 00000 n
0000001513 00000 n
0000001709 00000 n
0000001793 00000 n
0000001989 00000 n
0000002185 00000 n
0000002291 00000 n
0000002487 00000 n
0000002683 00000 n
0000002879 00000 n
0000003075 00000 n
0000003271 00000 n
0000003341 00000 n
0000003667 00000 n
0000003817 00000 n
0000004892 00000 n
0000005708 00000 n
0000007242 00000 n
0000008500 00000 n
0000009736 00000 n
0000013553 00000 n
0000016002 00000 n
0000018180 00000 n
0000019896 00000 n
0000022455 00000 n
0000024304 00000 n
0000025092 00000 n
0000026194 00000 n
trailer
<<
/ID
[<757ea4ddfa9c28711d3849412201980e><757ea4ddfa9c28711d3849412201980e>]
% ReportLab generated PDF document -- digest (opensource)
/Info 21 0 R
/Root 20 0 R
/Size 37
>>
startxref
27466
%%EOF

View file

@ -0,0 +1,118 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 6 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
5 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 13 0 R /MediaBox [ 0 0 612 792 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/PageMode /UseNone /Pages 10 0 R /Type /Catalog
>>
endobj
9 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260816060853+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260816060853+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Decentralized Platforms: Comprehensive Comparative Analysis \205 Master Report) /Trapped /False
>>
endobj
10 0 obj
<<
/Count 3 /Kids [ 4 0 R 5 0 R 7 0 R ] /Type /Pages
>>
endobj
11 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 882
>>
stream
Gatn#9lnc;&;KZL'miWBTN\WQa2^LQ"%/K`nSmb^[F^8NQ;^@m)h's9O+`7b-T[Z8,cu7adApPm#jB>+DdENnaP_H^JIBOki":kiqZ`[uao-mR4/8#HOKg'0?;I_2=MiI+5@H\4WT:htkD>.KKec7%$$JJ*2#NH'En$=R!1-tl&Tg%DN1#nBRBlslQ^FQ<<`SuT(9jm)0,n--1WY#3p(#q$m3^WS'4<qI)_d/5-?97df[O,`)`1;S+ETDNQ1)^/7TDOJT.rNR4O"_h"e2-K2,8b>da9FqgXF2`0'Rj<_Dlp/*tIo_df(jf&"h-M/CJd=^J`@PKcAf*f#+U$$2d'SFCQG(_-caXY?0*2palK"Lm^es4Wk&\dB6^:8UMZl5f^KC!>;:<1o<\@NL=gub5%Y"HfMabq.'P"7([?l0Ng8u/r&>Oj^L)"@bt:A<Si%/i>m?eops5'7[s')]i*_PVdXt8;akE8>IJ_\$'#9d.hF#c8Hl'D&"Oj%Oc3X]+He-"1#sGY9Ba5;%QC"-VY@2a\<(j`>J]T8[P21T&2i\'s4'u"/Da#[n"gH("Y*+[7AT;q9XB_%:_-"*]Ni8'2@mAa#C_<P)I7+CI]r/hKVjF80qM\T2ZnFO;>[LHXf=t1ffi#bb'.mhI:m<HR+^GYd,]AZoiSj[FbO^'%Q-AIWl;Zo5tAms+G,sfV'ArL=3j.bI%rje'OFd9@'9C@=gtt=-:cctM@S$V7A)%:==hit;KN<_D,nDqI)j;I\(tJ>%_/'m%)0!YUEgPYa)0C.D)Z"K/)?is#^5Jq*SB2>OXl#A]lMg@<'NfES.=..Gu8k??UaR"HHK"J+a%Q-&oHFbcA+cG;*#"6oEaKXE<st&Z9?0/MD4i.Z<X?u~>endstream
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3847
>>
stream
Gau0HD0+Gi')nJ0Z(Gp(2PU""WAjPp:$c24n\pLCp,_6%$q*Dp)N%ogb-q/?^\noJ77sgR6ms$NC`%hs>qG_Q@.E4VI/F?$pM:<.r=,9("qZH,Z[a1l@^p[o(H4#HGS.;7j/Ej331P4,quG;pJKIS7!5'uk`b>K\Pf@2t"gNH+?pTPi_9En'6O3aQ/WnA.0%kj(*,`j1TYMB5L6i?$S,+Gdr!k[C8D-5df-C)GIb4-h\As@h@Nc`3#qD*5_C18V)^jT$%cH@X01toj2'bJ@c$_!Jp*?Y&fqJ8Bricn>6scU7&\pdM(WoS,%6oB$#F]KJG"5uL=g*\7%eh*:G!1(BKZ;g]Zr76AKeU\p7:3kGD,rd^"^c0++4>0IXdT\Ji&rO\3[5@skV2ODq]!A$H//aN95+R]JhL57&sfE'_IC$P<%N<CMRXq='pl^p(G(?rZaZ_RE6\"Np>m`t,AT51iSF1glkESc&PeTKL)G<=5^u5;D$i>En(?gVm/,7X)d#2L"D6CDCK@NASff_T>!(.HY"0ei_^X"\[XJqcn2eI;^maZ`Ae+!C8TP:NU8FiE:FDH:!lO@N.kqmR.s(Q;_1L/G'c87J'bRP0-&.B1,$V=,B$EeQ_]Lcf-Q#2Z)C;hC$Qjem$S!RIW*dAr`I_Yp7OqMgY#1Z+hh[6.0*KBe)TGF&,-e91"]6(4Xp)E^%>B]q'AKP'Om!G88\IPsXl2/Ha&8H;PqT2t2>[`_U=NZm57)oh%#=l5aQS=T&4K^6#:*9CN>TOnd"LuW'bp=XkX-SM92ZI#e)aaCRGTI<<-RH%cHsfkXN+DcrhT@fl[gr$0%T\Cm0]ILdY`t&>K]Q=P;S&a$1nBR[^RnQkr.b;\K"@J!HA#2ZMq!?GO>^.^@A4NJTgUJSQ1'jK<q^T&Eu+0YgqaT\/WcoepO4X,`i39r(rb$3_"k%0'<k(O40s3LV$sGUND*4i5LKe:(_Rt]-r"O_1EfJpT;,=UrjO<(Z2mpVG^q1hDCi#nqT]fIEM;Vp^GI'n>gDX2E`()r7"4H?rJ"e';N!uNOGNXgEX_oNu2WKlhBr.@(M9qjgUi7i?%c&\F[U;a-_]1Ds)sISSo]pZ35Z`,(a>r@eSu(Ul;P@WNDERC#+^`XFX)oS3n-gVV(l]*:Da;0B(FiEnEL_cr[;ZCQ)Nj:<'D.n:kSgJ8aC&h,]18/.#LAmI<##)pVL`)d:fte14RZ"Kbh_&6,FeC:H?\OuN$CAB[E\2DX#1D:kM)d(`E)YY<cW+!tW6_mW';^k?4C+0_>9Q-#sd*?L-1lit1!K7<%=NRWGod$C0o^0Pa","meLL`0uYPK<jSVQnqb<>iWWBl0PnY,N9.q\"l9;[p+rYB9d3Xo/"kc2$Zaf*6<iE_eM?:.;^`+QbH&OU<Ll75Npb"GUVMc?TUfR1)d'NqZT:2oBgG_en!77O6=-1MSc/]\qIUC!O3f^;982FImh8j--C<BLZ2M6.gdg22iNg;D:eAR$qJc<3/Y?UJN,3\HDPa/7T,9Cr6Ib"b+d[nehBqN>uG$l(ADVQ%rh=WS):Sd&+18MhqJgMN0Gi.>tW3Agp9Y)DY]6(#-;6FP)Cmi6j,Y\`'#]]Aoj*&ZL9a065:UC(tNhTq0i::!p1B:@B%^;_lIJN0c;)@f/F(/euM45J,lTA^uO'N[6Sqbu>67j9X&_deVCc/dibYp%]>.o&BEiX.B8mL<+OhUnM=Y<6k8b]dY\,LG_O<Z5ap"XJ4A(Jq:`YD:!clhB7Gpk%na#Zq*Z%9EVmQMVFIEa0]<!78'R;o7CO8nb7-c.L:t\J8oUVD#WoKrr7Bp/b:/[h>25.h9PihD_aiKo/9b?+4U)km<1(Q`fQ$YpVcN?<492]TRPQW)>Ega^,FeK1YnCZoE(0s5MF/=p@6&752=WY^^NC*GhR=9(&%M?q,<R+Y1lkSm&-cPjsU`:%/95Om-VsF,peO]>JEK^S@;#2#d3n%U+dMXm(G8&eHLF]=OJKIoC(Trp_Q[r"YZ5*,uNCt[p_=P^T\W'eOZ$.'dZo9;tBaSb\IW"8%Y5.&59sE>=aPskV+aR\\ZlM,(u,P?[h,kIh!MY0We#:-I?IO,3Hg&6)N*E+d9/;1/:VuN+*GG3nK5.%%`"IlGX/,OW^1HjSg_MO8<GGLDY%`_1siH+:5`d/[Qr7%ad??>O^T&0ME[;HOo7-&LorO<dGlQLm$Ei/^B*JYH]2(^I5te1/8JZGPM#Z5-=#]Um=Y;EaaXEV(r'&a,l>13"pXTAc66#NdK]M2n$MOR93r,4L"IW8`SYA/SX!UgiCEJNEa90f2scI[fUtN(Bi2d\-O`?A9ur<c%9-5fLZuX?aI]]f#STXg9s[p%GUHl%edEY[4H;,gN(7*.r-$^gqg561pUWIohW3mCrg<jn1?dep!EW@Q"2(p/ZspRme,*EEK@.\ndN$c,joY09:c/cdGu2C$sQE,QBYu2f7l/"Lt]n2H[R_dNh88W<3[*K,)RD@M'fBJeKf-oW[VD4C)TNGl`04.**&-=\S#?/Z#?%ok\1d=Rpn_mes[A_JkX+e`>qJg'K+\3X3"e.4-29IHFVR.'?!&:VT:RO.ZuoHT4*XgqD\04e5k8\Y+2AGSKJS;lqgCjENQ8gLhfsa&*KmK*-S7_\UpQ1CL&ePS9l$[LrX[LlZZZN.cdb*JJGV69Y@UK2)3"^^7$#/EA]hL!E\g/4g&CQ/ZpNqGE47W&u@LR+'H%([5r2f(!O=DALGI(hJ7m-i5^]sG,V:'?Iot>gi0BrAqk),2(tJp.TSP'/8Po%T%RgRE5=OKr>@?m1MgVCItsI3mVt*GScMp__`b/7Lb5cD+2g=FAr/+BBnk^j=)ENtT,K_u`-ZG;Whdm&(S=Ek+BFYa4,-e7V@ga,WnmbrN7r0"=J6Z-590"CDLXXs[GCe#m90!cfo^,@MoBAKlUDoq2A*h%Ceuq)2/GnlkHLBgc@`_U`Uf$+c='p\4AW]M&Cu5f2,&2V=JL^8Xm!g*FDugHlQ2U(mFpd%O$BViqR-!rgcYtTqI'>nCXfgpjkZ,7fN)LU48nGgNE*5FjZ76oZ-]%[*Hu@arH#&[g=B`,47sM9D,mi&o,>$E=QoY0.i`YJ"5ii"as+FHgE]=5kBqEOIhMTDHP0AGp7<Q+'CodC)dsl;<nF1]-Q#L`FC"1(`+W)/V+Z/2P,OYK9=lQIT#(pL-\$p3lgI4@]%Y$57UDm/L6dKrjW_'dlQ`ul5Mi(Tp+2M8o:d[SkhmA%nDuOm?#M70moW>#+J:dDh7,YLZlNKG2r7kl\rX]8endkI]SbW9+g8h+p1Y\]ldre&L0*r3G4t-?dd7ng^dZO@,-P5>m]^u0ro=3_Hau3GX,GM73fV1R\md8=<ts@]*cnpNJc]_\T]D-a*o,\kh9EH]CoPdbO-NkQalT2tH.lU'[>C(0'Qnt0"S5@]R5VW&08lsFCE]@JBVLGc.k9VnEt;Si)0SBI\J1j(?8CCZkS\Vo)WO&YWTjajf6;2>gKBY1/O)cLZ6*W+XHZ;LU:_tSX@2Rh'i'inK8nqp#R^=-=Wp1irDp-Dbh=icRi7PsD<HN4:uTW,e6WiR=$@3D>ENqt&!T2g4o8TR,f(2/KrasCs'/fgE(1Gs^,0(qT0uJd?[IjkTDGhO(B7[B%8R=;dRUe?eY=G&PA](@gYpo0&$D53P.*uY@kI=]6R)KWli+$f^)C]crSj:]BqX.8Z@9Y(gM:i2CcKN'F63.OFtu(l_-Y6*^g7k&_f9-D=EdL*OhE@g15ZF(9tLne1.#m=!*RL_!KGa]dRj+qqOboP"I94`A(n?B]@JIsf%Il>=!STfTV.]6d>rU0HmFdE++!l';7u\P*:Vtf'C'ie~>endstream
endobj
13 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2237
>>
stream
Gatm<>EddN&q801kXT54(i4i8j=-F`^!pY\c*6AfWg'^kBZIQoP0=?6oAe.Efk.`fifbNSPq=8^h>R#uX`"$ca3St]3$W`.Vr"OOIR*K>q#bP#oAAeErp&BBIf8>8iWV.GHuFrQR)]\d0>nB8Sl)ucp&4EV5G@lTq0d0pL%K6b)I'1hpJYkmCc1%j<$]pCRfDF)lQ59:SP_.L'._<s.e/31+nIY2o2tAe4!nQ1EGYtKZf*a)#mj>:1mG7-@7I7;/V7Bk<]*r_Y-9'Z,1e*?4gE44,2p'E//;be7[4OpPU6%(SOYK]eQQ^cgAE=3$sPcS+h(\uMHq[!iBM\C9.R!CGQZo2ZQC%`L#4>>rNR/&K4A:Db?D.IaG^ame>#7(2@B2fYn:3m1+S^dGB`fL%+pVGCUP"o(+O&:_fdMo1btArIcCE=[,sAM=K(cP$#Kel<4ietVH4u'HD_4u>)\A/iNjd9_TFnm(^u2Y\:l2Xk.Ib*"Z$AFAX3AU1V7C7OXV#->[uZ&8HP2k(pN5>?E"R"A,"u?1`4*\**b01()KSZRGk=uAd)BGbD358U1B_`"Oj?Snt#i,_Vg4lhCtBdN[To!%HGT9EL*h?apG7mgo92'Z5k=rb1[#bmps^X-VN0t/U-(0O$tO-@F?1\%9%NEK.rdPgK&5qE!>gpG,&;&fb,)\f4e<m?(B8DQ_<clDVlW@LhXq6$)L?T:79\:/M;FQQo-b[>-.<R=6!Jrg@P4@,kBo"h]G9So"o&ol::@*0ah6`Yl=@p.b@f&GMZMh)'6\XT\9Vl$Z4r&k>ESL&n'+4069N5S@Z4FdqOVRV,Kbm=SrV\?o/]e\S)t9_iVOY0UN8rqXjB[h!N@"k_FDq:FY*_.lHNL;P2'YhB3^?UTfI#1F4T1$&OOB[hen3d,bmh[hM*9W>EHeYn>bo"N0GJhgVOs$,+60YR$s8IGugF)Nc3A=b=@QE1M*@Zrn,%<A_?V=;/,<)B<N\?HQ.jJYi`T0+rQ>b@;)))9rRPVYpoYAI`#IS'k3YdbFWV-1A)D=/G\A\.U=N_Rn)U0+n!Fm.RTFpZH:V$H."VT3n>Jh7Ju'*DW>IdFe32TS:>QO3c/DUP:oiE*R&2Ya5E>`0%VbaS*[,9lP/p.?3MJj]\&;KPq#l9N;@'9YDd+Qb,;4I_WreEU.;0odi\g4?Enajk4(sH2Co[))CVl[o=R!kDAFOk-(b_XK8tDkg]%c4b7V/,bl4eh?n5IZ75l\4#o:%nec^hVd)G0g$Erja45>2U>raiFBn<?'+f3Q>$SId1`5]-L5X>-.&Li.E(;2U=#_%G(\ta^e%d"\5PfK=o8V8>UPDnFqo[?5FC^/mD&!NYdAZWc'ZU]$?AubPTta(=;(h89Sm1G;-"ASE7@TkIf^gcCW92QnMJD'@<QE]hb'WSnp-@5n$N;RPoqREVWu;gq,QKCqTQGHWk&e$js)b-7H`!\KPWE35CN[@nnR+,b#Z2Nk;\I&AHRQ6ZPsU=d[<FB=FZQ!Sd+ke2W&bDA!uENtl*rPsj\&jlr(F/\?H-<RMNGN(8+ta)Y"N!RT#$DW/P77=?@qW0GthRNF$hVDjoFUXjptI.<hDi5)Fsaa@'9(g'YUid+4(f,n4k?Vatqf)$JD-fY*ZqK:qKKe+frSZa6Mo`.;9;>4=0%b\l+>q_O$(.[r95!JR2W'N/ACYK7.iIFu&t>+)FmM\)shD].MJGa-\@![[7Bfg&.TUL-\'#Im,[`Vq$=dJK<r"'lN;#OUjItBoo\m3JmgS+,t,!)/MZgU&!D?6SGU>9sIW`(EIU<=@#_1^@:4T/7iE><Mhu^_EWP0KiH(8P&FhD:4`\>n$F>/kgpe"&4pU%s%6/bp]3h$m)*[?c($6=f[K0`T7;H5s"0DaBg#ub8s\ef=1A%bn^anu2O]"V>)n3r\9n]JR\R\hn2`MERORbsNf47ddn6kRq;X>8T.qY=s&<DJF0ta;D7sLpabc]Kg1c-6V!5MCFl3/OIA9>M=jp8OL!d,Ed<?KanE<n&qb\P'F6:4-4adas;c:7IDg6X?2.0N`pX!*0$FX>?gCd3@FB:QU&)L:C[ZDHpLR3U%(u\(ErPl8m)Wu`f$=2XbV7SYGL,K"V=)a`.n>Hf6E%c?9-_ln&.D/G*eU\ZABZFV$'HhrM]-c%<JL;&9F]__-kCUM29p_ajoP5YY@%IS;V*PbX<=@0\^lC(Af<6P!Lu+G5gIMMH+DOa?*beM^9X"F#[hKE2~>endstream
endobj
xref
0 14
0000000000 65535 f
0000000061 00000 n
0000000112 00000 n
0000000219 00000 n
0000000331 00000 n
0000000526 00000 n
0000000721 00000 n
0000000798 00000 n
0000000993 00000 n
0000001062 00000 n
0000001407 00000 n
0000001479 00000 n
0000002452 00000 n
0000006391 00000 n
trailer
<<
/ID
[<91f4bac016bcf39cec98056a23eff6f8><91f4bac016bcf39cec98056a23eff6f8>]
% ReportLab generated PDF document -- digest (opensource)
/Info 9 0 R
/Root 8 0 R
/Size 14
>>
startxref
8720
%%EOF

19
vendor/zapier-platform/docs/index.html vendored Normal file
View file

@ -0,0 +1,19 @@
<!-- Used by https://zapier.github.io/zapier-platform-cli/ -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta
http-equiv="Refresh"
content="0; url='https://docs.zapier.com/platform'"
/>
<title>Zapier Platform Documentation</title>
</head>
<body>
<p>
Redirecting to
<a href="https://docs.zapier.com/platform"
>Zapier Platform Documentation</a
>...
</p>
</body>
</html>

View file

@ -0,0 +1,84 @@
const mocha = require("eslint-plugin-mocha");
const globals = require("globals");
const js = require("@eslint/js");
const {
FlatCompat,
} = require("@eslint/eslintrc");
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all
});
module.exports = [{
ignores: [
// this needs to combine all other eslintignore files so that lint-staged knows what to ignore
"packages/cli/scaffold/*.js",
"packages/cli/src/generators/templates/**/*.template.js",
"**/.yarn",
"example-apps/onedrive/test/*",
],
}, ...compat.extends("eslint:recommended", "standard", "prettier"), {
plugins: {
mocha,
},
languageOptions: {
globals: {
...globals.node,
},
},
}, {
files: [
"packages/*/test/**/*.js",
"packages/*/smoke-test/**/*.js",
"packages/*/integration-test/**/*.js",
"packages/cli/src/tests/**/*.js",
"packages/cli/src/smoke-tests/**/*.js",
],
languageOptions: {
globals: {
...globals.mocha,
},
},
rules: {
"mocha/no-exclusive-tests": "error",
},
}, {
files: ["packages/cli/snippets/**/*.js"],
languageOptions: {
globals: {
...globals.mocha,
},
},
rules: {
"no-unused-vars": 0,
},
}, {
files: ["example-apps/minimal-esm/*"],
languageOptions: {
ecmaVersion: 2025,
globals: {
...globals.mocha,
},
sourceType: "module",
},
rules: {
"no-unused-vars": 0,
},
}, {
files: ['packages/core/**.mjs'],
languageOptions: {
ecmaVersion: 2025,
sourceType: 'module',
},
}];

View file

@ -0,0 +1,13 @@
{
"presets": [
[
"env",
{
"targets": {
"node": 6
}
}
]
],
"plugins": ["transform-regenerator", "add-module-exports"]
}

View file

@ -0,0 +1,7 @@
build
docs
node_modules
*.log
.environment
lib
.env

View file

@ -0,0 +1,7 @@
language: node_js
node_js:
- 8.10.0
before_script: 'npm install -g zapier-platform-cli && zapier build'
script: 'zapier test'
notifications:
email: false

View file

@ -0,0 +1,16 @@
# "Babel" Example App For Zapier Platform
[![Build Status](https://travis-ci.org/zapier/zapier-platform-example-app-babel.svg?branch=main)](https://travis-ci.org/zapier/zapier-platform-example-app-babel)
A barebones app that has a resource defined. This is mainly a proof-of-concept for using features not yet available in node v12.x.
Run this:
```bash
npm run zapier-dev # compiles live
zapier-platform test
```
`zapier-platform build` works as a non-watch command that calls the `npm run _zapier-build` hook, and `zapier-platform push` will make a fresh build using that hook as well.
> We recommend using the zapier-platform-cli and `zapier-platform init .`  to create an app - youll be presented with a list of currently available templates to start with.

View file

@ -0,0 +1,3 @@
global._babelPolyfill || require('babel-polyfill');
module.exports = require('./lib');

View file

@ -0,0 +1,37 @@
{
"name": "zapier-platform-example-app-babel",
"version": "1.0.0",
"description": "An example app for the Zapier platform.",
"repository": "zapier/zapier-platform-example-app-babel",
"homepage": "https://zapier.com/",
"author": "Bryan Helmig <bryan@zapier.com>",
"license": "BSD-3-Clause",
"main": "index.js",
"scripts": {
"zapier-build": "rm -rf lib && babel src --out-dir lib",
"zapier-dev": "rm -rf lib && babel src --out-dir lib --watch",
"prepare": "npm run zapier-build",
"pretest": "npm run zapier-build",
"test": "mocha --recursive lib/test --require babel-polyfill",
"_zapier-build": "npm run zapier-build"
},
"engines": {
"node": ">=8.10.0",
"npm": ">=5.6.0"
},
"dependencies": {
"babel-polyfill": "6.26.0",
"zapier-platform-core": "19.1.0"
},
"devDependencies": {
"babel-cli": "6.26.0",
"babel-core": "6.26.0",
"babel-eslint": "8.2.3",
"babel-plugin-add-module-exports": "0.2.1",
"babel-plugin-transform-regenerator": "6.26.0",
"babel-preset-env": "1.6.1",
"mocha": "^5.2.0",
"should": "^13.2.1"
},
"private": true
}

View file

@ -0,0 +1,21 @@
const test = async (z /*, bundle */) => {
// Normally you want to make a request to an endpoint that is either specifically designed to test auth, or one that
// every user will have access to, such as an account or profile endpoint like /me.
// In this example, we'll hit httpbin, which validates the Authorization Header against the arguments passed in the URL path
const response = await z.request({
url: 'https://auth-json-server.zapier-staging.com/me',
});
return response;
};
const Authentication = {
type: 'basic',
// The test method allows Zapier to verify that the credentials a user provides are valid. We'll execute this
// method whenever a user connects their account for the first time.
test,
// assuming "username" is a key returned from the test
connectionLabel: '{{username}}',
};
export default Authentication;

View file

@ -0,0 +1,27 @@
import Authentication from './authentication';
import Recipe from './resources/recipe';
import { version } from '../package.json';
import { version as platformVersion } from 'zapier-platform-core';
const App = {
version,
platformVersion,
authentication: Authentication,
beforeRequest: [],
afterResponse: [],
resources: {
[Recipe.key]: Recipe,
},
triggers: {},
searches: {},
creates: {},
};
export default App;

View file

@ -0,0 +1,168 @@
const _sharedBaseUrl = 'https://auth-json-server.zapier-staging.com';
const getRecipe = async (z, bundle) => {
const response = await z.request({
url: `${_sharedBaseUrl}/recipes/${bundle.inputData.id}`,
});
return response.data;
};
const listRecipes = async (z, bundle) => {
const response = await z.request({
url: _sharedBaseUrl + '/recipes',
params: {
style: bundle.inputData.style,
},
});
return response.data;
};
const createRecipe = async (z, bundle) => {
const response = await z.request({
url: _sharedBaseUrl + '/recipes',
method: 'POST',
body: {
name: bundle.inputData.name,
directions: bundle.inputData.directions,
authorId: bundle.inputData.authorId,
},
headers: {
'content-type': 'application/json',
},
});
return response.data;
};
const searchRecipe = async (z, bundle) => {
const response = await z.request({
url: _sharedBaseUrl + '/recipes',
params: {
nameSearch: bundle.inputData.name,
},
});
const matchingRecipes = response.data;
// Only return the first matching recipe
if (matchingRecipes && matchingRecipes.length) {
return matchingRecipes[0];
}
return [];
};
const sample = {
id: 1,
createdAt: 1472069465,
name: 'Best Spagetti Ever',
authorId: 1,
directions: '1. Boil Noodles\n2.Serve with sauce',
style: 'italian',
};
// This file exports a Recipe resource. The definition below contains all of the keys available,
// and implements the list and create methods.
const Recipe = {
key: 'recipe',
noun: 'Recipe',
// The get method is used by Zapier to fetch a complete representation of a record. This is helpful when the HTTP
// response from a create call only return an ID, or a search that only returns a minimuml representation of the
// record. Zapier will follow these up with the get() to retrieve the entire object.
get: {
display: {
label: 'Get Recipe',
description: 'Gets a recipe.',
},
operation: {
inputFields: [{ key: 'id', required: true }],
perform: getRecipe,
sample,
},
},
// The list method on this resource becomes a Trigger on the app. Zapier will use polling to watch for new records
list: {
display: {
label: 'New Recipe',
description: 'Trigger when a new recipe is added.',
},
operation: {
inputFields: [
{
key: 'style',
type: 'string',
helpText: 'Explain what style of cuisine this is.',
},
],
perform: listRecipes,
sample,
},
},
// If your app supports webhooks, you can define a hook method instead of a list method.
// Zapier will turn this into a webhook Trigger on the app.
// hook: {
//
// },
create: {
display: {
label: 'Create Recipe',
description: 'Creates a new recipe.',
},
operation: {
inputFields: [
{ key: 'name', required: true, type: 'string' },
{
key: 'directions',
required: true,
type: 'text',
helpText: 'Explain how should one make the recipe, step by step.',
},
{
key: 'authorId',
required: true,
type: 'integer',
label: 'Author ID',
},
{
key: 'style',
required: false,
type: 'string',
helpText: 'Explain what style of cuisine this is.',
},
],
perform: createRecipe,
sample,
},
},
search: {
display: {
label: 'Find Recipe',
description: 'Finds an existing recipe by name.',
},
operation: {
inputFields: [{ key: 'name', required: true, type: 'string' }],
perform: searchRecipe,
sample,
},
},
// In cases where Zapier needs to show an example record to the user, but we are unable to get a live example
// from the API, Zapier will fallback to this hard-coded sample. It should reflect the data structure of
// returned records, and have obviously dummy values that we can show to any user.
sample,
// If the resource can have fields that are custom on a per-user basis, define a function to fetch the custom
// field definitions. The result will be used to augment the sample.
// outputFields: () => { return []; }
// Alternatively, a static field definition should be provided, to specify labels for the fields
outputFields: [
{ key: 'id', label: 'ID' },
{ key: 'createdAt', label: 'Created At' },
{ key: 'name', label: 'Name' },
{ key: 'directions', label: 'Directions' },
{ key: 'authorId', label: 'Author ID' },
{ key: 'style', label: 'Style' },
],
};
export default Recipe;

View file

@ -0,0 +1,33 @@
/* globals describe, it */
import should from 'should';
import zapier from 'zapier-platform-core';
import App from '../index';
const appTester = zapier.createAppTester(App);
describe('My Test', () => {
it('should test the auth succeeds', async () => {
const bundle = {
authData: {
username: 'user',
password: 'secret',
},
};
const response = await appTester(App.authentication.test, bundle);
should(response.status).eql(200);
response.request.headers.Authorization.should.eql('Basic dXNlcjpzZWNyZXQ=');
});
it('should test the auth fails', () => {
const bundle = {
authData: {
username: 'user',
password: 'boom',
},
};
return appTester(App.authentication.test, bundle).should.be.rejected();
});
});

View file

@ -0,0 +1,63 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/
dist/
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# environment variables file
.env
.environment
# next.js build output
.next

View file

@ -0,0 +1,34 @@
# basic-auth-typescript
This Zapier integration project is generated by the `zapier-platform init` CLI command.
These are what you normally do next:
```bash
# Install dependencies
npm install # or you can use yarn
# Run tests
zapier-platform test
# Register the integration on Zapier if you haven't
zapier-platform register "App Title"
# Or you can link to an existing integration on Zapier
zapier-platform link
# Push it to Zapier
zapier-platform push
```
Then, to add more features, you can use the `zapier-platform scaffold` command, for example:
```bash
# Add a trigger
zapier-platform scaffold trigger contact
# Add an action
zapier-platform scaffold create contact
```
Find out more on the latest docs: https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md.

View file

@ -0,0 +1,22 @@
{
"name": "basic-auth-typescript",
"version": "1.0.0",
"description": "",
"scripts": {
"test": "npm run build && vitest --run",
"clean": "rimraf ./dist ./build",
"build": "npm run clean && tsc",
"_zapier-build": "npm run build"
},
"dependencies": {
"zapier-platform-core": "19.1.0"
},
"devDependencies": {
"rimraf": "^5.0.10",
"typescript": "5.6.2",
"vitest": "^2.1.2"
},
"private": true,
"exports": "./dist/index.js",
"type": "module"
}

View file

@ -0,0 +1,32 @@
import type { ZObject, Bundle, Authentication } from 'zapier-platform-core';
// You want to make a request to an endpoint that is either specifically designed
// to test auth, or one that every user will have access to. eg: `/me`.
// By returning the entire request object, you have access to the request and
// response data for testing purposes. Your connection label can access any data
// from the returned response using the `json.` prefix. eg: `{{json.username}}`.
const test = (z: ZObject, bundle: Bundle) =>
z.request({ url: 'https://auth-json-server.zapier-staging.com/me' });
export default {
// "basic" auth automatically creates "username" and "password" input fields. It
// also registers default middleware to create the authentication header.
type: 'basic',
// Define any input app's auth requires here. The user will be prompted to enter
// this info when they connect their account.
fields: [],
// The test method allows Zapier to verify that the credentials a user provides
// are valid. We'll execute this method whenever a user connects their account for
// the first time.
test,
// This template string can access all the data returned from the auth test. If
// you return the test object, you'll access the returned data with a label like
// `{{json.X}}`. If you return `response.data` from your test, then your label can
// be `{{X}}`. This can also be a function that returns a label. That function has
// the standard args `(z: ZObject, bundle: Bundle)` and data returned from the
// test can be accessed in `bundle.inputData.X`.
connectionLabel: '{{json.username}}',
} satisfies Authentication;

View file

@ -0,0 +1,21 @@
import zapier, { defineApp } from 'zapier-platform-core';
import packageJson from '../package.json' with { type: 'json' };
import authentication from './authentication.js';
import { befores, afters } from './middleware.js';
export default defineApp({
version: packageJson.version,
platformVersion: zapier.version,
authentication,
beforeRequest: [...befores],
afterResponse: [...afters],
// Add your triggers here for them to show up!
triggers: {},
// Add your creates here for them to show up!
creates: {},
});

View file

@ -0,0 +1,21 @@
import type { ZObject, Bundle, Authentication } from 'zapier-platform-core';
// This function runs after every outbound request. You can use it to check for
// errors or modify the response. You can have as many as you need. They'll need
// to each be registered in your index.js file.
const handleBadResponses = (response, z: ZObject, bundle: Bundle) => {
if (response.status === 401) {
throw new z.errors.Error(
// This message is surfaced to the user
'The username and/or password you supplied is incorrect',
'AuthenticationError',
response.status,
);
}
return response;
};
export const befores = [];
export const afters = [handleBadResponses];

View file

@ -0,0 +1,42 @@
import { describe, expect, it } from 'vitest';
import zapier from 'zapier-platform-core';
import App from '../index.js';
const appTester = zapier.createAppTester(App);
describe('basic auth', () => {
it('automatically has Authorize Header add', async () => {
const bundle = {
authData: {
username: 'user',
password: 'secret',
},
};
const response = await appTester(App.authentication.test, bundle);
expect(response.status).toBe(200);
expect(response.request.headers.Authorization).toBe(
'Basic dXNlcjpzZWNyZXQ=',
);
});
it('fails on bad auth', async () => {
const bundle = {
authData: {
username: 'user',
password: 'badpwd',
},
};
try {
await appTester(App.authentication.test, bundle);
} catch (err) {
expect(err.message).toContain(
'The username and/or password you supplied is incorrect',
);
return;
}
throw new Error('appTester should have thrown');
});
});

View file

@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "ESNext",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"resolveJsonModule": true,
"esModuleInterop": true,
"noUncheckedIndexedAccess": true,
"isolatedModules": true,
"noImplicitAny": false,
"skipLibCheck": true,
"outDir": "./dist",
"rootDir": "./src",
"strict": true
},
"include": ["./src/**/*.ts"],
"exclude": ["./**/*.test.ts"]
}

View file

@ -0,0 +1,63 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/
dist/
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# environment variables file
.env
.environment
# next.js build output
.next

View file

@ -0,0 +1,34 @@
# basic-auth
This Zapier integration project is generated by the `zapier-platform init` CLI command.
These are what you normally do next:
```bash
# Install dependencies
npm install # or you can use yarn
# Run tests
zapier-platform test
# Register the integration on Zapier if you haven't
zapier-platform register "App Title"
# Or you can link to an existing integration on Zapier
zapier-platform link
# Push it to Zapier
zapier-platform push
```
Then, to add more features, you can use the `zapier-platform scaffold` command, for example:
```bash
# Add a trigger
zapier-platform scaffold trigger contact
# Add an action
zapier-platform scaffold create contact
```
Find out more on the latest docs: https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md.

View file

@ -0,0 +1,32 @@
'use strict';
// You want to make a request to an endpoint that is either specifically designed
// to test auth, or one that every user will have access to. eg: `/me`.
// By returning the entire request object, you have access to the request and
// response data for testing purposes. Your connection label can access any data
// from the returned response using the `json.` prefix. eg: `{{json.username}}`.
const test = (z, bundle) =>
z.request({ url: 'https://auth-json-server.zapier-staging.com/me' });
module.exports = {
// "basic" auth automatically creates "username" and "password" input fields. It
// also registers default middleware to create the authentication header.
type: 'basic',
// Define any input app's auth requires here. The user will be prompted to enter
// this info when they connect their account.
fields: [],
// The test method allows Zapier to verify that the credentials a user provides
// are valid. We'll execute this method whenever a user connects their account for
// the first time.
test,
// This template string can access all the data returned from the auth test. If
// you return the test object, you'll access the returned data with a label like
// `{{json.X}}`. If you return `response.data` from your test, then your label can
// be `{{X}}`. This can also be a function that returns a label. That function has
// the standard args `(z, bundle)` and data returned from the test can be accessed
// in `bundle.inputData.X`.
connectionLabel: '{{json.username}}',
};

View file

@ -0,0 +1,26 @@
const authentication = require('./authentication');
const { befores = [], afters = [] } = require('./middleware');
module.exports = {
// This is just shorthand to reference the installed dependencies you have.
// Zapier will need to know these before we can upload.
version: require('./package.json').version,
platformVersion: require('zapier-platform-core').version,
authentication,
beforeRequest: [...befores],
afterResponse: [...afters],
// If you want your trigger to show up, you better include it here!
triggers: {},
// If you want your searches to show up, you better include it here!
searches: {},
// If you want your creates to show up, you better include it here!
creates: {},
resources: {},
};

View file

@ -0,0 +1,19 @@
'use strict';
// This function runs after every outbound request. You can use it to check for
// errors or modify the response. You can have as many as you need. They'll need
// to each be registered in your index.js file.
const handleBadResponses = (response, z, bundle) => {
if (response.status === 401) {
throw new z.errors.Error(
// This message is surfaced to the user
'The username and/or password you supplied is incorrect',
'AuthenticationError',
response.status,
);
}
return response;
};
module.exports = { befores: [], afters: [handleBadResponses] };

View file

@ -0,0 +1,16 @@
{
"name": "basic-auth",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "jest --testTimeout 10000"
},
"dependencies": {
"zapier-platform-core": "19.1.0"
},
"devDependencies": {
"jest": "^29.6.0"
},
"private": true
}

View file

@ -0,0 +1,43 @@
/* globals describe, it, expect */
const zapier = require('zapier-platform-core');
const App = require('../index');
const appTester = zapier.createAppTester(App);
describe('basic auth', () => {
it('automatically has Authorize Header add', async () => {
const bundle = {
authData: {
username: 'user',
password: 'secret',
},
};
const response = await appTester(App.authentication.test, bundle);
expect(response.status).toBe(200);
expect(response.request.headers.Authorization).toBe(
'Basic dXNlcjpzZWNyZXQ=',
);
});
it('fails on bad auth', async () => {
const bundle = {
authData: {
username: 'user',
password: 'badpwd',
},
};
try {
await appTester(App.authentication.test, bundle);
} catch (err) {
expect(err.message).toContain(
'The username and/or password you supplied is incorrect',
);
return;
}
throw new Error('appTester should have thrown');
});
});

View file

@ -0,0 +1,62 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# environment variables file
.env
.environment
# next.js build output
.next

View file

@ -0,0 +1,30 @@
# callback
This Zapier integration project is generated by the `zapier-platform init` CLI command.
These are what you normally do next:
```bash
# Install dependencies
npm install # or you can use yarn
# Run tests
zapier-platform test
# Register the integration on Zapier if you haven't
zapier-platform register "App Title"
# Or you can link to an existing integration on Zapier
zapier-platform link
# Push it to Zapier
zapier-platform push
```
Find out more on the latest docs: https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md.
# The "Callback" Template
This example has a create showcasing the `performResume` callback function.
Find out more in the docs: https://github.com/zapier/zapier-platform/blob/main/packages/cli#zgeneratecallbackurl.

View file

@ -0,0 +1,73 @@
// We recommend writing your creates separate like this and rolling them
// into the App definition at the end.
module.exports = {
key: 'prediction',
// You'll want to provide some helpful display labels and descriptions
// for users. Zapier will put them into the UX.
noun: 'Prediction',
display: {
label: 'Create Prediction',
description: 'Creates a new prediction.',
},
// `operation` is where the business logic goes.
operation: {
inputFields: [
{
key: 'question',
required: true,
type: 'string',
helpText: 'Provide a "Yes" or "No" question to ask the Magic 8-Ball.',
},
],
perform: (z, bundle) => {
const promise = z.request({
url: 'https://auth-json-server.zapier-staging.com/magic',
method: 'POST',
body: {
callbackUrl: z.generateCallbackUrl(),
},
headers: {
'content-type': 'application/json',
// This is NOT how you normally do authentication. This is just to demo how to write a create here.
// Refer to this doc to set up authentication:
// https://docs.zapier.com/platform/reference/cli-docs#authentication
'X-API-Key': 'secret',
},
});
return promise.then((response) => ({ ...response.data, extra: 'data' }));
},
performResume: (z, bundle) => {
// The original output from perform is available in bundle.outputData.
// The data POSTed to the callbackUrl is in bundle.cleanedRequest.
// The full request object corresponding to bundle.cleanedRequest can be found in bundle.rawRequest.
const { extra, ...originalOutput } = bundle.outputData;
// The following line will return an object containing the contents of the original API response to the
// request from the perform function merged with the contents of the new request from the API.
return { ...originalOutput, ...bundle.cleanedRequest };
},
// In cases where Zapier needs to show an example record to the user, but we are unable to get a live example
// from the API, Zapier will fallback to this hard-coded sample. It should reflect the data structure of
// returned records, and have obviously dummy values that we can show to any user.
sample: {
callbackUrl: 'http://zapier.com/hooks/catch/-1234/abcdef/',
status: 'success',
result: 'Ask again later.',
},
// If the resource can have fields that are custom on a per-user basis, define a function to fetch the custom
// field definitions. The result will be used to augment the sample.
// outputFields: () => { return []; }
// Alternatively, a static field definition should be provided, to specify labels for the fields
outputFields: [
{ key: 'callbackUrl', label: 'Callback URL' },
{ key: 'status', label: 'Status' },
{ key: 'result', label: 'Predicted Result' },
],
},
};

View file

@ -0,0 +1,17 @@
const prediction = require('./creates/prediction');
// Now we can roll up all our behaviors in an App.
const App = {
// This is just shorthand to reference the installed dependencies you have. Zapier will
// need to know these before we can upload
version: require('./package.json').version,
platformVersion: require('zapier-platform-core').version,
// If you want your creates to show up, you better include it here!
creates: {
[prediction.key]: prediction,
},
};
// Finally, export the app.
module.exports = App;

View file

@ -0,0 +1,16 @@
{
"name": "callback",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "jest --testTimeout 10000"
},
"dependencies": {
"zapier-platform-core": "19.1.0"
},
"devDependencies": {
"jest": "^25.5.3"
},
"private": true
}

View file

@ -0,0 +1,46 @@
/* globals describe, expect, test */
const zapier = require('zapier-platform-core');
const App = require('../index');
const appTester = zapier.createAppTester(App);
zapier.tools.env.inject();
describe('creates', () => {
test('perform function returns intermediate data', async () => {
const bundle = { inputData: { question: 'Will this work?' } };
const result = await appTester(
App.creates.prediction.operation.perform,
bundle,
);
expect(result).toMatchObject({
status: '...thinking...',
callbackUrl: 'https://auth-json-server.zapier-staging.com/echo',
extra: 'data',
});
});
test('performResume function returns "final" data', async () => {
const bundle = {
outputData: {
callbackUrl: 'https://auth-json-server.zapier-staging.com/echo',
status: '...thinking...',
extra: 'data',
},
cleanedRequest: {
status: 'success',
result: 'Ask again later.',
},
};
const result = await appTester(
App.creates.prediction.operation.performResume,
bundle,
);
expect(result).toMatchObject({
status: 'success',
result: 'Ask again later.',
callbackUrl: 'https://auth-json-server.zapier-staging.com/echo',
});
});
});

View file

@ -0,0 +1,6 @@
build
docs
node_modules
*.log
.environment
.env

View file

@ -0,0 +1,7 @@
language: node_js
node_js:
- 8.10.0
before_script: 'npm install -g zapier-platform-cli'
script: 'zapier test'
notifications:
email: false

View file

@ -0,0 +1,7 @@
# "Create" Example App For Zapier Platform
[![Build Status](https://travis-ci.org/zapier/zapier-platform-example-app-create.svg?branch=main)](https://travis-ci.org/zapier/zapier-platform-example-app-create)
A barebones app that has a create defined.
> We recommend using the zapier-platform-cli and `zapier-platform init .`  to create an app - youll be presented with a list of currently available templates to start with.

View file

@ -0,0 +1,80 @@
// We recommend writing your creates separate like this and rolling them
// into the App definition at the end.
module.exports = {
key: 'recipe',
// You'll want to provide some helpful display labels and descriptions
// for users. Zapier will put them into the UX.
noun: 'Recipe',
display: {
label: 'Create Recipe',
description: 'Creates a new recipe.',
},
// `operation` is where the business logic goes.
operation: {
inputFields: [
{ key: 'name', required: true, type: 'string' },
{
key: 'directions',
required: true,
type: 'text',
helpText: 'Explain how should one make the recipe, step by step.',
},
{ key: 'authorId', required: true, type: 'integer', label: 'Author ID' },
{
key: 'style',
required: false,
type: 'string',
helpText: 'Explain what style of cuisine this is.',
},
],
perform: (z, bundle) => {
const promise = z.request({
url: 'https://auth-json-server.zapier-staging.com/recipes',
method: 'POST',
body: {
name: bundle.inputData.name,
directions: bundle.inputData.directions,
authorId: bundle.inputData.authorId,
style: bundle.inputData.style,
},
headers: {
'content-type': 'application/json',
// This is NOT how you normally do authentication. This is just to demo how to write a create here.
// Refer to this doc to set up authentication:
// https://docs.zapier.com/platform/reference/cli-docs#authentication
'X-API-Key': 'secret',
},
});
return promise.then((response) => response.data);
},
// In cases where Zapier needs to show an example record to the user, but we are unable to get a live example
// from the API, Zapier will fallback to this hard-coded sample. It should reflect the data structure of
// returned records, and have obviously dummy values that we can show to any user.
sample: {
id: 1,
createdAt: 1472069465,
name: 'Best Spagetti Ever',
authorId: 1,
directions: '1. Boil Noodles\n2.Serve with sauce',
style: 'italian',
},
// If the resource can have fields that are custom on a per-user basis, define a function to fetch the custom
// field definitions. The result will be used to augment the sample.
// outputFields: () => { return []; }
// Alternatively, a static field definition should be provided, to specify labels for the fields
outputFields: [
{ key: 'id', label: 'ID' },
{ key: 'createdAt', label: 'Created At' },
{ key: 'name', label: 'Name' },
{ key: 'directions', label: 'Directions' },
{ key: 'authorId', label: 'Author ID' },
{ key: 'style', label: 'Style' },
],
},
};

View file

@ -0,0 +1,29 @@
const recipe = require('./creates/recipe');
// Now we can roll up all our behaviors in an App.
const App = {
// This is just shorthand to reference the installed dependencies you have. Zapier will
// need to know these before we can upload
version: require('./package.json').version,
platformVersion: require('zapier-platform-core').version,
beforeRequest: [],
afterResponse: [],
resources: {},
// If you want your trigger to show up, you better include it here!
triggers: {},
// If you want your searches to show up, you better include it here!
searches: {},
// If you want your creates to show up, you better include it here!
creates: {
[recipe.key]: recipe,
},
};
// Finally, export the app.
module.exports = App;

View file

@ -0,0 +1,25 @@
{
"name": "zapier-platform-example-app-create",
"version": "1.0.0",
"description": "An example app for the Zapier platform.",
"repository": "zapier/zapier-platform-example-app-create",
"homepage": "https://zapier.com/",
"author": "Bryan Helmig <bryan@zapier.com>",
"license": "BSD-3-Clause",
"main": "index.js",
"scripts": {
"test": "mocha --recursive"
},
"engines": {
"node": ">=8.10.0",
"npm": ">=5.6.0"
},
"dependencies": {
"zapier-platform-core": "19.1.0"
},
"devDependencies": {
"mocha": "^5.2.0",
"should": "^13.2.0"
},
"private": true
}

View file

@ -0,0 +1,29 @@
/* globals describe, it */
require('should');
const zapier = require('zapier-platform-core');
const App = require('../index');
const appTester = zapier.createAppTester(App);
describe('creates', () => {
describe('create recipe create', () => {
it('should create a new recipe', (done) => {
const bundle = {
inputData: {
name: 'Smith Family Recipe',
directions: '1. Order out :)',
authorId: 1,
},
};
appTester(App.creates.recipe.operation.perform, bundle)
.then((result) => {
result.should.have.property('name');
done();
})
.catch(done);
});
});
});

View file

@ -0,0 +1,63 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/
dist/
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# environment variables file
.env
.environment
# next.js build output
.next

View file

@ -0,0 +1,34 @@
# custom-auth-typescript
This Zapier integration project is generated by the `zapier-platform init` CLI command.
These are what you normally do next:
```bash
# Install dependencies
npm install # or you can use yarn
# Run tests
zapier-platform test
# Register the integration on Zapier if you haven't
zapier-platform register "App Title"
# Or you can link to an existing integration on Zapier
zapier-platform link
# Push it to Zapier
zapier-platform push
```
Then, to add more features, you can use the `zapier-platform scaffold` command, for example:
```bash
# Add a trigger
zapier-platform scaffold trigger contact
# Add an action
zapier-platform scaffold create contact
```
Find out more on the latest docs: https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md.

View file

@ -0,0 +1,22 @@
{
"name": "custom-auth-typescript",
"version": "1.0.0",
"description": "",
"scripts": {
"test": "npm run build && vitest --run",
"clean": "rimraf ./dist ./build",
"build": "npm run clean && tsc",
"_zapier-build": "npm run build"
},
"dependencies": {
"zapier-platform-core": "19.1.0"
},
"devDependencies": {
"rimraf": "^5.0.10",
"typescript": "5.6.2",
"vitest": "^2.1.2"
},
"private": true,
"exports": "./dist/index.js",
"type": "module"
}

View file

@ -0,0 +1,32 @@
import type { ZObject, Bundle, Authentication } from 'zapier-platform-core';
// You want to make a request to an endpoint that is either specifically designed
// to test auth, or one that every user will have access to. eg: `/me`.
// By returning the entire request object, you have access to the request and
// response data for testing purposes. Your connection label can access any data
// from the returned response using the `json.` prefix. eg: `{{json.username}}`.
const test = (z: ZObject, bundle: Bundle) =>
z.request({ url: 'https://auth-json-server.zapier-staging.com/me' });
export default {
// "custom" is the catch-all auth type. The user supplies some info and Zapier can
// make authenticated requests with it
type: 'custom',
// Define any input app's auth requires here. The user will be prompted to enter
// this info when they connect their account.
fields: [{ key: 'apiKey', label: 'API Key', required: true }],
// The test method allows Zapier to verify that the credentials a user provides
// are valid. We'll execute this method whenever a user connects their account for
// the first time.
test,
// This template string can access all the data returned from the auth test. If
// you return the test object, you'll access the returned data with a label like
// `{{json.X}}`. If you return `response.data` from your test, then your label can
// be `{{X}}`. This can also be a function that returns a label. That function has
// the standard args `(z: ZObject, bundle: Bundle)` and data returned from the
// test can be accessed in `bundle.inputData.X`.
connectionLabel: '{{json.username}}',
} satisfies Authentication;

View file

@ -0,0 +1,21 @@
import zapier, { defineApp } from 'zapier-platform-core';
import packageJson from '../package.json' with { type: 'json' };
import authentication from './authentication.js';
import { befores, afters } from './middleware.js';
export default defineApp({
version: packageJson.version,
platformVersion: zapier.version,
authentication,
beforeRequest: [...befores],
afterResponse: [...afters],
// Add your triggers here for them to show up!
triggers: {},
// Add your creates here for them to show up!
creates: {},
});

View file

@ -0,0 +1,36 @@
import type { ZObject, Bundle, Authentication } from 'zapier-platform-core';
// This function runs after every outbound request. You can use it to check for
// errors or modify the response. You can have as many as you need. They'll need
// to each be registered in your index.js file.
const handleBadResponses = (response, z: ZObject, bundle: Bundle) => {
if (response.status === 401) {
throw new z.errors.Error(
// This message is surfaced to the user
'The API Key you supplied is incorrect',
'AuthenticationError',
response.status,
);
}
return response;
};
// This function runs before every outbound request. You can have as many as you
// need. They'll need to each be registered in your index.js file.
const includeApiKey = (request, z: ZObject, bundle: Bundle) => {
if (bundle.authData.apiKey) {
// Use these lines to include the API key in the querystring
request.params = request.params || {};
request.params.api_key = bundle.authData.apiKey;
// If you want to include the API key in the header instead, uncomment this:
// request.headers.Authorization = bundle.authData.apiKey;
}
return request;
};
export const befores = [includeApiKey];
export const afters = [handleBadResponses];

View file

@ -0,0 +1,34 @@
import { describe, expect, it } from 'vitest';
import zapier from 'zapier-platform-core';
import App from '../index.js';
const appTester = zapier.createAppTester(App);
describe('custom auth', () => {
it('passes authentication and returns json', async () => {
const bundle = {
authData: {
apiKey: 'secret',
},
};
const response = await appTester(App.authentication.test, bundle);
expect(response.data).toHaveProperty('username');
});
it('fails on bad auth', async () => {
const bundle = {
authData: {
apiKey: 'bad',
},
};
try {
await appTester(App.authentication.test, bundle);
} catch (error) {
expect(error.message).toContain('The API Key you supplied is incorrect');
return;
}
throw new Error('appTester should have thrown');
});
});

View file

@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "ESNext",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"resolveJsonModule": true,
"esModuleInterop": true,
"noUncheckedIndexedAccess": true,
"isolatedModules": true,
"noImplicitAny": false,
"skipLibCheck": true,
"outDir": "./dist",
"rootDir": "./src",
"strict": true
},
"include": ["./src/**/*.ts"],
"exclude": ["./**/*.test.ts"]
}

View file

@ -0,0 +1,63 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/
dist/
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# environment variables file
.env
.environment
# next.js build output
.next

View file

@ -0,0 +1,34 @@
# custom-auth
This Zapier integration project is generated by the `zapier-platform init` CLI command.
These are what you normally do next:
```bash
# Install dependencies
npm install # or you can use yarn
# Run tests
zapier-platform test
# Register the integration on Zapier if you haven't
zapier-platform register "App Title"
# Or you can link to an existing integration on Zapier
zapier-platform link
# Push it to Zapier
zapier-platform push
```
Then, to add more features, you can use the `zapier-platform scaffold` command, for example:
```bash
# Add a trigger
zapier-platform scaffold trigger contact
# Add an action
zapier-platform scaffold create contact
```
Find out more on the latest docs: https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md.

View file

@ -0,0 +1,32 @@
'use strict';
// You want to make a request to an endpoint that is either specifically designed
// to test auth, or one that every user will have access to. eg: `/me`.
// By returning the entire request object, you have access to the request and
// response data for testing purposes. Your connection label can access any data
// from the returned response using the `json.` prefix. eg: `{{json.username}}`.
const test = (z, bundle) =>
z.request({ url: 'https://auth-json-server.zapier-staging.com/me' });
module.exports = {
// "custom" is the catch-all auth type. The user supplies some info and Zapier can
// make authenticated requests with it
type: 'custom',
// Define any input app's auth requires here. The user will be prompted to enter
// this info when they connect their account.
fields: [{ key: 'apiKey', label: 'API Key', required: true }],
// The test method allows Zapier to verify that the credentials a user provides
// are valid. We'll execute this method whenever a user connects their account for
// the first time.
test,
// This template string can access all the data returned from the auth test. If
// you return the test object, you'll access the returned data with a label like
// `{{json.X}}`. If you return `response.data` from your test, then your label can
// be `{{X}}`. This can also be a function that returns a label. That function has
// the standard args `(z, bundle)` and data returned from the test can be accessed
// in `bundle.inputData.X`.
connectionLabel: '{{json.username}}',
};

View file

@ -0,0 +1,26 @@
const authentication = require('./authentication');
const { befores = [], afters = [] } = require('./middleware');
module.exports = {
// This is just shorthand to reference the installed dependencies you have.
// Zapier will need to know these before we can upload.
version: require('./package.json').version,
platformVersion: require('zapier-platform-core').version,
authentication,
beforeRequest: [...befores],
afterResponse: [...afters],
// If you want your trigger to show up, you better include it here!
triggers: {},
// If you want your searches to show up, you better include it here!
searches: {},
// If you want your creates to show up, you better include it here!
creates: {},
resources: {},
};

View file

@ -0,0 +1,34 @@
'use strict';
// This function runs after every outbound request. You can use it to check for
// errors or modify the response. You can have as many as you need. They'll need
// to each be registered in your index.js file.
const handleBadResponses = (response, z, bundle) => {
if (response.status === 401) {
throw new z.errors.Error(
// This message is surfaced to the user
'The API Key you supplied is incorrect',
'AuthenticationError',
response.status,
);
}
return response;
};
// This function runs before every outbound request. You can have as many as you
// need. They'll need to each be registered in your index.js file.
const includeApiKey = (request, z, bundle) => {
if (bundle.authData.apiKey) {
// Use these lines to include the API key in the querystring
request.params = request.params || {};
request.params.api_key = bundle.authData.apiKey;
// If you want to include the API key in the header instead, uncomment this:
// request.headers.Authorization = bundle.authData.apiKey;
}
return request;
};
module.exports = { befores: [includeApiKey], afters: [handleBadResponses] };

View file

@ -0,0 +1,16 @@
{
"name": "custom-auth",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "jest --testTimeout 10000"
},
"dependencies": {
"zapier-platform-core": "19.1.0"
},
"devDependencies": {
"jest": "^29.6.0"
},
"private": true
}

View file

@ -0,0 +1,35 @@
/* globals describe, it, expect */
const zapier = require('zapier-platform-core');
const App = require('../index');
const appTester = zapier.createAppTester(App);
describe('custom auth', () => {
it('passes authentication and returns json', async () => {
const bundle = {
authData: {
apiKey: 'secret',
},
};
const response = await appTester(App.authentication.test, bundle);
expect(response.data).toHaveProperty('username');
});
it('fails on bad auth', async () => {
const bundle = {
authData: {
apiKey: 'bad',
},
};
try {
await appTester(App.authentication.test, bundle);
} catch (error) {
expect(error.message).toContain('The API Key you supplied is incorrect');
return;
}
throw new Error('appTester should have thrown');
});
});

View file

@ -0,0 +1,63 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/
dist/
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# environment variables file
.env
.environment
# next.js build output
.next

Some files were not shown because too many files have changed in this diff Show more