diff --git a/docs/rfcs/view_grant_support_design.md b/docs/rfcs/view_grant_support_design.md new file mode 100644 index 0000000000000..1f29b51cbd8eb --- /dev/null +++ b/docs/rfcs/view_grant_support_design.md @@ -0,0 +1,85 @@ +# MatrixOne View Privilege Support (GRANT/REVOKE ON VIEW): Final Design and Implementation + +## Final Design + +### 1. Goals and Scope +Provide `GRANT/REVOKE ... ON VIEW` with correct authorization semantics so users can access view results safely while respecting `SQL SECURITY` behavior. + +### 2. Privilege Object and Levels +- Introduce `objectTypeView` alongside `objectTypeTable`. +- Privilege levels match table privileges: `*.*`, `db.*`, `db.view`, `view` (current database). +- Privilege types match table privileges (e.g., `SELECT/INSERT/UPDATE/DELETE/OWNERSHIP/ALL`), and `SHOW GRANTS` displays `ON VIEW`. + +### 3. Metadata and Storage +- View object id is `mo_catalog.mo_tables.rel_logical_id` with `relkind='v'`. +- Store privileges in `mo_catalog.mo_role_privs` with `obj_type="view"` and `obj_id=rel_logical_id`. +- View privileges are read and checked through the same pipeline as table privileges, but with `obj_type` distinguishing view vs table. + +### 4. Plan-Time View Lineage +Compiler records view lineage into plan nodes: +- `origin_views`: the view chain in `db#view` format, ordered from the outermost view to the innermost view. +- `direct_view`: the outermost view referenced by the user (optional, mostly for diagnostics). + +### 5. Runtime Authorization Flow +For each plan node: +1. If `origin_views` is present, verify view privileges in chain order (outermost to innermost). +2. For each view in the chain, apply its `SQL SECURITY` to decide the effective role for the next hop: + - `DEFINER`: switch to the view definer role for the next hop. + - `INVOKER`: keep the current role for the next hop. +3. After the chain, check base-table privileges using the effective role. +4. If `origin_views` is empty, fall back to standard table privilege checks. + +### 6. SQL SECURITY Semantics +- Session variable `view_security_type` controls `DEFINER` or `INVOKER` (default `DEFINER`). +- The `security_type` is persisted in viewdef JSON. +- For legacy views without `security_type`, treat as `DEFINER`. + +### 7. Special Cases and Compatibility +- System view databases (`information_schema`, `mysql`) skip view privilege checks and remain read-only. +- Fully qualified `db.view` queries can run without `USE ` if view privilege passes. + +### 8. Testable Behaviors +- `GRANT/REVOKE ... ON VIEW` syntax and `SHOW GRANTS` output. +- Multi-layer view chains work with grant/revoke. +- `DEFINER/INVOKER` semantics enforced. +- Role inheritance and partial revokes work for non-system tenants. + +## Implementation + +### 1. Syntax and Object Model +- Extend `ObjectType.String()` to include `view`. +- Add `objectTypeView` and its privilege level mappings. + +### 2. Metadata and Plan Structures +- Extend plan proto and generated code to carry view lineage fields. +- Record `origin_views` and `direct_view` during view binding and plan construction. + +### 3. Authorization Logic +- Extract view privilege tips from plan nodes and check them before table privileges. +- Enforce `SQL SECURITY` per view in the lineage to determine the effective role for base-table checks. +- For view chains, cache-only privilege evaluation is skipped to avoid missing view metadata checks. +- Snapshot reads resolve view metadata using the snapshot tenant and `MO_TS` to ensure view chains are validated against the correct historical catalog. +- View privilege checks use the view-level snapshot (when the view is referenced with a snapshot) rather than the underlying table scan snapshot to avoid false "view not found" errors. +- Fix privilege extraction for `INSERT/UPDATE/DELETE` paths to avoid missed checks. +- Preserve existing system view and cluster table guardrails. + +### 4. Tests and Results +Updated or added BVT cases: +- `test/distributed/cases/zz_accesscontrol/grant_view.sql` +- `test/distributed/cases/zz_accesscontrol/grant_view_non_sys.sql` +- `test/distributed/cases/zz_accesscontrol/grant_view_complex.sql` +- `test/distributed/cases/zz_accesscontrol/grant_view_nested_security.sql` +- Updated related `.result` files and error messages (e.g., `grant_privs_role.result`, `revoke_privs_role.result`). + +## MySQL Compatibility + +### Compatible +- Syntax: `GRANT/REVOKE ... ON VIEW`, `SHOW GRANTS` shows `ON VIEW`. +- Semantics: `SQL SECURITY DEFINER/INVOKER` aligns with MySQL (view privilege plus definer/invoker base-table privilege). +- Nested views: privilege checks follow the view chain with per-view `DEFINER/INVOKER` semantics. +- Isolation: granting view privilege does not grant base-table privilege. + +### Differences +- DML on views: MatrixOne rejects `INSERT/UPDATE/DELETE` on views, while MySQL allows DML on updatable views. +- SQL SECURITY declaration: MatrixOne uses session variable `view_security_type` persisted in viewdef, not `CREATE VIEW ... SQL SECURITY ...`. +- No separate `SHOW VIEW` privilege type; it follows table/database privilege categories. diff --git a/pkg/frontend/authenticate.go b/pkg/frontend/authenticate.go index 8a06aefd6fdbd..a0d7f91416a79 100644 --- a/pkg/frontend/authenticate.go +++ b/pkg/frontend/authenticate.go @@ -48,6 +48,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/pb/query" "github.com/matrixorigin/matrixone/pkg/pb/task" + "github.com/matrixorigin/matrixone/pkg/pb/timestamp" "github.com/matrixorigin/matrixone/pkg/queryservice" "github.com/matrixorigin/matrixone/pkg/sql/parsers" "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" @@ -573,6 +574,7 @@ type objectType int const ( objectTypeDatabase objectType = iota objectTypeTable + objectTypeView objectTypeFunction objectTypeAccount objectTypeNone @@ -586,6 +588,8 @@ func (ot objectType) String() string { return "database" case objectTypeTable: return "table" + case objectTypeView: + return "view" case objectTypeFunction: return "function" case objectTypeAccount: @@ -596,6 +600,11 @@ func (ot objectType) String() string { panic("unsupported object type") } +const ( + viewSecurityDefiner = "DEFINER" + viewSecurityInvoker = "INVOKER" +) + type privilegeLevelType int const ( @@ -1322,6 +1331,11 @@ const ( checkDatabaseTableFormat = `select rel_logical_id from mo_catalog.mo_tables where relname = "%s" and reldatabase = "%s" and account_id = %d;` + checkDatabaseViewFormat = `select rel_logical_id from mo_catalog.mo_tables where relname = "%s" and reldatabase = "%s" and relkind = "v" and account_id = %d;` + + getViewMetaFormat = `select viewdef, owner from mo_catalog.mo_tables where relname = "%s" and reldatabase = "%s" and relkind = "v" and account_id = %d;` + getViewMetaWithSnapshotFormat = `select viewdef, owner from mo_catalog.mo_tables {MO_TS = %d} where relname = "%s" and reldatabase = "%s" and relkind = "v" and account_id = %d;` + // TODO:fix privilege_level string and obj_type string // For object_type : table, privilege_level : *.* checkWithGrantOptionForTableStarStar = `select rp.privilege_id,rp.with_grant_option @@ -1568,6 +1582,9 @@ var ( objectTypeTable: {privilegeLevelStarStar, privilegeLevelDatabaseStar, privilegeLevelStar, privilegeLevelDatabaseTable, privilegeLevelTable}, + objectTypeView: {privilegeLevelStarStar, + privilegeLevelDatabaseStar, privilegeLevelStar, + privilegeLevelDatabaseTable, privilegeLevelTable}, } // the databases that can not operated by the real user @@ -1878,24 +1895,24 @@ func getSqlForDeleteRolePrivs(roleId int64, objType string, objId, privilegeId i return fmt.Sprintf(deleteRolePrivsFormat, roleId, objType, objId, privilegeId, privilegeLevel) } -func getSqlForCheckWithGrantOptionForTableStarStar(roleId int64, privId PrivilegeType) string { - return fmt.Sprintf(checkWithGrantOptionForTableStarStar, objectTypeTable, roleId, privId, privilegeLevelStarStar) +func getSqlForCheckWithGrantOptionForTableStarStarWithObjType(objType objectType, roleId int64, privId PrivilegeType) string { + return fmt.Sprintf(checkWithGrantOptionForTableStarStar, objType, roleId, privId, privilegeLevelStarStar) } -func getSqlForCheckWithGrantOptionForTableDatabaseStar(ctx context.Context, roleId int64, privId PrivilegeType, dbName string) (string, error) { +func getSqlForCheckWithGrantOptionForTableDatabaseStarWithObjType(ctx context.Context, objType objectType, roleId int64, privId PrivilegeType, dbName string) (string, error) { err := inputNameIsInvalid(ctx, dbName) if err != nil { return "", err } - return fmt.Sprintf(checkWithGrantOptionForTableDatabaseStar, objectTypeTable, roleId, privId, privilegeLevelDatabaseStar, dbName), nil + return fmt.Sprintf(checkWithGrantOptionForTableDatabaseStar, objType, roleId, privId, privilegeLevelDatabaseStar, dbName), nil } -func getSqlForCheckWithGrantOptionForTableDatabaseTable(ctx context.Context, roleId int64, privId PrivilegeType, dbName string, tableName string) (string, error) { +func getSqlForCheckWithGrantOptionForTableDatabaseTableWithObjType(ctx context.Context, objType objectType, roleId int64, privId PrivilegeType, dbName string, tableName string) (string, error) { err := inputNameIsInvalid(ctx, dbName, tableName) if err != nil { return "", err } - return fmt.Sprintf(checkWithGrantOptionForTableDatabaseTable, objectTypeTable, roleId, privId, privilegeLevelDatabaseTable, dbName, tableName), nil + return fmt.Sprintf(checkWithGrantOptionForTableDatabaseTable, objType, roleId, privId, privilegeLevelDatabaseTable, dbName, tableName), nil } func getSqlForCheckWithGrantOptionForDatabaseStar(roleId int64, privId PrivilegeType) string { @@ -1918,24 +1935,28 @@ func getSqlForCheckWithGrantOptionForAccountStar(roleId int64, privId PrivilegeT return fmt.Sprintf(checkWithGrantOptionForAccountStar, objectTypeAccount, roleId, privId, privilegeLevelStarStar) } -func getSqlForCheckRoleHasTableLevelPrivilege(ctx context.Context, roleId int64, privId PrivilegeType, dbName string, tableName string) (string, error) { +func getSqlForCheckRoleHasTableLevelPrivilegeWithObjType(ctx context.Context, objType objectType, roleId int64, privId PrivilegeType, dbName string, tableName string) (string, error) { err := inputNameIsInvalid(ctx, dbName, tableName) if err != nil { return "", err } - return fmt.Sprintf(checkRoleHasTableLevelPrivilegeFormat, objectTypeTable, roleId, privId, privilegeLevelDatabaseTable, privilegeLevelTable, dbName, tableName), nil + return fmt.Sprintf(checkRoleHasTableLevelPrivilegeFormat, objType, roleId, privId, privilegeLevelDatabaseTable, privilegeLevelTable, dbName, tableName), nil +} + +func getSqlForCheckRoleHasTableLevelPrivilege(ctx context.Context, roleId int64, privId PrivilegeType, dbName string, tableName string) (string, error) { + return getSqlForCheckRoleHasTableLevelPrivilegeWithObjType(ctx, objectTypeTable, roleId, privId, dbName, tableName) } -func getSqlForCheckRoleHasTableLevelForDatabaseStar(ctx context.Context, roleId int64, privId PrivilegeType, dbName string) (string, error) { +func getSqlForCheckRoleHasTableLevelForDatabaseStarWithObjType(ctx context.Context, objType objectType, roleId int64, privId PrivilegeType, dbName string) (string, error) { err := inputNameIsInvalid(ctx, dbName) if err != nil { return "", err } - return fmt.Sprintf(checkRoleHasTableLevelForDatabaseStarFormat, objectTypeTable, roleId, privId, privilegeLevelDatabaseStar, privilegeLevelStar, dbName), nil + return fmt.Sprintf(checkRoleHasTableLevelForDatabaseStarFormat, objType, roleId, privId, privilegeLevelDatabaseStar, privilegeLevelStar, dbName), nil } -func getSqlForCheckRoleHasTableLevelForStarStar(roleId int64, privId PrivilegeType) string { - return fmt.Sprintf(checkRoleHasTableLevelForStarStarFormat, objectTypeTable, roleId, privId, privilegeLevelStarStar) +func getSqlForCheckRoleHasTableLevelForStarStarWithObjType(objType objectType, roleId int64, privId PrivilegeType) string { + return fmt.Sprintf(checkRoleHasTableLevelForStarStarFormat, objType, roleId, privId, privilegeLevelStarStar) } func getSqlForCheckRoleHasDatabaseLevelForStarStar(roleId int64, privId PrivilegeType, level privilegeLevelType) string { @@ -2004,6 +2025,79 @@ func getSqlForCheckDatabaseTable( return fmt.Sprintf(checkDatabaseTableFormat, tableName, dbName, account), nil } +func getSqlForCheckDatabaseView( + ctx context.Context, + dbName string, + viewName string, +) (string, error) { + + err := inputNameIsInvalid(ctx, dbName, viewName) + if err != nil { + return "", err + } + + var ( + account uint32 + ) + + if v := ctx.Value(defines.TenantIDKey{}); v != nil { + account = v.(uint32) + } else { + return "", moerr.NewInternalErrorNoCtx("no account id found in the ctx") + } + + // we need the account id here to filter out the same dbName and viewName that exist in the + // different accounts. + return fmt.Sprintf(checkDatabaseViewFormat, viewName, dbName, account), nil +} + +func getSqlForCheckViewMeta( + ctx context.Context, + dbName string, + viewName string, +) (string, error) { + err := inputNameIsInvalid(ctx, dbName, viewName) + if err != nil { + return "", err + } + + var ( + account uint32 + ) + + if v := ctx.Value(defines.TenantIDKey{}); v != nil { + account = v.(uint32) + } else { + return "", moerr.NewInternalErrorNoCtx("no account id found in the ctx") + } + + return fmt.Sprintf(getViewMetaFormat, viewName, dbName, account), nil +} + +func getSqlForCheckViewMetaWithSnapshot( + ctx context.Context, + dbName string, + viewName string, + snapshotTs int64, +) (string, error) { + err := inputNameIsInvalid(ctx, dbName, viewName) + if err != nil { + return "", err + } + + var ( + account uint32 + ) + + if v := ctx.Value(defines.TenantIDKey{}); v != nil { + account = v.(uint32) + } else { + return "", moerr.NewInternalErrorNoCtx("no account id found in the ctx") + } + + return fmt.Sprintf(getViewMetaWithSnapshotFormat, snapshotTs, viewName, dbName, account), nil +} + func getSqlForDeleteRole(roleId int64) []string { return []string{ fmt.Sprintf(deleteRoleFromMoRoleFormat, roleId), @@ -2090,6 +2184,16 @@ func isClusterTable(dbName, name string) bool { return false } +func isSystemViewDatabase(dbName string) bool { + if strings.EqualFold(dbName, sysview.InformationDBConst) { + return true + } + if strings.EqualFold(dbName, sysview.MysqlDBConst) { + return true + } + return false +} + // getSqlForGrantOwnershipOnDatabase get the sql for grant ownership on database func getSqlForGrantOwnershipOnDatabase(dbName, roleName string) string { return fmt.Sprintf(grantOwnershipOnDatabaseFormat, dbName, roleName) @@ -2207,6 +2311,10 @@ const ( // privilegeItem is the item for in the compound entry type privilegeItem struct { privilegeTyp PrivilegeType + objType objectType + originViews []string + directView string + scanSnapshot *plan.Snapshot role *tree.Role users []*tree.User dbName string @@ -2377,6 +2485,13 @@ type privilegeCache struct { storeForTable2 btree.Map[string, *btree.Set[PrivilegeType]] // For objectType table database.table , table storeForTable3 btree.Map[string, *btree.Map[string, *btree.Set[PrivilegeType]]] + //For objectType view + //For objectType view *, *.* + storeForView [int(privilegeLevelEnd)]btree.Set[PrivilegeType] + //For objectType view database.* + storeForView2 btree.Map[string, *btree.Set[PrivilegeType]] + //For objectType view database.view , view + storeForView3 btree.Map[string, *btree.Map[string, *btree.Set[PrivilegeType]]] // For objectType database *, *.* storeForDatabase [int(privilegeLevelEnd)]btree.Set[PrivilegeType] @@ -2427,6 +2542,32 @@ func (pc *privilegeCache) getPrivilegeSet(objTyp objectType, plt privilegeLevelT default: return nil } + case objectTypeView: + switch plt { + case privilegeLevelStarStar, privilegeLevelStar: + return &pc.storeForView[plt] + case privilegeLevelDatabaseStar: + dbStore, ok1 := pc.storeForView2.Get(dbName) + if !ok1 { + dbStore = &btree.Set[PrivilegeType]{} + pc.storeForView2.Set(dbName, dbStore) + } + return dbStore + case privilegeLevelDatabaseTable, privilegeLevelTable: + viewStore, ok1 := pc.storeForView3.Get(dbName) + if !ok1 { + viewStore = &btree.Map[string, *btree.Set[PrivilegeType]]{} + pc.storeForView3.Set(dbName, viewStore) + } + privSet, ok2 := viewStore.Get(tableName) + if !ok2 { + privSet = &btree.Set[PrivilegeType]{} + viewStore.Set(tableName, privSet) + } + return privSet + default: + return nil + } case objectTypeDatabase: switch plt { case privilegeLevelStar, privilegeLevelStarStar: @@ -2479,11 +2620,14 @@ func (pc *privilegeCache) invalidate() { // hit := pc.hit.Swap(0) for i := privilegeLevelStar; i < privilegeLevelEnd; i++ { pc.storeForTable[i].Clear() + pc.storeForView[i].Clear() pc.storeForDatabase[i].Clear() pc.storeForAccount[i].Clear() } pc.storeForTable2.Clear() pc.storeForTable3.Clear() + pc.storeForView2.Clear() + pc.storeForView3.Clear() pc.storeForDatabase2.Clear() // ratio := float64(0) // if total == 0 { @@ -4793,7 +4937,6 @@ func doDropProcedure(ctx context.Context, ses *Session, dp *tree.DropProcedure) func doRevokePrivilege(ctx context.Context, ses FeSession, rp *tree.RevokePrivilege, bh BackgroundExec) (err error) { var vr *verifiedRole var objType objectType - var privLevel privilegeLevelType var objId int64 var privType PrivilegeType var sql string @@ -4851,7 +4994,7 @@ func doRevokePrivilege(ctx context.Context, ses FeSession, rp *tree.RevokePrivil } // step 2: decide the object type , the object id and the privilege_level - privLevel, objId, err = checkPrivilegeObjectTypeAndPrivilegeLevel(ctx, ses, bh, rp.ObjType, *rp.Level) + privLevel, objId, err := checkPrivilegeObjectTypeAndPrivilegeLevel(ctx, ses, bh, rp.ObjType, *rp.Level) if err != nil { return err } @@ -4916,12 +5059,222 @@ func getDatabaseOrTableId(ctx context.Context, bh BackgroundExec, isDb bool, dbN } } +func getViewId(ctx context.Context, bh BackgroundExec, dbName, viewName string) (int64, error) { + sql, err := getSqlForCheckDatabaseView(ctx, dbName, viewName) + if err != nil { + return 0, err + } + bh.ClearExecResultSet() + err = bh.Exec(ctx, sql) + if err != nil { + return 0, err + } + + erArray, err := getResultSet(ctx, bh) + if err != nil { + return 0, err + } + + if execResultArrayHasData(erArray) { + id, err := erArray[0].GetInt64(ctx, 0, 0) + if err != nil { + return 0, err + } + return id, nil + } + //TODO: check the database exists or not first + return 0, moerr.NewInternalErrorf(ctx, `there is no view "%s" in database "%s"`, viewName, dbName) +} + +type viewSecurityInfo struct { + securityType string + definerRoleId int64 +} + +func normalizeViewSecurityType(securityType string) string { + securityType = strings.TrimSpace(strings.ToUpper(securityType)) + if securityType == viewSecurityInvoker { + return viewSecurityInvoker + } + return viewSecurityDefiner +} + +func parseViewKey(key string) (string, string) { + if key == "" { + return "", "" + } + if baseKey, _, ok := splitViewSnapshotSuffix(key); ok { + key = baseKey + } + if strings.Contains(key, KeySep) { + return splitKey(key) + } + if dotIdx := strings.LastIndex(key, "."); dotIdx != -1 { + return key[:dotIdx], key[dotIdx+1:] + } + return "", key +} + +func splitViewSnapshotSuffix(key string) (string, int64, bool) { + if key == "" { + return key, 0, false + } + idx := strings.LastIndex(key, plan2.ViewSnapshotKeySuffix) + if idx == -1 { + return key, 0, false + } + tsStr := key[idx+len(plan2.ViewSnapshotKeySuffix):] + ts, err := strconv.ParseInt(tsStr, 10, 64) + if err != nil { + return key, 0, false + } + return key[:idx], ts, true +} + +func getViewSecurityInfoWithSnapshot(ctx context.Context, bh BackgroundExec, dbName, viewName string, snapshot *plan.Snapshot) (viewSecurityInfo, bool, error) { + var ( + sql string + err error + ) + ctxForSql := ctx + if snapshot != nil && snapshot.Tenant != nil { + ctxForSql = defines.AttachAccountId(ctxForSql, snapshot.Tenant.TenantID) + } + if snapshot != nil && snapshot.TS != nil { + sql, err = getSqlForCheckViewMetaWithSnapshot(ctxForSql, dbName, viewName, snapshot.TS.PhysicalTime) + } else { + sql, err = getSqlForCheckViewMeta(ctxForSql, dbName, viewName) + } + if err != nil { + return viewSecurityInfo{}, false, err + } + bh.ClearExecResultSet() + err = bh.Exec(ctxForSql, sql) + if err != nil { + return viewSecurityInfo{}, false, err + } + + erArray, err := getResultSet(ctxForSql, bh) + if err != nil { + return viewSecurityInfo{}, false, err + } + if !execResultArrayHasData(erArray) { + return viewSecurityInfo{}, false, nil + } + + viewDef, err := erArray[0].GetString(ctx, 0, 0) + if err != nil { + return viewSecurityInfo{}, false, err + } + definerRoleId, err := erArray[0].GetInt64(ctx, 0, 1) + if err != nil { + return viewSecurityInfo{}, false, err + } + + securityType := viewSecurityDefiner + if viewDef != "" { + var viewData plan2.ViewData + if err := json.Unmarshal([]byte(viewDef), &viewData); err != nil { + return viewSecurityInfo{}, false, err + } + securityType = normalizeViewSecurityType(viewData.SecurityType) + } + + return viewSecurityInfo{ + securityType: securityType, + definerRoleId: definerRoleId, + }, true, nil +} + +// resolveViewChainPrivilegeContext verifies view privileges in order and returns +// the effective role to use for underlying object checks. +func resolveViewChainPrivilegeContext( + ctx context.Context, + bh BackgroundExec, + ses *Session, + cache *privilegeCache, + roleId int64, + privType PrivilegeType, + viewChain []string, + fallbackDb string, + snapshot *plan.Snapshot, + enableCache bool, +) (int64, bool, bool, error) { + if len(viewChain) == 0 { + return roleId, true, false, nil + } + rootDb, rootView := parseViewKey(viewChain[0]) + if rootView == "" { + return 0, false, false, moerr.NewInternalErrorf(ctx, "invalid view key %q", viewChain[0]) + } + if rootDb == "" { + rootDb = fallbackDb + if rootDb == "" { + rootDb = ses.GetDatabaseName() + } + } + if isSystemViewDatabase(rootDb) { + return roleId, true, true, nil + } + + currentRoleId := roleId + for _, viewKey := range viewChain { + viewDb, viewName := parseViewKey(viewKey) + if viewName == "" { + return 0, false, false, moerr.NewInternalErrorf(ctx, "invalid view key %q", viewKey) + } + if viewDb == "" { + viewDb = fallbackDb + if viewDb == "" { + viewDb = ses.GetDatabaseName() + } + } + + useCache := enableCache && cache != nil && currentRoleId == roleId + cacheToUse := cache + if !useCache { + cacheToUse = nil + } + viewAllowed, err := verifyViewPrivilegeForRole(ctx, bh, ses, cacheToUse, currentRoleId, privType, viewDb, viewName, useCache) + if err != nil { + return 0, false, false, err + } + if !viewAllowed { + return 0, false, false, nil + } + + viewInfo, found, err := getViewSecurityInfoWithSnapshot(ctx, bh, viewDb, viewName, snapshot) + if err != nil { + return 0, false, false, err + } + if !found { + if snapshot != nil && snapshot.TS != nil { + return 0, false, false, moerr.NewInternalErrorf(ctx, `there is no view "%s" in database "%s"`, viewName, viewDb) + } + if !ses.GetTxnHandler().InActiveTxn() { + return 0, false, false, moerr.NewInternalErrorf(ctx, `there is no view "%s" in database "%s"`, viewName, viewDb) + } + viewInfo = viewSecurityInfo{ + securityType: viewSecurityDefiner, + definerRoleId: currentRoleId, + } + } + if viewInfo.securityType == viewSecurityDefiner { + currentRoleId = viewInfo.definerRoleId + } + } + + return currentRoleId, true, false, nil +} + // convertAstObjectTypeToObjectType gets the object type from the ast func convertAstObjectTypeToObjectType(ctx context.Context, ot tree.ObjectType) (objectType, error) { var objType objectType switch ot { case tree.OBJECT_TYPE_TABLE: objType = objectTypeTable + case tree.OBJECT_TYPE_VIEW: + objType = objectTypeView case tree.OBJECT_TYPE_DATABASE: objType = objectTypeDatabase case tree.OBJECT_TYPE_ACCOUNT: @@ -4942,7 +5295,8 @@ func checkPrivilegeObjectTypeAndPrivilegeLevel(ctx context.Context, ses FeSessio var dbName string switch ot { - case tree.OBJECT_TYPE_TABLE: + case tree.OBJECT_TYPE_TABLE, tree.OBJECT_TYPE_VIEW: + isView := ot == tree.OBJECT_TYPE_VIEW switch pl.Level { case tree.PRIVILEGE_LEVEL_TYPE_STAR: privLevel = privilegeLevelStar @@ -4961,13 +5315,21 @@ func checkPrivilegeObjectTypeAndPrivilegeLevel(ctx context.Context, ses FeSessio } case tree.PRIVILEGE_LEVEL_TYPE_DATABASE_TABLE: privLevel = privilegeLevelDatabaseTable - objId, err = getDatabaseOrTableId(ctx, bh, false, pl.DbName, pl.TabName) + if isView { + objId, err = getViewId(ctx, bh, pl.DbName, pl.TabName) + } else { + objId, err = getDatabaseOrTableId(ctx, bh, false, pl.DbName, pl.TabName) + } if err != nil { return 0, 0, err } case tree.PRIVILEGE_LEVEL_TYPE_TABLE: privLevel = privilegeLevelTable - objId, err = getDatabaseOrTableId(ctx, bh, false, ses.GetDatabaseName(), pl.TabName) + if isView { + objId, err = getViewId(ctx, bh, ses.GetDatabaseName(), pl.TabName) + } else { + objId, err = getDatabaseOrTableId(ctx, bh, false, ses.GetDatabaseName(), pl.TabName) + } if err != nil { return 0, 0, err } @@ -5032,8 +5394,8 @@ func matchPrivilegeTypeWithObjectType(ctx context.Context, privType PrivilegeTyp err = moerr.NewInternalErrorf(ctx, `the privilege "%s" can only be granted to the object type "database"`, privType) } case PrivilegeScopeTable: - if objType != objectTypeTable { - err = moerr.NewInternalErrorf(ctx, `the privilege "%s" can only be granted to the object type "table"`, privType) + if objType != objectTypeTable && objType != objectTypeView { + err = moerr.NewInternalErrorf(ctx, `the privilege "%s" can only be granted to the object type "table" or "view"`, privType) } case PrivilegeScopeRoutine: if objType != objectTypeFunction { @@ -5049,7 +5411,6 @@ func doGrantPrivilege(ctx context.Context, ses FeSession, gp *tree.GrantPrivileg var roleId int64 var privType PrivilegeType var objType objectType - var privLevel privilegeLevelType var objId int64 var sql string var userId uint32 @@ -5133,7 +5494,7 @@ func doGrantPrivilege(ctx context.Context, ses FeSession, gp *tree.GrantPrivileg // step 2: get obj_type, privilege_level // step 3: get obj_id - privLevel, objId, err = checkPrivilegeObjectTypeAndPrivilegeLevel(ctx, ses, bh, gp.ObjType, *gp.Level) + privLevel, objId, err := checkPrivilegeObjectTypeAndPrivilegeLevel(ctx, ses, bh, gp.ObjType, *gp.Level) if err != nil { return err } @@ -6021,6 +6382,10 @@ func determinePrivilegeSetOfStatement(stmt tree.Statement) *privilege { // privilege will be done on the table type privilegeTips struct { typ PrivilegeType + objType objectType + originViews []string + directView string + scanSnapshot *plan.Snapshot databaseName string tableName string isClusterTable bool @@ -6058,27 +6423,42 @@ func extractPrivilegeTipsFromPlan(p *plan2.Plan) privilegeTipsArray { appendPt := func(pt privilegeTips) { pts = append(pts, pt) } + if p.GetQuery() != nil { // select,insert select, update, delete q := p.GetQuery() // lastNode := q.Nodes[len(q.Nodes)-1] var t PrivilegeType var clusterTable bool - var clusterTableOperation clusterTableOperationType + var scanTargetTables map[[2]string]struct{} switch q.StmtType { case plan.Query_UPDATE: t = PrivilegeTypeUpdate - clusterTableOperation = clusterTableModify case plan.Query_DELETE: t = PrivilegeTypeDelete - clusterTableOperation = clusterTableModify case plan.Query_INSERT: t = PrivilegeTypeInsert - clusterTableOperation = clusterTableModify default: t = PrivilegeTypeSelect - clusterTableOperation = clusterTableSelect + } + + if q.StmtType == plan.Query_UPDATE || q.StmtType == plan.Query_DELETE { + scanTargetTables = make(map[[2]string]struct{}) + for _, node := range q.Nodes { + switch node.NodeType { + case plan.Node_MULTI_UPDATE: + for _, updateCtx := range node.UpdateCtxList { + if updateCtx != nil && updateCtx.ObjRef != nil { + scanTargetTables[[2]string{updateCtx.ObjRef.GetSchemaName(), updateCtx.ObjRef.GetObjName()}] = struct{}{} + } + } + case plan.Node_DELETE: + if node.DeleteCtx != nil && node.DeleteCtx.Ref != nil { + scanTargetTables[[2]string{node.DeleteCtx.Ref.GetSchemaName(), node.DeleteCtx.Ref.GetObjName()}] = struct{}{} + } + } + } } for _, node := range q.Nodes { @@ -6091,48 +6471,155 @@ func extractPrivilegeTipsFromPlan(p *plan2.Plan) privilegeTipsArray { } var scanTyp PrivilegeType + var scanOperation clusterTableOperationType switch q.StmtType { case plan.Query_UPDATE: - scanTyp = PrivilegeTypeUpdate - clusterTableOperation = clusterTableModify + scanTyp = PrivilegeTypeSelect + scanOperation = clusterTableSelect + if _, ok := scanTargetTables[[2]string{node.ObjRef.GetSchemaName(), node.ObjRef.GetObjName()}]; ok { + scanTyp = PrivilegeTypeUpdate + scanOperation = clusterTableModify + } case plan.Query_DELETE: - scanTyp = PrivilegeTypeDelete - clusterTableOperation = clusterTableModify + scanTyp = PrivilegeTypeSelect + scanOperation = clusterTableSelect + if _, ok := scanTargetTables[[2]string{node.ObjRef.GetSchemaName(), node.ObjRef.GetObjName()}]; ok { + scanTyp = PrivilegeTypeDelete + scanOperation = clusterTableModify + } default: scanTyp = PrivilegeTypeSelect - clusterTableOperation = clusterTableSelect + scanOperation = clusterTableSelect } // do not check the privilege of the index table + originViews := node.GetOriginViews() + directView := node.GetDirectView() + scanSnapshot := node.GetScanSnapshot() if !isIndexTable(node.ObjRef.GetObjName()) { appendPt(privilegeTips{ typ: scanTyp, + objType: objectTypeTable, databaseName: getDbNameForPrivilege(node.ObjRef), tableName: node.ObjRef.GetObjName(), isClusterTable: clusterTable, - clusterTableOperation: clusterTableOperation, + clusterTableOperation: scanOperation, + originViews: originViews, + directView: directView, + scanSnapshot: scanSnapshot, }) } else if node.ParentObjRef != nil { appendPt(privilegeTips{ typ: scanTyp, + objType: objectTypeTable, databaseName: getDbNameForPrivilege(node.ParentObjRef), tableName: node.ParentObjRef.GetObjName(), isClusterTable: clusterTable, - clusterTableOperation: clusterTableOperation, + clusterTableOperation: scanOperation, + originViews: originViews, + directView: directView, + scanSnapshot: scanSnapshot, + }) + } + } + // Pre-insert nodes are the stable place to find INSERT targets after plan rewrite. + } else if node.NodeType == plan.Node_PRE_INSERT || + node.NodeType == plan.Node_PRE_INSERT_UK || + node.NodeType == plan.Node_PRE_INSERT_SK { + var objRef *plan.ObjectRef + var tableDef *plan.TableDef + if node.PreInsertCtx != nil { + objRef = node.PreInsertCtx.Ref + tableDef = node.PreInsertCtx.TableDef + } + if objRef == nil && node.ObjRef != nil { + objRef = node.ObjRef + } + if objRef != nil { + dbName := objRef.GetSchemaName() + tableName := objRef.GetObjName() + if dbName == "" && tableDef != nil && tableDef.DbName != "" { + dbName = tableDef.DbName + } + if tableName == "" && tableDef != nil && tableDef.Name != "" { + tableName = tableDef.Name + } + //do not check the privilege of the index table + originViews := node.GetOriginViews() + directView := node.GetDirectView() + scanSnapshot := node.GetScanSnapshot() + if !isIndexTable(tableName) { + insertClusterTable := false + if tableDef != nil && tableDef.TableType == catalog.SystemClusterRel { + insertClusterTable = true + } else { + insertClusterTable = isClusterTable(dbName, tableName) + } + appendPt(privilegeTips{ + typ: PrivilegeTypeInsert, + objType: objectTypeTable, + databaseName: dbName, + tableName: tableName, + isClusterTable: insertClusterTable, + clusterTableOperation: clusterTableModify, + originViews: originViews, + directView: directView, + scanSnapshot: scanSnapshot, + }) + } else if node.ParentObjRef != nil { + parentDb := node.ParentObjRef.GetSchemaName() + parentTable := node.ParentObjRef.GetObjName() + if parentDb == "" && tableDef != nil && tableDef.DbName != "" { + parentDb = tableDef.DbName + } + if parentTable == "" && tableDef != nil && tableDef.Name != "" { + parentTable = tableDef.Name + } + appendPt(privilegeTips{ + typ: PrivilegeTypeInsert, + objType: objectTypeTable, + databaseName: parentDb, + tableName: parentTable, + isClusterTable: isClusterTable(parentDb, parentTable), + clusterTableOperation: clusterTableModify, + originViews: originViews, + directView: directView, + scanSnapshot: scanSnapshot, }) } } } else if node.NodeType == plan.Node_INSERT { + var objRef *plan.ObjectRef if node.InsertCtx != nil && node.InsertCtx.Ref != nil { - objRef := node.InsertCtx.Ref + objRef = node.InsertCtx.Ref + } else if node.ObjRef != nil { + objRef = node.ObjRef + } + if objRef != nil { + dbName := objRef.GetSchemaName() + tableName := objRef.GetObjName() + if dbName == "" && node.TableDef != nil && node.TableDef.DbName != "" { + dbName = node.TableDef.DbName + } + if tableName == "" && node.TableDef != nil && node.TableDef.Name != "" { + tableName = node.TableDef.Name + } // do not check the privilege of the index table - if !isIndexTable(node.ObjRef.GetObjName()) { + originViews := node.GetOriginViews() + directView := node.GetDirectView() + scanSnapshot := node.GetScanSnapshot() + if !isIndexTable(tableName) { + insertClusterTable := isClusterTable(dbName, tableName) appendPt(privilegeTips{ - typ: t, - databaseName: objRef.GetSchemaName(), - tableName: objRef.GetObjName(), - isClusterTable: node.InsertCtx.IsClusterTable, + typ: PrivilegeTypeInsert, + objType: objectTypeTable, + databaseName: dbName, + tableName: tableName, + isClusterTable: insertClusterTable, clusterTableOperation: clusterTableModify, + originViews: originViews, + directView: directView, + scanSnapshot: scanSnapshot, }) } } @@ -6140,26 +6627,40 @@ func extractPrivilegeTipsFromPlan(p *plan2.Plan) privilegeTipsArray { if node.DeleteCtx != nil && node.DeleteCtx.Ref != nil { objRef := node.DeleteCtx.Ref // do not check the privilege of the index table + originViews := node.GetOriginViews() + directView := node.GetDirectView() + scanSnapshot := node.GetScanSnapshot() if !isIndexTable(node.ObjRef.GetObjName()) { appendPt(privilegeTips{ typ: t, + objType: objectTypeTable, databaseName: objRef.GetSchemaName(), tableName: objRef.GetObjName(), isClusterTable: node.DeleteCtx.IsClusterTable, clusterTableOperation: clusterTableModify, + originViews: originViews, + directView: directView, + scanSnapshot: scanSnapshot, }) } } } else if node.NodeType == plan.Node_MULTI_UPDATE { for _, updateCtx := range node.UpdateCtxList { + originViews := node.GetOriginViews() + directView := node.GetDirectView() + scanSnapshot := node.GetScanSnapshot() if !isIndexTable(updateCtx.ObjRef.GetObjName()) { isClusterTable := updateCtx.TableDef.TableType == catalog.SystemClusterRel appendPt(privilegeTips{ typ: t, + objType: objectTypeTable, databaseName: updateCtx.ObjRef.GetSchemaName(), tableName: updateCtx.ObjRef.GetObjName(), isClusterTable: isClusterTable, clusterTableOperation: clusterTableModify, + originViews: originViews, + directView: directView, + scanSnapshot: scanSnapshot, }) } } @@ -6170,6 +6671,7 @@ func extractPrivilegeTipsFromPlan(p *plan2.Plan) privilegeTipsArray { truncateTable := p.GetDdl().GetTruncateTable() appendPt(privilegeTips{ typ: PrivilegeTypeTruncate, + objType: objectTypeTable, databaseName: truncateTable.GetDatabase(), tableName: truncateTable.GetTable(), isClusterTable: truncateTable.GetClusterTable().GetIsClusterTable(), @@ -6185,6 +6687,7 @@ func extractPrivilegeTipsFromPlan(p *plan2.Plan) privilegeTipsArray { } appendPt(privilegeTips{ typ: PrivilegeTypeDropTable, + objType: objectTypeTable, databaseName: entry.GetDatabase(), tableName: entry.GetTable(), isClusterTable: isCluster, @@ -6194,6 +6697,7 @@ func extractPrivilegeTipsFromPlan(p *plan2.Plan) privilegeTipsArray { } else { appendPt(privilegeTips{ typ: PrivilegeTypeDropTable, + objType: objectTypeTable, databaseName: dropTable.GetDatabase(), tableName: dropTable.GetTable(), isClusterTable: dropTable.GetClusterTable().GetIsClusterTable(), @@ -6204,6 +6708,7 @@ func extractPrivilegeTipsFromPlan(p *plan2.Plan) privilegeTipsArray { createIndex := p.GetDdl().GetCreateIndex() appendPt(privilegeTips{ typ: PrivilegeTypeDropTable, + objType: objectTypeTable, databaseName: createIndex.GetDatabase(), tableName: createIndex.GetTable(), clusterTableOperation: clusterTableModify, @@ -6212,6 +6717,7 @@ func extractPrivilegeTipsFromPlan(p *plan2.Plan) privilegeTipsArray { dropIndex := p.GetDdl().GetDropIndex() appendPt(privilegeTips{ typ: PrivilegeTypeDropTable, + objType: objectTypeTable, databaseName: dropIndex.GetDatabase(), tableName: dropIndex.GetTable(), clusterTableOperation: clusterTableModify, @@ -6244,6 +6750,10 @@ func convertPrivilegeTipsToPrivilege(priv *privilege, arr privilegeTipsArray) { for _, tips := range arr { multiPrivs = append(multiPrivs, privilegeItem{ privilegeTyp: tips.typ, + objType: tips.objType, + originViews: tips.originViews, + directView: tips.directView, + scanSnapshot: tips.scanSnapshot, dbName: tips.databaseName, tableName: tips.tableName, isClusterTable: tips.isClusterTable, @@ -6276,14 +6786,14 @@ func getSqlFromPrivilegeEntry(ctx context.Context, roleId int64, entry privilege var sql string // for object type table, need concrete tableid // TODO: table level check should be done after getting the plan - if entry.objType == objectTypeTable { + if entry.objType == objectTypeTable || entry.objType == objectTypeView { switch entry.privilegeLevel { case privilegeLevelDatabaseTable, privilegeLevelTable: - sql, err = getSqlForCheckRoleHasTableLevelPrivilege(ctx, roleId, entry.privilegeId, entry.databaseName, entry.tableName) + sql, err = getSqlForCheckRoleHasTableLevelPrivilegeWithObjType(ctx, entry.objType, roleId, entry.privilegeId, entry.databaseName, entry.tableName) case privilegeLevelDatabaseStar, privilegeLevelStar: - sql, err = getSqlForCheckRoleHasTableLevelForDatabaseStar(ctx, roleId, entry.privilegeId, entry.databaseName) + sql, err = getSqlForCheckRoleHasTableLevelForDatabaseStarWithObjType(ctx, entry.objType, roleId, entry.privilegeId, entry.databaseName) case privilegeLevelStarStar: - sql = getSqlForCheckRoleHasTableLevelForStarStar(roleId, entry.privilegeId) + sql = getSqlForCheckRoleHasTableLevelForStarStarWithObjType(entry.objType, roleId, entry.privilegeId) default: return "", moerr.NewInternalErrorf(ctx, "unsupported privilegel level %s for the privilege %s", entry.privilegeLevel, entry.privilegeId) } @@ -6323,14 +6833,14 @@ func getSqlForPrivilege(ctx context.Context, roleId int64, entry privilegeEntry, var err error // for object type table, need concrete tableid switch entry.objType { - case objectTypeTable: + case objectTypeTable, objectTypeView: switch pl { case privilegeLevelDatabaseTable, privilegeLevelTable: - sql, err = getSqlForCheckRoleHasTableLevelPrivilege(ctx, roleId, entry.privilegeId, entry.databaseName, entry.tableName) + sql, err = getSqlForCheckRoleHasTableLevelPrivilegeWithObjType(ctx, entry.objType, roleId, entry.privilegeId, entry.databaseName, entry.tableName) case privilegeLevelDatabaseStar, privilegeLevelStar: - sql, err = getSqlForCheckRoleHasTableLevelForDatabaseStar(ctx, roleId, entry.privilegeId, entry.databaseName) + sql, err = getSqlForCheckRoleHasTableLevelForDatabaseStarWithObjType(ctx, entry.objType, roleId, entry.privilegeId, entry.databaseName) case privilegeLevelStarStar: - sql = getSqlForCheckRoleHasTableLevelForStarStar(roleId, entry.privilegeId) + sql = getSqlForCheckRoleHasTableLevelForStarStarWithObjType(entry.objType, roleId, entry.privilegeId) default: return "", moerr.NewInternalErrorf(ctx, "the privilege level %s for the privilege %s is unsupported", pl, entry.privilegeId) } @@ -6418,6 +6928,49 @@ func verifyPrivilegeEntryInMultiPrivilegeLevels( return false, nil } +func verifyViewPrivilegeForRole( + ctx context.Context, + bh BackgroundExec, + ses *Session, + cache *privilegeCache, + roleId int64, + privType PrivilegeType, + dbName string, + viewName string, + enableCache bool, +) (bool, error) { + // Admin roles bypass view privilege checks to keep grants output stable. + if roleId == moAdminRoleID || roleId == accountAdminRoleID { + return true, nil + } + privTypes := []PrivilegeType{privType, PrivilegeTypeTableAll, PrivilegeTypeTableOwnership} + seen := make(map[PrivilegeType]struct{}, len(privTypes)) + for _, p := range privTypes { + if _, ok := seen[p]; ok { + continue + } + seen[p] = struct{}{} + entry := privilegeEntriesMap[p] + entry.objType = objectTypeView + entry.databaseName = dbName + entry.tableName = viewName + entry.privilegeEntryTyp = privilegeEntryTypeGeneral + entry.compound = nil + pls, err := getPrivilegeLevelsOfObjectType(ctx, objectTypeView) + if err != nil { + return false, err + } + yes, err := verifyPrivilegeEntryInMultiPrivilegeLevels(ctx, bh, ses, cache, roleId, entry, pls, enableCache) + if err != nil { + return false, err + } + if yes { + return true, nil + } + } + return false, nil +} + // determineRoleSetHasPrivilegeSet decides the role set has at least one privilege of the privilege set. // The algorithm 2. func determineRoleSetHasPrivilegeSet(ctx context.Context, bh BackgroundExec, ses *Session, roleIds *btree.Set[int64], priv *privilege, enableCache bool) (bool, error) { @@ -6463,8 +7016,6 @@ func determineRoleSetHasPrivilegeSet(ctx context.Context, bh BackgroundExec, ses // multi privileges take effect together for _, mi := range entry.compound.items { if mi.privilegeTyp == PrivilegeTypeCanGrantRoleToOthersInCreateUser { - // TODO: normalize the name - // TODO: simplify the logic yes, err = determineUserCanGrantRolesToOthersInternal(ctx, bh, ses, []*tree.Role{mi.role}) if err != nil { return false, err @@ -6496,17 +7047,69 @@ func determineRoleSetHasPrivilegeSet(ctx context.Context, bh BackgroundExec, ses return false, err } + yes = false + writeDirectly := priv.writeDatabaseAndTableDirectly + if (tempEntry.objType == objectTypeTable || tempEntry.objType == objectTypeView) && mi.privilegeTyp == PrivilegeTypeSelect { + writeDirectly = false + } yes2 = verifyLightPrivilege(ses, tempEntry.databaseName, - priv.writeDatabaseAndTableDirectly, + writeDirectly, mi.isClusterTable, mi.clusterTableOperation) - if yes2 { - // At least there is one success - yes, err = verifyPrivilegeEntryInMultiPrivilegeLevels(ctx, bh, ses, cache, roleId, tempEntry, pls, enableCache) - if err != nil { - return false, err + viewChain := mi.originViews + directView := mi.directView + var viewSnapshot *plan.Snapshot + if directView != "" { + baseKey, ts, ok := splitViewSnapshotSuffix(directView) + if ok { + viewSnapshot = &plan.Snapshot{TS: ×tamp.Timestamp{PhysicalTime: ts}} + if mi.scanSnapshot != nil && mi.scanSnapshot.Tenant != nil { + viewSnapshot.Tenant = mi.scanSnapshot.Tenant + } + directView = baseKey + } + } + if len(viewChain) == 0 && directView != "" { + viewChain = []string{directView} + } + + checkRoleId := roleId + viewAllowed := true + skipBaseCheck := false + if len(viewChain) > 0 { + checkRoleId, viewAllowed, skipBaseCheck, err = resolveViewChainPrivilegeContext( + ctx, + bh, + ses, + cache, + roleId, + mi.privilegeTyp, + viewChain, + tempEntry.databaseName, + viewSnapshot, + enableCache, + ) + if err != nil { + return false, err + } + } + + if viewAllowed { + if skipBaseCheck { + yes = true + } else { + useCache := enableCache && cache != nil && checkRoleId == roleId + cacheToUse := cache + if !useCache { + cacheToUse = nil + } + yes, err = verifyPrivilegeEntryInMultiPrivilegeLevels(ctx, bh, ses, cacheToUse, checkRoleId, tempEntry, pls, useCache) + if err != nil { + return false, err + } + } } } } @@ -7219,6 +7822,21 @@ func authenticateUserCanExecuteStatementWithObjectTypeDatabaseAndTable(ctx conte return true, stats, nil } arr := extractPrivilegeTipsFromPlan(p) + if len(arr) == 0 { + if ins, ok := stmt.(*tree.Insert); ok { + dbName, tableName, ok := getInsertTargetTableName(ins, ses) + if ok { + arr = append(arr, privilegeTips{ + typ: PrivilegeTypeInsert, + objType: objectTypeTable, + databaseName: dbName, + tableName: tableName, + isClusterTable: isClusterTable(dbName, tableName), + clusterTableOperation: clusterTableModify, + }) + } + } + } if len(arr) == 0 { return true, stats, nil } @@ -7234,6 +7852,29 @@ func authenticateUserCanExecuteStatementWithObjectTypeDatabaseAndTable(ctx conte return true, stats, nil } +func getInsertTargetTableName(stmt *tree.Insert, ses *Session) (string, string, bool) { + if stmt == nil || stmt.Table == nil { + return "", "", false + } + var tbl tree.TableExpr = stmt.Table + if alias, ok := tbl.(*tree.AliasedTableExpr); ok { + tbl = alias.Expr + } + name, ok := tbl.(*tree.TableName) + if !ok || name == nil { + return "", "", false + } + dbName := string(name.SchemaName) + if dbName == "" { + dbName = ses.GetDatabaseName() + } + tableName := string(name.ObjectName) + if dbName == "" || tableName == "" { + return "", "", false + } + return dbName, tableName, true +} + func authenticateCreateTableAsSelectSourcePrivilege( ctx context.Context, ses *Session, @@ -7275,18 +7916,22 @@ func formSqlFromGrantPrivilege(ctx context.Context, ses *Session, gp *tree.Grant return "", err } switch gp.ObjType { - case tree.OBJECT_TYPE_TABLE: + case tree.OBJECT_TYPE_TABLE, tree.OBJECT_TYPE_VIEW: + objType := objectTypeTable + if gp.ObjType == tree.OBJECT_TYPE_VIEW { + objType = objectTypeView + } switch gp.Level.Level { case tree.PRIVILEGE_LEVEL_TYPE_STAR: - sql, err = getSqlForCheckWithGrantOptionForTableDatabaseStar(ctx, int64(tenant.GetDefaultRoleID()), privType, ses.GetDatabaseName()) + sql, err = getSqlForCheckWithGrantOptionForTableDatabaseStarWithObjType(ctx, objType, int64(tenant.GetDefaultRoleID()), privType, ses.GetDatabaseName()) case tree.PRIVILEGE_LEVEL_TYPE_STAR_STAR: - sql = getSqlForCheckWithGrantOptionForTableStarStar(int64(tenant.GetDefaultRoleID()), privType) + sql = getSqlForCheckWithGrantOptionForTableStarStarWithObjType(objType, int64(tenant.GetDefaultRoleID()), privType) case tree.PRIVILEGE_LEVEL_TYPE_DATABASE_STAR: - sql, err = getSqlForCheckWithGrantOptionForTableDatabaseStar(ctx, int64(tenant.GetDefaultRoleID()), privType, gp.Level.DbName) + sql, err = getSqlForCheckWithGrantOptionForTableDatabaseStarWithObjType(ctx, objType, int64(tenant.GetDefaultRoleID()), privType, gp.Level.DbName) case tree.PRIVILEGE_LEVEL_TYPE_DATABASE_TABLE: - sql, err = getSqlForCheckWithGrantOptionForTableDatabaseTable(ctx, int64(tenant.GetDefaultRoleID()), privType, gp.Level.DbName, gp.Level.TabName) + sql, err = getSqlForCheckWithGrantOptionForTableDatabaseTableWithObjType(ctx, objType, int64(tenant.GetDefaultRoleID()), privType, gp.Level.DbName, gp.Level.TabName) case tree.PRIVILEGE_LEVEL_TYPE_TABLE: - sql, err = getSqlForCheckWithGrantOptionForTableDatabaseTable(ctx, int64(tenant.GetDefaultRoleID()), privType, ses.GetDatabaseName(), gp.Level.TabName) + sql, err = getSqlForCheckWithGrantOptionForTableDatabaseTableWithObjType(ctx, objType, int64(tenant.GetDefaultRoleID()), privType, ses.GetDatabaseName(), gp.Level.TabName) default: return "", moerr.NewInternalErrorf(ctx, "in object type %v privilege level type %v is unsupported", gp.ObjType, gp.Level.Level) } @@ -7593,7 +8238,7 @@ func convertAstPrivilegeTypeToPrivilegeType(ctx context.Context, priv tree.Privi privType = PrivilegeTypeAccountAll case tree.OBJECT_TYPE_DATABASE: privType = PrivilegeTypeDatabaseAll - case tree.OBJECT_TYPE_TABLE: + case tree.OBJECT_TYPE_TABLE, tree.OBJECT_TYPE_VIEW: privType = PrivilegeTypeTableAll default: return 0, moerr.NewInternalErrorf(ctx, `the object type "%s" do not support the privilege "%s"`, ot.String(), priv.ToString()) @@ -7602,7 +8247,7 @@ func convertAstPrivilegeTypeToPrivilegeType(ctx context.Context, priv tree.Privi switch ot { case tree.OBJECT_TYPE_DATABASE: privType = PrivilegeTypeDatabaseOwnership - case tree.OBJECT_TYPE_TABLE: + case tree.OBJECT_TYPE_TABLE, tree.OBJECT_TYPE_VIEW: privType = PrivilegeTypeTableOwnership default: return 0, moerr.NewInternalErrorf(ctx, `the object type "%s" do not support the privilege "%s"`, ot.String(), priv.ToString()) diff --git a/pkg/frontend/authenticate2.go b/pkg/frontend/authenticate2.go index a46659e25cc1d..0a1fa56162287 100644 --- a/pkg/frontend/authenticate2.go +++ b/pkg/frontend/authenticate2.go @@ -16,6 +16,7 @@ package frontend import ( "context" + "strings" "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/pb/plan" @@ -59,6 +60,7 @@ func verifyLightPrivilege(ses *Session, if len(dbName) == 0 { dbName = ses.GetDatabaseName() } + dbName = strings.ToLower(dbName) if ok2 := isBannedDatabase(dbName); ok2 { if isClusterTable { ok = verifyAccountCanOperateClusterTable(ses.GetTenantInfo(), dbName, clusterTableOperation) @@ -170,6 +172,10 @@ var checkPrivilegeInCache = func(ctx context.Context, ses *Session, priv *privil // } yes = false } else { + if len(mi.originViews) > 0 || mi.directView != "" { + // View chains require metadata checks; skip cache-only evaluation. + return false, nil + } tempEntry := privilegeEntriesMap[mi.privilegeTyp] tempEntry.databaseName = mi.dbName tempEntry.tableName = mi.tableName @@ -180,9 +186,13 @@ var checkPrivilegeInCache = func(ctx context.Context, ses *Session, priv *privil return false, err } + writeDirectly := priv.writeDatabaseAndTableDirectly + if (tempEntry.objType == objectTypeTable || tempEntry.objType == objectTypeView) && mi.privilegeTyp == PrivilegeTypeSelect { + writeDirectly = false + } yes2 = verifyLightPrivilege(ses, tempEntry.databaseName, - priv.writeDatabaseAndTableDirectly, + writeDirectly, mi.isClusterTable, mi.clusterTableOperation) diff --git a/pkg/frontend/authenticate_test.go b/pkg/frontend/authenticate_test.go index 998e7aac57d9d..b2f2b9ce0862d 100644 --- a/pkg/frontend/authenticate_test.go +++ b/pkg/frontend/authenticate_test.go @@ -5289,11 +5289,163 @@ func Test_doGrantPrivilege(t *testing.T) { bh.sql2result[sql] = mrs } else if stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_TABLE || stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_DATABASE_TABLE { - sql, _ := getSqlForCheckDatabaseTable(ctx, dbName, tableName) - mrs := newMrsForCheckDatabaseTable([][]interface{}{ + if stmt.ObjType == tree.OBJECT_TYPE_VIEW { + sql, _ := getSqlForCheckDatabaseView(ctx, dbName, tableName) + mrs := newMrsForCheckDatabaseTable([][]interface{}{ + {0}, + }) + bh.sql2result[sql] = mrs + } else { + sql, _ := getSqlForCheckDatabaseTable(ctx, dbName, tableName) + mrs := newMrsForCheckDatabaseTable([][]interface{}{ + {0}, + }) + bh.sql2result[sql] = mrs + } + } + + _, objId, err := checkPrivilegeObjectTypeAndPrivilegeLevel(ctx, ses, bh, stmt.ObjType, *stmt.Level) + convey.So(err, convey.ShouldBeNil) + + for _, p := range stmt.Privileges { + privType, err := convertAstPrivilegeTypeToPrivilegeType(context.TODO(), p.Type, stmt.ObjType) + convey.So(err, convey.ShouldBeNil) + for j := range stmt.Roles { + sql := getSqlForCheckRoleHasPrivilege(int64(j), objType, objId, int64(privType)) + mrs := newMrsForCheckRoleHasPrivilege([][]interface{}{}) + bh.sql2result[sql] = mrs + } + } + + err = doGrantPrivilege(ses.GetTxnHandler().GetTxnCtx(), ses, stmt, bh) + convey.So(err, convey.ShouldBeNil) + } + }) + convey.Convey("grant view, role succ", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + bh := &backgroundExecTest{} + bh.init() + + bhStub := gostub.StubFunc(&NewBackgroundExec, bh) + defer bhStub.Reset() + + dbName := "d" + tableName := "v" + stmts := []*tree.GrantPrivilege{ + { + Privileges: []*tree.Privilege{ + {Type: tree.PRIVILEGE_TYPE_STATIC_SELECT}, + }, + ObjType: tree.OBJECT_TYPE_VIEW, + Level: &tree.PrivilegeLevel{ + Level: tree.PRIVILEGE_LEVEL_TYPE_STAR, + }, + Roles: []*tree.Role{ + {UserName: "r1"}, + }, + }, + { + Privileges: []*tree.Privilege{ + {Type: tree.PRIVILEGE_TYPE_STATIC_SELECT}, + }, + ObjType: tree.OBJECT_TYPE_VIEW, + Level: &tree.PrivilegeLevel{ + Level: tree.PRIVILEGE_LEVEL_TYPE_STAR_STAR, + }, + Roles: []*tree.Role{ + {UserName: "r1"}, + }, + }, + { + Privileges: []*tree.Privilege{ + {Type: tree.PRIVILEGE_TYPE_STATIC_SELECT}, + }, + ObjType: tree.OBJECT_TYPE_VIEW, + Level: &tree.PrivilegeLevel{ + Level: tree.PRIVILEGE_LEVEL_TYPE_DATABASE_STAR, + DbName: dbName, + }, + Roles: []*tree.Role{ + {UserName: "r1"}, + }, + }, + { + Privileges: []*tree.Privilege{ + {Type: tree.PRIVILEGE_TYPE_STATIC_SELECT}, + }, + ObjType: tree.OBJECT_TYPE_VIEW, + Level: &tree.PrivilegeLevel{ + Level: tree.PRIVILEGE_LEVEL_TYPE_DATABASE_TABLE, + DbName: dbName, + TabName: tableName, + }, + Roles: []*tree.Role{ + {UserName: "r1"}, + }, + }, + { + Privileges: []*tree.Privilege{ + {Type: tree.PRIVILEGE_TYPE_STATIC_SELECT}, + }, + ObjType: tree.OBJECT_TYPE_VIEW, + Level: &tree.PrivilegeLevel{ + Level: tree.PRIVILEGE_LEVEL_TYPE_TABLE, + TabName: tableName, + }, + Roles: []*tree.Role{ + {UserName: "r1"}, + }, + }, + } + + ctx := context.WithValue(context.TODO(), defines.TenantIDKey{}, uint32(sysAccountID)) + + for _, stmt := range stmts { + priv := determinePrivilegeSetOfStatement(stmt) + ses := newSes(priv, ctrl) + ses.SetDatabaseName("d") + + //no result set + bh.sql2result["begin;"] = nil + bh.sql2result["commit;"] = nil + bh.sql2result["rollback;"] = nil + + //init from roles + for i, role := range stmt.Roles { + sql, _ := getSqlForRoleIdOfRole(context.TODO(), role.UserName) + mrs := newMrsForRoleIdOfRole([][]interface{}{ + {i}, + }) + bh.sql2result[sql] = mrs + } + + objType, err := convertAstObjectTypeToObjectType(context.TODO(), stmt.ObjType) + convey.So(err, convey.ShouldBeNil) + + if stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_STAR || + stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_DATABASE_STAR { + sql, _ := getSqlForCheckDatabase(context.TODO(), dbName) + mrs := newMrsForCheckDatabase([][]interface{}{ {0}, }) bh.sql2result[sql] = mrs + } else if stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_TABLE || + stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_DATABASE_TABLE { + if stmt.ObjType == tree.OBJECT_TYPE_VIEW { + sql, _ := getSqlForCheckDatabaseView(ctx, dbName, tableName) + mrs := newMrsForCheckDatabaseTable([][]interface{}{ + {0}, + }) + bh.sql2result[sql] = mrs + } else { + sql, _ := getSqlForCheckDatabaseTable(ctx, dbName, tableName) + mrs := newMrsForCheckDatabaseTable([][]interface{}{ + {0}, + }) + bh.sql2result[sql] = mrs + } } _, objId, err := checkPrivilegeObjectTypeAndPrivilegeLevel(ctx, ses, bh, stmt.ObjType, *stmt.Level) @@ -5593,11 +5745,163 @@ func Test_doRevokePrivilege(t *testing.T) { bh.sql2result[sql] = mrs } else if stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_TABLE || stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_DATABASE_TABLE { - sql, _ := getSqlForCheckDatabaseTable(ctx, dbName, tableName) - mrs := newMrsForCheckDatabaseTable([][]interface{}{ + if stmt.ObjType == tree.OBJECT_TYPE_VIEW { + sql, _ := getSqlForCheckDatabaseView(ctx, dbName, tableName) + mrs := newMrsForCheckDatabaseTable([][]interface{}{ + {0}, + }) + bh.sql2result[sql] = mrs + } else { + sql, _ := getSqlForCheckDatabaseTable(ctx, dbName, tableName) + mrs := newMrsForCheckDatabaseTable([][]interface{}{ + {0}, + }) + bh.sql2result[sql] = mrs + } + } + + _, objId, err := checkPrivilegeObjectTypeAndPrivilegeLevel(ctx, ses, bh, stmt.ObjType, *stmt.Level) + convey.So(err, convey.ShouldBeNil) + + for _, p := range stmt.Privileges { + privType, err := convertAstPrivilegeTypeToPrivilegeType(context.TODO(), p.Type, stmt.ObjType) + convey.So(err, convey.ShouldBeNil) + for j := range stmt.Roles { + sql := getSqlForCheckRoleHasPrivilege(int64(j), objType, objId, int64(privType)) + mrs := newMrsForCheckRoleHasPrivilege([][]interface{}{}) + bh.sql2result[sql] = mrs + } + } + + err = doRevokePrivilege(ses.GetTxnHandler().GetTxnCtx(), ses, stmt, bh) + convey.So(err, convey.ShouldBeNil) + } + }) + convey.Convey("revoke view, role succ", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + bh := &backgroundExecTest{} + bh.init() + + bhStub := gostub.StubFunc(&NewBackgroundExec, bh) + defer bhStub.Reset() + + dbName := "d" + tableName := "v" + stmts := []*tree.RevokePrivilege{ + { + Privileges: []*tree.Privilege{ + {Type: tree.PRIVILEGE_TYPE_STATIC_SELECT}, + }, + ObjType: tree.OBJECT_TYPE_VIEW, + Level: &tree.PrivilegeLevel{ + Level: tree.PRIVILEGE_LEVEL_TYPE_STAR, + }, + Roles: []*tree.Role{ + {UserName: "r1"}, + }, + }, + { + Privileges: []*tree.Privilege{ + {Type: tree.PRIVILEGE_TYPE_STATIC_SELECT}, + }, + ObjType: tree.OBJECT_TYPE_VIEW, + Level: &tree.PrivilegeLevel{ + Level: tree.PRIVILEGE_LEVEL_TYPE_STAR_STAR, + }, + Roles: []*tree.Role{ + {UserName: "r1"}, + }, + }, + { + Privileges: []*tree.Privilege{ + {Type: tree.PRIVILEGE_TYPE_STATIC_SELECT}, + }, + ObjType: tree.OBJECT_TYPE_VIEW, + Level: &tree.PrivilegeLevel{ + Level: tree.PRIVILEGE_LEVEL_TYPE_DATABASE_STAR, + DbName: dbName, + }, + Roles: []*tree.Role{ + {UserName: "r1"}, + }, + }, + { + Privileges: []*tree.Privilege{ + {Type: tree.PRIVILEGE_TYPE_STATIC_SELECT}, + }, + ObjType: tree.OBJECT_TYPE_VIEW, + Level: &tree.PrivilegeLevel{ + Level: tree.PRIVILEGE_LEVEL_TYPE_DATABASE_TABLE, + DbName: dbName, + TabName: tableName, + }, + Roles: []*tree.Role{ + {UserName: "r1"}, + }, + }, + { + Privileges: []*tree.Privilege{ + {Type: tree.PRIVILEGE_TYPE_STATIC_SELECT}, + }, + ObjType: tree.OBJECT_TYPE_VIEW, + Level: &tree.PrivilegeLevel{ + Level: tree.PRIVILEGE_LEVEL_TYPE_TABLE, + TabName: tableName, + }, + Roles: []*tree.Role{ + {UserName: "r1"}, + }, + }, + } + + ctx := context.WithValue(context.TODO(), defines.TenantIDKey{}, uint32(sysAccountID)) + + for _, stmt := range stmts { + priv := determinePrivilegeSetOfStatement(stmt) + ses := newSes(priv, ctrl) + ses.SetDatabaseName("d") + + //no result set + bh.sql2result["begin;"] = nil + bh.sql2result["commit;"] = nil + bh.sql2result["rollback;"] = nil + + //init from roles + for i, role := range stmt.Roles { + sql, _ := getSqlForRoleIdOfRole(context.TODO(), role.UserName) + mrs := newMrsForRoleIdOfRole([][]interface{}{ + {i}, + }) + bh.sql2result[sql] = mrs + } + + objType, err := convertAstObjectTypeToObjectType(context.TODO(), stmt.ObjType) + convey.So(err, convey.ShouldBeNil) + + if stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_STAR || + stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_DATABASE_STAR { + sql, _ := getSqlForCheckDatabase(context.TODO(), dbName) + mrs := newMrsForCheckDatabase([][]interface{}{ {0}, }) bh.sql2result[sql] = mrs + } else if stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_TABLE || + stmt.Level.Level == tree.PRIVILEGE_LEVEL_TYPE_DATABASE_TABLE { + if stmt.ObjType == tree.OBJECT_TYPE_VIEW { + sql, _ := getSqlForCheckDatabaseView(ctx, dbName, tableName) + mrs := newMrsForCheckDatabaseTable([][]interface{}{ + {0}, + }) + bh.sql2result[sql] = mrs + } else { + sql, _ := getSqlForCheckDatabaseTable(ctx, dbName, tableName) + mrs := newMrsForCheckDatabaseTable([][]interface{}{ + {0}, + }) + bh.sql2result[sql] = mrs + } } _, objId, err := checkPrivilegeObjectTypeAndPrivilegeLevel(ctx, ses, bh, stmt.ObjType, *stmt.Level) diff --git a/pkg/frontend/variables.go b/pkg/frontend/variables.go index d26c9515b5dde..72895372b8e01 100644 --- a/pkg/frontend/variables.go +++ b/pkg/frontend/variables.go @@ -1727,6 +1727,14 @@ var gSysVarsDefs = map[string]SystemVariable{ Type: InitSystemSystemEnumType("default_storage_engine", "InnoDB"), Default: "InnoDB", }, + "view_security_type": { + Name: "view_security_type", + Scope: ScopeSession, + Dynamic: true, + SetVarHintApplies: false, + Type: InitSystemSystemEnumType("view_security_type", "DEFINER", "INVOKER"), + Default: "DEFINER", + }, "default_table_encryption": { Name: "default_table_encryption", Scope: ScopeBoth, diff --git a/pkg/pb/plan/plan.pb.go b/pkg/pb/plan/plan.pb.go index 4afab4a27a064..5f9bbb92f39e8 100644 --- a/pkg/pb/plan/plan.pb.go +++ b/pkg/pb/plan/plan.pb.go @@ -6616,6 +6616,8 @@ type Node struct { RollupFilter bool `protobuf:"varint,69,opt,name=rollup_filter,json=rollupFilter,proto3" json:"rollup_filter,omitempty"` // compile time performance setting SpillMem int64 `protobuf:"varint,70,opt,name=spill_mem,json=spillMem,proto3" json:"spill_mem,omitempty"` + OriginViews []string `protobuf:"bytes,71,rep,name=origin_views,json=originViews,proto3" json:"origin_views,omitempty"` + DirectView string `protobuf:"bytes,72,opt,name=direct_view,json=directView,proto3" json:"direct_view,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -7137,6 +7139,20 @@ func (m *Node) GetSpillMem() int64 { return 0 } +func (m *Node) GetOriginViews() []string { + if m != nil { + return m.OriginViews + } + return nil +} + +func (m *Node) GetDirectView() string { + if m != nil { + return m.DirectView + } + return "" +} + type SnapshotExtraInfo struct { Level string `protobuf:"bytes,1,opt,name=Level,proto3" json:"Level,omitempty"` ObjId uint64 `protobuf:"varint,2,opt,name=ObjId,proto3" json:"ObjId,omitempty"` @@ -13688,825 +13704,827 @@ func init() { func init() { proto.RegisterFile("plan.proto", fileDescriptor_2d655ab2f7683c23) } var fileDescriptor_2d655ab2f7683c23 = []byte{ - // 13076 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0xbd, 0x5d, 0x8c, 0x1b, 0x59, - 0x76, 0x18, 0xdc, 0x6c, 0x92, 0x4d, 0xf2, 0x90, 0xcd, 0xae, 0xbe, 0xfa, 0xa3, 0x34, 0x1a, 0xa9, - 0x55, 0xd2, 0x68, 0x34, 0x9a, 0x19, 0x69, 0x46, 0x9a, 0x1f, 0xcd, 0x7a, 0xd7, 0xbb, 0x6c, 0x92, - 0xad, 0xe6, 0x8a, 0x4d, 0xf6, 0x16, 0xd9, 0xd2, 0xcc, 0xfa, 0x33, 0x0a, 0x45, 0x56, 0xb1, 0xbb, - 0xa6, 0x8b, 0x55, 0x9c, 0xaa, 0xa2, 0xba, 0x7b, 0x01, 0xe3, 0x5b, 0x24, 0x80, 0x7f, 0x02, 0xe4, - 0x29, 0xb0, 0xf3, 0x12, 0x03, 0x4e, 0x80, 0x20, 0x41, 0xe0, 0x00, 0x49, 0x60, 0xc0, 0xf6, 0x5b, - 0x8c, 0xbc, 0x38, 0x08, 0x6c, 0x07, 0x08, 0x92, 0x20, 0x09, 0xe0, 0x04, 0x9b, 0xe7, 0x20, 0x01, - 0x92, 0xf7, 0x04, 0xe7, 0xdc, 0x5b, 0x55, 0xb7, 0x48, 0xb6, 0x34, 0x33, 0xbb, 0x06, 0x92, 0x97, - 0x6e, 0xde, 0xf3, 0x73, 0xff, 0xef, 0xb9, 0xe7, 0x9c, 0x7b, 0xee, 0x2d, 0x80, 0xa9, 0x63, 0xb8, - 0x0f, 0xa6, 0xbe, 0x17, 0x7a, 0x2c, 0x87, 0xbf, 0xaf, 0xbd, 0x7f, 0x68, 0x87, 0x47, 0xb3, 0xe1, - 0x83, 0x91, 0x37, 0x79, 0x78, 0xe8, 0x1d, 0x7a, 0x0f, 0x09, 0x39, 0x9c, 0x8d, 0x29, 0x45, 0x09, - 0xfa, 0xc5, 0x99, 0xae, 0x81, 0xe3, 0x8d, 0x8e, 0xc5, 0xef, 0x8d, 0xd0, 0x9e, 0x58, 0x41, 0x68, - 0x4c, 0xa6, 0x1c, 0xa0, 0xfe, 0x61, 0x06, 0x72, 0x83, 0xb3, 0xa9, 0xc5, 0xaa, 0xb0, 0x6a, 0x9b, - 0xb5, 0xcc, 0x56, 0xe6, 0x5e, 0x5e, 0x5b, 0xb5, 0x4d, 0xb6, 0x05, 0x65, 0xd7, 0x0b, 0xbb, 0x33, - 0xc7, 0x31, 0x86, 0x8e, 0x55, 0x5b, 0xdd, 0xca, 0xdc, 0x2b, 0x6a, 0x32, 0x88, 0xbd, 0x01, 0x25, - 0x63, 0x16, 0x7a, 0xba, 0xed, 0x8e, 0xfc, 0x5a, 0x96, 0xf0, 0x45, 0x04, 0xb4, 0xdd, 0x91, 0xcf, - 0x2e, 0x42, 0xfe, 0xc4, 0x36, 0xc3, 0xa3, 0x5a, 0x8e, 0x72, 0xe4, 0x09, 0x84, 0x06, 0x23, 0xc3, - 0xb1, 0x6a, 0x79, 0x0e, 0xa5, 0x04, 0x42, 0x43, 0x2a, 0x64, 0x6d, 0x2b, 0x73, 0xaf, 0xa4, 0xf1, - 0x04, 0xbb, 0x01, 0x60, 0xb9, 0xb3, 0xc9, 0x4b, 0xc3, 0x99, 0x59, 0x41, 0xad, 0x40, 0x28, 0x09, - 0xa2, 0x7e, 0x1f, 0x4a, 0x93, 0xe0, 0x70, 0xd7, 0x32, 0x4c, 0xcb, 0x67, 0x57, 0xa0, 0x30, 0x09, - 0x0e, 0xf5, 0xd0, 0x38, 0x14, 0x4d, 0x58, 0x9b, 0x04, 0x87, 0x03, 0xe3, 0x90, 0x5d, 0x85, 0x22, - 0x21, 0xce, 0xa6, 0xbc, 0x0d, 0x79, 0x0d, 0x09, 0xb1, 0xc5, 0xea, 0x6f, 0xad, 0x41, 0xa1, 0x63, - 0x87, 0x96, 0x6f, 0x38, 0xec, 0x32, 0xac, 0xd9, 0x81, 0x3b, 0x73, 0x1c, 0x62, 0x2f, 0x6a, 0x22, - 0xc5, 0x2e, 0x43, 0xde, 0x7e, 0xf2, 0xd2, 0x70, 0x38, 0xef, 0xee, 0x8a, 0xc6, 0x93, 0xac, 0x06, - 0x6b, 0xf6, 0x87, 0x9f, 0x20, 0x22, 0x2b, 0x10, 0x22, 0x4d, 0x98, 0xc7, 0x8f, 0x10, 0x93, 0x8b, - 0x31, 0x94, 0x26, 0xcc, 0x27, 0x1f, 0x21, 0x06, 0x5b, 0x9f, 0x25, 0x0c, 0xa5, 0xb1, 0x94, 0x19, - 0x95, 0x82, 0x1d, 0xb0, 0x8e, 0xa5, 0xcc, 0xa2, 0x52, 0x66, 0xbc, 0x94, 0x82, 0x40, 0x88, 0x34, - 0x61, 0x78, 0x29, 0xc5, 0x18, 0x13, 0x97, 0x32, 0xe3, 0xa5, 0x94, 0xb6, 0x32, 0xf7, 0x72, 0x84, - 0xe1, 0xa5, 0x5c, 0x84, 0x9c, 0x89, 0x70, 0xd8, 0xca, 0xdc, 0xcb, 0xec, 0xae, 0x68, 0x94, 0x42, - 0x68, 0x80, 0xd0, 0x32, 0x76, 0x30, 0x42, 0x03, 0x01, 0x1d, 0x22, 0xb4, 0x82, 0xbd, 0x81, 0xd0, - 0xa1, 0x80, 0x8e, 0x11, 0xba, 0xbe, 0x95, 0xb9, 0xb7, 0x8a, 0x50, 0x4c, 0xb1, 0x6b, 0x50, 0x30, - 0x8d, 0xd0, 0x42, 0x44, 0x55, 0x34, 0x39, 0x02, 0x20, 0x0e, 0x67, 0x1c, 0xe2, 0x36, 0x44, 0xa3, - 0x23, 0x00, 0x53, 0xa1, 0x8c, 0x64, 0x11, 0x5e, 0x11, 0x78, 0x19, 0xc8, 0x3e, 0x86, 0x8a, 0x69, - 0x8d, 0xec, 0x89, 0xe1, 0xf0, 0x36, 0x6d, 0x6e, 0x65, 0xee, 0x95, 0x1f, 0x6d, 0x3c, 0xa0, 0x35, - 0x11, 0x63, 0x76, 0x57, 0xb4, 0x14, 0x19, 0x7b, 0x02, 0xeb, 0x22, 0xfd, 0xe1, 0x23, 0xea, 0x58, - 0x46, 0x7c, 0x4a, 0x8a, 0xef, 0xc3, 0x47, 0x4f, 0x76, 0x57, 0xb4, 0x34, 0x21, 0xbb, 0x03, 0x95, - 0x78, 0x89, 0x20, 0xe3, 0x05, 0x51, 0xab, 0x14, 0x14, 0x9b, 0xf5, 0x65, 0xe0, 0xb9, 0x48, 0x70, - 0x51, 0xf4, 0x5b, 0x04, 0x60, 0x5b, 0x00, 0xa6, 0x35, 0x36, 0x66, 0x4e, 0x88, 0xe8, 0x4b, 0xa2, - 0x03, 0x25, 0x18, 0xbb, 0x01, 0xa5, 0xd9, 0x14, 0x5b, 0xf9, 0xdc, 0x70, 0x6a, 0x97, 0x05, 0x41, - 0x02, 0xc2, 0xdc, 0x71, 0x9e, 0x23, 0xf6, 0x8a, 0x18, 0xdd, 0x08, 0x80, 0xc3, 0xfb, 0xd2, 0x1a, - 0x21, 0xaa, 0x26, 0x0a, 0x16, 0x69, 0x5c, 0x45, 0x76, 0xb0, 0x6d, 0xbb, 0xb5, 0xab, 0x34, 0x83, - 0x79, 0x82, 0x5d, 0x87, 0x6c, 0xe0, 0x8f, 0x6a, 0xd7, 0xa8, 0xfd, 0xc0, 0xdb, 0xdf, 0x3a, 0x9d, - 0xfa, 0x1a, 0x82, 0xb7, 0x0b, 0x90, 0xa7, 0xd5, 0xa4, 0x5e, 0x87, 0xe2, 0xbe, 0xe1, 0x1b, 0x13, - 0xcd, 0x1a, 0x33, 0x05, 0xb2, 0x53, 0x2f, 0x10, 0xeb, 0x08, 0x7f, 0xaa, 0x1d, 0x58, 0x7b, 0x6e, - 0xf8, 0x88, 0x63, 0x90, 0x73, 0x8d, 0x89, 0x45, 0xc8, 0x92, 0x46, 0xbf, 0x71, 0xed, 0x04, 0x67, - 0x41, 0x68, 0x4d, 0x84, 0x90, 0x10, 0x29, 0x84, 0x1f, 0x3a, 0xde, 0x50, 0xac, 0x91, 0xa2, 0x26, - 0x52, 0xea, 0x5f, 0xcb, 0xc0, 0x5a, 0xc3, 0x73, 0x30, 0xbb, 0x2b, 0x50, 0xf0, 0x2d, 0x47, 0x4f, - 0x8a, 0x5b, 0xf3, 0x2d, 0x67, 0xdf, 0x0b, 0x10, 0x31, 0xf2, 0x38, 0x82, 0xaf, 0xda, 0xb5, 0x91, - 0x47, 0x88, 0xa8, 0x02, 0x59, 0xa9, 0x02, 0x57, 0xa1, 0x18, 0x0e, 0x1d, 0x9d, 0xe0, 0x39, 0x82, - 0x17, 0xc2, 0xa1, 0xd3, 0x45, 0xd4, 0x15, 0x28, 0x98, 0x43, 0x8e, 0xc9, 0x13, 0x66, 0xcd, 0x1c, - 0x22, 0x42, 0xfd, 0x0c, 0x4a, 0x9a, 0x71, 0x22, 0xaa, 0x71, 0x09, 0xd6, 0x30, 0x03, 0x21, 0xff, - 0x72, 0x5a, 0x3e, 0x1c, 0x3a, 0x6d, 0x13, 0xc1, 0x58, 0x09, 0xdb, 0xa4, 0x3a, 0xe4, 0xb4, 0xfc, - 0xc8, 0x73, 0xda, 0xa6, 0x3a, 0x00, 0x68, 0x78, 0xbe, 0xff, 0xad, 0x9b, 0x70, 0x11, 0xf2, 0xa6, - 0x35, 0x0d, 0x8f, 0xb8, 0xe8, 0xd0, 0x78, 0x42, 0xbd, 0x0f, 0x45, 0x1c, 0x97, 0x8e, 0x1d, 0x84, - 0xec, 0x06, 0xe4, 0x1c, 0x3b, 0x08, 0x6b, 0x99, 0xad, 0xec, 0xdc, 0xa8, 0x11, 0x5c, 0xdd, 0x82, - 0xe2, 0x9e, 0x71, 0xfa, 0x1c, 0x47, 0x0e, 0x73, 0xa3, 0x21, 0x14, 0x43, 0x22, 0xc6, 0xb3, 0x02, - 0x30, 0x30, 0xfc, 0x43, 0x2b, 0x24, 0x49, 0xf7, 0x3f, 0x33, 0x50, 0xee, 0xcf, 0x86, 0x5f, 0xcd, - 0x2c, 0xff, 0x0c, 0xeb, 0x7c, 0x0f, 0xb2, 0xe1, 0xd9, 0x94, 0x38, 0xaa, 0x8f, 0x2e, 0xf3, 0xec, - 0x25, 0xfc, 0x03, 0x64, 0xd2, 0x90, 0x04, 0x1b, 0xe1, 0x7a, 0xa6, 0x15, 0xf5, 0x41, 0x5e, 0x5b, - 0xc3, 0x64, 0xdb, 0xc4, 0xed, 0xc2, 0x9b, 0x8a, 0x51, 0x58, 0xf5, 0xa6, 0x6c, 0x0b, 0xf2, 0xa3, - 0x23, 0xdb, 0x31, 0x69, 0x00, 0xd2, 0x75, 0xe6, 0x08, 0x1c, 0x25, 0xdf, 0x3b, 0xd1, 0x03, 0xfb, - 0x27, 0x91, 0xf8, 0x2f, 0xf8, 0xde, 0x49, 0xdf, 0xfe, 0x89, 0xa5, 0x0e, 0xc4, 0x1e, 0x04, 0xb0, - 0xd6, 0x6f, 0xd4, 0x3b, 0x75, 0x4d, 0x59, 0xc1, 0xdf, 0xad, 0xcf, 0xdb, 0xfd, 0x41, 0x5f, 0xc9, - 0xb0, 0x2a, 0x40, 0xb7, 0x37, 0xd0, 0x45, 0x7a, 0x95, 0xad, 0xc1, 0x6a, 0xbb, 0xab, 0x64, 0x91, - 0x06, 0xe1, 0xed, 0xae, 0x92, 0x63, 0x05, 0xc8, 0xd6, 0xbb, 0x5f, 0x28, 0x79, 0xfa, 0xd1, 0xe9, - 0x28, 0x6b, 0xea, 0x9f, 0xaf, 0x42, 0xa9, 0x37, 0xfc, 0xd2, 0x1a, 0x85, 0xd8, 0x66, 0x9c, 0xa5, - 0x96, 0xff, 0xd2, 0xf2, 0xa9, 0xd9, 0x59, 0x4d, 0xa4, 0xb0, 0x21, 0xe6, 0x90, 0x1a, 0x97, 0xd5, - 0x56, 0xcd, 0x21, 0xd1, 0x8d, 0x8e, 0xac, 0x89, 0x41, 0x8d, 0x43, 0x3a, 0x4a, 0xe1, 0xaa, 0xf0, - 0x86, 0x5f, 0x52, 0xf3, 0xb2, 0x1a, 0xfe, 0x64, 0x37, 0xa1, 0xcc, 0xf3, 0x90, 0xe7, 0x17, 0x70, - 0xd0, 0xfc, 0xe4, 0x5b, 0x93, 0x27, 0x1f, 0x71, 0x52, 0xae, 0x1c, 0x29, 0xf6, 0x36, 0x0e, 0xea, - 0x8a, 0x19, 0xed, 0x0d, 0xbf, 0xe4, 0xd8, 0x22, 0x9f, 0xd1, 0xde, 0xf0, 0x4b, 0x42, 0xbd, 0x0b, - 0x9b, 0xc1, 0x6c, 0x18, 0x8c, 0x7c, 0x7b, 0x1a, 0xda, 0x9e, 0xcb, 0x69, 0x4a, 0x44, 0xa3, 0xc8, - 0x08, 0x22, 0xbe, 0x07, 0xc5, 0xe9, 0x6c, 0xa8, 0xdb, 0xee, 0xd8, 0x23, 0xb1, 0x5f, 0x7e, 0xb4, - 0xce, 0x07, 0x66, 0x7f, 0x36, 0x6c, 0xbb, 0x63, 0x4f, 0x2b, 0x4c, 0xf9, 0x0f, 0xa6, 0xc2, 0xba, - 0xeb, 0x85, 0x3a, 0xaa, 0x0a, 0xfa, 0xc4, 0x0a, 0x0d, 0xda, 0x0f, 0xf8, 0x86, 0xdf, 0xf1, 0x46, - 0xc7, 0x7b, 0x56, 0x68, 0xa8, 0x77, 0xa1, 0x20, 0xf8, 0x70, 0xef, 0x0f, 0x2d, 0xd7, 0x70, 0x43, - 0x3d, 0x56, 0x1a, 0x8a, 0x1c, 0xd0, 0x36, 0xd5, 0x3f, 0xc8, 0x80, 0xd2, 0x97, 0xaa, 0x82, 0xcc, - 0x4b, 0x25, 0xc7, 0x9b, 0x00, 0xc6, 0x68, 0xe4, 0xcd, 0x78, 0x36, 0x7c, 0x82, 0x95, 0x04, 0xa4, - 0x6d, 0xca, 0xfd, 0x97, 0x4d, 0xf5, 0xdf, 0x2d, 0xa8, 0x44, 0x7c, 0xd2, 0xa2, 0x2f, 0x0b, 0x58, - 0xd4, 0x83, 0xc1, 0x2c, 0xb5, 0xf2, 0x0b, 0xc1, 0x8c, 0x73, 0x5f, 0x86, 0x35, 0xd2, 0x30, 0x82, - 0x68, 0x54, 0x78, 0x4a, 0xfd, 0xf7, 0x19, 0x58, 0x6f, 0xbb, 0xa6, 0x75, 0xda, 0x1f, 0x19, 0x6e, - 0xd4, 0x29, 0x76, 0xa0, 0xdb, 0x08, 0xd3, 0x83, 0x91, 0xe1, 0x0a, 0xe5, 0xa0, 0x6c, 0x07, 0x31, - 0x1d, 0xb6, 0x81, 0x13, 0x50, 0x51, 0xab, 0x94, 0x63, 0x89, 0x20, 0x54, 0xd8, 0x5d, 0xd8, 0x18, - 0x5a, 0x8e, 0xe7, 0x1e, 0xea, 0xa1, 0xa7, 0x73, 0x2d, 0x87, 0xb7, 0x65, 0x9d, 0x83, 0x07, 0xde, - 0x80, 0xb4, 0x9d, 0x8b, 0x90, 0x9f, 0x1a, 0x7e, 0x18, 0xd4, 0x72, 0x5b, 0x59, 0x5c, 0xc6, 0x94, - 0xc0, 0x6e, 0xb6, 0x03, 0x7d, 0xe6, 0xda, 0x5f, 0xcd, 0x78, 0x33, 0x8a, 0x5a, 0xd1, 0x0e, 0x0e, - 0x28, 0xcd, 0xee, 0x81, 0xc2, 0x4b, 0xa6, 0x6c, 0xe5, 0x79, 0x56, 0x25, 0x38, 0x65, 0x4c, 0xc2, - 0xee, 0x6f, 0xac, 0x42, 0x71, 0x67, 0xe6, 0x8e, 0x70, 0x30, 0xd8, 0x6d, 0xc8, 0x8d, 0x67, 0xee, - 0x88, 0xda, 0x12, 0x6f, 0xa5, 0xf1, 0x3a, 0xd1, 0x08, 0x89, 0x12, 0xc8, 0xf0, 0x0f, 0x51, 0x72, - 0x2d, 0x48, 0x20, 0x84, 0xab, 0x7f, 0x94, 0xe1, 0x39, 0xee, 0x38, 0xc6, 0x21, 0x2b, 0x42, 0xae, - 0xdb, 0xeb, 0xb6, 0x94, 0x15, 0x56, 0x81, 0x62, 0xbb, 0x3b, 0x68, 0x69, 0xdd, 0x7a, 0x47, 0xc9, - 0xd0, 0x72, 0x1e, 0xd4, 0xb7, 0x3b, 0x2d, 0x65, 0x15, 0x31, 0xcf, 0x7b, 0x9d, 0xfa, 0xa0, 0xdd, - 0x69, 0x29, 0x39, 0x8e, 0xd1, 0xda, 0x8d, 0x81, 0x52, 0x64, 0x0a, 0x54, 0xf6, 0xb5, 0x5e, 0xf3, - 0xa0, 0xd1, 0xd2, 0xbb, 0x07, 0x9d, 0x8e, 0xa2, 0xb0, 0x0b, 0xb0, 0x11, 0x43, 0x7a, 0x1c, 0xb8, - 0x85, 0x2c, 0xcf, 0xeb, 0x5a, 0x5d, 0x7b, 0xaa, 0xfc, 0x80, 0x15, 0x21, 0x5b, 0x7f, 0xfa, 0x54, - 0xf9, 0x29, 0x4a, 0x86, 0xd2, 0x8b, 0x76, 0x57, 0x7f, 0x5e, 0xef, 0x1c, 0xb4, 0x94, 0x9f, 0xae, - 0x46, 0xe9, 0x9e, 0xd6, 0x6c, 0x69, 0xca, 0x4f, 0x73, 0x6c, 0x13, 0x2a, 0x3f, 0xee, 0x75, 0x5b, - 0x7b, 0xf5, 0xfd, 0x7d, 0xaa, 0xc8, 0x4f, 0x8b, 0xea, 0x7f, 0xcb, 0x41, 0x0e, 0x5b, 0xc2, 0xd4, - 0x44, 0x0a, 0xc6, 0x4d, 0x44, 0x31, 0xb4, 0x9d, 0xfb, 0xd3, 0xbf, 0xbc, 0xb9, 0xc2, 0xe5, 0xdf, - 0x2d, 0xc8, 0x3a, 0x76, 0x48, 0xc3, 0x1a, 0xaf, 0x1d, 0xa1, 0x33, 0xee, 0xae, 0x68, 0x88, 0x63, - 0x37, 0x20, 0xc3, 0x05, 0x61, 0xf9, 0x51, 0x55, 0x2c, 0x2e, 0xb1, 0x93, 0xee, 0xae, 0x68, 0x99, - 0x29, 0xbb, 0x0e, 0x99, 0x97, 0x42, 0x2a, 0x56, 0x38, 0x9e, 0xef, 0xa5, 0x88, 0x7d, 0xc9, 0xb6, - 0x20, 0x3b, 0xf2, 0xb8, 0x46, 0x18, 0xe3, 0xf9, 0xce, 0x82, 0xf9, 0x8f, 0x3c, 0x87, 0xdd, 0x86, - 0xac, 0x6f, 0x9c, 0xd0, 0xc8, 0xc6, 0xc3, 0x15, 0x6f, 0x5d, 0x48, 0xe4, 0x1b, 0x27, 0x58, 0x89, - 0x31, 0xc9, 0x91, 0xb8, 0x12, 0xd1, 0x78, 0x63, 0x31, 0x63, 0xb6, 0x05, 0x99, 0x13, 0x92, 0x24, - 0xb1, 0x12, 0xf4, 0xc2, 0x76, 0x4d, 0xef, 0xa4, 0x3f, 0xb5, 0x46, 0x48, 0x71, 0xc2, 0xde, 0x82, - 0x6c, 0x30, 0x1b, 0x92, 0x24, 0x29, 0x3f, 0xda, 0x5c, 0xd8, 0x13, 0xb0, 0xa0, 0x60, 0x36, 0x64, - 0x77, 0x21, 0x37, 0xf2, 0x7c, 0x5f, 0x48, 0x13, 0x25, 0xaa, 0x70, 0xb4, 0x1d, 0xa2, 0x52, 0x88, - 0x78, 0x2c, 0x30, 0x24, 0x19, 0x12, 0x13, 0x25, 0xfb, 0x11, 0x16, 0x18, 0xb2, 0x3b, 0x62, 0x93, - 0xab, 0xc8, 0xb5, 0x8e, 0xb6, 0x40, 0xcc, 0x07, 0xb1, 0x38, 0x48, 0x13, 0xe3, 0x94, 0x34, 0xce, - 0x98, 0x28, 0xda, 0xfb, 0xb0, 0x4e, 0x13, 0xe3, 0x94, 0xdd, 0x81, 0xec, 0x4b, 0x6b, 0x44, 0xca, - 0x67, 0x5c, 0x9a, 0x18, 0xa4, 0xe7, 0xd4, 0x3c, 0x44, 0xd3, 0xbc, 0xf7, 0x1c, 0x93, 0xf4, 0xd0, - 0x78, 0x2c, 0x77, 0x3c, 0xc7, 0x7c, 0x4e, 0x63, 0x49, 0x48, 0xdc, 0xf2, 0x8d, 0xd9, 0x29, 0x4a, - 0x23, 0x85, 0x6f, 0xce, 0xc6, 0xec, 0xb4, 0x6d, 0xa2, 0xf0, 0x77, 0xcd, 0x97, 0xa4, 0x7d, 0x66, - 0x34, 0xfc, 0x89, 0xe6, 0x51, 0x60, 0x39, 0xd6, 0x28, 0xb4, 0x5f, 0xda, 0xe1, 0x19, 0xe9, 0x97, - 0x19, 0x4d, 0x06, 0x6d, 0xaf, 0x41, 0xce, 0x3a, 0x9d, 0xfa, 0xea, 0x2e, 0x14, 0x44, 0x29, 0x0b, - 0x36, 0xd6, 0x55, 0x28, 0xda, 0x81, 0x3e, 0xf2, 0xdc, 0x20, 0x14, 0xba, 0x53, 0xc1, 0x0e, 0x1a, - 0x98, 0x44, 0x71, 0x69, 0x1a, 0x21, 0xdf, 0x84, 0x2a, 0x1a, 0xfd, 0x56, 0x1f, 0x01, 0x24, 0xcd, - 0xc2, 0x3a, 0x39, 0x96, 0x1b, 0xa9, 0x69, 0x8e, 0xe5, 0xc6, 0x3c, 0xab, 0x12, 0xcf, 0x55, 0x28, - 0xc5, 0x9a, 0x31, 0xab, 0x40, 0xc6, 0x10, 0xdb, 0x5f, 0xc6, 0x50, 0xef, 0xa1, 0xa2, 0x1a, 0xe9, - 0xbe, 0x69, 0x1c, 0xa6, 0xa2, 0x4d, 0x31, 0x33, 0x54, 0xbf, 0x0b, 0x15, 0xcd, 0x0a, 0x66, 0x4e, - 0xd8, 0xf0, 0x9c, 0xa6, 0x35, 0x66, 0xef, 0x01, 0xc4, 0xe9, 0x40, 0x68, 0x29, 0xc9, 0xdc, 0x6d, - 0x5a, 0x63, 0x4d, 0xc2, 0xab, 0xff, 0x30, 0x47, 0xfa, 0x5e, 0x93, 0x2b, 0x5a, 0x42, 0xa3, 0xca, - 0x48, 0x1a, 0x55, 0xbc, 0x37, 0xac, 0xa6, 0xb5, 0xca, 0x23, 0xdb, 0x34, 0x2d, 0x37, 0xd2, 0x1e, - 0x79, 0x0a, 0x07, 0xdb, 0x70, 0x0e, 0x69, 0x41, 0x55, 0x1f, 0xb1, 0xa8, 0xd0, 0xc9, 0xd4, 0xb7, - 0x82, 0x80, 0xeb, 0x2d, 0x86, 0x73, 0x18, 0xad, 0xed, 0xfc, 0xab, 0xd6, 0xf6, 0x55, 0x28, 0xe2, - 0x96, 0x47, 0x56, 0xdf, 0x1a, 0xef, 0x7d, 0x61, 0xde, 0xb2, 0xb7, 0xa1, 0x20, 0xf4, 0x75, 0xb1, - 0xa8, 0xc4, 0x74, 0x69, 0x72, 0xa0, 0x16, 0x61, 0x59, 0x0d, 0x95, 0xbc, 0xc9, 0xc4, 0x72, 0xc3, - 0x68, 0x9f, 0x16, 0x49, 0xf6, 0x2e, 0x94, 0x3c, 0x57, 0xe7, 0x4a, 0xbd, 0x58, 0x55, 0x62, 0xfa, - 0xf6, 0xdc, 0x03, 0x82, 0x6a, 0x45, 0x4f, 0xfc, 0xc2, 0xaa, 0x38, 0xde, 0x89, 0x3e, 0x32, 0x7c, - 0x93, 0x56, 0x56, 0x51, 0x2b, 0x38, 0xde, 0x49, 0xc3, 0xf0, 0x4d, 0xae, 0xb7, 0x7c, 0xe5, 0xce, - 0x26, 0xb4, 0x9a, 0xd6, 0x35, 0x91, 0x62, 0xd7, 0xa1, 0x34, 0x72, 0x66, 0x41, 0x68, 0xf9, 0xdb, - 0x67, 0xdc, 0x4c, 0xd3, 0x12, 0x00, 0xd6, 0x6b, 0xea, 0xdb, 0x13, 0xc3, 0x3f, 0xa3, 0xa5, 0x53, - 0xd4, 0xa2, 0x24, 0x6d, 0x34, 0xc7, 0xb6, 0x79, 0xca, 0x6d, 0x35, 0x8d, 0x27, 0x90, 0xfe, 0x88, - 0x2c, 0xe9, 0x80, 0xd6, 0x47, 0x51, 0x8b, 0x92, 0x34, 0x0e, 0xf4, 0x93, 0x56, 0x44, 0x49, 0x13, - 0xa9, 0x94, 0xd2, 0xbd, 0x79, 0xae, 0xd2, 0xcd, 0xe6, 0xf5, 0x1e, 0xcf, 0xb7, 0x0f, 0x6d, 0xa1, - 0xb5, 0x5c, 0xe0, 0x7a, 0x0f, 0x07, 0xd1, 0x46, 0xf5, 0x15, 0x14, 0x44, 0x17, 0xe3, 0x0e, 0x84, - 0xcb, 0x27, 0x2d, 0x9e, 0xf9, 0x0e, 0x84, 0x70, 0x76, 0x1b, 0xd6, 0x45, 0x5e, 0x41, 0xe8, 0xdb, - 0xee, 0xa1, 0x98, 0x3c, 0x15, 0x0e, 0xec, 0x13, 0x0c, 0x15, 0x05, 0x1c, 0x5e, 0xdd, 0x18, 0xda, - 0x0e, 0x2e, 0xd3, 0xac, 0x50, 0x6a, 0x66, 0x8e, 0x53, 0xe7, 0x20, 0xb5, 0x07, 0xc5, 0x68, 0x40, - 0x7e, 0x21, 0x65, 0xaa, 0xbf, 0x9e, 0x81, 0x32, 0xa9, 0x07, 0x3d, 0x52, 0x7e, 0xd8, 0x7b, 0xc0, - 0x46, 0xbe, 0x65, 0x84, 0x96, 0x6e, 0x9d, 0x86, 0xbe, 0x21, 0x94, 0x00, 0xae, 0x49, 0x28, 0x1c, - 0xd3, 0x42, 0x04, 0xd7, 0x03, 0x6e, 0x42, 0x79, 0x6a, 0xf8, 0x41, 0xa4, 0x54, 0xf2, 0x02, 0x80, - 0x83, 0x84, 0x4a, 0xa7, 0xb8, 0x87, 0xbe, 0x31, 0xd1, 0x43, 0xef, 0xd8, 0x72, 0xb9, 0x3a, 0xcd, - 0x0d, 0x89, 0x2a, 0xc1, 0x07, 0x08, 0x26, 0xad, 0xfa, 0x3f, 0x66, 0x60, 0x7d, 0x9f, 0x8f, 0xfa, - 0x33, 0xeb, 0xac, 0xc9, 0xad, 0xb7, 0x51, 0xb4, 0x62, 0x73, 0x1a, 0xfd, 0x66, 0x37, 0xa0, 0x3c, - 0x3d, 0xb6, 0xce, 0xf4, 0x94, 0xa5, 0x53, 0x42, 0x50, 0x83, 0xd6, 0xe6, 0x3b, 0xb0, 0xe6, 0x51, - 0x43, 0xc4, 0x1e, 0x27, 0xb6, 0x06, 0xa9, 0x85, 0x9a, 0x20, 0x40, 0x75, 0x29, 0xce, 0x4a, 0xd6, - 0xcb, 0x44, 0x66, 0x54, 0xfd, 0x8b, 0x90, 0x47, 0x54, 0x50, 0xcb, 0x73, 0x3d, 0x87, 0x12, 0xec, - 0x03, 0x58, 0x1f, 0x79, 0x93, 0xa9, 0x1e, 0xb1, 0x8b, 0xdd, 0x2e, 0x2d, 0x53, 0xca, 0x48, 0xb2, - 0xcf, 0xf3, 0x52, 0x7f, 0x27, 0x0b, 0x45, 0xaa, 0x83, 0x10, 0x2b, 0xb6, 0x79, 0x1a, 0x89, 0x95, - 0x92, 0x96, 0xb7, 0x4d, 0x94, 0xda, 0xaf, 0x51, 0xcd, 0x62, 0x95, 0x2b, 0x2b, 0xab, 0x5c, 0x97, - 0x61, 0x4d, 0xe8, 0x5b, 0x39, 0x2e, 0x77, 0x66, 0xe7, 0x6b, 0x5b, 0xf9, 0x65, 0xda, 0x16, 0x0e, - 0x21, 0xa7, 0xb1, 0x4e, 0x71, 0x7f, 0xe3, 0xa2, 0x05, 0x08, 0xd4, 0x42, 0x88, 0x2c, 0x34, 0x0a, - 0x69, 0xa1, 0x51, 0x83, 0xc2, 0x4b, 0x3b, 0xb0, 0x71, 0x82, 0x14, 0xf9, 0x32, 0x14, 0x49, 0x69, - 0x18, 0x4a, 0xaf, 0x1b, 0x86, 0xb8, 0xd9, 0x86, 0x73, 0xc8, 0xd5, 0xfe, 0xa8, 0xd9, 0x75, 0xe7, - 0xd0, 0x63, 0x1f, 0xc2, 0xa5, 0x04, 0x2d, 0x5a, 0x43, 0xee, 0x31, 0xf2, 0x00, 0x69, 0x2c, 0xa6, - 0xa4, 0x16, 0x91, 0x5d, 0x76, 0x1f, 0x36, 0x25, 0x96, 0x29, 0xaa, 0x37, 0x01, 0xc9, 0x9c, 0x92, - 0xb6, 0x11, 0x93, 0x93, 0xd6, 0x13, 0xa8, 0xff, 0x72, 0x15, 0xd6, 0x77, 0x3c, 0xdf, 0xb2, 0x0f, - 0xdd, 0x64, 0xd6, 0x2d, 0x68, 0xfe, 0xd1, 0x4c, 0x5c, 0x95, 0x66, 0xe2, 0x4d, 0x28, 0x8f, 0x39, - 0xa3, 0x1e, 0x0e, 0xb9, 0xd3, 0x20, 0xa7, 0x81, 0x00, 0x0d, 0x86, 0x0e, 0xae, 0xe6, 0x88, 0x80, - 0x98, 0x73, 0xc4, 0x1c, 0x31, 0xe1, 0x5e, 0xc3, 0xbe, 0x43, 0x52, 0xd7, 0xb4, 0x1c, 0x2b, 0xe4, - 0xc3, 0x53, 0x7d, 0xf4, 0x66, 0xb4, 0xd3, 0x4b, 0x75, 0x7a, 0xa0, 0x59, 0xe3, 0x3a, 0xa9, 0x47, - 0x28, 0x84, 0x9b, 0x44, 0x2e, 0x78, 0x85, 0xc4, 0x5e, 0xfb, 0x9a, 0xbc, 0x5c, 0x72, 0xa8, 0x03, - 0x28, 0xc5, 0x60, 0xd4, 0x75, 0xb5, 0x96, 0xd0, 0x6f, 0x57, 0x58, 0x19, 0x0a, 0x8d, 0x7a, 0xbf, - 0x51, 0x6f, 0xb6, 0x94, 0x0c, 0xa2, 0xfa, 0xad, 0x01, 0xd7, 0x69, 0x57, 0xd9, 0x06, 0x94, 0x31, - 0xd5, 0x6c, 0xed, 0xd4, 0x0f, 0x3a, 0x03, 0x25, 0xcb, 0xd6, 0xa1, 0xd4, 0xed, 0xe9, 0xf5, 0xc6, - 0xa0, 0xdd, 0xeb, 0x2a, 0x39, 0xf5, 0x07, 0x50, 0x6c, 0x1c, 0x59, 0xa3, 0xe3, 0xf3, 0x7a, 0x91, - 0x8c, 0x6e, 0x6b, 0x74, 0x2c, 0xf4, 0xd3, 0x39, 0xa3, 0xdb, 0x1a, 0x1d, 0xab, 0x2d, 0x28, 0xed, - 0x1b, 0x7e, 0x68, 0x53, 0xbd, 0x9e, 0xc0, 0x7a, 0x9c, 0x68, 0x5a, 0xe3, 0x68, 0xe7, 0x66, 0xb1, - 0xd6, 0x1a, 0xa3, 0xb4, 0x34, 0xa1, 0xfa, 0x1e, 0x54, 0x64, 0x00, 0xbb, 0x0e, 0x59, 0xd3, 0x1a, - 0x2f, 0x91, 0x93, 0x08, 0x56, 0x9f, 0x43, 0xa5, 0x11, 0xed, 0x44, 0xe7, 0x55, 0xfd, 0x11, 0x54, - 0x69, 0xc5, 0x8f, 0x86, 0xd1, 0x92, 0x5f, 0x5d, 0xb2, 0xe4, 0x2b, 0x48, 0xd3, 0x18, 0x8a, 0x35, - 0xff, 0x31, 0x94, 0xf7, 0x7d, 0x6f, 0x6a, 0xf9, 0x21, 0x65, 0xab, 0x40, 0xf6, 0xd8, 0x3a, 0x13, - 0xb9, 0xe2, 0xcf, 0xc4, 0x17, 0xb2, 0x2a, 0xfb, 0x42, 0x1e, 0x41, 0x31, 0x62, 0xfb, 0xda, 0x3c, - 0xdf, 0x47, 0xd1, 0x49, 0x3c, 0xb6, 0x15, 0x60, 0x61, 0x0f, 0x00, 0xa6, 0x31, 0x40, 0x74, 0x5c, - 0xa4, 0xee, 0x8b, 0xcc, 0x35, 0x89, 0x42, 0x7d, 0x13, 0x0a, 0xcf, 0x6d, 0xeb, 0x44, 0x34, 0xff, - 0xa5, 0x6d, 0x9d, 0x44, 0xcd, 0xc7, 0xdf, 0xea, 0x5f, 0x94, 0xa0, 0x48, 0xeb, 0xab, 0x79, 0xbe, - 0xfb, 0xe9, 0x9b, 0x68, 0x45, 0x5b, 0x62, 0x3d, 0xe5, 0x96, 0xe8, 0x62, 0x7c, 0x75, 0xbd, 0x09, - 0x20, 0xad, 0x75, 0x2e, 0xb9, 0x4a, 0x61, 0xbc, 0xc4, 0x51, 0x9d, 0xa0, 0xbd, 0x28, 0xf8, 0xca, - 0x11, 0x56, 0x64, 0x02, 0x60, 0x0f, 0xf8, 0x66, 0x4f, 0x76, 0x23, 0x57, 0x88, 0x2e, 0x44, 0x4a, - 0xfd, 0xd0, 0xb1, 0x22, 0x53, 0x83, 0x34, 0x00, 0x4c, 0x90, 0x1c, 0xb3, 0xfc, 0x00, 0xc5, 0x15, - 0xf9, 0xa7, 0xb5, 0x28, 0xc9, 0xde, 0x86, 0x1c, 0x0a, 0x79, 0x61, 0x1a, 0x5c, 0x88, 0x7a, 0x50, - 0xda, 0xa5, 0x34, 0x22, 0x60, 0xf7, 0xa0, 0x40, 0xa2, 0xc5, 0x42, 0x49, 0x23, 0xf5, 0x76, 0x24, - 0xf4, 0xb5, 0x08, 0xcd, 0xde, 0x81, 0xfc, 0xf8, 0xd8, 0x3a, 0x0b, 0x6a, 0xeb, 0x44, 0x77, 0x61, - 0xc9, 0x9a, 0xd5, 0x38, 0x05, 0xbb, 0x03, 0x55, 0xdf, 0x1a, 0xeb, 0xe4, 0x90, 0x42, 0x21, 0x13, - 0xd4, 0xaa, 0x24, 0x43, 0x2a, 0xbe, 0x35, 0x6e, 0x20, 0x70, 0x30, 0x74, 0x02, 0x76, 0x17, 0xd6, - 0x68, 0xf5, 0xa0, 0x2e, 0x24, 0x95, 0x1c, 0x2d, 0x45, 0x4d, 0x60, 0xd9, 0x87, 0x00, 0x42, 0xe3, - 0xd2, 0x87, 0x67, 0xe4, 0xc8, 0x8d, 0x17, 0x93, 0x3c, 0xff, 0x65, 0xbd, 0xec, 0x6d, 0xc8, 0xe3, - 0x24, 0x09, 0x6a, 0x57, 0x28, 0xe7, 0xcd, 0xf4, 0x0c, 0xa2, 0x9a, 0x12, 0x9e, 0xdd, 0x83, 0x22, - 0x4e, 0x14, 0x1d, 0x87, 0xa3, 0x26, 0xab, 0xa0, 0x62, 0x56, 0xe1, 0xce, 0x60, 0x9d, 0xf4, 0xbf, - 0x72, 0xd8, 0x7d, 0xc8, 0x99, 0xb8, 0x98, 0xaf, 0x52, 0x8e, 0x97, 0xa5, 0x71, 0x41, 0x61, 0xd5, - 0xb4, 0xc6, 0xa4, 0x15, 0x13, 0x0d, 0xdb, 0x85, 0x2a, 0x4e, 0xa3, 0x47, 0xb4, 0xd9, 0x63, 0xf7, - 0xd5, 0xae, 0x11, 0xd7, 0xad, 0x39, 0xae, 0xae, 0x20, 0xa2, 0xce, 0x6e, 0xb9, 0xa1, 0x7f, 0xa6, - 0xad, 0xbb, 0x32, 0x8c, 0x5d, 0x43, 0xd3, 0xa5, 0xe3, 0x8d, 0x8e, 0x2d, 0xb3, 0xf6, 0x46, 0xe4, - 0x98, 0xe0, 0x69, 0xf6, 0x19, 0xac, 0xd3, 0xc4, 0xc2, 0x24, 0x16, 0x5e, 0xbb, 0x4e, 0xc2, 0x54, - 0x9e, 0x32, 0x11, 0x4a, 0x4b, 0x53, 0xa2, 0x88, 0xb7, 0x03, 0x3d, 0xb4, 0x26, 0x53, 0xcf, 0x47, - 0xe5, 0xf5, 0xcd, 0xc8, 0xe1, 0x32, 0x88, 0x40, 0xb8, 0x11, 0xc7, 0xc7, 0x4e, 0xba, 0x37, 0x1e, - 0x07, 0x56, 0x58, 0xbb, 0x41, 0xeb, 0xa6, 0x1a, 0x9d, 0x3e, 0xf5, 0x08, 0x4a, 0x1b, 0x61, 0xa0, - 0x9b, 0x67, 0xae, 0x31, 0xb1, 0x47, 0xb5, 0x9b, 0x5c, 0x47, 0xb6, 0x83, 0x26, 0x07, 0xc8, 0x6a, - 0xea, 0x56, 0x4a, 0x4d, 0xbd, 0x00, 0x79, 0x73, 0x88, 0xcb, 0xf1, 0x16, 0x65, 0x9b, 0x33, 0x87, - 0x6d, 0x93, 0xbd, 0x0f, 0xa5, 0x69, 0x24, 0x02, 0x6b, 0xaa, 0x6c, 0x8c, 0xc7, 0x92, 0x51, 0x4b, - 0x28, 0xd0, 0x3e, 0xdc, 0xb1, 0x8c, 0x70, 0xe6, 0x5b, 0x3b, 0x8e, 0x71, 0x58, 0xbb, 0x4d, 0x39, - 0xc9, 0x20, 0xac, 0x9d, 0xe3, 0x1d, 0xda, 0x23, 0x83, 0x56, 0xfe, 0x1d, 0xae, 0x77, 0x09, 0x48, - 0xdb, 0x4c, 0x74, 0x4d, 0x43, 0x28, 0x53, 0x6f, 0xc9, 0xba, 0xa6, 0x41, 0xda, 0xd4, 0xb5, 0xa7, - 0xa4, 0x2f, 0x53, 0xcf, 0x7d, 0x3c, 0x27, 0xa0, 0x52, 0xcb, 0x4b, 0x92, 0x64, 0xbb, 0x2b, 0xb2, - 0x9c, 0xda, 0xce, 0x93, 0x24, 0xbf, 0xf6, 0x03, 0x60, 0x8b, 0x63, 0xfe, 0x3a, 0x69, 0x99, 0x17, - 0xd2, 0xf2, 0x3b, 0xab, 0x4f, 0x32, 0xea, 0x73, 0x58, 0x4f, 0x09, 0x83, 0xa5, 0x52, 0x9f, 0xab, - 0x5c, 0xc6, 0x44, 0x98, 0xa8, 0x3c, 0x21, 0xbc, 0x5c, 0x81, 0xed, 0x1e, 0x0a, 0xef, 0x18, 0x4d, - 0xa6, 0x3e, 0xa5, 0xd5, 0x3f, 0xcf, 0x42, 0x65, 0xd7, 0x08, 0x8e, 0xf6, 0x8c, 0x69, 0x3f, 0x34, - 0xc2, 0x00, 0xa7, 0xc8, 0x91, 0x11, 0x1c, 0x4d, 0x8c, 0x29, 0x57, 0x7e, 0x33, 0xdc, 0xf4, 0x16, - 0x30, 0xd4, 0x7c, 0x71, 0x72, 0x62, 0xb2, 0xe7, 0xee, 0x3f, 0x13, 0x76, 0x75, 0x9c, 0x46, 0xd1, - 0x14, 0x1c, 0xcd, 0xc6, 0xe3, 0xb8, 0xa8, 0x28, 0xc9, 0xee, 0xc0, 0xba, 0xf8, 0x49, 0x9a, 0xef, - 0xa9, 0x38, 0xba, 0x4c, 0x03, 0xd9, 0x63, 0x28, 0x0b, 0xc0, 0x20, 0x12, 0xa4, 0xd5, 0xd8, 0x5f, - 0x92, 0x20, 0x34, 0x99, 0x8a, 0xfd, 0x08, 0x2e, 0x49, 0xc9, 0x1d, 0xcf, 0xdf, 0x9b, 0x39, 0xa1, - 0xdd, 0xe8, 0x0a, 0x35, 0xe3, 0x8d, 0x05, 0xf6, 0x84, 0x44, 0x5b, 0xce, 0x99, 0xae, 0xed, 0x9e, - 0xed, 0x92, 0x5c, 0xce, 0x6a, 0x69, 0xe0, 0x1c, 0x95, 0x71, 0x4a, 0xe2, 0x38, 0x4d, 0x65, 0x9c, - 0xe2, 0x82, 0x15, 0x80, 0x3d, 0x2b, 0x3c, 0xf2, 0x4c, 0xd2, 0x31, 0xe3, 0x05, 0xdb, 0x97, 0x51, - 0x5a, 0x9a, 0x12, 0xbb, 0x13, 0xad, 0xa9, 0x91, 0x1b, 0x92, 0xa6, 0x99, 0xd5, 0xa2, 0x24, 0x6e, - 0x55, 0xbe, 0xe1, 0x1e, 0x5a, 0x41, 0xad, 0xbc, 0x95, 0xbd, 0x97, 0xd1, 0x44, 0x4a, 0xfd, 0xfb, - 0xab, 0x90, 0xe7, 0x23, 0xf9, 0x06, 0x94, 0x86, 0xe4, 0x70, 0x46, 0xeb, 0x56, 0x38, 0x91, 0x09, - 0xd0, 0x9d, 0x4d, 0xb8, 0x86, 0x28, 0xfc, 0x22, 0x19, 0x8d, 0x7e, 0x63, 0x96, 0xde, 0x2c, 0xc4, - 0xb2, 0xb2, 0x04, 0x15, 0x29, 0xac, 0x84, 0xef, 0x9d, 0xd0, 0x6c, 0xc8, 0x11, 0x22, 0x4a, 0x92, - 0x9f, 0x9a, 0x76, 0x3d, 0x64, 0xca, 0x13, 0xae, 0x48, 0x80, 0x86, 0x1b, 0xce, 0xfb, 0x70, 0xd6, - 0x16, 0x7c, 0x38, 0xec, 0x06, 0xa0, 0xfe, 0x39, 0xb2, 0x7a, 0xae, 0xd5, 0xe8, 0x52, 0x0f, 0x17, - 0x35, 0x09, 0x82, 0x0b, 0xc4, 0xf4, 0xa6, 0xd4, 0xa9, 0x79, 0x0d, 0x7f, 0xb2, 0x4f, 0xe2, 0xd9, - 0x49, 0x6d, 0x14, 0xda, 0xba, 0xd8, 0x15, 0xe4, 0x79, 0xac, 0xa5, 0xe8, 0x30, 0x27, 0x14, 0xf5, - 0x5c, 0x5b, 0xc7, 0x9f, 0x6a, 0x0b, 0x40, 0xf3, 0x4e, 0x02, 0x2b, 0x24, 0x67, 0xe5, 0x15, 0x6a, - 0x62, 0xea, 0x98, 0xc9, 0x3b, 0xd9, 0xf7, 0x82, 0xd8, 0x66, 0x5d, 0x5d, 0x6e, 0xb3, 0xaa, 0x0f, - 0xa1, 0x80, 0x7a, 0x80, 0x11, 0x1a, 0xec, 0x8e, 0xf0, 0x0f, 0x71, 0xed, 0x45, 0x38, 0xca, 0x92, - 0x32, 0x84, 0xc7, 0xa8, 0x13, 0x95, 0x4b, 0x3c, 0xb7, 0x24, 0x93, 0x31, 0xde, 0x83, 0x44, 0x86, - 0x42, 0xb3, 0x78, 0x03, 0x4a, 0x58, 0x35, 0xf2, 0xbd, 0x0b, 0xb9, 0x50, 0xf4, 0xbd, 0x93, 0x06, - 0xa6, 0xd5, 0xff, 0x94, 0x81, 0x72, 0xcf, 0x37, 0x71, 0xf3, 0xeb, 0x4f, 0xad, 0xd1, 0x6b, 0x4d, - 0x6c, 0xd4, 0x43, 0x3c, 0xc7, 0x31, 0x48, 0xcc, 0x0a, 0x93, 0x2d, 0x06, 0xb0, 0x0f, 0x21, 0x37, - 0x46, 0x71, 0x9a, 0x95, 0xb5, 0x73, 0x29, 0xfb, 0xe8, 0x37, 0x0a, 0x58, 0x8d, 0x48, 0xd5, 0x5f, - 0x89, 0xcb, 0x27, 0xa9, 0x2b, 0x7b, 0xa8, 0x57, 0xe8, 0xac, 0xa8, 0xdf, 0x50, 0x32, 0xac, 0x08, - 0xb9, 0x66, 0xab, 0xdf, 0xe0, 0x3a, 0x39, 0x6a, 0xe7, 0x7d, 0x7d, 0xa7, 0xad, 0xf5, 0x07, 0x4a, - 0x8e, 0x0e, 0x9f, 0x08, 0xd0, 0xa9, 0xf7, 0x07, 0x4a, 0x91, 0x01, 0xac, 0x1d, 0x74, 0xdb, 0x3f, - 0x3a, 0x68, 0x29, 0x8a, 0xfa, 0x6f, 0x32, 0x00, 0x89, 0x23, 0x95, 0xbd, 0x0b, 0xe5, 0x13, 0x4a, - 0xe9, 0x92, 0x87, 0x5d, 0x6e, 0x23, 0x70, 0x34, 0xe9, 0x48, 0xef, 0x43, 0x25, 0xde, 0x2e, 0x50, - 0x7f, 0x58, 0x74, 0xb5, 0x97, 0x63, 0xfc, 0xf6, 0x19, 0x7b, 0x0f, 0x8a, 0x1e, 0xb6, 0x03, 0x49, - 0xb3, 0xb2, 0xf2, 0x20, 0x35, 0x5f, 0x2b, 0x78, 0x3c, 0x81, 0x7a, 0xc6, 0xd8, 0x8f, 0x4c, 0xf0, - 0x98, 0x74, 0x07, 0x41, 0x0d, 0xc7, 0x98, 0x05, 0x96, 0xc6, 0xf1, 0xb1, 0x94, 0xce, 0x27, 0x52, - 0x5a, 0xfd, 0x31, 0x54, 0xfb, 0xc6, 0x64, 0xca, 0x65, 0x39, 0x35, 0x8c, 0x41, 0x0e, 0xe7, 0x84, - 0x98, 0x7a, 0xf4, 0x1b, 0x17, 0xdd, 0xbe, 0xe5, 0x8f, 0x2c, 0x37, 0x5a, 0xa3, 0x51, 0x12, 0xc5, - 0xef, 0x01, 0x4a, 0x73, 0xcd, 0x3b, 0x89, 0xc4, 0x79, 0x94, 0x56, 0x7f, 0x3f, 0x03, 0x65, 0xa9, - 0x1a, 0xec, 0x21, 0xe4, 0x48, 0x21, 0xcd, 0xc8, 0x82, 0x50, 0x22, 0xe0, 0xbf, 0xb9, 0x0a, 0x83, - 0x84, 0xec, 0x2e, 0xe4, 0x83, 0xd0, 0xf0, 0x23, 0x9f, 0xbc, 0x22, 0x71, 0x6c, 0x7b, 0x33, 0xd7, - 0xd4, 0x38, 0x9a, 0xa9, 0x90, 0xb5, 0x5c, 0x53, 0x38, 0x2d, 0x16, 0xa9, 0x10, 0xa9, 0x6e, 0x41, - 0x29, 0xce, 0x1e, 0xa7, 0x80, 0xd6, 0x7b, 0xd1, 0x57, 0x56, 0x58, 0x09, 0xf2, 0x5a, 0xbd, 0xfb, - 0xb4, 0xa5, 0x64, 0xd4, 0x3f, 0xc8, 0x00, 0x24, 0x5c, 0xec, 0x41, 0xaa, 0xb6, 0xd7, 0xe6, 0x73, - 0x7d, 0x40, 0x7f, 0xa5, 0xca, 0x5e, 0x87, 0xd2, 0xcc, 0x25, 0xa0, 0x65, 0x8a, 0x9d, 0x28, 0x01, - 0xa0, 0x15, 0x15, 0x45, 0x90, 0xcc, 0x59, 0x51, 0x2f, 0x0d, 0x47, 0xfd, 0x0e, 0x94, 0xe2, 0xec, - 0xd0, 0x30, 0xdc, 0xe9, 0x75, 0x3a, 0xbd, 0x17, 0xed, 0xee, 0x53, 0x65, 0x05, 0x93, 0xfb, 0x5a, - 0xab, 0xd1, 0x6a, 0x62, 0x32, 0x83, 0x73, 0xb6, 0x71, 0xa0, 0x69, 0xad, 0xee, 0x40, 0xd7, 0x7a, - 0x2f, 0x94, 0x55, 0xf5, 0xaf, 0xe7, 0x60, 0xb3, 0xe7, 0x36, 0x67, 0x53, 0xc7, 0x1e, 0x19, 0xa1, - 0xf5, 0xcc, 0x3a, 0x6b, 0x84, 0xa7, 0xb8, 0xfb, 0x1a, 0x61, 0xe8, 0xf3, 0xc5, 0x5c, 0xd2, 0x78, - 0x82, 0x3b, 0x36, 0x02, 0xcb, 0x0f, 0xc9, 0x6f, 0x23, 0xaf, 0xe2, 0x2a, 0x87, 0x37, 0x3c, 0x87, - 0xd6, 0x32, 0xfb, 0x1e, 0x5c, 0xe2, 0xce, 0x10, 0x4e, 0x89, 0x4a, 0xb0, 0x4e, 0x8b, 0x39, 0xbb, - 0x30, 0x75, 0x19, 0x27, 0x44, 0x56, 0x24, 0x23, 0x11, 0x76, 0x13, 0xca, 0x09, 0x7b, 0x74, 0xd0, - 0x05, 0x31, 0x21, 0xd5, 0x04, 0x8d, 0xf7, 0xa8, 0xd6, 0xba, 0x6d, 0x9e, 0x92, 0x9b, 0x28, 0xaf, - 0x55, 0xbd, 0xa4, 0x31, 0xb8, 0x09, 0x7f, 0x0e, 0x9b, 0x29, 0x4a, 0xaa, 0xc5, 0x1a, 0xd5, 0xe2, - 0xbd, 0xc8, 0xc9, 0x3a, 0xd7, 0x7a, 0x19, 0x82, 0xd5, 0xe1, 0x5a, 0xed, 0x86, 0x97, 0x86, 0x0a, - 0x5d, 0xc4, 0x3e, 0x74, 0x3d, 0xdf, 0x12, 0x02, 0xbf, 0x68, 0x07, 0x6d, 0x4a, 0x27, 0x36, 0x94, - 0x74, 0x30, 0xcb, 0xf7, 0x97, 0xe8, 0xcc, 0x91, 0xa3, 0x6d, 0xbe, 0x83, 0xe6, 0xb4, 0x02, 0xa5, - 0xb9, 0x36, 0xc7, 0x51, 0x91, 0x59, 0x04, 0x64, 0x16, 0x55, 0x08, 0xf8, 0x9c, 0xc3, 0xae, 0x75, - 0xe1, 0xe2, 0xb2, 0x4a, 0x2e, 0x51, 0xc3, 0xb6, 0x64, 0x35, 0x6c, 0xce, 0xf0, 0x4f, 0x54, 0xb2, - 0x7f, 0x92, 0x81, 0x4a, 0xd3, 0x32, 0x67, 0xd3, 0x1f, 0x7a, 0xb6, 0x8b, 0x13, 0xe0, 0x23, 0xa8, - 0x78, 0x8e, 0x49, 0xa3, 0x27, 0xc5, 0x17, 0xa4, 0x4e, 0x9d, 0x84, 0x83, 0x1c, 0x3c, 0xc7, 0x6c, - 0x78, 0x0e, 0x45, 0x23, 0xbc, 0x0f, 0x17, 0xb8, 0x53, 0x44, 0xf8, 0x08, 0x4f, 0x39, 0xf3, 0x2a, - 0x8d, 0x8c, 0xc2, 0x51, 0x5c, 0x39, 0x22, 0xf2, 0x5f, 0x82, 0x8b, 0x12, 0x39, 0x8e, 0x0c, 0xa7, - 0x5f, 0x9c, 0x24, 0x9b, 0x31, 0x6f, 0x74, 0xec, 0xa3, 0xfe, 0xc6, 0x2a, 0x94, 0xb8, 0x4b, 0x05, - 0xeb, 0x7b, 0x0f, 0x0a, 0xde, 0xf0, 0x4b, 0xdd, 0x8f, 0x5d, 0x0d, 0x0b, 0xa7, 0x95, 0x6b, 0xde, - 0xf0, 0x4b, 0xcd, 0x1a, 0xb3, 0x77, 0xa3, 0x7d, 0xde, 0xb4, 0xc6, 0xa2, 0x53, 0xaa, 0x69, 0x9b, - 0x46, 0xec, 0xfb, 0x68, 0x6f, 0x3f, 0x86, 0x72, 0x32, 0xe3, 0x83, 0x5a, 0xe1, 0xfc, 0x5e, 0x88, - 0x17, 0x40, 0x80, 0x4c, 0xdc, 0xad, 0xc4, 0x99, 0x8a, 0xe7, 0x33, 0x71, 0x32, 0x62, 0xfa, 0x0c, - 0xaa, 0x89, 0x8c, 0x27, 0xbe, 0xd2, 0xb9, 0x7c, 0xeb, 0x31, 0x25, 0x9d, 0x9a, 0xfc, 0xd3, 0x0c, - 0x94, 0xda, 0xbc, 0xf8, 0xf0, 0x94, 0xdd, 0x82, 0xec, 0x2b, 0x7a, 0x01, 0x71, 0xec, 0x3e, 0x6c, - 0x1a, 0xa6, 0xa9, 0x1b, 0xe3, 0xb1, 0x35, 0x0a, 0x2d, 0x53, 0x47, 0x15, 0x48, 0xc8, 0x9c, 0x0d, - 0xc3, 0x34, 0xeb, 0x02, 0x4e, 0xb2, 0x1b, 0xd7, 0x7c, 0xa0, 0x47, 0xc6, 0x6b, 0x72, 0x2c, 0x5d, - 0xd4, 0xaa, 0x76, 0x20, 0x6c, 0x57, 0xee, 0x8f, 0x4e, 0x75, 0x6c, 0xee, 0xd5, 0x1d, 0xab, 0xfe, - 0xf6, 0x2a, 0x80, 0x66, 0x4d, 0x1d, 0x63, 0x64, 0xfd, 0x3f, 0x53, 0x69, 0x14, 0x4b, 0xf1, 0xc0, - 0xba, 0x66, 0x14, 0xc6, 0x11, 0x0d, 0xa2, 0x6b, 0xb2, 0x1f, 0xc0, 0x9b, 0xbe, 0x75, 0xe2, 0xdb, - 0xa1, 0xa5, 0x8f, 0x7d, 0x6f, 0xa2, 0xa7, 0x24, 0x0f, 0x2e, 0xcc, 0x12, 0x55, 0xe2, 0xaa, 0x20, - 0xda, 0xf1, 0xbd, 0x49, 0x5a, 0xfa, 0xa8, 0xbf, 0x5f, 0x86, 0x72, 0xdd, 0x35, 0x9c, 0xb3, 0x9f, - 0x58, 0x14, 0x57, 0x40, 0x1e, 0xda, 0xe9, 0x2c, 0xe4, 0xcd, 0xe5, 0x87, 0x6e, 0x25, 0x82, 0x50, - 0x43, 0x6f, 0x42, 0xd9, 0x9b, 0x85, 0x31, 0x9e, 0x1f, 0xc3, 0x01, 0x07, 0x11, 0x41, 0xcc, 0x1f, - 0x7b, 0xff, 0x23, 0x7e, 0x32, 0x7f, 0x12, 0xfe, 0x58, 0x25, 0x8e, 0xf9, 0x89, 0x00, 0xa5, 0x91, - 0x3d, 0xa1, 0x06, 0x07, 0xb3, 0x89, 0xc5, 0x1b, 0x9d, 0xe5, 0x31, 0x6e, 0x0d, 0x01, 0xc3, 0x5c, - 0x26, 0xd6, 0xc4, 0xf3, 0xcf, 0x78, 0x2e, 0x6b, 0x3c, 0x17, 0x0e, 0xa2, 0x5c, 0xde, 0x03, 0x76, - 0x62, 0xd8, 0xa1, 0x9e, 0xce, 0x8a, 0x9b, 0x21, 0x0a, 0x62, 0x06, 0x72, 0x76, 0x97, 0x61, 0xcd, - 0xb4, 0x83, 0xe3, 0x76, 0x4f, 0x98, 0x20, 0x22, 0x85, 0x6d, 0x09, 0x46, 0x06, 0x6a, 0x40, 0xa1, - 0xc5, 0xd5, 0xe5, 0xac, 0x56, 0x42, 0xc8, 0x36, 0x02, 0x70, 0x07, 0x75, 0xad, 0xf0, 0xc4, 0xf3, - 0x91, 0x93, 0x5b, 0x18, 0x09, 0x00, 0x35, 0x0d, 0x24, 0xc5, 0x82, 0xc8, 0xa3, 0x94, 0xd5, 0xe2, - 0x34, 0xea, 0xee, 0x7c, 0xf9, 0x12, 0xb6, 0xc2, 0xab, 0x9f, 0x40, 0xd8, 0x1d, 0xa8, 0x52, 0xf5, - 0xc9, 0x02, 0xc1, 0x36, 0xd0, 0x49, 0x59, 0x56, 0xab, 0x20, 0x94, 0x1c, 0x12, 0x48, 0xf5, 0x19, - 0x5c, 0x4d, 0xb5, 0x4f, 0x37, 0x7c, 0xdf, 0x38, 0xd3, 0x27, 0xc6, 0x97, 0x9e, 0x4f, 0xce, 0xa3, - 0xac, 0x76, 0x59, 0xee, 0xb6, 0x3a, 0xa2, 0xf7, 0x10, 0x7b, 0x2e, 0xab, 0xed, 0x7a, 0x3e, 0x79, - 0x96, 0x96, 0xb2, 0x22, 0x96, 0xdc, 0x20, 0x34, 0xc0, 0x64, 0x0e, 0x05, 0x3c, 0x36, 0x52, 0x2b, - 0x13, 0x6c, 0x9b, 0x40, 0x68, 0x10, 0x04, 0x8f, 0xb9, 0x64, 0xdd, 0x14, 0x81, 0x4a, 0x8f, 0x49, - 0xfe, 0x72, 0xc4, 0x91, 0x65, 0x98, 0x74, 0xfa, 0x46, 0x88, 0x5d, 0xcb, 0xa0, 0xb3, 0xed, 0xe0, - 0xb1, 0x3e, 0x9d, 0x85, 0x3c, 0xa8, 0x51, 0xcb, 0x07, 0x8f, 0xf7, 0x67, 0xa1, 0x00, 0x1f, 0x5a, - 0x21, 0x85, 0x32, 0x12, 0xf8, 0xa9, 0x15, 0xe2, 0x46, 0x18, 0x3c, 0x8e, 0x3c, 0xe9, 0x97, 0x44, - 0xdf, 0x3e, 0x16, 0xae, 0x72, 0x15, 0xd6, 0x63, 0xa4, 0x3e, 0x99, 0xf1, 0x28, 0xc6, 0xac, 0x56, - 0x8e, 0x08, 0xf6, 0x66, 0x0e, 0x0e, 0xec, 0xc8, 0x18, 0x1d, 0x59, 0xba, 0x8f, 0x55, 0xb9, 0xc2, - 0x87, 0x8e, 0x20, 0x1a, 0xd6, 0xe6, 0x0d, 0xe0, 0x09, 0xfd, 0xc8, 0x0e, 0xc9, 0xc3, 0x95, 0xd5, - 0x8a, 0x04, 0xd8, 0xb5, 0x43, 0x14, 0x0b, 0x1c, 0x29, 0x66, 0x20, 0x65, 0x71, 0x95, 0x88, 0x36, - 0x08, 0xb1, 0x47, 0x70, 0xca, 0xe8, 0x1e, 0x28, 0x29, 0x5a, 0xcc, 0xef, 0x1a, 0x91, 0x56, 0x25, - 0x52, 0xcc, 0xf5, 0x2e, 0x70, 0x66, 0x1d, 0xa7, 0x1e, 0xcf, 0xf3, 0x0d, 0x6e, 0x0e, 0x13, 0xb8, - 0x69, 0x07, 0xc7, 0x94, 0xe3, 0x1d, 0xa8, 0x4a, 0x74, 0x98, 0xdf, 0x75, 0x3e, 0x33, 0x62, 0xb2, - 0x54, 0x1d, 0x7d, 0x6b, 0xe2, 0x85, 0xa2, 0x99, 0x6f, 0x4a, 0x75, 0xd4, 0x08, 0x9e, 0xae, 0xa3, - 0xa0, 0xc5, 0x3c, 0x6f, 0x48, 0x75, 0xe4, 0xa4, 0x98, 0xeb, 0x2d, 0xa8, 0xa0, 0x14, 0x09, 0x2d, - 0x97, 0x2f, 0xfe, 0x9b, 0xbc, 0x63, 0x05, 0x8c, 0x56, 0xff, 0x2d, 0xa8, 0xf0, 0x9e, 0x17, 0xe2, - 0x72, 0x8b, 0x93, 0x08, 0x58, 0x24, 0x20, 0x44, 0x6f, 0x4c, 0x6c, 0x97, 0xdc, 0x58, 0x59, 0xad, - 0xc4, 0x21, 0x7b, 0xb6, 0x2b, 0xa3, 0x8d, 0x53, 0x72, 0x66, 0x25, 0x68, 0xe3, 0x94, 0x96, 0xe4, - 0xd4, 0x76, 0x1c, 0xbe, 0xf0, 0x6f, 0x8b, 0x25, 0x89, 0x90, 0xbe, 0xb0, 0xa9, 0x39, 0x1a, 0xf3, - 0xbe, 0x23, 0x66, 0x06, 0x02, 0x30, 0xeb, 0x04, 0x69, 0x9c, 0x92, 0xcb, 0x2a, 0x46, 0x1a, 0xa7, - 0x42, 0x30, 0x61, 0xa5, 0x89, 0xf7, 0x6e, 0x2c, 0x98, 0x10, 0x84, 0xdc, 0x32, 0x81, 0x71, 0x5a, - 0x7b, 0x3b, 0x4d, 0x60, 0x9c, 0x92, 0xad, 0x69, 0x19, 0x26, 0xaf, 0xd9, 0x3d, 0x9e, 0x3d, 0x02, - 0xa8, 0x62, 0x5b, 0x50, 0x09, 0x1e, 0xeb, 0x09, 0xfe, 0x1d, 0xce, 0x1e, 0x3c, 0xd6, 0x22, 0x8a, - 0x3b, 0x50, 0x8d, 0xc7, 0x9e, 0xd3, 0xdc, 0xe7, 0x23, 0x6b, 0x8a, 0xb1, 0xa7, 0x83, 0xd3, 0x9f, - 0x66, 0xe0, 0x5a, 0x8f, 0xdc, 0x6c, 0xb4, 0x5d, 0xec, 0x59, 0x41, 0x60, 0x1c, 0x5a, 0x3b, 0x9e, - 0xbf, 0x33, 0xfb, 0xc9, 0x4f, 0xce, 0xd8, 0x3d, 0xd8, 0xd8, 0x37, 0x7c, 0xcb, 0x0d, 0xe3, 0x23, - 0x3f, 0xa1, 0x9a, 0xcd, 0x83, 0xd9, 0x13, 0x50, 0x38, 0xe8, 0x20, 0x56, 0x72, 0x85, 0x99, 0x97, - 0xf6, 0xd0, 0x2f, 0x50, 0xa1, 0xd9, 0x5c, 0x6a, 0xda, 0x41, 0xa8, 0x19, 0xee, 0x21, 0x0a, 0x21, - 0xc5, 0xf1, 0x4e, 0xd0, 0xf6, 0x43, 0x83, 0x40, 0x97, 0x4c, 0x10, 0xb1, 0xab, 0x26, 0x76, 0x47, - 0x95, 0x08, 0x13, 0xc3, 0xe1, 0x33, 0x50, 0x66, 0xd3, 0x69, 0x9a, 0x75, 0xf5, 0x1c, 0x56, 0x22, - 0x4c, 0x58, 0xdf, 0x85, 0xb2, 0x54, 0xea, 0x12, 0x33, 0x05, 0x92, 0xb2, 0x90, 0x58, 0x2a, 0x67, - 0x49, 0x14, 0x28, 0x24, 0xb9, 0xab, 0x7f, 0x94, 0x01, 0x85, 0xdc, 0x8c, 0x1a, 0xc5, 0x12, 0xd0, - 0xc9, 0x61, 0xca, 0xc0, 0xcd, 0xbc, 0xd6, 0xc0, 0xdd, 0x82, 0xbc, 0x63, 0x4f, 0xe2, 0xd0, 0xac, - 0x94, 0x06, 0x4c, 0x08, 0x1c, 0x6b, 0xcf, 0xb7, 0x0f, 0xc9, 0x14, 0x97, 0x83, 0x08, 0xc9, 0x83, - 0x8a, 0x96, 0x2d, 0x0d, 0xd1, 0x03, 0x00, 0xd3, 0x0e, 0x42, 0x9d, 0x9c, 0x53, 0xa2, 0xda, 0xa2, - 0x67, 0xe2, 0xfe, 0xd7, 0x4a, 0x66, 0xf4, 0x53, 0xfd, 0x9b, 0x2a, 0xe4, 0xba, 0x9e, 0x69, 0xb1, - 0x0f, 0xa0, 0x44, 0x91, 0xb1, 0xd2, 0x60, 0x08, 0x7f, 0x19, 0xa2, 0xe9, 0x0f, 0xf5, 0x6a, 0xd1, - 0x15, 0xbf, 0xce, 0x8f, 0xa5, 0xbd, 0x45, 0x26, 0x2d, 0x1d, 0x44, 0x63, 0xf1, 0x65, 0xe1, 0x76, - 0x23, 0x2f, 0x11, 0xc7, 0xe0, 0x46, 0x47, 0x87, 0x16, 0xbe, 0xe5, 0x92, 0xe1, 0x94, 0xd7, 0xe2, - 0x34, 0x39, 0x12, 0x7c, 0x0f, 0xd5, 0x2a, 0xbe, 0x1d, 0xe4, 0x97, 0x38, 0x12, 0x38, 0x9e, 0xf6, - 0x87, 0x0f, 0xa0, 0xf4, 0xa5, 0x67, 0xbb, 0xbc, 0xe2, 0x6b, 0x0b, 0x15, 0x47, 0x5b, 0x81, 0x57, - 0xfc, 0x4b, 0xf1, 0x8b, 0xdd, 0x86, 0x82, 0xe7, 0xf2, 0xbc, 0x0b, 0x0b, 0x79, 0xaf, 0x79, 0x6e, - 0x87, 0x07, 0x6a, 0xad, 0xdb, 0x81, 0xee, 0xdb, 0x87, 0x47, 0xa1, 0x8e, 0x9c, 0xe2, 0x00, 0xbb, - 0x6c, 0x07, 0x1a, 0xc2, 0x30, 0x5b, 0x9c, 0x24, 0x63, 0xdb, 0x41, 0xed, 0x8d, 0x32, 0x2b, 0x2d, - 0x64, 0x06, 0x1c, 0x4d, 0x19, 0xbe, 0x05, 0xc5, 0x43, 0xdf, 0x9b, 0x4d, 0x71, 0x3e, 0xc0, 0x02, - 0x65, 0x81, 0x70, 0xdb, 0x67, 0xa8, 0xcb, 0xd0, 0x4f, 0xdb, 0x3d, 0xd4, 0xc9, 0x37, 0x54, 0xde, - 0xca, 0xde, 0x2b, 0x6a, 0x95, 0x08, 0x48, 0x5e, 0x9f, 0xb7, 0xa0, 0x68, 0x1c, 0x1e, 0xea, 0x22, - 0xde, 0x6c, 0x21, 0x2f, 0xe3, 0xf0, 0x90, 0x8a, 0x7c, 0x00, 0xeb, 0x27, 0xb6, 0xab, 0x07, 0x53, - 0x6b, 0xc4, 0x69, 0xd7, 0x17, 0xbb, 0xf2, 0xc4, 0x76, 0x71, 0x26, 0x12, 0xbd, 0x3c, 0x65, 0xab, - 0x5f, 0x7f, 0xca, 0x6e, 0x9c, 0x37, 0x65, 0x55, 0x58, 0x13, 0x07, 0x1a, 0xca, 0x02, 0x89, 0xc0, - 0xb0, 0x0f, 0xa1, 0xec, 0x1b, 0xee, 0xb1, 0x2e, 0xa2, 0x01, 0xbe, 0x90, 0xfd, 0x1b, 0x9a, 0xe1, - 0x1e, 0x8b, 0x60, 0x00, 0xf0, 0xe3, 0xdf, 0x69, 0x75, 0x78, 0xf3, 0x35, 0xea, 0xb0, 0x64, 0x73, - 0xb1, 0x57, 0xdb, 0x5c, 0x1f, 0x93, 0x71, 0x63, 0xb9, 0xa1, 0x1e, 0x31, 0x5c, 0x58, 0xce, 0x50, - 0xe1, 0x64, 0x3d, 0xce, 0x86, 0x0d, 0x20, 0xff, 0xa2, 0x4e, 0xce, 0xc8, 0x8b, 0xa9, 0x06, 0xc4, - 0x8e, 0x47, 0x0d, 0xfc, 0xc4, 0x09, 0x59, 0x87, 0x8d, 0x24, 0x08, 0x97, 0x47, 0x33, 0x5f, 0x92, - 0x0f, 0x38, 0x52, 0x51, 0xbb, 0x91, 0x39, 0x65, 0xa7, 0x42, 0x79, 0x6f, 0xc3, 0x3a, 0x0f, 0xbf, - 0xe1, 0xfd, 0x16, 0x90, 0xc6, 0x52, 0xd2, 0x2a, 0x04, 0xe4, 0xfd, 0x14, 0x90, 0x30, 0x10, 0xa6, - 0x40, 0x78, 0x4a, 0x2a, 0x4b, 0x22, 0x0c, 0xb8, 0x3d, 0x10, 0x9e, 0x6a, 0x25, 0x33, 0xfa, 0x89, - 0x3b, 0xf1, 0xd0, 0x76, 0x4d, 0x9c, 0x7a, 0xa1, 0x71, 0x18, 0xd4, 0x6a, 0xb4, 0x32, 0xcb, 0x02, - 0x36, 0x30, 0x0e, 0x03, 0x34, 0xb9, 0x0d, 0xae, 0xf9, 0xf3, 0x7a, 0x5f, 0x95, 0xfd, 0x71, 0x92, - 0x4d, 0xa0, 0x95, 0x0d, 0xc9, 0x40, 0xf8, 0x14, 0x58, 0x74, 0xde, 0x2a, 0x59, 0xd0, 0xd7, 0x16, - 0x66, 0xe3, 0x86, 0x38, 0x70, 0x8d, 0x6f, 0x0e, 0xdc, 0x84, 0x72, 0xe0, 0xcd, 0xfc, 0x91, 0xa5, - 0x07, 0xa1, 0x35, 0xad, 0xbd, 0x41, 0x15, 0x02, 0x0e, 0xea, 0x87, 0xd6, 0x94, 0x7d, 0x0a, 0xeb, - 0x69, 0x0b, 0xea, 0xfa, 0x92, 0x63, 0x4b, 0x9a, 0x16, 0x5a, 0x65, 0x24, 0xdb, 0x54, 0xb7, 0x79, - 0x80, 0x38, 0xa9, 0x2b, 0xc4, 0xc8, 0x8f, 0xe6, 0x2a, 0xae, 0x17, 0x36, 0x22, 0x18, 0x76, 0x60, - 0x64, 0x59, 0x87, 0xa7, 0xa4, 0xe1, 0xc4, 0x1d, 0x18, 0xdb, 0xb2, 0x68, 0xa9, 0x44, 0x66, 0x2d, - 0xce, 0x05, 0x6e, 0x2f, 0x12, 0xc3, 0xcd, 0xd4, 0x5c, 0x88, 0x0d, 0x49, 0x0d, 0xfc, 0xc4, 0xa8, - 0x6c, 0x02, 0x8f, 0x50, 0xa1, 0x3d, 0xdc, 0xf2, 0x79, 0x34, 0x0a, 0xe9, 0x40, 0xf1, 0xe1, 0xe7, - 0xfc, 0xd6, 0xa2, 0xf1, 0xc8, 0x1d, 0x79, 0xb3, 0x79, 0x02, 0xd5, 0xa9, 0x8f, 0x43, 0x12, 0x57, - 0x56, 0x95, 0xfb, 0x61, 0xdf, 0xb7, 0x92, 0xfa, 0x56, 0xa6, 0x52, 0x8a, 0x7d, 0x1f, 0x36, 0x25, - 0xce, 0xd9, 0x31, 0x31, 0xdf, 0x26, 0xe6, 0x8b, 0x73, 0xcc, 0x07, 0xc7, 0xc8, 0x5e, 0x9d, 0xa6, - 0xd2, 0xac, 0x3e, 0xe7, 0xe5, 0x42, 0x0b, 0xf2, 0x0e, 0xf1, 0x5f, 0x39, 0xc7, 0x75, 0x95, 0x72, - 0x7f, 0x3d, 0xe3, 0xa7, 0x70, 0xed, 0xa0, 0xe5, 0x9a, 0xa4, 0x60, 0x15, 0x35, 0x9e, 0x60, 0x8f, - 0xa1, 0xc2, 0x6d, 0x19, 0x0a, 0xb4, 0x0d, 0x6a, 0x77, 0x65, 0x37, 0x3f, 0x19, 0x34, 0x84, 0xd0, - 0xca, 0x4e, 0xfc, 0x3b, 0x60, 0x9f, 0xc0, 0x26, 0x3f, 0x83, 0x91, 0x05, 0xf3, 0xdb, 0x8b, 0x13, - 0x8d, 0x88, 0x76, 0x12, 0xe9, 0xac, 0xc1, 0x55, 0x7f, 0xe6, 0x92, 0x7d, 0x23, 0x38, 0xa7, 0xbe, - 0x37, 0xb4, 0x38, 0xff, 0x3d, 0xe2, 0x17, 0xcd, 0xd1, 0x38, 0x19, 0xe7, 0x25, 0x89, 0x78, 0xd9, - 0x97, 0x41, 0xfb, 0xc8, 0x77, 0x4e, 0x9e, 0xc3, 0x99, 0xed, 0x98, 0x3c, 0xcf, 0x77, 0xbe, 0x49, - 0x9e, 0xdb, 0xc8, 0x47, 0x79, 0x32, 0xc8, 0xcd, 0x66, 0xb6, 0x49, 0x7a, 0x5e, 0x45, 0xa3, 0xdf, - 0xec, 0x2d, 0xa8, 0xfa, 0xd6, 0x68, 0xe6, 0x07, 0xf6, 0x4b, 0x4b, 0x0f, 0x6c, 0xf7, 0xb8, 0xf6, - 0x2e, 0xf5, 0xe3, 0x7a, 0x0c, 0xed, 0xdb, 0xee, 0x31, 0x4e, 0x4e, 0xeb, 0x34, 0xb4, 0x7c, 0x97, - 0xc7, 0xfe, 0xbf, 0x27, 0x4f, 0xce, 0x16, 0x21, 0x50, 0xba, 0x68, 0x60, 0xc5, 0xbf, 0xe7, 0x26, - 0x47, 0xc0, 0x27, 0xc7, 0x83, 0xaf, 0x35, 0x39, 0xfa, 0x34, 0x39, 0xee, 0x42, 0xd1, 0x76, 0x43, - 0xcb, 0x7f, 0x69, 0x38, 0xb5, 0x87, 0x0b, 0x7b, 0x40, 0x8c, 0x63, 0x77, 0xa0, 0x10, 0x38, 0x36, - 0x4a, 0x99, 0xda, 0x07, 0x0b, 0x64, 0x11, 0x8a, 0xdd, 0x83, 0x52, 0x7c, 0x6d, 0xad, 0xf6, 0xe1, - 0x02, 0x5d, 0x82, 0x64, 0x37, 0x20, 0x77, 0x82, 0x13, 0xea, 0xd1, 0xe2, 0xb1, 0x0c, 0xc2, 0x51, - 0x69, 0x18, 0xa3, 0x56, 0x4f, 0x4a, 0xc3, 0xe3, 0x05, 0xa5, 0x61, 0xc7, 0x76, 0x1c, 0xae, 0x34, - 0x8c, 0xc5, 0x2f, 0xdc, 0x72, 0x89, 0x03, 0x5b, 0xf2, 0xd1, 0xe2, 0x96, 0x8b, 0xb8, 0xe7, 0x74, - 0xc1, 0xaf, 0x1c, 0xd0, 0x59, 0x03, 0x3f, 0x32, 0xf9, 0x58, 0xee, 0xab, 0xf4, 0x21, 0x84, 0x06, - 0x41, 0x9c, 0x46, 0x13, 0x45, 0x9c, 0xb4, 0xd8, 0xe6, 0x69, 0xed, 0x13, 0x7e, 0x73, 0x84, 0x43, - 0xda, 0xe6, 0x29, 0xfb, 0x00, 0xd6, 0xa3, 0xd0, 0x2c, 0x2c, 0x2e, 0xa8, 0x7d, 0xba, 0x50, 0x83, - 0x34, 0x01, 0x6b, 0x42, 0x65, 0x8c, 0xda, 0xfd, 0x84, 0x2b, 0xfb, 0xb5, 0x27, 0x54, 0x91, 0xad, - 0x68, 0x3b, 0x3f, 0xcf, 0x18, 0xd0, 0x52, 0x5c, 0xec, 0x01, 0x30, 0x7b, 0xcc, 0xc7, 0x73, 0xc7, - 0xf7, 0x26, 0x5c, 0xa1, 0xaf, 0x7d, 0x46, 0xb3, 0x6b, 0x09, 0x86, 0x0e, 0x5e, 0x2d, 0xd7, 0xd4, - 0x27, 0x81, 0x50, 0x4e, 0xbe, 0x43, 0xf5, 0x14, 0x22, 0x33, 0xbe, 0xde, 0x2a, 0xb6, 0xb4, 0x32, - 0xd2, 0xee, 0x05, 0x5c, 0x57, 0xf9, 0x0c, 0x70, 0xba, 0xbe, 0x4c, 0x58, 0x7f, 0xe9, 0x95, 0xac, - 0x48, 0x1b, 0xb1, 0x3e, 0x81, 0xaa, 0x69, 0x99, 0xb3, 0x29, 0xe9, 0x69, 0x34, 0x45, 0xbf, 0x2b, - 0x0b, 0x3f, 0xd9, 0x65, 0xac, 0x55, 0x4c, 0xd9, 0x81, 0xfc, 0x29, 0x6c, 0x44, 0xbe, 0xdd, 0x50, - 0xb8, 0x81, 0xbf, 0x27, 0x17, 0x1b, 0xbb, 0x6e, 0xb5, 0xf5, 0x59, 0xf4, 0x93, 0x8a, 0x7c, 0x0c, - 0xeb, 0xb4, 0x77, 0x07, 0xae, 0x31, 0x0d, 0x8e, 0xbc, 0xb0, 0xf6, 0xcb, 0xb2, 0x1a, 0xd2, 0x17, - 0x50, 0xad, 0x82, 0x44, 0x51, 0x0a, 0xb7, 0x9c, 0x64, 0x9d, 0x8e, 0x42, 0xab, 0xf6, 0x7d, 0xbe, - 0xe5, 0xc4, 0xc0, 0x46, 0x68, 0xb1, 0xc7, 0x00, 0xc6, 0x74, 0xea, 0x9c, 0xf1, 0xa9, 0xf9, 0x03, - 0x9a, 0x9a, 0x17, 0xa5, 0xa9, 0x59, 0x47, 0x24, 0xcd, 0xcd, 0x92, 0x11, 0xfd, 0x64, 0x8f, 0xa0, - 0x32, 0xf5, 0x82, 0x50, 0x37, 0x27, 0x0e, 0xb5, 0xbf, 0x2e, 0xaf, 0xed, 0x7d, 0x2f, 0x08, 0x9b, - 0x13, 0x87, 0x36, 0x9e, 0x69, 0xfc, 0x9b, 0x75, 0xe0, 0x42, 0x4a, 0x6e, 0x1b, 0x14, 0xe6, 0x50, - 0xdb, 0xa6, 0x12, 0xaf, 0x4b, 0x25, 0x4a, 0xf2, 0x5b, 0xc4, 0x09, 0x6e, 0x7a, 0xf3, 0x20, 0xb2, - 0x44, 0x69, 0x0c, 0xe2, 0x60, 0xd9, 0x06, 0x57, 0x48, 0x08, 0x1a, 0x45, 0xcb, 0x3e, 0x81, 0x8d, - 0x84, 0x0a, 0x1b, 0x18, 0xd4, 0x9a, 0xf2, 0x4c, 0x96, 0x42, 0xda, 0xd7, 0x23, 0x46, 0x84, 0x05, - 0xd4, 0x77, 0x9e, 0xe3, 0xcc, 0xa6, 0x42, 0x94, 0xd6, 0x5a, 0xa2, 0xef, 0x08, 0xc8, 0xa5, 0xa4, - 0x64, 0xac, 0x5b, 0x93, 0xda, 0x8e, 0x6c, 0xac, 0x5b, 0x13, 0xf5, 0x5f, 0xe5, 0xa1, 0x18, 0x59, - 0x31, 0xac, 0x0c, 0x85, 0x83, 0xee, 0xb3, 0x6e, 0xef, 0x45, 0x97, 0x5f, 0xcd, 0xab, 0xf7, 0xfb, - 0x2d, 0x6d, 0xa0, 0x98, 0xac, 0x0a, 0x40, 0x97, 0x6f, 0xf4, 0x7e, 0xa3, 0xde, 0xe5, 0x57, 0xf5, - 0xe8, 0xca, 0x0f, 0x4f, 0xaf, 0xb2, 0x4d, 0x58, 0xdf, 0x39, 0xe8, 0x52, 0x40, 0x23, 0x07, 0x65, - 0x11, 0xd4, 0xfa, 0x9c, 0x1f, 0xc1, 0x72, 0x50, 0x0e, 0x41, 0x7b, 0xf5, 0x41, 0x4b, 0x6b, 0x47, - 0xa0, 0x3c, 0xc5, 0x46, 0xf6, 0x0e, 0xb4, 0x86, 0xc8, 0x69, 0x8d, 0x5d, 0x82, 0xcd, 0x98, 0x2d, - 0xca, 0x52, 0x29, 0x60, 0xcd, 0xf6, 0xb5, 0xde, 0x0f, 0x5b, 0x8d, 0x81, 0x02, 0x74, 0x9e, 0xfb, - 0xf4, 0xa9, 0x52, 0x66, 0x15, 0x28, 0x36, 0xdb, 0xfd, 0x41, 0xbb, 0xdb, 0x18, 0x28, 0x15, 0xac, - 0xf0, 0x4e, 0xbb, 0x33, 0x68, 0x69, 0xca, 0x3a, 0x2b, 0x42, 0xee, 0x87, 0xbd, 0x76, 0x57, 0xa9, - 0xd2, 0x25, 0xa4, 0xfa, 0xde, 0x7e, 0xa7, 0xa5, 0x6c, 0x20, 0xb4, 0xdf, 0xd3, 0x06, 0x8a, 0x82, - 0xd0, 0x17, 0xed, 0x6e, 0xb3, 0xf7, 0x42, 0xd9, 0x64, 0x25, 0xc8, 0x1f, 0x74, 0xb1, 0x18, 0xc6, - 0xd6, 0xa1, 0x44, 0x3f, 0xf5, 0x7a, 0xa7, 0xa3, 0x5c, 0x90, 0x0e, 0x81, 0x2f, 0x22, 0x8a, 0x8e, - 0x94, 0xfb, 0x58, 0x87, 0x4b, 0xd8, 0x96, 0x38, 0x49, 0xd4, 0x97, 0x31, 0x9f, 0xbd, 0x76, 0xf7, - 0xa0, 0xaf, 0x5c, 0x41, 0x62, 0xfa, 0x49, 0x98, 0x1a, 0xe6, 0xd3, 0xee, 0x52, 0x57, 0xde, 0xc0, - 0xdf, 0xcd, 0x56, 0xa7, 0x35, 0x68, 0x29, 0x37, 0xb1, 0x55, 0x5a, 0x6b, 0xbf, 0x53, 0x6f, 0xb4, - 0x94, 0x2d, 0x4c, 0x74, 0x7a, 0x8d, 0x67, 0x7a, 0x6f, 0x5f, 0xb9, 0xc5, 0x2e, 0x82, 0xd2, 0xeb, - 0xea, 0xcd, 0x83, 0xfd, 0x4e, 0xbb, 0x51, 0x1f, 0xb4, 0xf4, 0x67, 0xad, 0x2f, 0x14, 0x15, 0xbb, - 0x7d, 0x5f, 0x6b, 0xe9, 0x22, 0xaf, 0xdb, 0x4c, 0x81, 0xca, 0xce, 0xc1, 0x8f, 0x7f, 0xfc, 0x85, - 0x2e, 0xda, 0xfd, 0x16, 0x56, 0x2b, 0xa1, 0xd0, 0x0f, 0x9e, 0x29, 0x77, 0xe7, 0x40, 0xfd, 0x67, - 0xca, 0xdb, 0xd8, 0x6f, 0xd1, 0x40, 0x28, 0xf7, 0x90, 0x40, 0x6b, 0x35, 0x0e, 0xb4, 0x7e, 0xfb, - 0x79, 0x4b, 0x6f, 0x0c, 0x5a, 0xca, 0x3b, 0xd4, 0x51, 0xed, 0xee, 0x33, 0xe5, 0x3e, 0xb6, 0x04, - 0x7f, 0xf1, 0xe1, 0x79, 0x97, 0x31, 0xa8, 0x26, 0xb4, 0x04, 0x7b, 0x0f, 0x49, 0xb6, 0xb5, 0x5e, - 0xbd, 0xd9, 0xa8, 0xf7, 0x07, 0xca, 0xfb, 0xd8, 0x0d, 0xfd, 0xfd, 0x4e, 0x7b, 0xa0, 0x3c, 0xc0, - 0xb6, 0x3e, 0xad, 0x0f, 0x76, 0x5b, 0x9a, 0xf2, 0x10, 0x47, 0x7a, 0xd0, 0xde, 0x6b, 0xe9, 0xa2, - 0xdb, 0x1f, 0x61, 0x19, 0x3b, 0xed, 0x4e, 0x47, 0x79, 0x4c, 0xe7, 0x9c, 0x75, 0x6d, 0xd0, 0xa6, - 0xb1, 0xfe, 0x08, 0x33, 0xa8, 0xef, 0xef, 0x77, 0xbe, 0x50, 0x3e, 0xc6, 0x06, 0xee, 0x1d, 0x74, - 0x06, 0x6d, 0xfd, 0x60, 0xbf, 0x59, 0x1f, 0xb4, 0x94, 0x4f, 0x68, 0x22, 0xf4, 0xfa, 0x83, 0xe6, - 0x5e, 0x47, 0xf9, 0x94, 0xf2, 0xa4, 0x69, 0xd8, 0xe8, 0xf4, 0xba, 0x2d, 0xe5, 0x89, 0xfa, 0x6b, - 0x50, 0x8c, 0x2c, 0x5b, 0xcc, 0xa6, 0xdd, 0xed, 0xb6, 0x34, 0x65, 0x05, 0x8b, 0xea, 0xb4, 0x76, - 0x06, 0x4a, 0x86, 0x0e, 0x7d, 0xdb, 0x4f, 0x77, 0x07, 0xca, 0x2a, 0xfe, 0xec, 0x1d, 0x60, 0xaf, - 0x65, 0xa9, 0xb9, 0xad, 0xbd, 0xb6, 0x92, 0xc3, 0x5f, 0xf5, 0xee, 0xa0, 0xad, 0xe4, 0x69, 0xde, - 0xb4, 0xbb, 0x4f, 0x3b, 0x2d, 0x65, 0x0d, 0xa1, 0x7b, 0x75, 0xed, 0x99, 0x52, 0xe0, 0x99, 0x36, - 0x5b, 0x9f, 0x2b, 0x45, 0xb6, 0x06, 0xab, 0x9d, 0x47, 0x4a, 0x09, 0x41, 0xcd, 0x56, 0xf3, 0x60, - 0x5f, 0x01, 0xf5, 0x1e, 0x14, 0xea, 0x87, 0x87, 0x7b, 0x9e, 0x49, 0xe7, 0xcc, 0x3b, 0x07, 0x9d, - 0x0e, 0x5f, 0x47, 0xdb, 0xbd, 0xc1, 0xa0, 0xb7, 0xa7, 0x64, 0x70, 0xe6, 0x0e, 0x7a, 0xfb, 0xca, - 0xaa, 0xda, 0x86, 0x62, 0xb4, 0x9b, 0x4a, 0x17, 0xeb, 0x8a, 0x90, 0xdb, 0xd7, 0x5a, 0xcf, 0x79, - 0xa4, 0x42, 0xb7, 0xf5, 0x39, 0x56, 0x13, 0x7f, 0x61, 0x46, 0x59, 0x2c, 0x88, 0xdf, 0x80, 0xa3, - 0x9b, 0x75, 0x9d, 0x76, 0xb7, 0x55, 0xd7, 0x94, 0xbc, 0xfa, 0x71, 0xea, 0x10, 0x58, 0x08, 0x1e, - 0x2c, 0xbe, 0xde, 0x16, 0xc5, 0xb7, 0x9f, 0x76, 0x7b, 0x5a, 0x8b, 0x5f, 0xd5, 0x13, 0x1d, 0xb9, - 0xaa, 0xbe, 0x0b, 0xa5, 0x58, 0x68, 0xe2, 0xc4, 0x6a, 0x68, 0xbd, 0x7e, 0x9f, 0xf7, 0xfb, 0x0a, - 0xa6, 0xa9, 0x6f, 0x78, 0x3a, 0xa3, 0xf6, 0x61, 0x33, 0x92, 0xd7, 0x74, 0x8b, 0x81, 0xcc, 0x97, - 0x8b, 0x90, 0xef, 0x58, 0x2f, 0x2d, 0x27, 0x0a, 0xc7, 0xa7, 0x04, 0x42, 0x7b, 0xc3, 0x2f, 0xdb, - 0xf1, 0x6d, 0x6a, 0x4a, 0xa0, 0x82, 0xd6, 0x95, 0x2e, 0x74, 0xd3, 0x35, 0x90, 0xdf, 0xce, 0x40, - 0x31, 0xde, 0x05, 0xee, 0xc0, 0xea, 0xa0, 0x2f, 0x0e, 0x91, 0x2e, 0x3e, 0x48, 0xde, 0xaf, 0x18, - 0x44, 0xbf, 0xb4, 0xd5, 0x41, 0x9f, 0xbd, 0x07, 0x6b, 0xfc, 0xfe, 0xa9, 0x70, 0x08, 0x5d, 0x4c, - 0xef, 0x2c, 0x03, 0xc2, 0x69, 0x82, 0x86, 0x7d, 0x0c, 0xa5, 0xb8, 0xb6, 0xc2, 0xeb, 0x72, 0x25, - 0xcd, 0x10, 0xa3, 0xb5, 0x84, 0x52, 0xed, 0x40, 0x35, 0x9d, 0x21, 0xbb, 0x01, 0xc0, 0xb3, 0x94, - 0xdc, 0x80, 0x12, 0x84, 0x5d, 0x83, 0xe8, 0x5a, 0x6c, 0x93, 0x2a, 0xb6, 0x1e, 0x5f, 0x93, 0x6d, - 0xaa, 0x7f, 0x27, 0x0b, 0x90, 0xe8, 0x91, 0xd8, 0x11, 0xb1, 0x2f, 0x29, 0x2f, 0xe2, 0x07, 0xde, - 0x80, 0x92, 0xe3, 0x19, 0xa6, 0xfc, 0x7c, 0x45, 0x11, 0x01, 0x34, 0x34, 0xf2, 0x15, 0xb1, 0x12, - 0x0f, 0xde, 0x61, 0x97, 0x61, 0x6d, 0xec, 0xf9, 0x13, 0x23, 0x14, 0x77, 0x2f, 0x44, 0x0a, 0xb7, - 0x03, 0x7e, 0xa6, 0x8d, 0xda, 0xb4, 0x4b, 0xd7, 0x2f, 0x70, 0x0c, 0x2a, 0x02, 0xd8, 0x41, 0x18, - 0x1a, 0x8f, 0x96, 0x3b, 0x72, 0xbc, 0xc0, 0x32, 0xf5, 0x21, 0x8f, 0x87, 0xaa, 0x68, 0x10, 0x81, - 0xb6, 0xcf, 0x78, 0x6b, 0xfd, 0x89, 0xed, 0x1a, 0xa1, 0x38, 0xe9, 0xa1, 0xd6, 0x46, 0x10, 0xac, - 0xee, 0x97, 0x81, 0x27, 0x5c, 0x4b, 0xfc, 0x78, 0xbc, 0x88, 0x00, 0xaa, 0xee, 0x9b, 0x00, 0x56, - 0x30, 0x32, 0xa6, 0x3c, 0xf3, 0x12, 0x65, 0x5e, 0x12, 0x90, 0xed, 0x33, 0xd6, 0x81, 0xea, 0x60, - 0x88, 0xdb, 0x97, 0x87, 0x26, 0x7f, 0xc3, 0x73, 0x84, 0xd3, 0xe7, 0xce, 0xbc, 0xc2, 0xfd, 0x20, - 0x4d, 0xc6, 0xcf, 0xf1, 0xe7, 0x78, 0xaf, 0xd5, 0xe1, 0xc2, 0x12, 0xb2, 0x6f, 0x14, 0xd0, 0xe8, - 0x44, 0xa3, 0x53, 0x0f, 0x43, 0xba, 0xee, 0x14, 0xef, 0xd4, 0x99, 0xe8, 0xd2, 0x06, 0xdf, 0xa4, - 0xdf, 0xa0, 0x90, 0x25, 0x11, 0x4f, 0x2b, 0x06, 0x29, 0x8e, 0x93, 0xbd, 0x0b, 0x1b, 0x88, 0x1c, - 0xdb, 0x96, 0x63, 0x0a, 0x12, 0x7e, 0x5b, 0x67, 0x7d, 0xe4, 0x39, 0x3b, 0x08, 0x25, 0x3a, 0xf5, - 0x6f, 0xe7, 0x01, 0x12, 0x1b, 0x2d, 0x15, 0x4a, 0x90, 0x49, 0x87, 0x12, 0x3c, 0x82, 0xcb, 0xe2, - 0x2e, 0x57, 0x7c, 0x1e, 0x6f, 0xbb, 0xfa, 0xd0, 0x88, 0xa2, 0x36, 0x98, 0xc0, 0xf2, 0x23, 0xf9, - 0xb6, 0xbb, 0x6d, 0xa0, 0xc6, 0xb7, 0x21, 0xf3, 0x84, 0x67, 0xd3, 0xb4, 0x3b, 0x57, 0xd6, 0x23, - 0x12, 0xf6, 0xc1, 0xd9, 0x94, 0x7d, 0x00, 0x97, 0x7c, 0x6b, 0xec, 0x5b, 0xc1, 0x91, 0x1e, 0x06, - 0x72, 0x61, 0x3c, 0x38, 0x72, 0x53, 0x20, 0x07, 0x41, 0x5c, 0xd6, 0x07, 0x70, 0x49, 0x58, 0x6f, - 0x73, 0xd5, 0xe3, 0x97, 0xfe, 0x37, 0x39, 0x52, 0xae, 0x1d, 0x45, 0xc2, 0x92, 0xe1, 0x1a, 0x3d, - 0x02, 0x53, 0xd4, 0x4a, 0xdc, 0x48, 0x15, 0x57, 0xa3, 0xc9, 0xfa, 0x14, 0xe7, 0xac, 0x3c, 0xc1, - 0x54, 0xc8, 0xa1, 0x38, 0xa5, 0x33, 0xc1, 0xea, 0xa3, 0xea, 0x03, 0x7a, 0xe4, 0x86, 0xae, 0xaa, - 0x7b, 0xa6, 0xa5, 0x11, 0x8e, 0xbd, 0x0f, 0x17, 0xe4, 0x66, 0x47, 0xef, 0x34, 0x94, 0xa9, 0x22, - 0x4a, 0xd2, 0x50, 0x8d, 0xbf, 0xd8, 0xf0, 0x2e, 0x30, 0xa9, 0xe6, 0x11, 0x75, 0x85, 0xa8, 0x37, - 0xe2, 0x6a, 0x0b, 0xe2, 0xb7, 0x81, 0xaa, 0xc8, 0x8f, 0x60, 0xd6, 0x17, 0x4d, 0x35, 0x44, 0xd2, - 0x59, 0xcc, 0x07, 0x70, 0x29, 0x69, 0x9d, 0x6e, 0x84, 0x7a, 0x78, 0x64, 0xe9, 0x96, 0x6b, 0xd2, - 0x05, 0xbc, 0xa2, 0xb6, 0x19, 0x37, 0xb4, 0x1e, 0x0e, 0x8e, 0x2c, 0x34, 0xb6, 0x24, 0x17, 0xdc, - 0xc6, 0xab, 0x5d, 0x70, 0x9f, 0x40, 0x2d, 0x15, 0x5f, 0x20, 0x77, 0x37, 0xbf, 0xc0, 0x7a, 0x51, - 0x8e, 0x2a, 0x88, 0x7b, 0xfc, 0x3e, 0x6c, 0x1e, 0x19, 0x81, 0x9e, 0xe2, 0x25, 0xcf, 0x60, 0x51, - 0xdb, 0x38, 0x32, 0x82, 0x7d, 0x89, 0x47, 0xfd, 0xdd, 0x0c, 0x54, 0xd3, 0x56, 0x2b, 0xbf, 0xc0, - 0xe4, 0xcc, 0x26, 0x2e, 0x0f, 0x25, 0xca, 0x6b, 0x51, 0x12, 0xd7, 0xc2, 0xf4, 0x58, 0xe7, 0xa9, - 0x68, 0x2d, 0x4c, 0x8f, 0x1b, 0x94, 0x66, 0xef, 0x40, 0x61, 0x7a, 0xcc, 0x85, 0xc3, 0x79, 0xb3, - 0x6f, 0x6d, 0xca, 0xe3, 0xc0, 0xdf, 0x81, 0xc2, 0x4c, 0x90, 0xe6, 0xce, 0x23, 0x9d, 0x11, 0xa9, - 0xfa, 0x67, 0xab, 0x50, 0x91, 0xfd, 0x35, 0x5f, 0x27, 0xec, 0xe0, 0x1b, 0x85, 0x8b, 0x6c, 0x51, - 0x48, 0xa7, 0x4e, 0x41, 0xe7, 0xd8, 0x4f, 0x3c, 0xe6, 0x00, 0x8e, 0x8c, 0xa0, 0x3e, 0x0b, 0xbd, - 0x86, 0xc7, 0x8f, 0x3a, 0x3d, 0x27, 0x0a, 0x46, 0xe7, 0x2b, 0x03, 0x65, 0x82, 0x88, 0x43, 0xff, - 0x40, 0xdc, 0x75, 0xa1, 0xdb, 0x6d, 0x14, 0xaa, 0x94, 0x5f, 0x98, 0x2f, 0x95, 0xe8, 0x72, 0x1b, - 0x45, 0x21, 0x3d, 0x82, 0x8d, 0xe4, 0x66, 0x41, 0x14, 0xdd, 0x34, 0xcf, 0xb2, 0x1e, 0x5f, 0x2b, - 0x10, 0xd7, 0xd9, 0xd7, 0xed, 0x40, 0xf7, 0x1c, 0x33, 0xba, 0xc2, 0x54, 0x88, 0x1c, 0xf0, 0x3d, - 0xc7, 0x14, 0x17, 0x1c, 0x39, 0x8d, 0x6b, 0x9d, 0x44, 0x34, 0xb1, 0x93, 0xbe, 0x6b, 0x9d, 0x88, - 0xab, 0x4c, 0x7f, 0x91, 0x81, 0xcd, 0x05, 0xff, 0x0a, 0x4a, 0xce, 0xe4, 0x71, 0x25, 0xfc, 0xc9, - 0x6e, 0x41, 0x65, 0x62, 0x84, 0xa3, 0x23, 0x7d, 0xea, 0x5b, 0x63, 0xfb, 0x34, 0x7a, 0x21, 0x8a, - 0x60, 0xfb, 0x04, 0xa2, 0x88, 0x2f, 0x3a, 0x14, 0xe2, 0x7e, 0x6f, 0x2e, 0xf8, 0xf8, 0x41, 0x50, - 0x87, 0x1c, 0xde, 0x51, 0x34, 0x68, 0xee, 0x9c, 0x68, 0xd0, 0x6b, 0x50, 0x72, 0xbd, 0x50, 0xf7, - 0x5c, 0x7d, 0x7a, 0x2c, 0xde, 0x3f, 0x28, 0xb8, 0x5e, 0xd8, 0x73, 0xf7, 0x8f, 0xd9, 0x3d, 0x50, - 0x66, 0x81, 0xa5, 0x0f, 0x1d, 0xcf, 0x9b, 0x44, 0x46, 0x0e, 0x97, 0x1d, 0xd5, 0x59, 0x60, 0x6d, - 0x23, 0x98, 0xd7, 0x5f, 0xbd, 0x0e, 0x6b, 0xed, 0xd8, 0x1b, 0x14, 0x07, 0x3e, 0x65, 0xc5, 0x63, - 0x2a, 0x1e, 0x94, 0x1a, 0xf4, 0x30, 0xcb, 0x9e, 0x31, 0x65, 0xf7, 0x21, 0x3b, 0x31, 0xa6, 0xe2, - 0xfc, 0xa9, 0x16, 0x1f, 0xd2, 0x71, 0xec, 0x83, 0x3d, 0x63, 0xca, 0xb7, 0x1b, 0x24, 0xba, 0xf6, - 0x09, 0x14, 0x23, 0xc0, 0x37, 0xda, 0x58, 0xfe, 0xdd, 0x2a, 0x94, 0x9a, 0xb2, 0x0f, 0x19, 0x0d, - 0xe3, 0xd0, 0x9f, 0xb9, 0xa8, 0xa5, 0x45, 0x4f, 0x4c, 0x8c, 0x0c, 0x77, 0x20, 0x40, 0xd1, 0x84, - 0x5e, 0x7d, 0xc5, 0x84, 0xbe, 0x0e, 0xe0, 0x93, 0x33, 0x84, 0xfc, 0x21, 0xd9, 0x38, 0x08, 0xb7, - 0x6d, 0xb6, 0xcd, 0xd3, 0xe5, 0x51, 0x36, 0xb9, 0xaf, 0x1f, 0x65, 0x93, 0x5f, 0x1a, 0x65, 0x73, - 0x37, 0xd9, 0x54, 0x70, 0x62, 0x63, 0xc1, 0x25, 0xbe, 0xb5, 0x4d, 0xe3, 0xfb, 0x3c, 0x58, 0xfa, - 0x77, 0xa0, 0x1a, 0xb5, 0x4e, 0xe4, 0x07, 0xa9, 0x2b, 0x44, 0x02, 0xc7, 0x9d, 0xce, 0xeb, 0xa1, - 0x9c, 0x4c, 0x2f, 0xd4, 0xf2, 0x6b, 0xc2, 0x8f, 0xfe, 0x6e, 0x06, 0x98, 0x30, 0xde, 0x77, 0x66, - 0x8e, 0x33, 0xb0, 0x4e, 0x49, 0x1e, 0xdc, 0x87, 0x4d, 0xe1, 0x13, 0x97, 0x82, 0xf7, 0xc4, 0x89, - 0x2d, 0x47, 0x24, 0x27, 0xb6, 0xcb, 0x6e, 0x79, 0xae, 0x2e, 0xbd, 0xe5, 0xb9, 0xfc, 0xf6, 0xe8, - 0x4d, 0x28, 0xcb, 0x77, 0x24, 0xb9, 0x12, 0x06, 0x46, 0x72, 0x3d, 0xf2, 0x3f, 0xac, 0x02, 0x24, - 0x0e, 0x86, 0x5f, 0x74, 0x88, 0xd4, 0x92, 0x21, 0xc9, 0x2e, 0x1b, 0x92, 0x7b, 0xa0, 0xc8, 0x74, - 0xd2, 0x65, 0xdd, 0x6a, 0x42, 0x18, 0x29, 0x37, 0x76, 0x20, 0x5f, 0xa8, 0xa4, 0x78, 0x48, 0x11, - 0x06, 0x22, 0x82, 0x25, 0x49, 0xf2, 0x8a, 0xb5, 0x57, 0xb4, 0x03, 0x2e, 0x89, 0xd9, 0x67, 0x70, - 0x35, 0xe6, 0xd4, 0x4f, 0xec, 0xf0, 0xc8, 0x9b, 0x85, 0x62, 0x9d, 0x06, 0x42, 0x36, 0x5d, 0x8e, - 0x72, 0x7a, 0xc1, 0xd1, 0x7c, 0xbd, 0x06, 0xa8, 0x9e, 0x8f, 0x67, 0x8e, 0xa3, 0x87, 0xd6, 0x69, - 0x28, 0x5e, 0xad, 0xa8, 0xa5, 0x7c, 0x33, 0xd2, 0xf0, 0x6a, 0xc5, 0xb1, 0x48, 0xa8, 0x7f, 0x96, - 0x85, 0xfc, 0x8f, 0x66, 0x96, 0x7f, 0xc6, 0x3e, 0x81, 0x52, 0x10, 0x4e, 0x42, 0xf9, 0x70, 0xf6, - 0x2a, 0xcf, 0x80, 0xf0, 0x74, 0xb6, 0x6a, 0x4d, 0x2c, 0x37, 0xe4, 0x4e, 0x4b, 0xa4, 0xa5, 0x6d, - 0xe7, 0x22, 0xe4, 0x83, 0xd0, 0x9a, 0x06, 0x22, 0xb8, 0x91, 0x27, 0xd8, 0x16, 0xe4, 0x5d, 0xcf, - 0xb4, 0x82, 0x74, 0x08, 0x63, 0x17, 0xf5, 0x0c, 0x8e, 0x60, 0x2a, 0xac, 0xc5, 0x23, 0xbe, 0x70, - 0x40, 0xca, 0x31, 0x74, 0x29, 0xc5, 0x32, 0x4c, 0xdb, 0x3d, 0x8c, 0x2e, 0x3f, 0xc7, 0x69, 0xdc, - 0x50, 0x49, 0xad, 0x37, 0x0e, 0xa3, 0x97, 0x08, 0x44, 0x92, 0x6d, 0x41, 0x19, 0x7f, 0xbe, 0xf0, - 0xed, 0xd0, 0xea, 0x3f, 0x8e, 0x64, 0xba, 0x04, 0x42, 0xa5, 0xdc, 0xb4, 0x42, 0x6b, 0x14, 0xf6, - 0xbf, 0x12, 0x71, 0x89, 0x14, 0xbe, 0x16, 0x41, 0xd8, 0x77, 0x80, 0x0d, 0x8d, 0xd1, 0xf1, 0xa1, - 0x4f, 0x01, 0x00, 0x5f, 0xcd, 0x2c, 0xdf, 0xb6, 0xa2, 0x38, 0xc4, 0xb2, 0xd4, 0x29, 0xda, 0x66, - 0x42, 0xf6, 0x23, 0x4e, 0x85, 0xe6, 0xc4, 0xc4, 0x38, 0x6d, 0x7a, 0x53, 0x11, 0x7a, 0x25, 0x52, - 0xaa, 0x09, 0xeb, 0xa9, 0x2e, 0x5c, 0xf0, 0x0f, 0xf5, 0x5b, 0x9d, 0x56, 0x63, 0xc0, 0x0d, 0x4b, - 0xe1, 0x94, 0x58, 0x95, 0x9d, 0x1a, 0x59, 0xc9, 0xdb, 0x91, 0x93, 0xac, 0xcf, 0x3c, 0xf9, 0x4a, - 0x5a, 0xda, 0xd3, 0x96, 0xb2, 0xa6, 0xfe, 0xbd, 0x55, 0xd8, 0x1c, 0xf8, 0x86, 0x1b, 0x18, 0x5c, - 0x17, 0x71, 0x43, 0xdf, 0x73, 0xd8, 0x77, 0xa0, 0x18, 0x8e, 0x1c, 0x79, 0x68, 0x6f, 0x46, 0x82, - 0x64, 0x8e, 0xf4, 0xc1, 0x60, 0xc4, 0xbd, 0xd2, 0x85, 0x90, 0xff, 0x60, 0xef, 0x43, 0x7e, 0x68, - 0x1d, 0xda, 0xae, 0x90, 0xa5, 0x97, 0xe6, 0x19, 0xb7, 0x11, 0xb9, 0xbb, 0xa2, 0x71, 0x2a, 0xf6, - 0x01, 0xac, 0x8d, 0xbc, 0x49, 0xb4, 0x75, 0x25, 0x97, 0xeb, 0xa4, 0x82, 0x10, 0xbb, 0xbb, 0xa2, - 0x09, 0x3a, 0xf6, 0x09, 0x14, 0x7d, 0xcf, 0x71, 0xb0, 0x27, 0xc5, 0xa6, 0x56, 0x9b, 0xe7, 0xd1, - 0x04, 0x7e, 0x77, 0x45, 0x8b, 0x69, 0xd5, 0x07, 0x50, 0x10, 0x95, 0xc5, 0x0e, 0xd8, 0x6e, 0x3d, - 0x6d, 0x8b, 0x8e, 0x6c, 0xf4, 0xf6, 0xf6, 0xda, 0x03, 0x7e, 0x73, 0x58, 0xeb, 0x75, 0x3a, 0xdb, - 0xf5, 0xc6, 0x33, 0x65, 0x75, 0xbb, 0x08, 0x6b, 0xdc, 0xff, 0xa8, 0xfe, 0x7a, 0x06, 0x36, 0xe6, - 0x1a, 0xc0, 0x9e, 0x40, 0x6e, 0x82, 0xba, 0x31, 0xef, 0x9e, 0x3b, 0x4b, 0x5b, 0x29, 0xa5, 0xb9, - 0xc6, 0x8c, 0x1c, 0xea, 0x67, 0x50, 0x4d, 0xc3, 0x25, 0x1f, 0xc4, 0x3a, 0x94, 0xb4, 0x56, 0xbd, - 0xa9, 0xf7, 0xba, 0x68, 0xf9, 0xb3, 0x2a, 0x00, 0x25, 0x5f, 0x68, 0x6d, 0x72, 0x1b, 0xfc, 0x0a, - 0x28, 0xf3, 0x1d, 0xc3, 0x9e, 0xa2, 0xf5, 0x33, 0x99, 0x3a, 0x16, 0x29, 0x99, 0xd2, 0x90, 0xdd, - 0x58, 0xd2, 0x93, 0x82, 0x8c, 0xc7, 0xa2, 0x8c, 0x52, 0x69, 0xf5, 0x57, 0x81, 0x2d, 0xf6, 0xe0, - 0x2f, 0x2e, 0xfb, 0xff, 0x95, 0x81, 0xdc, 0xbe, 0x63, 0xb8, 0xec, 0x36, 0xe4, 0xe9, 0xc5, 0x1b, - 0x21, 0x91, 0xe5, 0xf5, 0x81, 0xd3, 0x82, 0x70, 0xec, 0x5d, 0xc8, 0x86, 0xa3, 0xe8, 0xc2, 0xf2, - 0x95, 0x73, 0x26, 0xdf, 0xee, 0x8a, 0x86, 0x54, 0xec, 0x1e, 0x64, 0x4d, 0x33, 0x0a, 0xf2, 0x17, - 0x5e, 0x09, 0xb4, 0x49, 0x9b, 0xd6, 0xd8, 0x76, 0x6d, 0xf1, 0x42, 0x0f, 0x92, 0xb0, 0xb7, 0x20, - 0x6b, 0x8e, 0x9c, 0xf4, 0x8d, 0x0d, 0x6e, 0xbd, 0xc6, 0x19, 0x9a, 0x23, 0x07, 0x75, 0xb8, 0xd0, - 0x3f, 0xd3, 0xfd, 0x99, 0x4b, 0x51, 0x8b, 0x81, 0xb0, 0xab, 0xca, 0xa8, 0x97, 0xcc, 0x28, 0xf4, - 0x31, 0x10, 0x37, 0x1f, 0xa7, 0xbe, 0x35, 0x35, 0xfc, 0xd8, 0xa2, 0xb2, 0x83, 0x7d, 0x0e, 0xd8, - 0x5e, 0x03, 0x7a, 0x48, 0x54, 0x7d, 0x8f, 0x9e, 0x63, 0x41, 0xd5, 0x5c, 0x8d, 0x7e, 0x2d, 0x79, - 0x73, 0x4e, 0x60, 0xd4, 0xbf, 0xcc, 0x42, 0x59, 0xaa, 0x0f, 0xfb, 0x08, 0x8a, 0x66, 0x7a, 0x21, - 0x5e, 0x5d, 0xa8, 0xf4, 0x83, 0x66, 0xb4, 0x04, 0x4d, 0x31, 0xbd, 0xe9, 0xc8, 0x23, 0xd4, 0x5f, - 0x1a, 0xbe, 0xcd, 0x1f, 0xe1, 0x5a, 0x95, 0xcf, 0x1e, 0xfa, 0x56, 0xf8, 0x3c, 0xc2, 0xec, 0xae, - 0x68, 0x95, 0x40, 0x4a, 0x93, 0xfd, 0x20, 0x9a, 0x94, 0x4d, 0x3d, 0x66, 0xc6, 0x81, 0xbb, 0x2b, - 0x5a, 0x84, 0x47, 0x52, 0xeb, 0xd4, 0x1a, 0xcd, 0xc2, 0xc8, 0x7e, 0x58, 0x8f, 0x1a, 0x44, 0x40, - 0x7a, 0x51, 0x91, 0xff, 0x64, 0x8f, 0x50, 0x7e, 0x1a, 0x8e, 0xe3, 0x91, 0xfa, 0x95, 0x97, 0x4f, - 0x02, 0x9a, 0x31, 0x9c, 0xbf, 0xe0, 0x18, 0xa5, 0xd8, 0x5d, 0xc8, 0x7b, 0xe1, 0x91, 0x15, 0x69, - 0xe5, 0xd1, 0xc3, 0x2e, 0x08, 0x6a, 0x36, 0x3a, 0x38, 0x53, 0x08, 0xad, 0xfe, 0x5e, 0x06, 0x0a, - 0xa2, 0x07, 0xd8, 0x26, 0xac, 0xf7, 0x5b, 0x03, 0xfd, 0x79, 0x5d, 0x6b, 0xd7, 0xb7, 0x3b, 0x2d, - 0x71, 0xd1, 0xe4, 0xa9, 0x56, 0xef, 0x0a, 0x39, 0xa9, 0xb5, 0x9e, 0xf7, 0x9e, 0xb5, 0xb8, 0x63, - 0xaf, 0xd9, 0xea, 0x7e, 0xa1, 0x64, 0xb9, 0x73, 0xbb, 0xb5, 0x5f, 0xd7, 0x50, 0x4a, 0x96, 0xa1, - 0xd0, 0xfa, 0xbc, 0xd5, 0x38, 0x20, 0x31, 0x59, 0x05, 0x68, 0xb6, 0xea, 0x9d, 0x4e, 0xaf, 0x81, - 0x62, 0x73, 0x8d, 0x31, 0xa8, 0x36, 0xb4, 0x56, 0x7d, 0xd0, 0xd2, 0xeb, 0x8d, 0x46, 0xef, 0xa0, - 0x3b, 0x50, 0x0a, 0x58, 0x62, 0xbd, 0x33, 0x68, 0x69, 0x31, 0x88, 0x1e, 0xdb, 0x6a, 0x6a, 0xbd, - 0xfd, 0x18, 0x52, 0xda, 0x2e, 0xa1, 0x2d, 0x47, 0x63, 0xa5, 0xfe, 0xf1, 0x26, 0x54, 0xd3, 0x53, - 0x93, 0x7d, 0x0a, 0x45, 0xd3, 0x4c, 0x8d, 0xf1, 0xf5, 0x65, 0x53, 0xf8, 0x41, 0xd3, 0x8c, 0x86, - 0x99, 0xff, 0x60, 0xb7, 0xa2, 0x85, 0xb4, 0xba, 0xb0, 0x90, 0xa2, 0x65, 0xf4, 0x7d, 0xd8, 0x10, - 0x0f, 0xa3, 0x98, 0x46, 0x68, 0x0c, 0x8d, 0xc0, 0x4a, 0xaf, 0x92, 0x06, 0x21, 0x9b, 0x02, 0xb7, - 0xbb, 0xa2, 0x55, 0x47, 0x29, 0x08, 0xfb, 0x2e, 0x54, 0x0d, 0x32, 0xd7, 0x63, 0xfe, 0x9c, 0xac, - 0x58, 0xd6, 0x11, 0x27, 0xb1, 0xaf, 0x1b, 0x32, 0x00, 0x27, 0xa2, 0xe9, 0x7b, 0xd3, 0x84, 0x39, - 0x9f, 0x3a, 0x04, 0xf3, 0xbd, 0xa9, 0xc4, 0x5b, 0x31, 0xa5, 0x34, 0xfb, 0x04, 0x2a, 0xa2, 0xe6, - 0x89, 0xcb, 0x22, 0x5e, 0xb2, 0xbc, 0xda, 0xa4, 0x28, 0xee, 0xae, 0x68, 0xe5, 0x51, 0x92, 0x64, - 0x8f, 0x51, 0x3b, 0x4c, 0xd4, 0xea, 0x82, 0x3c, 0xd7, 0xa8, 0xb6, 0x11, 0x17, 0x18, 0x71, 0x8a, - 0x7d, 0x00, 0x40, 0xf5, 0xe4, 0x3c, 0xc5, 0x54, 0x50, 0x8a, 0xef, 0x4d, 0x23, 0x96, 0x92, 0x19, - 0x25, 0xa4, 0xea, 0x71, 0x87, 0x53, 0x69, 0xb1, 0x7a, 0xe4, 0x74, 0x4a, 0xaa, 0xc7, 0x7d, 0x55, - 0x71, 0xf5, 0x38, 0x1b, 0x2c, 0x54, 0x2f, 0xe2, 0xe2, 0xd5, 0xe3, 0x4c, 0x51, 0xf5, 0x38, 0x4f, - 0x79, 0xbe, 0x7a, 0x11, 0x0b, 0x55, 0x8f, 0x73, 0x7c, 0x77, 0xc1, 0x1e, 0xa8, 0x9c, 0x6b, 0x0f, - 0xe0, 0xb0, 0xa5, 0x2d, 0x82, 0xef, 0x42, 0x35, 0x38, 0xf2, 0x4e, 0x24, 0x01, 0xb2, 0x2e, 0x73, - 0xf7, 0x8f, 0xbc, 0x13, 0x59, 0x82, 0xac, 0x07, 0x32, 0x00, 0x6b, 0xcb, 0x9b, 0x48, 0x2f, 0x32, - 0x54, 0xe5, 0xda, 0x52, 0x0b, 0x9f, 0xdb, 0xd6, 0x09, 0xd6, 0xd6, 0x88, 0x12, 0xd8, 0x29, 0x89, - 0xfb, 0x26, 0x10, 0x0e, 0x99, 0x54, 0x50, 0x85, 0x28, 0x09, 0x62, 0x47, 0x4e, 0x80, 0x73, 0x6b, - 0xe6, 0xca, 0x6c, 0x8a, 0x3c, 0xb7, 0x0e, 0xdc, 0x14, 0x63, 0x85, 0x93, 0x0a, 0xd6, 0x64, 0x55, - 0x04, 0xd6, 0x57, 0x33, 0xcb, 0x1d, 0x59, 0x22, 0x64, 0x2b, 0xb5, 0x2a, 0xfa, 0x02, 0x97, 0xac, - 0x8a, 0x08, 0x12, 0xcf, 0xeb, 0x98, 0x9d, 0xcd, 0xcf, 0x6b, 0x89, 0x99, 0xe6, 0x75, 0xcc, 0x1a, - 0x2f, 0xa8, 0x98, 0xf7, 0xc2, 0xc2, 0x82, 0x92, 0x98, 0xf9, 0x82, 0x8a, 0xb9, 0x1f, 0x83, 0x98, - 0x4d, 0xbc, 0x73, 0x53, 0x81, 0x5d, 0xbc, 0xd6, 0xa2, 0x77, 0x61, 0x14, 0xa7, 0x70, 0xae, 0xfa, - 0x16, 0xda, 0x1f, 0x62, 0x2a, 0x5c, 0x92, 0xe7, 0xaa, 0x46, 0x98, 0x78, 0x29, 0xf9, 0x49, 0x52, - 0x2a, 0x6c, 0x6a, 0x87, 0x7e, 0xcd, 0x5c, 0x2c, 0x6c, 0xdf, 0x0e, 0xfd, 0xa4, 0x30, 0x4c, 0xb1, - 0xf7, 0x81, 0xa6, 0x21, 0x67, 0xb1, 0x64, 0xd1, 0x8d, 0xdd, 0x22, 0x18, 0x8a, 0xa6, 0xf8, 0x8d, - 0x93, 0x45, 0x94, 0x31, 0x32, 0x47, 0xb5, 0xb1, 0x3c, 0x59, 0x78, 0x11, 0x8d, 0x66, 0x03, 0x27, - 0x0b, 0x27, 0x6a, 0x98, 0x23, 0x76, 0x1f, 0x88, 0x9b, 0xe8, 0x0f, 0x53, 0x0f, 0x87, 0xf9, 0xde, - 0x94, 0x53, 0x17, 0x90, 0x00, 0x69, 0xb1, 0x05, 0x8e, 0xe7, 0x46, 0x0d, 0x3f, 0x4a, 0xb5, 0x00, - 0x11, 0xb1, 0x30, 0x18, 0xc5, 0x29, 0xf5, 0x37, 0xd7, 0xa0, 0x20, 0x64, 0x2d, 0xbb, 0x00, 0x1b, - 0x42, 0xe4, 0x37, 0xeb, 0x83, 0xfa, 0x76, 0xbd, 0x8f, 0x4a, 0x1a, 0x83, 0x2a, 0x97, 0xf9, 0x31, - 0x2c, 0x83, 0xfb, 0x00, 0x09, 0xfd, 0x18, 0xb4, 0x8a, 0xfb, 0x80, 0xe0, 0xe5, 0x0f, 0x34, 0x66, - 0xd9, 0x06, 0x94, 0x39, 0x23, 0x07, 0xd0, 0xbd, 0x57, 0xe2, 0xe2, 0xe9, 0xbc, 0xc4, 0xc2, 0xcf, - 0xb9, 0xd6, 0x12, 0x16, 0x0e, 0x28, 0xc4, 0x2c, 0xd1, 0x41, 0x18, 0x83, 0xea, 0x40, 0x3b, 0xe8, - 0x36, 0x92, 0x72, 0x4a, 0x74, 0x57, 0x91, 0x67, 0xf3, 0xbc, 0xdd, 0x7a, 0xa1, 0x00, 0x32, 0xf1, - 0x5c, 0x28, 0x5d, 0x46, 0x35, 0x93, 0x32, 0xa1, 0x64, 0x85, 0x5d, 0x81, 0x0b, 0xfd, 0xdd, 0xde, - 0x0b, 0x9d, 0x33, 0xc5, 0x4d, 0x58, 0x67, 0x17, 0x41, 0x91, 0x10, 0x3c, 0xfb, 0x2a, 0x16, 0x49, - 0xd0, 0x88, 0xb0, 0xaf, 0x6c, 0xd0, 0x51, 0x32, 0xc2, 0x06, 0x7c, 0xdf, 0x55, 0xb0, 0x29, 0x9c, - 0xb5, 0xd7, 0x39, 0xd8, 0xeb, 0xf6, 0x95, 0x4d, 0xac, 0x04, 0x41, 0x78, 0xcd, 0x59, 0x9c, 0x4d, - 0xb2, 0x5b, 0x5f, 0xa0, 0x0d, 0x1c, 0x61, 0x2f, 0xea, 0x5a, 0xb7, 0xdd, 0x7d, 0xda, 0x57, 0x2e, - 0xc6, 0x39, 0xb7, 0x34, 0xad, 0xa7, 0xf5, 0x95, 0x4b, 0x31, 0xa0, 0x3f, 0xa8, 0x0f, 0x0e, 0xfa, - 0xca, 0xe5, 0xb8, 0x96, 0xfb, 0x5a, 0xaf, 0xd1, 0xea, 0xf7, 0x3b, 0xed, 0xfe, 0x40, 0xb9, 0xc2, - 0x2e, 0xc1, 0x66, 0x52, 0xa3, 0x88, 0xb8, 0x26, 0x55, 0x54, 0x7b, 0xda, 0x1a, 0x28, 0x57, 0xe3, - 0x6a, 0x34, 0x7a, 0x9d, 0x4e, 0x9d, 0x0e, 0x41, 0xaf, 0x21, 0x11, 0x9d, 0x06, 0x8b, 0xd6, 0xbc, - 0x81, 0xf5, 0x3a, 0xe8, 0xca, 0xa0, 0xeb, 0xd2, 0xd4, 0xe8, 0xb7, 0x7e, 0x74, 0xd0, 0xea, 0x36, - 0x5a, 0xca, 0x9b, 0xc9, 0xd4, 0x88, 0x61, 0x37, 0xe2, 0xa9, 0x11, 0x83, 0x6e, 0xc6, 0x65, 0x46, - 0xa0, 0xbe, 0xb2, 0x85, 0xf9, 0x89, 0x7a, 0x74, 0xbb, 0xad, 0xc6, 0x00, 0xdb, 0x7a, 0x2b, 0xee, - 0xc5, 0x83, 0xfd, 0xa7, 0x5a, 0xbd, 0xd9, 0x52, 0x54, 0x84, 0x68, 0xad, 0x6e, 0x7d, 0x2f, 0x1a, - 0xed, 0xdb, 0xd2, 0x68, 0xef, 0xb7, 0x07, 0x9a, 0x72, 0x27, 0x1e, 0x5d, 0x4a, 0xbe, 0xc5, 0xde, - 0x80, 0x2b, 0xf2, 0x3c, 0xd4, 0x5f, 0xb4, 0x07, 0xbb, 0xe2, 0xcc, 0xf6, 0x2e, 0x3f, 0x7b, 0x24, - 0x64, 0xa3, 0xd9, 0xe0, 0x87, 0xd3, 0xc4, 0x8b, 0xa9, 0x7b, 0xdb, 0x15, 0x7a, 0x67, 0x5b, 0x28, - 0x20, 0xea, 0x0f, 0x81, 0xc9, 0x4f, 0xce, 0x8a, 0xc8, 0x57, 0x06, 0xb9, 0xb1, 0xef, 0x4d, 0xa2, - 0x37, 0x28, 0xf0, 0x37, 0x5a, 0xd4, 0xd3, 0xd9, 0x90, 0xce, 0x44, 0x93, 0x3b, 0xe6, 0x32, 0x48, - 0xfd, 0xc7, 0x19, 0xa8, 0xa6, 0x95, 0x0f, 0x72, 0x9c, 0x8e, 0x75, 0xd7, 0x0b, 0xf9, 0xa3, 0x5e, - 0x41, 0xfc, 0x12, 0xec, 0xb8, 0xeb, 0x85, 0xf4, 0xaa, 0x17, 0x19, 0xf8, 0xb1, 0x2e, 0xc1, 0x73, - 0x8d, 0xd3, 0xac, 0x0d, 0x17, 0x52, 0xaf, 0xf6, 0xa6, 0x9e, 0x54, 0xab, 0xc5, 0xaf, 0x6d, 0xce, - 0xd5, 0x5f, 0x63, 0xc1, 0x62, 0x9b, 0xc4, 0x4b, 0x01, 0xb9, 0xe4, 0xa5, 0x80, 0x5d, 0x58, 0x4f, - 0xe9, 0x3a, 0xe4, 0x97, 0x19, 0xa7, 0x6b, 0x5a, 0xb4, 0xc7, 0xaf, 0xaf, 0xa6, 0xfa, 0x8f, 0x32, - 0x50, 0x91, 0x35, 0x9f, 0x6f, 0x9d, 0x13, 0xdd, 0xaa, 0x13, 0xbf, 0x75, 0xdb, 0x8c, 0x1e, 0xf3, - 0x8a, 0x40, 0x6d, 0xfa, 0xbe, 0x00, 0xf7, 0x41, 0xef, 0x1c, 0xf7, 0xe3, 0xe6, 0xc8, 0x20, 0x76, - 0x03, 0x80, 0xee, 0x18, 0xef, 0x3c, 0x43, 0x02, 0x71, 0x2f, 0x2f, 0x81, 0xa8, 0x37, 0xa1, 0xb4, - 0x73, 0x1c, 0x45, 0xca, 0xc8, 0x4f, 0xdb, 0x95, 0xf8, 0xc3, 0x04, 0xea, 0x1f, 0x66, 0xa0, 0x9a, - 0x3c, 0x03, 0x44, 0x27, 0xd3, 0xfc, 0xb5, 0x67, 0x3e, 0x1d, 0x56, 0xcd, 0x61, 0xf2, 0xe9, 0x81, - 0x55, 0xf9, 0xd3, 0x03, 0xb7, 0x45, 0x66, 0x59, 0x59, 0xe4, 0xc7, 0x65, 0x89, 0x67, 0x0f, 0x1e, - 0x43, 0x05, 0xff, 0x6b, 0xd6, 0xd8, 0xf2, 0x7d, 0xcb, 0x4c, 0xdf, 0x1d, 0x48, 0x88, 0x53, 0x44, - 0x64, 0xe3, 0x59, 0x63, 0xa1, 0x6a, 0x2e, 0x7d, 0xa9, 0x88, 0x5e, 0xd0, 0xfa, 0x1f, 0x59, 0x28, - 0x4b, 0x7a, 0xe4, 0xd7, 0x9a, 0x7e, 0xd7, 0xa1, 0x94, 0xbc, 0x9b, 0x23, 0xee, 0x9a, 0xc7, 0x80, - 0xd4, 0x58, 0x65, 0xe7, 0xc6, 0xaa, 0x06, 0x05, 0x11, 0x60, 0x2b, 0x9c, 0xc2, 0x51, 0x32, 0xed, - 0x7e, 0xcd, 0xbf, 0xe6, 0x9c, 0xe4, 0x43, 0xa8, 0x48, 0xbe, 0xd3, 0x40, 0xdc, 0xc7, 0x9e, 0xa7, - 0x2f, 0x27, 0x7e, 0xd4, 0x80, 0x5d, 0x82, 0xb5, 0xf1, 0xb1, 0x6e, 0x0e, 0xf9, 0x25, 0xdc, 0x92, - 0x96, 0x1f, 0x1f, 0x37, 0x87, 0x74, 0x8a, 0x34, 0x8e, 0x55, 0x27, 0xee, 0xd1, 0x2a, 0x8e, 0x23, - 0x05, 0xe9, 0x1e, 0x14, 0xc6, 0xc7, 0xf2, 0x65, 0xda, 0x85, 0x2e, 0x5f, 0x1b, 0x1f, 0xd3, 0xed, - 0xdb, 0x87, 0x70, 0x51, 0xec, 0xdf, 0x46, 0xa0, 0xf3, 0x67, 0x3d, 0xe8, 0x3d, 0x25, 0xfe, 0xd0, - 0xdd, 0x26, 0xc7, 0xd5, 0x83, 0x3e, 0x61, 0x70, 0xc6, 0xa9, 0x50, 0x91, 0x26, 0x20, 0x7f, 0x78, - 0xaa, 0xa4, 0xa5, 0x60, 0xec, 0x09, 0x54, 0xc6, 0xc7, 0x7c, 0x40, 0x07, 0xde, 0x9e, 0x25, 0xae, - 0x08, 0x5c, 0x9c, 0x1f, 0x4a, 0x0a, 0x1d, 0x48, 0x51, 0xb2, 0xcb, 0xb0, 0xa6, 0x19, 0x27, 0xfd, - 0x1f, 0x75, 0x48, 0x89, 0x2c, 0x69, 0x22, 0xf5, 0xc3, 0x5c, 0xb1, 0xaa, 0x6c, 0xa8, 0xff, 0x22, - 0x03, 0xd5, 0xc4, 0x06, 0xc0, 0x45, 0xc8, 0xee, 0xcb, 0xcf, 0xb4, 0xd7, 0xe6, 0xcd, 0x04, 0x24, - 0x79, 0x30, 0x38, 0x9b, 0xf2, 0xc7, 0x4c, 0x97, 0x3d, 0x16, 0xb6, 0xcc, 0x99, 0x9d, 0x5d, 0xfa, - 0x40, 0xf4, 0x53, 0xc8, 0x0e, 0xce, 0xa6, 0xdc, 0xdf, 0x84, 0x5b, 0x22, 0xb7, 0x4d, 0xf9, 0x66, - 0x48, 0xb1, 0x29, 0xcf, 0x5a, 0x5f, 0xf0, 0xb7, 0x31, 0xf6, 0xb5, 0xf6, 0x5e, 0x5d, 0xfb, 0x82, - 0xc2, 0x8e, 0x48, 0x69, 0xd8, 0xe9, 0x69, 0xad, 0xf6, 0xd3, 0x2e, 0x01, 0x72, 0xe4, 0x8d, 0x4a, - 0xaa, 0x58, 0x37, 0xcd, 0x9d, 0x63, 0xf9, 0x9d, 0xa5, 0x4c, 0xea, 0x9d, 0xa5, 0xf4, 0x75, 0xfa, - 0xd5, 0xf9, 0xeb, 0xf4, 0x2c, 0x5e, 0x85, 0xf1, 0x92, 0x66, 0x6f, 0x43, 0x6e, 0x7c, 0x6c, 0x9d, - 0xa5, 0x0d, 0xbd, 0xf4, 0x02, 0x22, 0x02, 0xf5, 0x67, 0x19, 0x60, 0xa9, 0x8a, 0x70, 0xdb, 0xe3, - 0xdb, 0xd6, 0xe5, 0x53, 0xa8, 0x89, 0x97, 0x3f, 0x39, 0x95, 0xe4, 0x3d, 0x17, 0x5d, 0x7a, 0xc9, - 0x4b, 0x82, 0x44, 0x93, 0xf7, 0xcc, 0xd8, 0x43, 0xe0, 0x4f, 0x2f, 0x52, 0xa4, 0x49, 0xee, 0x1c, - 0x3b, 0x51, 0x4b, 0x68, 0x92, 0xb7, 0x16, 0xe5, 0x37, 0x24, 0xb9, 0xe3, 0x7d, 0x23, 0x19, 0x35, - 0x5a, 0xf3, 0xea, 0xef, 0x64, 0xe0, 0x42, 0x7a, 0x42, 0xfc, 0x7c, 0xad, 0x4c, 0x3f, 0x98, 0x99, - 0x9d, 0x7f, 0x30, 0x73, 0xd9, 0x7c, 0xca, 0x2d, 0x9d, 0x4f, 0xbf, 0x91, 0x81, 0x8b, 0x52, 0xef, - 0x27, 0xd6, 0xe2, 0x5f, 0x51, 0xcd, 0xa4, 0x77, 0x33, 0x73, 0xa9, 0x77, 0x33, 0xd5, 0x3f, 0xc9, - 0xc0, 0xe5, 0xb9, 0x9a, 0x68, 0xd6, 0x5f, 0x69, 0x5d, 0xd2, 0xef, 0x6b, 0x92, 0xf3, 0x9f, 0x47, - 0xca, 0xf2, 0x7b, 0xd8, 0x2c, 0xfd, 0x60, 0x26, 0x1d, 0x4b, 0xbe, 0x29, 0x9e, 0x19, 0xd2, 0x83, - 0x33, 0x77, 0x24, 0x06, 0xbb, 0x44, 0x90, 0xfe, 0x99, 0x3b, 0x52, 0xff, 0x38, 0x03, 0x57, 0xe7, - 0xda, 0x50, 0x9f, 0x85, 0x9e, 0x38, 0xd3, 0xfd, 0x2b, 0x6a, 0xc6, 0x4d, 0x28, 0xd3, 0x89, 0xb7, - 0x38, 0x28, 0xe6, 0xdd, 0x0a, 0x46, 0x52, 0xae, 0x02, 0x59, 0xd3, 0x38, 0x13, 0x57, 0xc7, 0xf1, - 0x27, 0x2e, 0xd8, 0x23, 0x6f, 0xe6, 0x8b, 0xab, 0xe2, 0xf4, 0x5b, 0xfd, 0x08, 0x36, 0x93, 0xaa, - 0x37, 0xc4, 0x33, 0xa7, 0x37, 0xa1, 0xec, 0x5a, 0x27, 0x7a, 0xf4, 0x08, 0xaa, 0x08, 0x9b, 0x72, - 0xad, 0x13, 0x41, 0xa0, 0xee, 0xc8, 0xb2, 0x30, 0xfe, 0x22, 0x82, 0x63, 0xa6, 0xe2, 0x6f, 0x3c, - 0xc7, 0x8c, 0x50, 0x98, 0x9b, 0xd4, 0xca, 0x82, 0x6b, 0x9d, 0xd0, 0x3c, 0x3c, 0x11, 0xf9, 0xd4, - 0x4d, 0x53, 0xc4, 0x20, 0x2c, 0x7b, 0x95, 0xec, 0x2a, 0x14, 0xa7, 0x7e, 0xaa, 0x9b, 0x0a, 0x53, - 0x9f, 0x17, 0x7b, 0x47, 0x04, 0x65, 0x9d, 0x17, 0xaf, 0xc0, 0xc3, 0xb4, 0xc4, 0x17, 0x53, 0x72, - 0xc9, 0x17, 0x53, 0x3e, 0x16, 0x62, 0x90, 0xec, 0x3e, 0x5e, 0xb2, 0x02, 0x59, 0xdb, 0x3c, 0xa5, - 0x82, 0xd7, 0x35, 0xfc, 0x49, 0x9a, 0x9c, 0xf5, 0x95, 0x88, 0x0b, 0xc3, 0x9f, 0xea, 0x36, 0x94, - 0xb5, 0x94, 0x91, 0x5b, 0x91, 0xfc, 0x45, 0x41, 0xfa, 0xe1, 0xa6, 0xa4, 0x83, 0xb4, 0x72, 0xe2, - 0x2e, 0x0a, 0xd4, 0x40, 0x08, 0xbe, 0xe7, 0x86, 0x3f, 0x3a, 0x32, 0xfc, 0x8e, 0xe5, 0x1e, 0x86, - 0x47, 0xd8, 0xe5, 0xdc, 0x8d, 0x2b, 0x77, 0x21, 0x70, 0x50, 0x34, 0x1d, 0xb0, 0x17, 0x1d, 0x22, - 0x8f, 0xbe, 0xc5, 0xe0, 0x5a, 0x27, 0x82, 0xff, 0x4d, 0x00, 0xec, 0x7f, 0x81, 0xe6, 0x87, 0x8a, - 0x25, 0xcf, 0x31, 0x39, 0x5a, 0xdd, 0x14, 0xed, 0x15, 0x97, 0x76, 0x9a, 0xd6, 0x58, 0x75, 0xc4, - 0xc8, 0xf3, 0x06, 0x89, 0x4e, 0xf8, 0x56, 0xc3, 0xc8, 0x6e, 0x41, 0x25, 0xf2, 0x48, 0xd0, 0x5b, - 0x61, 0xbc, 0xf8, 0x72, 0x04, 0xeb, 0xce, 0x26, 0xea, 0xef, 0x66, 0xa1, 0x52, 0xe7, 0x11, 0x3a, - 0xd3, 0xb3, 0xde, 0x34, 0x64, 0xbf, 0x0a, 0x97, 0x82, 0x63, 0x7b, 0x2a, 0x3e, 0x9e, 0x40, 0x81, - 0x31, 0x14, 0x21, 0x2d, 0x3a, 0xf1, 0xbe, 0xd4, 0x89, 0x82, 0xe5, 0x41, 0xff, 0xd8, 0x9e, 0xf2, - 0xc0, 0xfc, 0xb6, 0x79, 0x4a, 0x51, 0xf0, 0xfc, 0xb4, 0x9f, 0x05, 0x0b, 0x08, 0xba, 0x01, 0x8f, - 0xd9, 0x4f, 0x8f, 0x45, 0xb6, 0x22, 0xfc, 0x01, 0x81, 0xfb, 0xc7, 0x9c, 0xe6, 0x3e, 0x6c, 0xf2, - 0xbb, 0x38, 0x8b, 0x1b, 0xf0, 0x06, 0x47, 0x24, 0xf3, 0xbb, 0x0f, 0x9b, 0x94, 0x9f, 0x78, 0xd4, - 0x52, 0x1f, 0x79, 0xd3, 0x33, 0x71, 0x98, 0xf8, 0xf6, 0x39, 0x55, 0x6d, 0x73, 0x52, 0x04, 0x89, - 0xc7, 0x6c, 0x82, 0x34, 0xf4, 0x5a, 0x0b, 0xae, 0x9c, 0xd3, 0xa6, 0xd7, 0x05, 0x2c, 0x14, 0xa5, - 0x80, 0x85, 0x6b, 0xdb, 0x70, 0x71, 0x59, 0x79, 0xdf, 0x24, 0x0f, 0xf5, 0x0f, 0xd6, 0x01, 0x92, - 0x19, 0x9b, 0x52, 0x47, 0x33, 0x73, 0xea, 0xe8, 0x37, 0x0a, 0xce, 0xf9, 0x08, 0xaa, 0xd8, 0x55, - 0x7a, 0xc2, 0x91, 0x5d, 0xca, 0x51, 0x41, 0xaa, 0x41, 0x72, 0xc9, 0x71, 0x31, 0xc8, 0x21, 0xb7, - 0x34, 0xc8, 0xe1, 0x43, 0x28, 0xf0, 0x83, 0xb6, 0x40, 0xdc, 0xab, 0xbd, 0x32, 0xbf, 0xfa, 0x1e, - 0x88, 0x20, 0xff, 0x88, 0x8e, 0xb5, 0xa0, 0x8a, 0xa2, 0xdf, 0xb7, 0xc3, 0xa3, 0x89, 0x7c, 0xcb, - 0xf6, 0xc6, 0x22, 0x67, 0x44, 0xc6, 0x9f, 0xc2, 0x34, 0xe4, 0xa4, 0xa4, 0xbd, 0x86, 0x13, 0xe1, - 0xfd, 0x25, 0xed, 0xb5, 0x20, 0x6b, 0xaf, 0x83, 0x09, 0xf7, 0xf9, 0xa2, 0xf6, 0xfa, 0x3e, 0x5c, - 0x10, 0x17, 0x8f, 0x90, 0x01, 0xbb, 0x93, 0xe8, 0x79, 0x1c, 0xa6, 0x78, 0xe3, 0x69, 0x30, 0x21, - 0xdb, 0x0e, 0xc9, 0x3f, 0x87, 0x8b, 0xa3, 0x23, 0xc3, 0x3d, 0xb4, 0xf4, 0x70, 0xe8, 0xe8, 0xf4, - 0x10, 0xbf, 0x3e, 0x31, 0xa6, 0x42, 0xa9, 0x7e, 0x7b, 0xa1, 0xb2, 0x0d, 0x22, 0x1e, 0x0c, 0x1d, - 0x0a, 0x24, 0x8b, 0x43, 0x61, 0x36, 0x47, 0xf3, 0xf0, 0xb9, 0x13, 0x69, 0x58, 0x38, 0x91, 0x9e, - 0x57, 0xb3, 0xcb, 0x4b, 0xd4, 0xec, 0x44, 0x59, 0xae, 0xc8, 0xca, 0x32, 0x7b, 0x0f, 0x0a, 0xe2, - 0xb6, 0xa6, 0xf0, 0xfb, 0xb2, 0xc5, 0xd5, 0xa1, 0x45, 0x24, 0x58, 0x52, 0x14, 0x1f, 0x41, 0x97, - 0xef, 0xab, 0xbc, 0x24, 0x19, 0xc6, 0xb6, 0x85, 0xd3, 0x33, 0x0e, 0x7a, 0x13, 0x3e, 0xde, 0x6b, - 0x52, 0xc6, 0x31, 0x4e, 0xd8, 0xe5, 0x73, 0x1c, 0xd7, 0xfe, 0xf9, 0x1a, 0xac, 0x89, 0xf8, 0xea, - 0xfb, 0x90, 0x33, 0x7d, 0x6f, 0x1a, 0x07, 0x2c, 0x2f, 0xd1, 0xda, 0xe9, 0xdb, 0x6b, 0xa8, 0xe0, - 0x3f, 0x80, 0x35, 0xc3, 0x34, 0xf5, 0xf1, 0x71, 0xfa, 0x3c, 0x7a, 0x4e, 0x81, 0xde, 0x5d, 0xd1, - 0xf2, 0x06, 0x69, 0xd2, 0x9f, 0x42, 0x09, 0xe9, 0x93, 0x30, 0xd2, 0xf2, 0xa2, 0x59, 0x10, 0xa9, - 0xba, 0xbb, 0x2b, 0x5a, 0xd1, 0x88, 0xd4, 0xde, 0xef, 0xa5, 0x3d, 0xfb, 0xb9, 0x85, 0x06, 0xce, - 0xe9, 0x69, 0x73, 0x3e, 0xfe, 0x5f, 0x06, 0xee, 0xea, 0x8d, 0x77, 0xec, 0xbc, 0x7c, 0xf4, 0xb9, - 0xb0, 0xbf, 0xef, 0xae, 0x68, 0x7c, 0xdf, 0x8a, 0xf6, 0xfb, 0x8f, 0x23, 0xaf, 0x7b, 0xfc, 0x8d, - 0x9a, 0x25, 0x3d, 0x83, 0x62, 0x30, 0x76, 0xbd, 0x93, 0x4c, 0x44, 0x36, 0xd3, 0x8c, 0xa2, 0x09, - 0x0b, 0x0b, 0x6c, 0xf1, 0xae, 0x4e, 0x6c, 0xf1, 0x16, 0xff, 0x04, 0xca, 0xdc, 0x09, 0xcb, 0xf9, - 0x8a, 0x0b, 0x5d, 0x9b, 0x6c, 0xca, 0x74, 0xac, 0x97, 0x6c, 0xd1, 0x8d, 0xa8, 0x9d, 0xbe, 0x25, - 0x9f, 0x9c, 0x5c, 0x5f, 0xda, 0x51, 0x5a, 0x7c, 0x88, 0xc2, 0x1b, 0xab, 0x71, 0x1e, 0xd6, 0x81, - 0x8b, 0xe2, 0x88, 0x81, 0x6f, 0xc0, 0xd1, 0x9e, 0x09, 0x0b, 0xe3, 0x95, 0xda, 0xa1, 0x77, 0x57, - 0x34, 0x66, 0x2c, 0xee, 0xdb, 0x0d, 0xd8, 0x8c, 0xaa, 0xc4, 0xef, 0xc9, 0x26, 0x81, 0x50, 0x72, - 0x93, 0x92, 0x7d, 0x77, 0x77, 0x45, 0xdb, 0x30, 0xd2, 0x20, 0xd6, 0x86, 0x0b, 0x51, 0x26, 0xe4, - 0x6a, 0x17, 0x3d, 0x53, 0x59, 0x18, 0x45, 0x79, 0xaf, 0xde, 0x5d, 0xd1, 0x36, 0x8d, 0x85, 0x0d, - 0x7c, 0x2f, 0xaa, 0x8f, 0xac, 0x1c, 0xf2, 0x95, 0x78, 0x73, 0x69, 0x37, 0x25, 0x9a, 0x6a, 0x5c, - 0xb3, 0x04, 0x94, 0xc4, 0x31, 0x5c, 0xd3, 0xe0, 0xf2, 0x72, 0x09, 0x23, 0x6f, 0x33, 0x39, 0xbe, - 0xcd, 0xa8, 0xe9, 0xe7, 0xcf, 0xd2, 0x8f, 0x69, 0x48, 0x9b, 0xce, 0x0f, 0x60, 0x3d, 0x25, 0x62, - 0x59, 0x19, 0x0a, 0xd1, 0x63, 0xeb, 0x74, 0xa7, 0xa2, 0xd1, 0xdb, 0xff, 0x42, 0xc9, 0x20, 0xb8, - 0xdd, 0xed, 0x0f, 0xea, 0x5d, 0x11, 0xa5, 0xd2, 0xee, 0x8a, 0x28, 0x15, 0xf5, 0x4f, 0xb2, 0x50, - 0x8a, 0x4f, 0xd9, 0xbe, 0xbd, 0x37, 0x2c, 0x76, 0x33, 0x65, 0x65, 0x37, 0xd3, 0x9c, 0xa9, 0xc7, - 0xbf, 0x8b, 0xc0, 0x9f, 0xc5, 0xdb, 0x48, 0x1b, 0x54, 0xc1, 0xe2, 0xbd, 0xed, 0xfc, 0xd7, 0xbc, - 0xb7, 0x2d, 0x47, 0x92, 0xaf, 0xa5, 0x23, 0xc9, 0xe7, 0x1e, 0xdc, 0x2f, 0xd0, 0x53, 0xd8, 0xf2, - 0x83, 0xfb, 0xf4, 0x55, 0xcc, 0xe7, 0xb6, 0x75, 0x22, 0x42, 0xaf, 0x45, 0x2a, 0xbd, 0x43, 0xc3, - 0x6b, 0x76, 0xe8, 0xaf, 0x23, 0xed, 0x1f, 0xc1, 0xc5, 0xf1, 0x71, 0xfc, 0x00, 0x77, 0xe2, 0x5c, - 0xa9, 0x50, 0x95, 0x96, 0xe2, 0xd8, 0xdb, 0xf1, 0x67, 0xbc, 0xd6, 0x65, 0x37, 0x50, 0x3c, 0x5a, - 0xf1, 0x77, 0xbd, 0xfe, 0x56, 0x06, 0x20, 0x39, 0x7f, 0xfa, 0xb9, 0x5d, 0xb9, 0x92, 0xb7, 0x2c, - 0xfb, 0x0a, 0x6f, 0xd9, 0xeb, 0xde, 0x4a, 0xfb, 0x0a, 0x4a, 0xf1, 0x89, 0xe3, 0xb7, 0x9f, 0x58, - 0xdf, 0xa8, 0xc8, 0x5f, 0x8b, 0xdc, 0xda, 0xf1, 0x91, 0xdd, 0xcf, 0xdb, 0x17, 0xa9, 0xe2, 0xb3, - 0xaf, 0x29, 0xfe, 0x94, 0xfb, 0x96, 0xe3, 0xc2, 0x7f, 0xc1, 0xab, 0x49, 0x9e, 0xe8, 0xb9, 0xd4, - 0x44, 0x57, 0x67, 0xc2, 0x41, 0xfe, 0xf3, 0x17, 0xfd, 0x8d, 0x1a, 0xfc, 0xdf, 0x33, 0x91, 0x17, - 0x37, 0x7e, 0x33, 0xfd, 0x5c, 0xa5, 0x77, 0xb9, 0x23, 0xfa, 0x9b, 0x14, 0xf7, 0x4a, 0x1f, 0x55, - 0xee, 0x55, 0x3e, 0xaa, 0xb7, 0x21, 0xcf, 0xb7, 0xbb, 0xfc, 0x79, 0xfe, 0x29, 0x8e, 0x7f, 0xed, - 0x97, 0x4d, 0x54, 0x55, 0x28, 0xf9, 0xbc, 0xbd, 0x17, 0xa3, 0x7c, 0xa3, 0xaf, 0xb2, 0xd0, 0x4d, - 0x97, 0xff, 0x8f, 0x4b, 0xd4, 0x6f, 0xdb, 0x25, 0xaf, 0x76, 0x5b, 0xa8, 0xff, 0x3b, 0x03, 0xeb, - 0xa9, 0x08, 0x82, 0x6f, 0x51, 0xc4, 0x52, 0xb9, 0x9c, 0xfd, 0xbf, 0x48, 0x2e, 0xa7, 0x82, 0x72, - 0x8b, 0xe9, 0xa0, 0x5c, 0x14, 0x77, 0x95, 0x94, 0x09, 0xb3, 0xcc, 0xd8, 0xc9, 0x2c, 0x35, 0x76, - 0x6e, 0xc4, 0xdf, 0x63, 0x6c, 0x37, 0x79, 0x0c, 0xec, 0xba, 0x26, 0x41, 0xd8, 0x67, 0x70, 0x55, - 0x38, 0x11, 0x78, 0xff, 0x78, 0x63, 0x3d, 0xfe, 0x5a, 0xa3, 0x30, 0xca, 0x2f, 0x73, 0x02, 0xfe, - 0x5d, 0x9a, 0x71, 0x3d, 0xc2, 0xaa, 0x6d, 0x58, 0x4f, 0x85, 0x66, 0x48, 0x5f, 0x87, 0xcd, 0xc8, - 0x5f, 0x87, 0x65, 0x5b, 0x90, 0x3f, 0x39, 0xb2, 0x7c, 0x6b, 0xc9, 0x7b, 0xc8, 0x1c, 0xa1, 0x7e, - 0x17, 0x2a, 0x72, 0x98, 0x18, 0x7b, 0x0f, 0xf2, 0x76, 0x68, 0x4d, 0x22, 0xf7, 0xc8, 0xe5, 0xc5, - 0x48, 0xb2, 0x76, 0x68, 0x4d, 0x34, 0x4e, 0xa4, 0xfe, 0x5e, 0x06, 0x94, 0x79, 0x9c, 0xf4, 0x09, - 0xdb, 0xcc, 0x39, 0x9f, 0xb0, 0x5d, 0x4d, 0x55, 0x72, 0xd9, 0x57, 0x68, 0xe3, 0x37, 0x59, 0x73, - 0xe7, 0xbc, 0xc9, 0xca, 0xee, 0x42, 0xd1, 0xb7, 0xe8, 0xfb, 0xa0, 0xe6, 0x92, 0x1b, 0x20, 0x31, - 0x4e, 0xfd, 0xad, 0x0c, 0x14, 0x44, 0x4c, 0xdb, 0x52, 0x7f, 0xd5, 0x3b, 0x50, 0xe0, 0xdf, 0x0a, - 0x8d, 0x5e, 0x13, 0x5b, 0x08, 0x1c, 0x8f, 0xf0, 0xec, 0x06, 0x8f, 0xf4, 0x4b, 0xfb, 0xaf, 0xf6, - 0x1d, 0xc3, 0xd5, 0x08, 0x2e, 0x3e, 0x37, 0x65, 0x4c, 0xc4, 0xe5, 0x72, 0xfe, 0xb4, 0x14, 0x10, - 0x88, 0xee, 0x91, 0xab, 0xdf, 0x83, 0x82, 0x88, 0x99, 0x5b, 0x5a, 0x95, 0xd7, 0x7d, 0x27, 0x72, - 0x0b, 0x20, 0x09, 0xa2, 0x5b, 0x96, 0x83, 0x7a, 0x1f, 0x8a, 0x51, 0xdc, 0x1c, 0xce, 0xbf, 0xa4, - 0x68, 0x71, 0xb5, 0x48, 0xae, 0x8c, 0x23, 0xbe, 0x31, 0xd0, 0xf1, 0x46, 0xc7, 0xe4, 0x2c, 0x7f, - 0x08, 0x74, 0xcf, 0x6a, 0xb0, 0xf0, 0x06, 0x57, 0xfa, 0x23, 0x13, 0x31, 0x11, 0xbb, 0x0f, 0xb1, - 0xbc, 0x7c, 0x9d, 0x6b, 0x41, 0xad, 0x47, 0x37, 0xf2, 0x68, 0x96, 0x3d, 0x16, 0xde, 0xd4, 0x0e, - 0x3d, 0xc8, 0x98, 0x91, 0x3f, 0x35, 0x92, 0xaa, 0x93, 0x26, 0x91, 0xa9, 0x55, 0xa8, 0xc8, 0xc1, - 0x3e, 0x6a, 0x1d, 0x36, 0xf7, 0xac, 0xd0, 0x40, 0xf9, 0x13, 0xbd, 0x4c, 0xc4, 0xe7, 0x2f, 0xfe, - 0x48, 0xcf, 0xdf, 0x79, 0x3a, 0x8d, 0x13, 0xa9, 0x7f, 0x92, 0x03, 0x65, 0x1e, 0xf7, 0xaa, 0xdb, - 0x89, 0x37, 0xa1, 0xec, 0xd1, 0xbc, 0x48, 0x7d, 0x50, 0x8c, 0x83, 0xa4, 0x08, 0xff, 0xd4, 0x57, - 0x65, 0x8a, 0x76, 0xb0, 0xcb, 0xbf, 0x2b, 0x73, 0x85, 0x5f, 0x45, 0x73, 0xbc, 0x11, 0x4d, 0xeb, - 0x0a, 0xdd, 0x3c, 0xeb, 0x78, 0x23, 0xba, 0xf4, 0x28, 0xbc, 0x13, 0x3c, 0x02, 0xb5, 0xa2, 0x15, - 0x85, 0x4b, 0x82, 0xce, 0xef, 0x44, 0xdc, 0x7f, 0x18, 0x88, 0x6b, 0xa4, 0x45, 0x0e, 0x18, 0x04, - 0xd1, 0x4b, 0xf6, 0x23, 0xf1, 0xf5, 0xab, 0x2c, 0xbd, 0x64, 0xdf, 0x70, 0xe9, 0xce, 0x23, 0x7d, - 0xac, 0x6d, 0x24, 0x3e, 0xa6, 0x27, 0xbe, 0x25, 0x80, 0xa8, 0xdb, 0xfc, 0xfb, 0x60, 0xbe, 0x15, - 0x04, 0xfc, 0xd9, 0xbe, 0x92, 0x78, 0x90, 0x51, 0x00, 0xe3, 0x67, 0x4f, 0xc5, 0xd7, 0xd9, 0x90, - 0x04, 0xc4, 0xe3, 0x81, 0xfc, 0xdb, 0x6c, 0x48, 0x70, 0x15, 0x8a, 0x3f, 0xf1, 0x5c, 0x8b, 0xbc, - 0x1c, 0x65, 0xaa, 0x55, 0x01, 0xd3, 0x7b, 0xc6, 0x14, 0x37, 0x02, 0x87, 0x6e, 0x2c, 0xf3, 0xdb, - 0x7e, 0x3c, 0xa1, 0xfe, 0xdb, 0x0c, 0x5c, 0x9c, 0xef, 0x6b, 0x9a, 0x46, 0x15, 0x28, 0x36, 0x7a, - 0x1d, 0xbd, 0x5b, 0xdf, 0x6b, 0x29, 0x2b, 0x6c, 0x03, 0xca, 0xbd, 0xed, 0x1f, 0xb6, 0x1a, 0x03, - 0x0e, 0xc8, 0xd0, 0x8b, 0x00, 0x7d, 0x7d, 0xb7, 0xdd, 0x6c, 0xb6, 0xba, 0xdc, 0xa2, 0xe8, 0x6d, - 0xff, 0x50, 0xef, 0xf4, 0x1a, 0xfc, 0x13, 0x4f, 0x51, 0xc4, 0x43, 0x5f, 0xc9, 0x51, 0x3c, 0x04, - 0x85, 0xc1, 0x63, 0x32, 0xcf, 0xa3, 0xbc, 0x5f, 0xf4, 0xf5, 0x46, 0x77, 0xa0, 0xac, 0x61, 0xaa, - 0x7b, 0xd0, 0xe9, 0x50, 0x8a, 0xc2, 0x39, 0x1b, 0xbd, 0xbd, 0x7d, 0xad, 0xd5, 0xef, 0xeb, 0xfd, - 0xf6, 0x8f, 0x5b, 0x4a, 0x91, 0x4a, 0xd6, 0xda, 0x4f, 0xdb, 0x5d, 0x0e, 0x28, 0xb1, 0x02, 0x64, - 0xf7, 0xda, 0x5d, 0xfe, 0x12, 0xc2, 0x5e, 0xfd, 0x73, 0xa5, 0x8c, 0x3f, 0xfa, 0x07, 0x7b, 0x4a, - 0x85, 0x95, 0x20, 0xdf, 0x69, 0x3d, 0x6f, 0x75, 0x94, 0x75, 0xf5, 0x3f, 0x67, 0x23, 0x8d, 0x98, - 0xe2, 0x9c, 0xbe, 0x8e, 0x16, 0xb8, 0xec, 0x7c, 0x31, 0xee, 0xb4, 0xac, 0xd4, 0x69, 0x5f, 0xe7, - 0xe3, 0xbc, 0xb7, 0x61, 0x3d, 0x0e, 0x0e, 0x90, 0x5e, 0x9f, 0xaf, 0x44, 0xc0, 0x25, 0xc7, 0x17, - 0x6b, 0x4b, 0x8e, 0x2f, 0xa6, 0x76, 0x88, 0x56, 0x36, 0xca, 0x5c, 0x3e, 0x93, 0x4a, 0x08, 0xe1, - 0x9f, 0xc5, 0x7e, 0x03, 0x28, 0xa1, 0xcf, 0x5c, 0x3b, 0xfa, 0x34, 0x63, 0x11, 0x01, 0x07, 0xae, - 0x1d, 0xce, 0x07, 0x27, 0x94, 0x16, 0x82, 0x13, 0xe4, 0xcd, 0x19, 0xd2, 0x9b, 0x73, 0xfa, 0x9b, - 0xc5, 0xfc, 0x9b, 0x8c, 0xd2, 0x37, 0x8b, 0xdf, 0x03, 0x36, 0x9a, 0xf9, 0xf4, 0x2a, 0x9a, 0x44, - 0x56, 0x21, 0x32, 0x45, 0x60, 0xe2, 0x5d, 0x91, 0xbd, 0x0d, 0x1b, 0x73, 0xd4, 0x64, 0x4b, 0x97, - 0xb4, 0x6a, 0x9a, 0x94, 0x3d, 0x80, 0x0b, 0x62, 0x6e, 0xa7, 0xfa, 0x56, 0x5c, 0x21, 0xe5, 0xa8, - 0x7a, 0xd2, 0xc3, 0xea, 0x2f, 0x41, 0x31, 0x0a, 0x69, 0x7b, 0xb5, 0xb2, 0xbb, 0x64, 0x5c, 0xd5, - 0x7f, 0xb6, 0x0a, 0xa5, 0x38, 0xc0, 0xed, 0x6b, 0xcd, 0x0e, 0xfa, 0xcc, 0x46, 0x70, 0x2c, 0x8b, - 0x98, 0x22, 0x02, 0xa2, 0x91, 0x12, 0xf7, 0xaf, 0x66, 0xbe, 0x1d, 0x69, 0x6c, 0x1c, 0x72, 0xe0, - 0xdb, 0xf4, 0x08, 0x89, 0xed, 0x4a, 0x97, 0x3d, 0x4b, 0x5a, 0x11, 0x01, 0xb4, 0xd0, 0xae, 0x02, - 0xfd, 0x26, 0xce, 0xe8, 0x33, 0xce, 0xb6, 0x7b, 0x8c, 0x7c, 0xe7, 0x7c, 0xc6, 0x99, 0x3e, 0x12, - 0xc2, 0xa3, 0x6b, 0x78, 0x4c, 0x41, 0xf4, 0x59, 0xbc, 0x37, 0xa0, 0x34, 0x8b, 0xbf, 0xab, 0x28, - 0x66, 0xc4, 0x2c, 0xfa, 0xaa, 0x62, 0x7a, 0x54, 0x4b, 0xf3, 0xa3, 0x3a, 0x3f, 0xa7, 0x61, 0x61, - 0x4e, 0xab, 0x21, 0x14, 0x44, 0x90, 0xdf, 0xab, 0x3b, 0xfc, 0x95, 0x5d, 0xa5, 0x40, 0xd6, 0x70, - 0xa2, 0x1b, 0xa6, 0xf8, 0x73, 0xae, 0x62, 0xb9, 0xb9, 0x8a, 0xa9, 0xff, 0x60, 0x15, 0x20, 0x09, - 0x16, 0x64, 0xef, 0xcf, 0x05, 0x26, 0x67, 0x16, 0xb6, 0xfd, 0xb9, 0x78, 0xe4, 0xb9, 0x57, 0x79, - 0x56, 0xbf, 0xc6, 0xab, 0x3c, 0x8f, 0x60, 0x3d, 0xf0, 0x47, 0xaf, 0x75, 0xb8, 0x97, 0x03, 0x7f, - 0x14, 0xfb, 0xdb, 0x1f, 0x02, 0x26, 0xe9, 0x9d, 0xc0, 0xc4, 0x50, 0x5d, 0xd0, 0x5a, 0x4a, 0x81, - 0x3f, 0xea, 0x0d, 0xbf, 0x6c, 0xf2, 0x4b, 0x6f, 0x66, 0x10, 0xea, 0xcb, 0xa4, 0xc4, 0x86, 0x19, - 0x84, 0x4d, 0x59, 0x50, 0xdc, 0x81, 0x2a, 0xd2, 0x2e, 0x08, 0x8b, 0x8a, 0x19, 0x24, 0x07, 0x2c, - 0xea, 0x6f, 0x46, 0x47, 0xd2, 0x73, 0xbe, 0x5c, 0xf6, 0x89, 0x30, 0xc4, 0x25, 0x25, 0xa2, 0xb6, - 0xcc, 0xf5, 0xcb, 0xdf, 0x10, 0x8a, 0x49, 0x17, 0xbf, 0xa6, 0xb7, 0xfa, 0x75, 0xbf, 0xa6, 0xb7, - 0x05, 0x90, 0xbc, 0xd4, 0x88, 0x2b, 0x30, 0xbe, 0xac, 0x53, 0xe2, 0xd7, 0x70, 0xee, 0xdf, 0x82, - 0x8a, 0xfc, 0x4d, 0x5b, 0xba, 0x84, 0xe3, 0xb9, 0x16, 0xff, 0x62, 0x49, 0xe7, 0x27, 0x1f, 0x29, - 0x99, 0xfb, 0x2a, 0x94, 0xa5, 0xef, 0x05, 0x21, 0xc5, 0xae, 0x11, 0x1c, 0x89, 0xaf, 0x57, 0x18, - 0xee, 0xa1, 0xa5, 0x64, 0xee, 0xdf, 0x45, 0xa5, 0x5b, 0xfe, 0x5a, 0x0f, 0xc0, 0x5a, 0xd7, 0xf3, - 0x27, 0x86, 0x23, 0xe8, 0xac, 0x59, 0x80, 0x74, 0x0f, 0xe1, 0xd2, 0xd2, 0x6f, 0x0f, 0xd1, 0x4d, - 0x2e, 0x7b, 0x32, 0x75, 0x2c, 0x7e, 0x19, 0x69, 0xf7, 0x6c, 0xe8, 0xdb, 0xa6, 0x92, 0xb9, 0xff, - 0x64, 0xee, 0xdb, 0x14, 0x07, 0xdd, 0xed, 0xde, 0x41, 0xb7, 0xd9, 0x6a, 0xf2, 0x6b, 0x42, 0xed, - 0x6e, 0xa3, 0x73, 0xd0, 0x6f, 0x3f, 0x17, 0x7b, 0x61, 0xeb, 0xf3, 0x28, 0xb9, 0x7a, 0xff, 0x49, - 0xf4, 0xaa, 0x42, 0x54, 0xeb, 0x4e, 0xaf, 0xde, 0xe4, 0x7b, 0x68, 0xfc, 0xba, 0xcf, 0x60, 0x9b, - 0x7f, 0xd3, 0x42, 0x6b, 0xf5, 0x0f, 0x3a, 0x03, 0xf1, 0x92, 0xd0, 0xfd, 0x1f, 0x40, 0xed, 0xbc, - 0xfb, 0x3c, 0xd8, 0x96, 0xc6, 0x6e, 0x9d, 0xee, 0x4c, 0xe1, 0x9e, 0xd9, 0xd3, 0x79, 0x2a, 0xc3, - 0xaf, 0x9c, 0x75, 0x5a, 0x14, 0xf4, 0x7a, 0xff, 0xa7, 0x19, 0x49, 0x7f, 0x8c, 0xee, 0x64, 0xc4, - 0x00, 0xd1, 0xc1, 0x32, 0x48, 0xb3, 0x0c, 0x53, 0xc9, 0xb0, 0xcb, 0xc0, 0x52, 0xa0, 0x8e, 0x37, - 0x32, 0x1c, 0x65, 0x95, 0xc2, 0x5b, 0x23, 0x38, 0xdd, 0xc6, 0x53, 0xb2, 0xec, 0x4d, 0xb8, 0x1a, - 0xc3, 0x3a, 0xde, 0xc9, 0xbe, 0x6f, 0x7b, 0xbe, 0x1d, 0x9e, 0x71, 0x74, 0xee, 0xfe, 0xff, 0x2f, - 0x0e, 0x67, 0x53, 0xb3, 0x0a, 0x0b, 0xa8, 0x9b, 0x66, 0x02, 0x23, 0x41, 0xa6, 0xac, 0xb0, 0x2b, - 0x70, 0x81, 0xa4, 0xf8, 0x1c, 0x22, 0xc3, 0xde, 0x80, 0x2b, 0x91, 0x91, 0x3b, 0x8f, 0x5c, 0x45, - 0xa4, 0x66, 0x51, 0x68, 0xe4, 0x02, 0x32, 0xbb, 0xfd, 0xfd, 0x3f, 0xfd, 0xd9, 0x8d, 0xcc, 0xbf, - 0xfe, 0xd9, 0x8d, 0xcc, 0x7f, 0xf9, 0xd9, 0x8d, 0x95, 0xdf, 0xfb, 0xaf, 0x37, 0x32, 0x3f, 0x7e, - 0xff, 0xd0, 0x0e, 0x8f, 0x66, 0xc3, 0x07, 0x23, 0x6f, 0xf2, 0x70, 0x62, 0x84, 0xbe, 0x7d, 0xca, - 0xb7, 0x93, 0x28, 0xe1, 0x5a, 0x0f, 0xa7, 0xc7, 0x87, 0x0f, 0xa7, 0xc3, 0x87, 0x38, 0xb1, 0x87, - 0x6b, 0x53, 0xdf, 0x0b, 0xbd, 0xc7, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0xa8, 0x6c, 0x68, 0x6f, - 0x97, 0x88, 0x00, 0x00, + // 13109 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0xbd, 0x5d, 0x6c, 0x23, 0x59, + 0x76, 0x18, 0x2c, 0x8a, 0xa4, 0x48, 0x1e, 0x52, 0x54, 0xe9, 0xf6, 0x1f, 0xfb, 0x67, 0xba, 0x35, + 0xd5, 0x3d, 0x3d, 0x3d, 0x3d, 0x33, 0xdd, 0x33, 0xdd, 0xf3, 0xd3, 0xb3, 0xde, 0xf5, 0x2e, 0x45, + 0x52, 0x2d, 0x6e, 0x53, 0xa4, 0xb6, 0x48, 0x75, 0xcf, 0xac, 0x3f, 0xa3, 0x50, 0x64, 0x15, 0xa5, + 0x1a, 0x15, 0xab, 0x38, 0x55, 0xc5, 0x96, 0xb4, 0x80, 0xf1, 0x2d, 0x12, 0xc0, 0x3f, 0x79, 0x0d, + 0xec, 0xbc, 0xc4, 0x80, 0x13, 0x20, 0x48, 0x10, 0x38, 0x40, 0x12, 0x18, 0xb0, 0xfd, 0x16, 0x23, + 0x2f, 0x0e, 0x02, 0xdb, 0x09, 0x82, 0x24, 0x48, 0x02, 0x38, 0xc1, 0xe6, 0x39, 0x48, 0x80, 0xe4, + 0x3d, 0xc1, 0x39, 0xf7, 0x56, 0xd5, 0x2d, 0x92, 0xea, 0x9e, 0x99, 0x5d, 0x03, 0xc9, 0x8b, 0xc4, + 0x7b, 0x7e, 0xee, 0xff, 0x3d, 0xf7, 0x9c, 0x73, 0xcf, 0xbd, 0x05, 0x30, 0x75, 0x0c, 0xf7, 0xc1, + 0xd4, 0xf7, 0x42, 0x8f, 0xe5, 0xf0, 0xf7, 0xb5, 0xf7, 0x0f, 0xed, 0xf0, 0x68, 0x36, 0x7c, 0x30, + 0xf2, 0x26, 0x0f, 0x0f, 0xbd, 0x43, 0xef, 0x21, 0x21, 0x87, 0xb3, 0x31, 0xa5, 0x28, 0x41, 0xbf, + 0x38, 0xd3, 0x35, 0x70, 0xbc, 0xd1, 0xb1, 0xf8, 0xbd, 0x11, 0xda, 0x13, 0x2b, 0x08, 0x8d, 0xc9, + 0x94, 0x03, 0xd4, 0x3f, 0xcc, 0x40, 0x6e, 0x70, 0x36, 0xb5, 0x58, 0x15, 0x56, 0x6d, 0xb3, 0x96, + 0xd9, 0xca, 0xdc, 0xcb, 0x6b, 0xab, 0xb6, 0xc9, 0xb6, 0xa0, 0xec, 0x7a, 0x61, 0x77, 0xe6, 0x38, + 0xc6, 0xd0, 0xb1, 0x6a, 0xab, 0x5b, 0x99, 0x7b, 0x45, 0x4d, 0x06, 0xb1, 0xeb, 0x50, 0x32, 0x66, + 0xa1, 0xa7, 0xdb, 0xee, 0xc8, 0xaf, 0x65, 0x09, 0x5f, 0x44, 0x40, 0xdb, 0x1d, 0xf9, 0xec, 0x22, + 0xe4, 0x4f, 0x6c, 0x33, 0x3c, 0xaa, 0xe5, 0x28, 0x47, 0x9e, 0x40, 0x68, 0x30, 0x32, 0x1c, 0xab, + 0x96, 0xe7, 0x50, 0x4a, 0x20, 0x34, 0xa4, 0x42, 0xd6, 0xb6, 0x32, 0xf7, 0x4a, 0x1a, 0x4f, 0xb0, + 0x9b, 0x00, 0x96, 0x3b, 0x9b, 0xbc, 0x34, 0x9c, 0x99, 0x15, 0xd4, 0x0a, 0x84, 0x92, 0x20, 0xea, + 0xf7, 0xa1, 0x34, 0x09, 0x0e, 0x77, 0x2d, 0xc3, 0xb4, 0x7c, 0x76, 0x05, 0x0a, 0x93, 0xe0, 0x50, + 0x0f, 0x8d, 0x43, 0xd1, 0x84, 0xb5, 0x49, 0x70, 0x38, 0x30, 0x0e, 0xd9, 0x55, 0x28, 0x12, 0xe2, + 0x6c, 0xca, 0xdb, 0x90, 0xd7, 0x90, 0x10, 0x5b, 0xac, 0xfe, 0xd6, 0x1a, 0x14, 0x3a, 0x76, 0x68, + 0xf9, 0x86, 0xc3, 0x2e, 0xc3, 0x9a, 0x1d, 0xb8, 0x33, 0xc7, 0x21, 0xf6, 0xa2, 0x26, 0x52, 0xec, + 0x32, 0xe4, 0xed, 0x27, 0x2f, 0x0d, 0x87, 0xf3, 0xee, 0xae, 0x68, 0x3c, 0xc9, 0x6a, 0xb0, 0x66, + 0x7f, 0xf8, 0x09, 0x22, 0xb2, 0x02, 0x21, 0xd2, 0x84, 0x79, 0xfc, 0x08, 0x31, 0xb9, 0x18, 0x43, + 0x69, 0xc2, 0x7c, 0xf2, 0x11, 0x62, 0xb0, 0xf5, 0x59, 0xc2, 0x50, 0x1a, 0x4b, 0x99, 0x51, 0x29, + 0xd8, 0x01, 0xeb, 0x58, 0xca, 0x2c, 0x2a, 0x65, 0xc6, 0x4b, 0x29, 0x08, 0x84, 0x48, 0x13, 0x86, + 0x97, 0x52, 0x8c, 0x31, 0x71, 0x29, 0x33, 0x5e, 0x4a, 0x69, 0x2b, 0x73, 0x2f, 0x47, 0x18, 0x5e, + 0xca, 0x45, 0xc8, 0x99, 0x08, 0x87, 0xad, 0xcc, 0xbd, 0xcc, 0xee, 0x8a, 0x46, 0x29, 0x84, 0x06, + 0x08, 0x2d, 0x63, 0x07, 0x23, 0x34, 0x10, 0xd0, 0x21, 0x42, 0x2b, 0xd8, 0x1b, 0x08, 0x1d, 0x0a, + 0xe8, 0x18, 0xa1, 0xeb, 0x5b, 0x99, 0x7b, 0xab, 0x08, 0xc5, 0x14, 0xbb, 0x06, 0x05, 0xd3, 0x08, + 0x2d, 0x44, 0x54, 0x45, 0x93, 0x23, 0x00, 0xe2, 0x70, 0xc6, 0x21, 0x6e, 0x43, 0x34, 0x3a, 0x02, + 0x30, 0x15, 0xca, 0x48, 0x16, 0xe1, 0x15, 0x81, 0x97, 0x81, 0xec, 0x63, 0xa8, 0x98, 0xd6, 0xc8, + 0x9e, 0x18, 0x0e, 0x6f, 0xd3, 0xe6, 0x56, 0xe6, 0x5e, 0xf9, 0xd1, 0xc6, 0x03, 0x5a, 0x13, 0x31, + 0x66, 0x77, 0x45, 0x4b, 0x91, 0xb1, 0x27, 0xb0, 0x2e, 0xd2, 0x1f, 0x3e, 0xa2, 0x8e, 0x65, 0xc4, + 0xa7, 0xa4, 0xf8, 0x3e, 0x7c, 0xf4, 0x64, 0x77, 0x45, 0x4b, 0x13, 0xb2, 0x3b, 0x50, 0x89, 0x97, + 0x08, 0x32, 0x5e, 0x10, 0xb5, 0x4a, 0x41, 0xb1, 0x59, 0x5f, 0x06, 0x9e, 0x8b, 0x04, 0x17, 0x45, + 0xbf, 0x45, 0x00, 0xb6, 0x05, 0x60, 0x5a, 0x63, 0x63, 0xe6, 0x84, 0x88, 0xbe, 0x24, 0x3a, 0x50, + 0x82, 0xb1, 0x9b, 0x50, 0x9a, 0x4d, 0xb1, 0x95, 0xcf, 0x0d, 0xa7, 0x76, 0x59, 0x10, 0x24, 0x20, + 0xcc, 0x1d, 0xe7, 0x39, 0x62, 0xaf, 0x88, 0xd1, 0x8d, 0x00, 0x38, 0xbc, 0x2f, 0xad, 0x11, 0xa2, + 0x6a, 0xa2, 0x60, 0x91, 0xc6, 0x55, 0x64, 0x07, 0xdb, 0xb6, 0x5b, 0xbb, 0x4a, 0x33, 0x98, 0x27, + 0xd8, 0x0d, 0xc8, 0x06, 0xfe, 0xa8, 0x76, 0x8d, 0xda, 0x0f, 0xbc, 0xfd, 0xad, 0xd3, 0xa9, 0xaf, + 0x21, 0x78, 0xbb, 0x00, 0x79, 0x5a, 0x4d, 0xea, 0x0d, 0x28, 0xee, 0x1b, 0xbe, 0x31, 0xd1, 0xac, + 0x31, 0x53, 0x20, 0x3b, 0xf5, 0x02, 0xb1, 0x8e, 0xf0, 0xa7, 0xda, 0x81, 0xb5, 0xe7, 0x86, 0x8f, + 0x38, 0x06, 0x39, 0xd7, 0x98, 0x58, 0x84, 0x2c, 0x69, 0xf4, 0x1b, 0xd7, 0x4e, 0x70, 0x16, 0x84, + 0xd6, 0x44, 0x08, 0x09, 0x91, 0x42, 0xf8, 0xa1, 0xe3, 0x0d, 0xc5, 0x1a, 0x29, 0x6a, 0x22, 0xa5, + 0xfe, 0xb5, 0x0c, 0xac, 0x35, 0x3c, 0x07, 0xb3, 0xbb, 0x02, 0x05, 0xdf, 0x72, 0xf4, 0xa4, 0xb8, + 0x35, 0xdf, 0x72, 0xf6, 0xbd, 0x00, 0x11, 0x23, 0x8f, 0x23, 0xf8, 0xaa, 0x5d, 0x1b, 0x79, 0x84, + 0x88, 0x2a, 0x90, 0x95, 0x2a, 0x70, 0x15, 0x8a, 0xe1, 0xd0, 0xd1, 0x09, 0x9e, 0x23, 0x78, 0x21, + 0x1c, 0x3a, 0x5d, 0x44, 0x5d, 0x81, 0x82, 0x39, 0xe4, 0x98, 0x3c, 0x61, 0xd6, 0xcc, 0x21, 0x22, + 0xd4, 0xcf, 0xa0, 0xa4, 0x19, 0x27, 0xa2, 0x1a, 0x97, 0x60, 0x0d, 0x33, 0x10, 0xf2, 0x2f, 0xa7, + 0xe5, 0xc3, 0xa1, 0xd3, 0x36, 0x11, 0x8c, 0x95, 0xb0, 0x4d, 0xaa, 0x43, 0x4e, 0xcb, 0x8f, 0x3c, + 0xa7, 0x6d, 0xaa, 0x03, 0x80, 0x86, 0xe7, 0xfb, 0xdf, 0xba, 0x09, 0x17, 0x21, 0x6f, 0x5a, 0xd3, + 0xf0, 0x88, 0x8b, 0x0e, 0x8d, 0x27, 0xd4, 0xfb, 0x50, 0xc4, 0x71, 0xe9, 0xd8, 0x41, 0xc8, 0x6e, + 0x42, 0xce, 0xb1, 0x83, 0xb0, 0x96, 0xd9, 0xca, 0xce, 0x8d, 0x1a, 0xc1, 0xd5, 0x2d, 0x28, 0xee, + 0x19, 0xa7, 0xcf, 0x71, 0xe4, 0x30, 0x37, 0x1a, 0x42, 0x31, 0x24, 0x62, 0x3c, 0x2b, 0x00, 0x03, + 0xc3, 0x3f, 0xb4, 0x42, 0x92, 0x74, 0xff, 0x33, 0x03, 0xe5, 0xfe, 0x6c, 0xf8, 0xd5, 0xcc, 0xf2, + 0xcf, 0xb0, 0xce, 0xf7, 0x20, 0x1b, 0x9e, 0x4d, 0x89, 0xa3, 0xfa, 0xe8, 0x32, 0xcf, 0x5e, 0xc2, + 0x3f, 0x40, 0x26, 0x0d, 0x49, 0xb0, 0x11, 0xae, 0x67, 0x5a, 0x51, 0x1f, 0xe4, 0xb5, 0x35, 0x4c, + 0xb6, 0x4d, 0xdc, 0x2e, 0xbc, 0xa9, 0x18, 0x85, 0x55, 0x6f, 0xca, 0xb6, 0x20, 0x3f, 0x3a, 0xb2, + 0x1d, 0x93, 0x06, 0x20, 0x5d, 0x67, 0x8e, 0xc0, 0x51, 0xf2, 0xbd, 0x13, 0x3d, 0xb0, 0x7f, 0x12, + 0x89, 0xff, 0x82, 0xef, 0x9d, 0xf4, 0xed, 0x9f, 0x58, 0xea, 0x40, 0xec, 0x41, 0x00, 0x6b, 0xfd, + 0x46, 0xbd, 0x53, 0xd7, 0x94, 0x15, 0xfc, 0xdd, 0xfa, 0xbc, 0xdd, 0x1f, 0xf4, 0x95, 0x0c, 0xab, + 0x02, 0x74, 0x7b, 0x03, 0x5d, 0xa4, 0x57, 0xd9, 0x1a, 0xac, 0xb6, 0xbb, 0x4a, 0x16, 0x69, 0x10, + 0xde, 0xee, 0x2a, 0x39, 0x56, 0x80, 0x6c, 0xbd, 0xfb, 0x85, 0x92, 0xa7, 0x1f, 0x9d, 0x8e, 0xb2, + 0xa6, 0xfe, 0xf9, 0x2a, 0x94, 0x7a, 0xc3, 0x2f, 0xad, 0x51, 0x88, 0x6d, 0xc6, 0x59, 0x6a, 0xf9, + 0x2f, 0x2d, 0x9f, 0x9a, 0x9d, 0xd5, 0x44, 0x0a, 0x1b, 0x62, 0x0e, 0xa9, 0x71, 0x59, 0x6d, 0xd5, + 0x1c, 0x12, 0xdd, 0xe8, 0xc8, 0x9a, 0x18, 0xd4, 0x38, 0xa4, 0xa3, 0x14, 0xae, 0x0a, 0x6f, 0xf8, + 0x25, 0x35, 0x2f, 0xab, 0xe1, 0x4f, 0x76, 0x0b, 0xca, 0x3c, 0x0f, 0x79, 0x7e, 0x01, 0x07, 0xcd, + 0x4f, 0xbe, 0x35, 0x79, 0xf2, 0x11, 0x27, 0xe5, 0xca, 0x91, 0x62, 0x6f, 0xe3, 0xa0, 0xae, 0x98, + 0xd1, 0xde, 0xf0, 0x4b, 0x8e, 0x2d, 0xf2, 0x19, 0xed, 0x0d, 0xbf, 0x24, 0xd4, 0xbb, 0xb0, 0x19, + 0xcc, 0x86, 0xc1, 0xc8, 0xb7, 0xa7, 0xa1, 0xed, 0xb9, 0x9c, 0xa6, 0x44, 0x34, 0x8a, 0x8c, 0x20, + 0xe2, 0x7b, 0x50, 0x9c, 0xce, 0x86, 0xba, 0xed, 0x8e, 0x3d, 0x12, 0xfb, 0xe5, 0x47, 0xeb, 0x7c, + 0x60, 0xf6, 0x67, 0xc3, 0xb6, 0x3b, 0xf6, 0xb4, 0xc2, 0x94, 0xff, 0x60, 0x2a, 0xac, 0xbb, 0x5e, + 0xa8, 0xa3, 0xaa, 0xa0, 0x4f, 0xac, 0xd0, 0xa0, 0xfd, 0x80, 0x6f, 0xf8, 0x1d, 0x6f, 0x74, 0xbc, + 0x67, 0x85, 0x86, 0x7a, 0x17, 0x0a, 0x82, 0x0f, 0xf7, 0xfe, 0xd0, 0x72, 0x0d, 0x37, 0xd4, 0x63, + 0xa5, 0xa1, 0xc8, 0x01, 0x6d, 0x53, 0xfd, 0x83, 0x0c, 0x28, 0x7d, 0xa9, 0x2a, 0xc8, 0xbc, 0x54, + 0x72, 0xbc, 0x01, 0x60, 0x8c, 0x46, 0xde, 0x8c, 0x67, 0xc3, 0x27, 0x58, 0x49, 0x40, 0xda, 0xa6, + 0xdc, 0x7f, 0xd9, 0x54, 0xff, 0xbd, 0x09, 0x95, 0x88, 0x4f, 0x5a, 0xf4, 0x65, 0x01, 0x8b, 0x7a, + 0x30, 0x98, 0xa5, 0x56, 0x7e, 0x21, 0x98, 0x71, 0xee, 0xcb, 0xb0, 0x46, 0x1a, 0x46, 0x10, 0x8d, + 0x0a, 0x4f, 0xa9, 0xff, 0x3e, 0x03, 0xeb, 0x6d, 0xd7, 0xb4, 0x4e, 0xfb, 0x23, 0xc3, 0x8d, 0x3a, + 0xc5, 0x0e, 0x74, 0x1b, 0x61, 0x7a, 0x30, 0x32, 0x5c, 0xa1, 0x1c, 0x94, 0xed, 0x20, 0xa6, 0xc3, + 0x36, 0x70, 0x02, 0x2a, 0x6a, 0x95, 0x72, 0x2c, 0x11, 0x84, 0x0a, 0xbb, 0x0b, 0x1b, 0x43, 0xcb, + 0xf1, 0xdc, 0x43, 0x3d, 0xf4, 0x74, 0xae, 0xe5, 0xf0, 0xb6, 0xac, 0x73, 0xf0, 0xc0, 0x1b, 0x90, + 0xb6, 0x73, 0x11, 0xf2, 0x53, 0xc3, 0x0f, 0x83, 0x5a, 0x6e, 0x2b, 0x8b, 0xcb, 0x98, 0x12, 0xd8, + 0xcd, 0x76, 0xa0, 0xcf, 0x5c, 0xfb, 0xab, 0x19, 0x6f, 0x46, 0x51, 0x2b, 0xda, 0xc1, 0x01, 0xa5, + 0xd9, 0x3d, 0x50, 0x78, 0xc9, 0x94, 0xad, 0x3c, 0xcf, 0xaa, 0x04, 0xa7, 0x8c, 0x49, 0xd8, 0xfd, + 0x8d, 0x55, 0x28, 0xee, 0xcc, 0xdc, 0x11, 0x0e, 0x06, 0xbb, 0x0d, 0xb9, 0xf1, 0xcc, 0x1d, 0x51, + 0x5b, 0xe2, 0xad, 0x34, 0x5e, 0x27, 0x1a, 0x21, 0x51, 0x02, 0x19, 0xfe, 0x21, 0x4a, 0xae, 0x05, + 0x09, 0x84, 0x70, 0xf5, 0x8f, 0x32, 0x3c, 0xc7, 0x1d, 0xc7, 0x38, 0x64, 0x45, 0xc8, 0x75, 0x7b, + 0xdd, 0x96, 0xb2, 0xc2, 0x2a, 0x50, 0x6c, 0x77, 0x07, 0x2d, 0xad, 0x5b, 0xef, 0x28, 0x19, 0x5a, + 0xce, 0x83, 0xfa, 0x76, 0xa7, 0xa5, 0xac, 0x22, 0xe6, 0x79, 0xaf, 0x53, 0x1f, 0xb4, 0x3b, 0x2d, + 0x25, 0xc7, 0x31, 0x5a, 0xbb, 0x31, 0x50, 0x8a, 0x4c, 0x81, 0xca, 0xbe, 0xd6, 0x6b, 0x1e, 0x34, + 0x5a, 0x7a, 0xf7, 0xa0, 0xd3, 0x51, 0x14, 0x76, 0x01, 0x36, 0x62, 0x48, 0x8f, 0x03, 0xb7, 0x90, + 0xe5, 0x79, 0x5d, 0xab, 0x6b, 0x4f, 0x95, 0x1f, 0xb0, 0x22, 0x64, 0xeb, 0x4f, 0x9f, 0x2a, 0x3f, + 0x45, 0xc9, 0x50, 0x7a, 0xd1, 0xee, 0xea, 0xcf, 0xeb, 0x9d, 0x83, 0x96, 0xf2, 0xd3, 0xd5, 0x28, + 0xdd, 0xd3, 0x9a, 0x2d, 0x4d, 0xf9, 0x69, 0x8e, 0x6d, 0x42, 0xe5, 0xc7, 0xbd, 0x6e, 0x6b, 0xaf, + 0xbe, 0xbf, 0x4f, 0x15, 0xf9, 0x69, 0x51, 0xfd, 0x6f, 0x39, 0xc8, 0x61, 0x4b, 0x98, 0x9a, 0x48, + 0xc1, 0xb8, 0x89, 0x28, 0x86, 0xb6, 0x73, 0x7f, 0xfa, 0x97, 0xb7, 0x56, 0xb8, 0xfc, 0x7b, 0x13, + 0xb2, 0x8e, 0x1d, 0xd2, 0xb0, 0xc6, 0x6b, 0x47, 0xe8, 0x8c, 0xbb, 0x2b, 0x1a, 0xe2, 0xd8, 0x4d, + 0xc8, 0x70, 0x41, 0x58, 0x7e, 0x54, 0x15, 0x8b, 0x4b, 0xec, 0xa4, 0xbb, 0x2b, 0x5a, 0x66, 0xca, + 0x6e, 0x40, 0xe6, 0xa5, 0x90, 0x8a, 0x15, 0x8e, 0xe7, 0x7b, 0x29, 0x62, 0x5f, 0xb2, 0x2d, 0xc8, + 0x8e, 0x3c, 0xae, 0x11, 0xc6, 0x78, 0xbe, 0xb3, 0x60, 0xfe, 0x23, 0xcf, 0x61, 0xb7, 0x21, 0xeb, + 0x1b, 0x27, 0x34, 0xb2, 0xf1, 0x70, 0xc5, 0x5b, 0x17, 0x12, 0xf9, 0xc6, 0x09, 0x56, 0x62, 0x4c, + 0x72, 0x24, 0xae, 0x44, 0x34, 0xde, 0x58, 0xcc, 0x98, 0x6d, 0x41, 0xe6, 0x84, 0x24, 0x49, 0xac, + 0x04, 0xbd, 0xb0, 0x5d, 0xd3, 0x3b, 0xe9, 0x4f, 0xad, 0x11, 0x52, 0x9c, 0xb0, 0xb7, 0x20, 0x1b, + 0xcc, 0x86, 0x24, 0x49, 0xca, 0x8f, 0x36, 0x17, 0xf6, 0x04, 0x2c, 0x28, 0x98, 0x0d, 0xd9, 0x5d, + 0xc8, 0x8d, 0x3c, 0xdf, 0x17, 0xd2, 0x44, 0x89, 0x2a, 0x1c, 0x6d, 0x87, 0xa8, 0x14, 0x22, 0x1e, + 0x0b, 0x0c, 0x49, 0x86, 0xc4, 0x44, 0xc9, 0x7e, 0x84, 0x05, 0x86, 0xec, 0x8e, 0xd8, 0xe4, 0x2a, + 0x72, 0xad, 0xa3, 0x2d, 0x10, 0xf3, 0x41, 0x2c, 0x0e, 0xd2, 0xc4, 0x38, 0x25, 0x8d, 0x33, 0x26, + 0x8a, 0xf6, 0x3e, 0xac, 0xd3, 0xc4, 0x38, 0x65, 0x77, 0x20, 0xfb, 0xd2, 0x1a, 0x91, 0xf2, 0x19, + 0x97, 0x26, 0x06, 0xe9, 0x39, 0x35, 0x0f, 0xd1, 0x34, 0xef, 0x3d, 0xc7, 0x24, 0x3d, 0x34, 0x1e, + 0xcb, 0x1d, 0xcf, 0x31, 0x9f, 0xd3, 0x58, 0x12, 0x12, 0xb7, 0x7c, 0x63, 0x76, 0x8a, 0xd2, 0x48, + 0xe1, 0x9b, 0xb3, 0x31, 0x3b, 0x6d, 0x9b, 0x28, 0xfc, 0x5d, 0xf3, 0x25, 0x69, 0x9f, 0x19, 0x0d, + 0x7f, 0xa2, 0x79, 0x14, 0x58, 0x8e, 0x35, 0x0a, 0xed, 0x97, 0x76, 0x78, 0x46, 0xfa, 0x65, 0x46, + 0x93, 0x41, 0xdb, 0x6b, 0x90, 0xb3, 0x4e, 0xa7, 0xbe, 0xba, 0x0b, 0x05, 0x51, 0xca, 0x82, 0x8d, + 0x75, 0x15, 0x8a, 0x76, 0xa0, 0x8f, 0x3c, 0x37, 0x08, 0x85, 0xee, 0x54, 0xb0, 0x83, 0x06, 0x26, + 0x51, 0x5c, 0x9a, 0x46, 0xc8, 0x37, 0xa1, 0x8a, 0x46, 0xbf, 0xd5, 0x47, 0x00, 0x49, 0xb3, 0xb0, + 0x4e, 0x8e, 0xe5, 0x46, 0x6a, 0x9a, 0x63, 0xb9, 0x31, 0xcf, 0xaa, 0xc4, 0x73, 0x15, 0x4a, 0xb1, + 0x66, 0xcc, 0x2a, 0x90, 0x31, 0xc4, 0xf6, 0x97, 0x31, 0xd4, 0x7b, 0xa8, 0xa8, 0x46, 0xba, 0x6f, + 0x1a, 0x87, 0xa9, 0x68, 0x53, 0xcc, 0x0c, 0xd5, 0xef, 0x42, 0x45, 0xb3, 0x82, 0x99, 0x13, 0x36, + 0x3c, 0xa7, 0x69, 0x8d, 0xd9, 0x7b, 0x00, 0x71, 0x3a, 0x10, 0x5a, 0x4a, 0x32, 0x77, 0x9b, 0xd6, + 0x58, 0x93, 0xf0, 0xea, 0x3f, 0xc8, 0x91, 0xbe, 0xd7, 0xe4, 0x8a, 0x96, 0xd0, 0xa8, 0x32, 0x92, + 0x46, 0x15, 0xef, 0x0d, 0xab, 0x69, 0xad, 0xf2, 0xc8, 0x36, 0x4d, 0xcb, 0x8d, 0xb4, 0x47, 0x9e, + 0xc2, 0xc1, 0x36, 0x9c, 0x43, 0x5a, 0x50, 0xd5, 0x47, 0x2c, 0x2a, 0x74, 0x32, 0xf5, 0xad, 0x20, + 0xe0, 0x7a, 0x8b, 0xe1, 0x1c, 0x46, 0x6b, 0x3b, 0xff, 0xaa, 0xb5, 0x7d, 0x15, 0x8a, 0xb8, 0xe5, + 0x91, 0xd5, 0xb7, 0xc6, 0x7b, 0x5f, 0x98, 0xb7, 0xec, 0x6d, 0x28, 0x08, 0x7d, 0x5d, 0x2c, 0x2a, + 0x31, 0x5d, 0x9a, 0x1c, 0xa8, 0x45, 0x58, 0x56, 0x43, 0x25, 0x6f, 0x32, 0xb1, 0xdc, 0x30, 0xda, + 0xa7, 0x45, 0x92, 0xbd, 0x0b, 0x25, 0xcf, 0xd5, 0xb9, 0x52, 0x2f, 0x56, 0x95, 0x98, 0xbe, 0x3d, + 0xf7, 0x80, 0xa0, 0x5a, 0xd1, 0x13, 0xbf, 0xb0, 0x2a, 0x8e, 0x77, 0xa2, 0x8f, 0x0c, 0xdf, 0xa4, + 0x95, 0x55, 0xd4, 0x0a, 0x8e, 0x77, 0xd2, 0x30, 0x7c, 0x93, 0xeb, 0x2d, 0x5f, 0xb9, 0xb3, 0x09, + 0xad, 0xa6, 0x75, 0x4d, 0xa4, 0xd8, 0x0d, 0x28, 0x8d, 0x9c, 0x59, 0x10, 0x5a, 0xfe, 0xf6, 0x19, + 0x37, 0xd3, 0xb4, 0x04, 0x80, 0xf5, 0x9a, 0xfa, 0xf6, 0xc4, 0xf0, 0xcf, 0x68, 0xe9, 0x14, 0xb5, + 0x28, 0x49, 0x1b, 0xcd, 0xb1, 0x6d, 0x9e, 0x72, 0x5b, 0x4d, 0xe3, 0x09, 0xa4, 0x3f, 0x22, 0x4b, + 0x3a, 0xa0, 0xf5, 0x51, 0xd4, 0xa2, 0x24, 0x8d, 0x03, 0xfd, 0xa4, 0x15, 0x51, 0xd2, 0x44, 0x2a, + 0xa5, 0x74, 0x6f, 0x9e, 0xab, 0x74, 0xb3, 0x79, 0xbd, 0xc7, 0xf3, 0xed, 0x43, 0x5b, 0x68, 0x2d, + 0x17, 0xb8, 0xde, 0xc3, 0x41, 0xb4, 0x51, 0x7d, 0x05, 0x05, 0xd1, 0xc5, 0xb8, 0x03, 0xe1, 0xf2, + 0x49, 0x8b, 0x67, 0xbe, 0x03, 0x21, 0x9c, 0xdd, 0x86, 0x75, 0x91, 0x57, 0x10, 0xfa, 0xb6, 0x7b, + 0x28, 0x26, 0x4f, 0x85, 0x03, 0xfb, 0x04, 0x43, 0x45, 0x01, 0x87, 0x57, 0x37, 0x86, 0xb6, 0x83, + 0xcb, 0x34, 0x2b, 0x94, 0x9a, 0x99, 0xe3, 0xd4, 0x39, 0x48, 0xed, 0x41, 0x31, 0x1a, 0x90, 0x5f, + 0x48, 0x99, 0xea, 0xaf, 0x67, 0xa0, 0x4c, 0xea, 0x41, 0x8f, 0x94, 0x1f, 0xf6, 0x1e, 0xb0, 0x91, + 0x6f, 0x19, 0xa1, 0xa5, 0x5b, 0xa7, 0xa1, 0x6f, 0x08, 0x25, 0x80, 0x6b, 0x12, 0x0a, 0xc7, 0xb4, + 0x10, 0xc1, 0xf5, 0x80, 0x5b, 0x50, 0x9e, 0x1a, 0x7e, 0x10, 0x29, 0x95, 0xbc, 0x00, 0xe0, 0x20, + 0xa1, 0xd2, 0x29, 0xee, 0xa1, 0x6f, 0x4c, 0xf4, 0xd0, 0x3b, 0xb6, 0x5c, 0xae, 0x4e, 0x73, 0x43, + 0xa2, 0x4a, 0xf0, 0x01, 0x82, 0x49, 0xab, 0xfe, 0x8f, 0x19, 0x58, 0xdf, 0xe7, 0xa3, 0xfe, 0xcc, + 0x3a, 0x6b, 0x72, 0xeb, 0x6d, 0x14, 0xad, 0xd8, 0x9c, 0x46, 0xbf, 0xd9, 0x4d, 0x28, 0x4f, 0x8f, + 0xad, 0x33, 0x3d, 0x65, 0xe9, 0x94, 0x10, 0xd4, 0xa0, 0xb5, 0xf9, 0x0e, 0xac, 0x79, 0xd4, 0x10, + 0xb1, 0xc7, 0x89, 0xad, 0x41, 0x6a, 0xa1, 0x26, 0x08, 0x50, 0x5d, 0x8a, 0xb3, 0x92, 0xf5, 0x32, + 0x91, 0x19, 0x55, 0xff, 0x22, 0xe4, 0x11, 0x15, 0xd4, 0xf2, 0x5c, 0xcf, 0xa1, 0x04, 0xfb, 0x00, + 0xd6, 0x47, 0xde, 0x64, 0xaa, 0x47, 0xec, 0x62, 0xb7, 0x4b, 0xcb, 0x94, 0x32, 0x92, 0xec, 0xf3, + 0xbc, 0xd4, 0xdf, 0xc9, 0x42, 0x91, 0xea, 0x20, 0xc4, 0x8a, 0x6d, 0x9e, 0x46, 0x62, 0xa5, 0xa4, + 0xe5, 0x6d, 0x13, 0xa5, 0xf6, 0x6b, 0x54, 0xb3, 0x58, 0xe5, 0xca, 0xca, 0x2a, 0xd7, 0x65, 0x58, + 0x13, 0xfa, 0x56, 0x8e, 0xcb, 0x9d, 0xd9, 0xf9, 0xda, 0x56, 0x7e, 0x99, 0xb6, 0x85, 0x43, 0xc8, + 0x69, 0xac, 0x53, 0xdc, 0xdf, 0xb8, 0x68, 0x01, 0x02, 0xb5, 0x10, 0x22, 0x0b, 0x8d, 0x42, 0x5a, + 0x68, 0xd4, 0xa0, 0xf0, 0xd2, 0x0e, 0x6c, 0x9c, 0x20, 0x45, 0xbe, 0x0c, 0x45, 0x52, 0x1a, 0x86, + 0xd2, 0xeb, 0x86, 0x21, 0x6e, 0xb6, 0xe1, 0x1c, 0x72, 0xb5, 0x3f, 0x6a, 0x76, 0xdd, 0x39, 0xf4, + 0xd8, 0x87, 0x70, 0x29, 0x41, 0x8b, 0xd6, 0x90, 0x7b, 0x8c, 0x3c, 0x40, 0x1a, 0x8b, 0x29, 0xa9, + 0x45, 0x64, 0x97, 0xdd, 0x87, 0x4d, 0x89, 0x65, 0x8a, 0xea, 0x4d, 0x40, 0x32, 0xa7, 0xa4, 0x6d, + 0xc4, 0xe4, 0xa4, 0xf5, 0x04, 0xea, 0xbf, 0x58, 0x85, 0xf5, 0x1d, 0xcf, 0xb7, 0xec, 0x43, 0x37, + 0x99, 0x75, 0x0b, 0x9a, 0x7f, 0x34, 0x13, 0x57, 0xa5, 0x99, 0x78, 0x0b, 0xca, 0x63, 0xce, 0xa8, + 0x87, 0x43, 0xee, 0x34, 0xc8, 0x69, 0x20, 0x40, 0x83, 0xa1, 0x83, 0xab, 0x39, 0x22, 0x20, 0xe6, + 0x1c, 0x31, 0x47, 0x4c, 0xb8, 0xd7, 0xb0, 0xef, 0x90, 0xd4, 0x35, 0x2d, 0xc7, 0x0a, 0xf9, 0xf0, + 0x54, 0x1f, 0xbd, 0x11, 0xed, 0xf4, 0x52, 0x9d, 0x1e, 0x68, 0xd6, 0xb8, 0x4e, 0xea, 0x11, 0x0a, + 0xe1, 0x26, 0x91, 0x0b, 0x5e, 0x21, 0xb1, 0xd7, 0xbe, 0x26, 0x2f, 0x97, 0x1c, 0xea, 0x00, 0x4a, + 0x31, 0x18, 0x75, 0x5d, 0xad, 0x25, 0xf4, 0xdb, 0x15, 0x56, 0x86, 0x42, 0xa3, 0xde, 0x6f, 0xd4, + 0x9b, 0x2d, 0x25, 0x83, 0xa8, 0x7e, 0x6b, 0xc0, 0x75, 0xda, 0x55, 0xb6, 0x01, 0x65, 0x4c, 0x35, + 0x5b, 0x3b, 0xf5, 0x83, 0xce, 0x40, 0xc9, 0xb2, 0x75, 0x28, 0x75, 0x7b, 0x7a, 0xbd, 0x31, 0x68, + 0xf7, 0xba, 0x4a, 0x4e, 0xfd, 0x01, 0x14, 0x1b, 0x47, 0xd6, 0xe8, 0xf8, 0xbc, 0x5e, 0x24, 0xa3, + 0xdb, 0x1a, 0x1d, 0x0b, 0xfd, 0x74, 0xce, 0xe8, 0xb6, 0x46, 0xc7, 0x6a, 0x0b, 0x4a, 0xfb, 0x86, + 0x1f, 0xda, 0x54, 0xaf, 0x27, 0xb0, 0x1e, 0x27, 0x9a, 0xd6, 0x38, 0xda, 0xb9, 0x59, 0xac, 0xb5, + 0xc6, 0x28, 0x2d, 0x4d, 0xa8, 0xbe, 0x07, 0x15, 0x19, 0xc0, 0x6e, 0x40, 0xd6, 0xb4, 0xc6, 0x4b, + 0xe4, 0x24, 0x82, 0xd5, 0xe7, 0x50, 0x69, 0x44, 0x3b, 0xd1, 0x79, 0x55, 0x7f, 0x04, 0x55, 0x5a, + 0xf1, 0xa3, 0x61, 0xb4, 0xe4, 0x57, 0x97, 0x2c, 0xf9, 0x0a, 0xd2, 0x34, 0x86, 0x62, 0xcd, 0x7f, + 0x0c, 0xe5, 0x7d, 0xdf, 0x9b, 0x5a, 0x7e, 0x48, 0xd9, 0x2a, 0x90, 0x3d, 0xb6, 0xce, 0x44, 0xae, + 0xf8, 0x33, 0xf1, 0x85, 0xac, 0xca, 0xbe, 0x90, 0x47, 0x50, 0x8c, 0xd8, 0xbe, 0x36, 0xcf, 0xf7, + 0x51, 0x74, 0x12, 0x8f, 0x6d, 0x05, 0x58, 0xd8, 0x03, 0x80, 0x69, 0x0c, 0x10, 0x1d, 0x17, 0xa9, + 0xfb, 0x22, 0x73, 0x4d, 0xa2, 0x50, 0xdf, 0x80, 0xc2, 0x73, 0xdb, 0x3a, 0x11, 0xcd, 0x7f, 0x69, + 0x5b, 0x27, 0x51, 0xf3, 0xf1, 0xb7, 0xfa, 0x17, 0x25, 0x28, 0xd2, 0xfa, 0x6a, 0x9e, 0xef, 0x7e, + 0xfa, 0x26, 0x5a, 0xd1, 0x96, 0x58, 0x4f, 0xb9, 0x25, 0xba, 0x18, 0x5f, 0x5d, 0x6f, 0x00, 0x48, + 0x6b, 0x9d, 0x4b, 0xae, 0x52, 0x18, 0x2f, 0x71, 0x54, 0x27, 0x68, 0x2f, 0x0a, 0xbe, 0x72, 0x84, + 0x15, 0x99, 0x00, 0xd8, 0x03, 0xbe, 0xd9, 0x93, 0xdd, 0xc8, 0x15, 0xa2, 0x0b, 0x91, 0x52, 0x3f, + 0x74, 0xac, 0xc8, 0xd4, 0x20, 0x0d, 0x00, 0x13, 0x24, 0xc7, 0x2c, 0x3f, 0x40, 0x71, 0x45, 0xfe, + 0x69, 0x2d, 0x4a, 0xb2, 0xb7, 0x21, 0x87, 0x42, 0x5e, 0x98, 0x06, 0x17, 0xa2, 0x1e, 0x94, 0x76, + 0x29, 0x8d, 0x08, 0xd8, 0x3d, 0x28, 0x90, 0x68, 0xb1, 0x50, 0xd2, 0x48, 0xbd, 0x1d, 0x09, 0x7d, + 0x2d, 0x42, 0xb3, 0x77, 0x20, 0x3f, 0x3e, 0xb6, 0xce, 0x82, 0xda, 0x3a, 0xd1, 0x5d, 0x58, 0xb2, + 0x66, 0x35, 0x4e, 0xc1, 0xee, 0x40, 0xd5, 0xb7, 0xc6, 0x3a, 0x39, 0xa4, 0x50, 0xc8, 0x04, 0xb5, + 0x2a, 0xc9, 0x90, 0x8a, 0x6f, 0x8d, 0x1b, 0x08, 0x1c, 0x0c, 0x9d, 0x80, 0xdd, 0x85, 0x35, 0x5a, + 0x3d, 0xa8, 0x0b, 0x49, 0x25, 0x47, 0x4b, 0x51, 0x13, 0x58, 0xf6, 0x21, 0x80, 0xd0, 0xb8, 0xf4, + 0xe1, 0x19, 0x39, 0x72, 0xe3, 0xc5, 0x24, 0xcf, 0x7f, 0x59, 0x2f, 0x7b, 0x1b, 0xf2, 0x38, 0x49, + 0x82, 0xda, 0x15, 0xca, 0x79, 0x33, 0x3d, 0x83, 0xa8, 0xa6, 0x84, 0x67, 0xf7, 0xa0, 0x88, 0x13, + 0x45, 0xc7, 0xe1, 0xa8, 0xc9, 0x2a, 0xa8, 0x98, 0x55, 0xb8, 0x33, 0x58, 0x27, 0xfd, 0xaf, 0x1c, + 0x76, 0x1f, 0x72, 0x26, 0x2e, 0xe6, 0xab, 0x94, 0xe3, 0x65, 0x69, 0x5c, 0x50, 0x58, 0x35, 0xad, + 0x31, 0x69, 0xc5, 0x44, 0xc3, 0x76, 0xa1, 0x8a, 0xd3, 0xe8, 0x11, 0x6d, 0xf6, 0xd8, 0x7d, 0xb5, + 0x6b, 0xc4, 0xf5, 0xe6, 0x1c, 0x57, 0x57, 0x10, 0x51, 0x67, 0xb7, 0xdc, 0xd0, 0x3f, 0xd3, 0xd6, + 0x5d, 0x19, 0xc6, 0xae, 0xa1, 0xe9, 0xd2, 0xf1, 0x46, 0xc7, 0x96, 0x59, 0xbb, 0x1e, 0x39, 0x26, + 0x78, 0x9a, 0x7d, 0x06, 0xeb, 0x34, 0xb1, 0x30, 0x89, 0x85, 0xd7, 0x6e, 0x90, 0x30, 0x95, 0xa7, + 0x4c, 0x84, 0xd2, 0xd2, 0x94, 0x28, 0xe2, 0xed, 0x40, 0x0f, 0xad, 0xc9, 0xd4, 0xf3, 0x51, 0x79, + 0x7d, 0x23, 0x72, 0xb8, 0x0c, 0x22, 0x10, 0x6e, 0xc4, 0xf1, 0xb1, 0x93, 0xee, 0x8d, 0xc7, 0x81, + 0x15, 0xd6, 0x6e, 0xd2, 0xba, 0xa9, 0x46, 0xa7, 0x4f, 0x3d, 0x82, 0xd2, 0x46, 0x18, 0xe8, 0xe6, + 0x99, 0x6b, 0x4c, 0xec, 0x51, 0xed, 0x16, 0xd7, 0x91, 0xed, 0xa0, 0xc9, 0x01, 0xb2, 0x9a, 0xba, + 0x95, 0x52, 0x53, 0x2f, 0x40, 0xde, 0x1c, 0xe2, 0x72, 0x7c, 0x93, 0xb2, 0xcd, 0x99, 0xc3, 0xb6, + 0xc9, 0xde, 0x87, 0xd2, 0x34, 0x12, 0x81, 0x35, 0x55, 0x36, 0xc6, 0x63, 0xc9, 0xa8, 0x25, 0x14, + 0x68, 0x1f, 0xee, 0x58, 0x46, 0x38, 0xf3, 0xad, 0x1d, 0xc7, 0x38, 0xac, 0xdd, 0xa6, 0x9c, 0x64, + 0x10, 0xd6, 0xce, 0xf1, 0x0e, 0xed, 0x91, 0x41, 0x2b, 0xff, 0x0e, 0xd7, 0xbb, 0x04, 0xa4, 0x6d, + 0x26, 0xba, 0xa6, 0x21, 0x94, 0xa9, 0xb7, 0x64, 0x5d, 0xd3, 0x20, 0x6d, 0xea, 0xda, 0x53, 0xd2, + 0x97, 0xa9, 0xe7, 0x3e, 0x9e, 0x13, 0x50, 0xa9, 0xe5, 0x25, 0x49, 0xb2, 0xdd, 0x15, 0x59, 0x4e, + 0x6d, 0xe7, 0x49, 0x92, 0x5f, 0xfb, 0x01, 0xb0, 0xc5, 0x31, 0x7f, 0x9d, 0xb4, 0xcc, 0x0b, 0x69, + 0xf9, 0x9d, 0xd5, 0x27, 0x19, 0xf5, 0x39, 0xac, 0xa7, 0x84, 0xc1, 0x52, 0xa9, 0xcf, 0x55, 0x2e, + 0x63, 0x22, 0x4c, 0x54, 0x9e, 0x10, 0x5e, 0xae, 0xc0, 0x76, 0x0f, 0x85, 0x77, 0x8c, 0x26, 0x53, + 0x9f, 0xd2, 0xea, 0x9f, 0x67, 0xa1, 0xb2, 0x6b, 0x04, 0x47, 0x7b, 0xc6, 0xb4, 0x1f, 0x1a, 0x61, + 0x80, 0x53, 0xe4, 0xc8, 0x08, 0x8e, 0x26, 0xc6, 0x94, 0x2b, 0xbf, 0x19, 0x6e, 0x7a, 0x0b, 0x18, + 0x6a, 0xbe, 0x38, 0x39, 0x31, 0xd9, 0x73, 0xf7, 0x9f, 0x09, 0xbb, 0x3a, 0x4e, 0xa3, 0x68, 0x0a, + 0x8e, 0x66, 0xe3, 0x71, 0x5c, 0x54, 0x94, 0x64, 0x77, 0x60, 0x5d, 0xfc, 0x24, 0xcd, 0xf7, 0x54, + 0x1c, 0x5d, 0xa6, 0x81, 0xec, 0x31, 0x94, 0x05, 0x60, 0x10, 0x09, 0xd2, 0x6a, 0xec, 0x2f, 0x49, + 0x10, 0x9a, 0x4c, 0xc5, 0x7e, 0x04, 0x97, 0xa4, 0xe4, 0x8e, 0xe7, 0xef, 0xcd, 0x9c, 0xd0, 0x6e, + 0x74, 0x85, 0x9a, 0x71, 0x7d, 0x81, 0x3d, 0x21, 0xd1, 0x96, 0x73, 0xa6, 0x6b, 0xbb, 0x67, 0xbb, + 0x24, 0x97, 0xb3, 0x5a, 0x1a, 0x38, 0x47, 0x65, 0x9c, 0x92, 0x38, 0x4e, 0x53, 0x19, 0xa7, 0xb8, + 0x60, 0x05, 0x60, 0xcf, 0x0a, 0x8f, 0x3c, 0x93, 0x74, 0xcc, 0x78, 0xc1, 0xf6, 0x65, 0x94, 0x96, + 0xa6, 0xc4, 0xee, 0x44, 0x6b, 0x6a, 0xe4, 0x86, 0xa4, 0x69, 0x66, 0xb5, 0x28, 0x89, 0x5b, 0x95, + 0x6f, 0xb8, 0x87, 0x56, 0x50, 0x2b, 0x6f, 0x65, 0xef, 0x65, 0x34, 0x91, 0x52, 0xff, 0xde, 0x2a, + 0xe4, 0xf9, 0x48, 0x5e, 0x87, 0xd2, 0x90, 0x1c, 0xce, 0x68, 0xdd, 0x0a, 0x27, 0x32, 0x01, 0xba, + 0xb3, 0x09, 0xd7, 0x10, 0x85, 0x5f, 0x24, 0xa3, 0xd1, 0x6f, 0xcc, 0xd2, 0x9b, 0x85, 0x58, 0x56, + 0x96, 0xa0, 0x22, 0x85, 0x95, 0xf0, 0xbd, 0x13, 0x9a, 0x0d, 0x39, 0x42, 0x44, 0x49, 0xf2, 0x53, + 0xd3, 0xae, 0x87, 0x4c, 0x79, 0xc2, 0x15, 0x09, 0xd0, 0x70, 0xc3, 0x79, 0x1f, 0xce, 0xda, 0x82, + 0x0f, 0x87, 0xdd, 0x04, 0xd4, 0x3f, 0x47, 0x56, 0xcf, 0xb5, 0x1a, 0x5d, 0xea, 0xe1, 0xa2, 0x26, + 0x41, 0x70, 0x81, 0x98, 0xde, 0x94, 0x3a, 0x35, 0xaf, 0xe1, 0x4f, 0xf6, 0x49, 0x3c, 0x3b, 0xa9, + 0x8d, 0x42, 0x5b, 0x17, 0xbb, 0x82, 0x3c, 0x8f, 0xb5, 0x14, 0x1d, 0xe6, 0x84, 0xa2, 0x9e, 0x6b, + 0xeb, 0xf8, 0x53, 0x6d, 0x01, 0x68, 0xde, 0x49, 0x60, 0x85, 0xe4, 0xac, 0xbc, 0x42, 0x4d, 0x4c, + 0x1d, 0x33, 0x79, 0x27, 0xfb, 0x5e, 0x10, 0xdb, 0xac, 0xab, 0xcb, 0x6d, 0x56, 0xf5, 0x21, 0x14, + 0x50, 0x0f, 0x30, 0x42, 0x83, 0xdd, 0x11, 0xfe, 0x21, 0xae, 0xbd, 0x08, 0x47, 0x59, 0x52, 0x86, + 0xf0, 0x18, 0x75, 0xa2, 0x72, 0x89, 0xe7, 0x4d, 0xc9, 0x64, 0x8c, 0xf7, 0x20, 0x91, 0xa1, 0xd0, + 0x2c, 0xae, 0x43, 0x09, 0xab, 0x46, 0xbe, 0x77, 0x21, 0x17, 0x8a, 0xbe, 0x77, 0xd2, 0xc0, 0xb4, + 0xfa, 0x9f, 0x32, 0x50, 0xee, 0xf9, 0x26, 0x6e, 0x7e, 0xfd, 0xa9, 0x35, 0x7a, 0xad, 0x89, 0x8d, + 0x7a, 0x88, 0xe7, 0x38, 0x06, 0x89, 0x59, 0x61, 0xb2, 0xc5, 0x00, 0xf6, 0x21, 0xe4, 0xc6, 0x28, + 0x4e, 0xb3, 0xb2, 0x76, 0x2e, 0x65, 0x1f, 0xfd, 0x46, 0x01, 0xab, 0x11, 0xa9, 0xfa, 0x2b, 0x71, + 0xf9, 0x24, 0x75, 0x65, 0x0f, 0xf5, 0x0a, 0x9d, 0x15, 0xf5, 0x1b, 0x4a, 0x86, 0x15, 0x21, 0xd7, + 0x6c, 0xf5, 0x1b, 0x5c, 0x27, 0x47, 0xed, 0xbc, 0xaf, 0xef, 0xb4, 0xb5, 0xfe, 0x40, 0xc9, 0xd1, + 0xe1, 0x13, 0x01, 0x3a, 0xf5, 0xfe, 0x40, 0x29, 0x32, 0x80, 0xb5, 0x83, 0x6e, 0xfb, 0x47, 0x07, + 0x2d, 0x45, 0x51, 0xff, 0x4d, 0x06, 0x20, 0x71, 0xa4, 0xb2, 0x77, 0xa1, 0x7c, 0x42, 0x29, 0x5d, + 0xf2, 0xb0, 0xcb, 0x6d, 0x04, 0x8e, 0x26, 0x1d, 0xe9, 0x7d, 0xa8, 0xc4, 0xdb, 0x05, 0xea, 0x0f, + 0x8b, 0xae, 0xf6, 0x72, 0x8c, 0xdf, 0x3e, 0x63, 0xef, 0x41, 0xd1, 0xc3, 0x76, 0x20, 0x69, 0x56, + 0x56, 0x1e, 0xa4, 0xe6, 0x6b, 0x05, 0x8f, 0x27, 0x50, 0xcf, 0x18, 0xfb, 0x91, 0x09, 0x1e, 0x93, + 0xee, 0x20, 0xa8, 0xe1, 0x18, 0xb3, 0xc0, 0xd2, 0x38, 0x3e, 0x96, 0xd2, 0xf9, 0x44, 0x4a, 0xab, + 0x3f, 0x86, 0x6a, 0xdf, 0x98, 0x4c, 0xb9, 0x2c, 0xa7, 0x86, 0x31, 0xc8, 0xe1, 0x9c, 0x10, 0x53, + 0x8f, 0x7e, 0xe3, 0xa2, 0xdb, 0xb7, 0xfc, 0x91, 0xe5, 0x46, 0x6b, 0x34, 0x4a, 0xa2, 0xf8, 0x3d, + 0x40, 0x69, 0xae, 0x79, 0x27, 0x91, 0x38, 0x8f, 0xd2, 0xea, 0xef, 0x67, 0xa0, 0x2c, 0x55, 0x83, + 0x3d, 0x84, 0x1c, 0x29, 0xa4, 0x19, 0x59, 0x10, 0x4a, 0x04, 0xfc, 0x37, 0x57, 0x61, 0x90, 0x90, + 0xdd, 0x85, 0x7c, 0x10, 0x1a, 0x7e, 0xe4, 0x93, 0x57, 0x24, 0x8e, 0x6d, 0x6f, 0xe6, 0x9a, 0x1a, + 0x47, 0x33, 0x15, 0xb2, 0x96, 0x6b, 0x0a, 0xa7, 0xc5, 0x22, 0x15, 0x22, 0xd5, 0x2d, 0x28, 0xc5, + 0xd9, 0xe3, 0x14, 0xd0, 0x7a, 0x2f, 0xfa, 0xca, 0x0a, 0x2b, 0x41, 0x5e, 0xab, 0x77, 0x9f, 0xb6, + 0x94, 0x8c, 0xfa, 0x07, 0x19, 0x80, 0x84, 0x8b, 0x3d, 0x48, 0xd5, 0xf6, 0xda, 0x7c, 0xae, 0x0f, + 0xe8, 0xaf, 0x54, 0xd9, 0x1b, 0x50, 0x9a, 0xb9, 0x04, 0xb4, 0x4c, 0xb1, 0x13, 0x25, 0x00, 0xb4, + 0xa2, 0xa2, 0x08, 0x92, 0x39, 0x2b, 0xea, 0xa5, 0xe1, 0xa8, 0xdf, 0x81, 0x52, 0x9c, 0x1d, 0x1a, + 0x86, 0x3b, 0xbd, 0x4e, 0xa7, 0xf7, 0xa2, 0xdd, 0x7d, 0xaa, 0xac, 0x60, 0x72, 0x5f, 0x6b, 0x35, + 0x5a, 0x4d, 0x4c, 0x66, 0x70, 0xce, 0x36, 0x0e, 0x34, 0xad, 0xd5, 0x1d, 0xe8, 0x5a, 0xef, 0x85, + 0xb2, 0xaa, 0xfe, 0xf5, 0x1c, 0x6c, 0xf6, 0xdc, 0xe6, 0x6c, 0xea, 0xd8, 0x23, 0x23, 0xb4, 0x9e, + 0x59, 0x67, 0x8d, 0xf0, 0x14, 0x77, 0x5f, 0x23, 0x0c, 0x7d, 0xbe, 0x98, 0x4b, 0x1a, 0x4f, 0x70, + 0xc7, 0x46, 0x60, 0xf9, 0x21, 0xf9, 0x6d, 0xe4, 0x55, 0x5c, 0xe5, 0xf0, 0x86, 0xe7, 0xd0, 0x5a, + 0x66, 0xdf, 0x83, 0x4b, 0xdc, 0x19, 0xc2, 0x29, 0x51, 0x09, 0xd6, 0x69, 0x31, 0x67, 0x17, 0xa6, + 0x2e, 0xe3, 0x84, 0xc8, 0x8a, 0x64, 0x24, 0xc2, 0x6e, 0x41, 0x39, 0x61, 0x8f, 0x0e, 0xba, 0x20, + 0x26, 0xa4, 0x9a, 0xa0, 0xf1, 0x1e, 0xd5, 0x5a, 0xb7, 0xcd, 0x53, 0x72, 0x13, 0xe5, 0xb5, 0xaa, + 0x97, 0x34, 0x06, 0x37, 0xe1, 0xcf, 0x61, 0x33, 0x45, 0x49, 0xb5, 0x58, 0xa3, 0x5a, 0xbc, 0x17, + 0x39, 0x59, 0xe7, 0x5a, 0x2f, 0x43, 0xb0, 0x3a, 0x5c, 0xab, 0xdd, 0xf0, 0xd2, 0x50, 0xa1, 0x8b, + 0xd8, 0x87, 0xae, 0xe7, 0x5b, 0x42, 0xe0, 0x17, 0xed, 0xa0, 0x4d, 0xe9, 0xc4, 0x86, 0x92, 0x0e, + 0x66, 0xf9, 0xfe, 0x12, 0x9d, 0x39, 0x72, 0xb4, 0xcd, 0x77, 0xd0, 0x9c, 0x56, 0xa0, 0x34, 0xd7, + 0xe6, 0x38, 0x2a, 0x32, 0x8b, 0x80, 0xcc, 0xa2, 0x0a, 0x01, 0x9f, 0x73, 0xd8, 0xb5, 0x2e, 0x5c, + 0x5c, 0x56, 0xc9, 0x25, 0x6a, 0xd8, 0x96, 0xac, 0x86, 0xcd, 0x19, 0xfe, 0x89, 0x4a, 0xf6, 0x8f, + 0x33, 0x50, 0x69, 0x5a, 0xe6, 0x6c, 0xfa, 0x43, 0xcf, 0x76, 0x71, 0x02, 0x7c, 0x04, 0x15, 0xcf, + 0x31, 0x69, 0xf4, 0xa4, 0xf8, 0x82, 0xd4, 0xa9, 0x93, 0x70, 0x90, 0x83, 0xe7, 0x98, 0x0d, 0xcf, + 0xa1, 0x68, 0x84, 0xf7, 0xe1, 0x02, 0x77, 0x8a, 0x08, 0x1f, 0xe1, 0x29, 0x67, 0x5e, 0xa5, 0x91, + 0x51, 0x38, 0x8a, 0x2b, 0x47, 0x44, 0xfe, 0x4b, 0x70, 0x51, 0x22, 0xc7, 0x91, 0xe1, 0xf4, 0x8b, + 0x93, 0x64, 0x33, 0xe6, 0x8d, 0x8e, 0x7d, 0xd4, 0xdf, 0x58, 0x85, 0x12, 0x77, 0xa9, 0x60, 0x7d, + 0xef, 0x41, 0xc1, 0x1b, 0x7e, 0xa9, 0xfb, 0xb1, 0xab, 0x61, 0xe1, 0xb4, 0x72, 0xcd, 0x1b, 0x7e, + 0xa9, 0x59, 0x63, 0xf6, 0x6e, 0xb4, 0xcf, 0x9b, 0xd6, 0x58, 0x74, 0x4a, 0x35, 0x6d, 0xd3, 0x88, + 0x7d, 0x1f, 0xed, 0xed, 0xc7, 0x50, 0x4e, 0x66, 0x7c, 0x50, 0x2b, 0x9c, 0xdf, 0x0b, 0xf1, 0x02, + 0x08, 0x90, 0x89, 0xbb, 0x95, 0x38, 0x53, 0xf1, 0x7c, 0x26, 0x4e, 0x46, 0x4c, 0x9f, 0x41, 0x35, + 0x91, 0xf1, 0xc4, 0x57, 0x3a, 0x97, 0x6f, 0x3d, 0xa6, 0xa4, 0x53, 0x93, 0x7f, 0x92, 0x81, 0x52, + 0x9b, 0x17, 0x1f, 0x9e, 0xb2, 0x37, 0x21, 0xfb, 0x8a, 0x5e, 0x40, 0x1c, 0xbb, 0x0f, 0x9b, 0x86, + 0x69, 0xea, 0xc6, 0x78, 0x6c, 0x8d, 0x42, 0xcb, 0xd4, 0x51, 0x05, 0x12, 0x32, 0x67, 0xc3, 0x30, + 0xcd, 0xba, 0x80, 0x93, 0xec, 0xc6, 0x35, 0x1f, 0xe8, 0x91, 0xf1, 0x9a, 0x1c, 0x4b, 0x17, 0xb5, + 0xaa, 0x1d, 0x08, 0xdb, 0x95, 0xfb, 0xa3, 0x53, 0x1d, 0x9b, 0x7b, 0x75, 0xc7, 0xaa, 0xbf, 0xbd, + 0x0a, 0xa0, 0x59, 0x53, 0xc7, 0x18, 0x59, 0xff, 0xcf, 0x54, 0x1a, 0xc5, 0x52, 0x3c, 0xb0, 0xae, + 0x19, 0x85, 0x71, 0x44, 0x83, 0xe8, 0x9a, 0xec, 0x07, 0xf0, 0x86, 0x6f, 0x9d, 0xf8, 0x76, 0x68, + 0xe9, 0x63, 0xdf, 0x9b, 0xe8, 0x29, 0xc9, 0x83, 0x0b, 0xb3, 0x44, 0x95, 0xb8, 0x2a, 0x88, 0x76, + 0x7c, 0x6f, 0x92, 0x96, 0x3e, 0xea, 0xef, 0x97, 0xa1, 0x5c, 0x77, 0x0d, 0xe7, 0xec, 0x27, 0x16, + 0xc5, 0x15, 0x90, 0x87, 0x76, 0x3a, 0x0b, 0x79, 0x73, 0xf9, 0xa1, 0x5b, 0x89, 0x20, 0xd4, 0xd0, + 0x5b, 0x50, 0xf6, 0x66, 0x61, 0x8c, 0xe7, 0xc7, 0x70, 0xc0, 0x41, 0x44, 0x10, 0xf3, 0xc7, 0xde, + 0xff, 0x88, 0x9f, 0xcc, 0x9f, 0x84, 0x3f, 0x56, 0x89, 0x63, 0x7e, 0x22, 0x40, 0x69, 0x64, 0x4f, + 0xa8, 0xc1, 0xc1, 0x6c, 0x62, 0xf1, 0x46, 0x67, 0x79, 0x8c, 0x5b, 0x43, 0xc0, 0x30, 0x97, 0x89, + 0x35, 0xf1, 0xfc, 0x33, 0x9e, 0xcb, 0x1a, 0xcf, 0x85, 0x83, 0x28, 0x97, 0xf7, 0x80, 0x9d, 0x18, + 0x76, 0xa8, 0xa7, 0xb3, 0xe2, 0x66, 0x88, 0x82, 0x98, 0x81, 0x9c, 0xdd, 0x65, 0x58, 0x33, 0xed, + 0xe0, 0xb8, 0xdd, 0x13, 0x26, 0x88, 0x48, 0x61, 0x5b, 0x82, 0x91, 0x81, 0x1a, 0x50, 0x68, 0x71, + 0x75, 0x39, 0xab, 0x95, 0x10, 0xb2, 0x8d, 0x00, 0xdc, 0x41, 0x5d, 0x2b, 0x3c, 0xf1, 0x7c, 0xe4, + 0xe4, 0x16, 0x46, 0x02, 0x40, 0x4d, 0x03, 0x49, 0xb1, 0x20, 0xf2, 0x28, 0x65, 0xb5, 0x38, 0x8d, + 0xba, 0x3b, 0x5f, 0xbe, 0x84, 0xad, 0xf0, 0xea, 0x27, 0x10, 0x76, 0x07, 0xaa, 0x54, 0x7d, 0xb2, + 0x40, 0xb0, 0x0d, 0x74, 0x52, 0x96, 0xd5, 0x2a, 0x08, 0x25, 0x87, 0x04, 0x52, 0x7d, 0x06, 0x57, + 0x53, 0xed, 0xd3, 0x0d, 0xdf, 0x37, 0xce, 0xf4, 0x89, 0xf1, 0xa5, 0xe7, 0x93, 0xf3, 0x28, 0xab, + 0x5d, 0x96, 0xbb, 0xad, 0x8e, 0xe8, 0x3d, 0xc4, 0x9e, 0xcb, 0x6a, 0xbb, 0x9e, 0x4f, 0x9e, 0xa5, + 0xa5, 0xac, 0x88, 0x25, 0x37, 0x08, 0x0d, 0x30, 0x99, 0x43, 0x01, 0x8f, 0x8d, 0xd4, 0xca, 0x04, + 0xdb, 0x26, 0x10, 0x1a, 0x04, 0xc1, 0x63, 0x2e, 0x59, 0x37, 0x45, 0xa0, 0xd2, 0x63, 0x92, 0xbf, + 0x1c, 0x71, 0x64, 0x19, 0x26, 0x9d, 0xbe, 0x11, 0x62, 0xd7, 0x32, 0xe8, 0x6c, 0x3b, 0x78, 0xac, + 0x4f, 0x67, 0x21, 0x0f, 0x6a, 0xd4, 0xf2, 0xc1, 0xe3, 0xfd, 0x59, 0x28, 0xc0, 0x87, 0x56, 0x48, + 0xa1, 0x8c, 0x04, 0x7e, 0x6a, 0x85, 0xb8, 0x11, 0x06, 0x8f, 0x23, 0x4f, 0xfa, 0x25, 0xd1, 0xb7, + 0x8f, 0x85, 0xab, 0x5c, 0x85, 0xf5, 0x18, 0xa9, 0x4f, 0x66, 0x3c, 0x8a, 0x31, 0xab, 0x95, 0x23, + 0x82, 0xbd, 0x99, 0x83, 0x03, 0x3b, 0x32, 0x46, 0x47, 0x96, 0xee, 0x63, 0x55, 0xae, 0xf0, 0xa1, + 0x23, 0x88, 0x86, 0xb5, 0xb9, 0x0e, 0x3c, 0xa1, 0x1f, 0xd9, 0x21, 0x79, 0xb8, 0xb2, 0x5a, 0x91, + 0x00, 0xbb, 0x76, 0x88, 0x62, 0x81, 0x23, 0xc5, 0x0c, 0xa4, 0x2c, 0xae, 0x12, 0xd1, 0x06, 0x21, + 0xf6, 0x08, 0x4e, 0x19, 0xdd, 0x03, 0x25, 0x45, 0x8b, 0xf9, 0x5d, 0x23, 0xd2, 0xaa, 0x44, 0x8a, + 0xb9, 0xde, 0x05, 0xce, 0xac, 0xe3, 0xd4, 0xe3, 0x79, 0x5e, 0xe7, 0xe6, 0x30, 0x81, 0x9b, 0x76, + 0x70, 0x4c, 0x39, 0xde, 0x81, 0xaa, 0x44, 0x87, 0xf9, 0xdd, 0xe0, 0x33, 0x23, 0x26, 0x4b, 0xd5, + 0xd1, 0xb7, 0x26, 0x5e, 0x28, 0x9a, 0xf9, 0x86, 0x54, 0x47, 0x8d, 0xe0, 0xe9, 0x3a, 0x0a, 0x5a, + 0xcc, 0xf3, 0xa6, 0x54, 0x47, 0x4e, 0x8a, 0xb9, 0xbe, 0x09, 0x15, 0x94, 0x22, 0xa1, 0xe5, 0xf2, + 0xc5, 0x7f, 0x8b, 0x77, 0xac, 0x80, 0xd1, 0xea, 0x7f, 0x13, 0x2a, 0xbc, 0xe7, 0x85, 0xb8, 0xdc, + 0xe2, 0x24, 0x02, 0x16, 0x09, 0x08, 0xd1, 0x1b, 0x13, 0xdb, 0x25, 0x37, 0x56, 0x56, 0x2b, 0x71, + 0xc8, 0x9e, 0xed, 0xca, 0x68, 0xe3, 0x94, 0x9c, 0x59, 0x09, 0xda, 0x38, 0xa5, 0x25, 0x39, 0xb5, + 0x1d, 0x87, 0x2f, 0xfc, 0xdb, 0x62, 0x49, 0x22, 0xa4, 0x2f, 0x6c, 0x6a, 0x8e, 0xc6, 0xbc, 0xef, + 0x88, 0x99, 0x81, 0x00, 0xcc, 0x3a, 0x41, 0x1a, 0xa7, 0xe4, 0xb2, 0x8a, 0x91, 0xc6, 0xa9, 0x10, + 0x4c, 0x58, 0x69, 0xe2, 0xbd, 0x1b, 0x0b, 0x26, 0x04, 0x21, 0xb7, 0x4c, 0x60, 0x9c, 0xd6, 0xde, + 0x4e, 0x13, 0x18, 0xa7, 0x64, 0x6b, 0x5a, 0x86, 0xc9, 0x6b, 0x76, 0x8f, 0x67, 0x8f, 0x00, 0xaa, + 0xd8, 0x16, 0x54, 0x82, 0xc7, 0x7a, 0x82, 0x7f, 0x87, 0xb3, 0x07, 0x8f, 0xb5, 0x88, 0xe2, 0x0e, + 0x54, 0xe3, 0xb1, 0xe7, 0x34, 0xf7, 0xf9, 0xc8, 0x9a, 0x62, 0xec, 0xe9, 0xe0, 0xf4, 0xa7, 0x19, + 0xb8, 0xd6, 0x23, 0x37, 0x1b, 0x6d, 0x17, 0x7b, 0x56, 0x10, 0x18, 0x87, 0xd6, 0x8e, 0xe7, 0xef, + 0xcc, 0x7e, 0xf2, 0x93, 0x33, 0x76, 0x0f, 0x36, 0xf6, 0x0d, 0xdf, 0x72, 0xc3, 0xf8, 0xc8, 0x4f, + 0xa8, 0x66, 0xf3, 0x60, 0xf6, 0x04, 0x14, 0x0e, 0x3a, 0x88, 0x95, 0x5c, 0x61, 0xe6, 0xa5, 0x3d, + 0xf4, 0x0b, 0x54, 0x68, 0x36, 0x97, 0x9a, 0x76, 0x10, 0x6a, 0x86, 0x7b, 0x88, 0x42, 0x48, 0x71, + 0xbc, 0x13, 0xb4, 0xfd, 0xd0, 0x20, 0xd0, 0x25, 0x13, 0x44, 0xec, 0xaa, 0x89, 0xdd, 0x51, 0x25, + 0xc2, 0xc4, 0x70, 0xf8, 0x0c, 0x94, 0xd9, 0x74, 0x9a, 0x66, 0x5d, 0x3d, 0x87, 0x95, 0x08, 0x13, + 0xd6, 0x77, 0xa1, 0x2c, 0x95, 0xba, 0xc4, 0x4c, 0x81, 0xa4, 0x2c, 0x24, 0x96, 0xca, 0x59, 0x12, + 0x05, 0x0a, 0x49, 0xee, 0xea, 0x1f, 0x65, 0x40, 0x21, 0x37, 0xa3, 0x46, 0xb1, 0x04, 0x74, 0x72, + 0x98, 0x32, 0x70, 0x33, 0xaf, 0x35, 0x70, 0xb7, 0x20, 0xef, 0xd8, 0x93, 0x38, 0x34, 0x2b, 0xa5, + 0x01, 0x13, 0x02, 0xc7, 0xda, 0xf3, 0xed, 0x43, 0x32, 0xc5, 0xe5, 0x20, 0x42, 0xf2, 0xa0, 0xa2, + 0x65, 0x4b, 0x43, 0xf4, 0x00, 0xc0, 0xb4, 0x83, 0x50, 0x27, 0xe7, 0x94, 0xa8, 0xb6, 0xe8, 0x99, + 0xb8, 0xff, 0xb5, 0x92, 0x19, 0xfd, 0x54, 0xff, 0xb5, 0x0a, 0xb9, 0xae, 0x67, 0x5a, 0xec, 0x03, + 0x28, 0x51, 0x64, 0xac, 0x34, 0x18, 0xc2, 0x5f, 0x86, 0x68, 0xfa, 0x43, 0xbd, 0x5a, 0x74, 0xc5, + 0xaf, 0xf3, 0x63, 0x69, 0xdf, 0x24, 0x93, 0x96, 0x0e, 0xa2, 0xb1, 0xf8, 0xb2, 0x70, 0xbb, 0x91, + 0x97, 0x88, 0x63, 0x70, 0xa3, 0xa3, 0x43, 0x0b, 0xdf, 0x72, 0xc9, 0x70, 0xca, 0x6b, 0x71, 0x9a, + 0x1c, 0x09, 0xbe, 0x87, 0x6a, 0x15, 0xdf, 0x0e, 0xf2, 0x4b, 0x1c, 0x09, 0x1c, 0x4f, 0xfb, 0xc3, + 0x07, 0x50, 0xfa, 0xd2, 0xb3, 0x5d, 0x5e, 0xf1, 0xb5, 0x85, 0x8a, 0xa3, 0xad, 0xc0, 0x2b, 0xfe, + 0xa5, 0xf8, 0xc5, 0x6e, 0x43, 0xc1, 0x73, 0x79, 0xde, 0x85, 0x85, 0xbc, 0xd7, 0x3c, 0xb7, 0xc3, + 0x03, 0xb5, 0xd6, 0xed, 0x40, 0xf7, 0xed, 0xc3, 0xa3, 0x50, 0x47, 0x4e, 0x71, 0x80, 0x5d, 0xb6, + 0x03, 0x0d, 0x61, 0x98, 0x2d, 0x4e, 0x92, 0xb1, 0xed, 0xa0, 0xf6, 0x46, 0x99, 0x95, 0x16, 0x32, + 0x03, 0x8e, 0xa6, 0x0c, 0xdf, 0x82, 0xe2, 0xa1, 0xef, 0xcd, 0xa6, 0x38, 0x1f, 0x60, 0x81, 0xb2, + 0x40, 0xb8, 0xed, 0x33, 0xd4, 0x65, 0xe8, 0xa7, 0xed, 0x1e, 0xea, 0xe4, 0x1b, 0x2a, 0x6f, 0x65, + 0xef, 0x15, 0xb5, 0x4a, 0x04, 0x24, 0xaf, 0xcf, 0x5b, 0x50, 0x34, 0x0e, 0x0f, 0x75, 0x11, 0x6f, + 0xb6, 0x90, 0x97, 0x71, 0x78, 0x48, 0x45, 0x3e, 0x80, 0xf5, 0x13, 0xdb, 0xd5, 0x83, 0xa9, 0x35, + 0xe2, 0xb4, 0xeb, 0x8b, 0x5d, 0x79, 0x62, 0xbb, 0x38, 0x13, 0x89, 0x5e, 0x9e, 0xb2, 0xd5, 0xaf, + 0x3f, 0x65, 0x37, 0xce, 0x9b, 0xb2, 0x2a, 0xac, 0x89, 0x03, 0x0d, 0x65, 0x81, 0x44, 0x60, 0xd8, + 0x87, 0x50, 0xf6, 0x0d, 0xf7, 0x58, 0x17, 0xd1, 0x00, 0x5f, 0xc8, 0xfe, 0x0d, 0xcd, 0x70, 0x8f, + 0x45, 0x30, 0x00, 0xf8, 0xf1, 0xef, 0xb4, 0x3a, 0xbc, 0xf9, 0x1a, 0x75, 0x58, 0xb2, 0xb9, 0xd8, + 0xab, 0x6d, 0xae, 0x8f, 0xc9, 0xb8, 0xb1, 0xdc, 0x50, 0x8f, 0x18, 0x2e, 0x2c, 0x67, 0xa8, 0x70, + 0xb2, 0x1e, 0x67, 0xc3, 0x06, 0x90, 0x7f, 0x51, 0x27, 0x67, 0xe4, 0xc5, 0x54, 0x03, 0x62, 0xc7, + 0xa3, 0x06, 0x7e, 0xe2, 0x84, 0xac, 0xc3, 0x46, 0x12, 0x84, 0xcb, 0xa3, 0x99, 0x2f, 0xc9, 0x07, + 0x1c, 0xa9, 0xa8, 0xdd, 0xc8, 0x9c, 0xb2, 0x53, 0xa1, 0xbc, 0xb7, 0x61, 0x9d, 0x87, 0xdf, 0xf0, + 0x7e, 0x0b, 0x48, 0x63, 0x29, 0x69, 0x15, 0x02, 0xf2, 0x7e, 0x0a, 0x48, 0x18, 0x08, 0x53, 0x20, + 0x3c, 0x25, 0x95, 0x25, 0x11, 0x06, 0xdc, 0x1e, 0x08, 0x4f, 0xb5, 0x92, 0x19, 0xfd, 0xc4, 0x9d, + 0x78, 0x68, 0xbb, 0x26, 0x4e, 0xbd, 0xd0, 0x38, 0x0c, 0x6a, 0x35, 0x5a, 0x99, 0x65, 0x01, 0x1b, + 0x18, 0x87, 0x01, 0x9a, 0xdc, 0x06, 0xd7, 0xfc, 0x79, 0xbd, 0xaf, 0xca, 0xfe, 0x38, 0xc9, 0x26, + 0xd0, 0xca, 0x86, 0x64, 0x20, 0x7c, 0x0a, 0x2c, 0x3a, 0x6f, 0x95, 0x2c, 0xe8, 0x6b, 0x0b, 0xb3, + 0x71, 0x43, 0x1c, 0xb8, 0xc6, 0x37, 0x07, 0x6e, 0x41, 0x39, 0xf0, 0x66, 0xfe, 0xc8, 0xd2, 0x83, + 0xd0, 0x9a, 0xd6, 0xae, 0x53, 0x85, 0x80, 0x83, 0xfa, 0xa1, 0x35, 0x65, 0x9f, 0xc2, 0x7a, 0xda, + 0x82, 0xba, 0xb1, 0xe4, 0xd8, 0x92, 0xa6, 0x85, 0x56, 0x19, 0xc9, 0x36, 0xd5, 0x6d, 0x1e, 0x20, + 0x4e, 0xea, 0x0a, 0x31, 0xf2, 0xa3, 0xb9, 0x8a, 0xeb, 0x85, 0x8d, 0x08, 0x86, 0x1d, 0x18, 0x59, + 0xd6, 0xe1, 0x29, 0x69, 0x38, 0x71, 0x07, 0xc6, 0xb6, 0x2c, 0x5a, 0x2a, 0x91, 0x59, 0x8b, 0x73, + 0x81, 0xdb, 0x8b, 0xc4, 0x70, 0x2b, 0x35, 0x17, 0x62, 0x43, 0x52, 0x03, 0x3f, 0x31, 0x2a, 0x9b, + 0xc0, 0x23, 0x54, 0x68, 0x0f, 0xb7, 0x7c, 0x1e, 0x8d, 0x42, 0x3a, 0x50, 0x7c, 0xf8, 0x39, 0xbf, + 0xb5, 0x68, 0x3c, 0x72, 0x47, 0xde, 0x6c, 0x9e, 0x40, 0x75, 0xea, 0xe3, 0x90, 0xc4, 0x95, 0x55, + 0xe5, 0x7e, 0xd8, 0xf7, 0xad, 0xa4, 0xbe, 0x95, 0xa9, 0x94, 0x62, 0xdf, 0x87, 0x4d, 0x89, 0x73, + 0x76, 0x4c, 0xcc, 0xb7, 0x89, 0xf9, 0xe2, 0x1c, 0xf3, 0xc1, 0x31, 0xb2, 0x57, 0xa7, 0xa9, 0x34, + 0xab, 0xcf, 0x79, 0xb9, 0xd0, 0x82, 0xbc, 0x43, 0xfc, 0x57, 0xce, 0x71, 0x5d, 0xa5, 0xdc, 0x5f, + 0xcf, 0xf8, 0x29, 0x5c, 0x3b, 0x68, 0xb9, 0x26, 0x29, 0x58, 0x45, 0x8d, 0x27, 0xd8, 0x63, 0xa8, + 0x70, 0x5b, 0x86, 0x02, 0x6d, 0x83, 0xda, 0x5d, 0xd9, 0xcd, 0x4f, 0x06, 0x0d, 0x21, 0xb4, 0xb2, + 0x13, 0xff, 0x0e, 0xd8, 0x27, 0xb0, 0xc9, 0xcf, 0x60, 0x64, 0xc1, 0xfc, 0xf6, 0xe2, 0x44, 0x23, + 0xa2, 0x9d, 0x44, 0x3a, 0x6b, 0x70, 0xd5, 0x9f, 0xb9, 0x64, 0xdf, 0x08, 0xce, 0xa9, 0xef, 0x0d, + 0x2d, 0xce, 0x7f, 0x8f, 0xf8, 0x45, 0x73, 0x34, 0x4e, 0xc6, 0x79, 0x49, 0x22, 0x5e, 0xf6, 0x65, + 0xd0, 0x3e, 0xf2, 0x9d, 0x93, 0xe7, 0x70, 0x66, 0x3b, 0x26, 0xcf, 0xf3, 0x9d, 0x6f, 0x92, 0xe7, + 0x36, 0xf2, 0x51, 0x9e, 0x0c, 0x72, 0xb3, 0x99, 0x6d, 0x92, 0x9e, 0x57, 0xd1, 0xe8, 0x37, 0x7b, + 0x0b, 0xaa, 0xbe, 0x35, 0x9a, 0xf9, 0x81, 0xfd, 0xd2, 0xd2, 0x03, 0xdb, 0x3d, 0xae, 0xbd, 0x4b, + 0xfd, 0xb8, 0x1e, 0x43, 0xfb, 0xb6, 0x7b, 0x8c, 0x93, 0xd3, 0x3a, 0x0d, 0x2d, 0xdf, 0xe5, 0xb1, + 0xff, 0xef, 0xc9, 0x93, 0xb3, 0x45, 0x08, 0x94, 0x2e, 0x1a, 0x58, 0xf1, 0xef, 0xb9, 0xc9, 0x11, + 0xf0, 0xc9, 0xf1, 0xe0, 0x6b, 0x4d, 0x8e, 0x3e, 0x4d, 0x8e, 0xbb, 0x50, 0xb4, 0xdd, 0xd0, 0xf2, + 0x5f, 0x1a, 0x4e, 0xed, 0xe1, 0xc2, 0x1e, 0x10, 0xe3, 0xd8, 0x1d, 0x28, 0x04, 0x8e, 0x8d, 0x52, + 0xa6, 0xf6, 0xc1, 0x02, 0x59, 0x84, 0x62, 0xf7, 0xa0, 0x14, 0x5f, 0x5b, 0xab, 0x7d, 0xb8, 0x40, + 0x97, 0x20, 0xd9, 0x4d, 0xc8, 0x9d, 0xe0, 0x84, 0x7a, 0xb4, 0x78, 0x2c, 0x83, 0x70, 0x54, 0x1a, + 0xc6, 0xa8, 0xd5, 0x93, 0xd2, 0xf0, 0x78, 0x41, 0x69, 0xd8, 0xb1, 0x1d, 0x87, 0x2b, 0x0d, 0x63, + 0xf1, 0x0b, 0xb7, 0x5c, 0xe2, 0xc0, 0x96, 0x7c, 0xb4, 0xb8, 0xe5, 0x22, 0xee, 0x39, 0x5d, 0xf0, + 0x2b, 0x07, 0x74, 0xd6, 0xc0, 0x8f, 0x4c, 0x3e, 0x96, 0xfb, 0x2a, 0x7d, 0x08, 0xa1, 0x41, 0x10, + 0xa7, 0xd1, 0x44, 0x11, 0x27, 0x2d, 0xb6, 0x79, 0x5a, 0xfb, 0x84, 0xdf, 0x1c, 0xe1, 0x90, 0xb6, + 0x79, 0xca, 0x3e, 0x80, 0xf5, 0x28, 0x34, 0x0b, 0x8b, 0x0b, 0x6a, 0x9f, 0x2e, 0xd4, 0x20, 0x4d, + 0xc0, 0x9a, 0x50, 0x19, 0xa3, 0x76, 0x3f, 0xe1, 0xca, 0x7e, 0xed, 0x09, 0x55, 0x64, 0x2b, 0xda, + 0xce, 0xcf, 0x33, 0x06, 0xb4, 0x14, 0x17, 0x7b, 0x00, 0xcc, 0x1e, 0xf3, 0xf1, 0xdc, 0xf1, 0xbd, + 0x09, 0x57, 0xe8, 0x6b, 0x9f, 0xd1, 0xec, 0x5a, 0x82, 0xa1, 0x83, 0x57, 0xcb, 0x35, 0xf5, 0x49, + 0x20, 0x94, 0x93, 0xef, 0x50, 0x3d, 0x85, 0xc8, 0x8c, 0xaf, 0xb7, 0x8a, 0x2d, 0xad, 0x8c, 0xb4, + 0x7b, 0x01, 0xd7, 0x55, 0x3e, 0x03, 0x9c, 0xae, 0x2f, 0x13, 0xd6, 0x5f, 0x7a, 0x25, 0x2b, 0xd2, + 0x46, 0xac, 0x4f, 0xa0, 0x6a, 0x5a, 0xe6, 0x6c, 0x4a, 0x7a, 0x1a, 0x4d, 0xd1, 0xef, 0xca, 0xc2, + 0x4f, 0x76, 0x19, 0x6b, 0x15, 0x53, 0x76, 0x20, 0x7f, 0x0a, 0x1b, 0x91, 0x6f, 0x37, 0x14, 0x6e, + 0xe0, 0xef, 0xc9, 0xc5, 0xc6, 0xae, 0x5b, 0x6d, 0x7d, 0x16, 0xfd, 0xa4, 0x22, 0x1f, 0xc3, 0x3a, + 0xed, 0xdd, 0x81, 0x6b, 0x4c, 0x83, 0x23, 0x2f, 0xac, 0xfd, 0xb2, 0xac, 0x86, 0xf4, 0x05, 0x54, + 0xab, 0x20, 0x51, 0x94, 0xc2, 0x2d, 0x27, 0x59, 0xa7, 0xa3, 0xd0, 0xaa, 0x7d, 0x9f, 0x6f, 0x39, + 0x31, 0xb0, 0x11, 0x5a, 0xec, 0x31, 0x80, 0x31, 0x9d, 0x3a, 0x67, 0x7c, 0x6a, 0xfe, 0x80, 0xa6, + 0xe6, 0x45, 0x69, 0x6a, 0xd6, 0x11, 0x49, 0x73, 0xb3, 0x64, 0x44, 0x3f, 0xd9, 0x23, 0xa8, 0x4c, + 0xbd, 0x20, 0xd4, 0xcd, 0x89, 0x43, 0xed, 0xaf, 0xcb, 0x6b, 0x7b, 0xdf, 0x0b, 0xc2, 0xe6, 0xc4, + 0xa1, 0x8d, 0x67, 0x1a, 0xff, 0x66, 0x1d, 0xb8, 0x90, 0x92, 0xdb, 0x06, 0x85, 0x39, 0xd4, 0xb6, + 0xa9, 0xc4, 0x1b, 0x52, 0x89, 0x92, 0xfc, 0x16, 0x71, 0x82, 0x9b, 0xde, 0x3c, 0x88, 0x2c, 0x51, + 0x1a, 0x83, 0x38, 0x58, 0xb6, 0xc1, 0x15, 0x12, 0x82, 0x46, 0xd1, 0xb2, 0x4f, 0x60, 0x23, 0xa1, + 0xc2, 0x06, 0x06, 0xb5, 0xa6, 0x3c, 0x93, 0xa5, 0x90, 0xf6, 0xf5, 0x88, 0x11, 0x61, 0x01, 0xf5, + 0x9d, 0xe7, 0x38, 0xb3, 0xa9, 0x10, 0xa5, 0xb5, 0x96, 0xe8, 0x3b, 0x02, 0x72, 0x29, 0x29, 0x19, + 0xeb, 0xd6, 0xa4, 0xb6, 0x23, 0x1b, 0xeb, 0xd6, 0x04, 0x95, 0x1b, 0x11, 0xec, 0xfc, 0xd2, 0xb6, + 0x4e, 0x82, 0xda, 0x53, 0x3a, 0xaf, 0x11, 0x01, 0xdc, 0xcf, 0x11, 0x44, 0xae, 0x53, 0xdb, 0x47, + 0xc3, 0x83, 0x02, 0xdc, 0x76, 0x85, 0xeb, 0x94, 0x40, 0x48, 0xa1, 0xfe, 0xcb, 0x3c, 0x14, 0x23, + 0x4b, 0x88, 0x95, 0xa1, 0x70, 0xd0, 0x7d, 0xd6, 0xed, 0xbd, 0xe8, 0xf2, 0xeb, 0x7d, 0xf5, 0x7e, + 0xbf, 0xa5, 0x0d, 0x14, 0x93, 0x55, 0x01, 0xe8, 0x02, 0x8f, 0xde, 0x6f, 0xd4, 0xbb, 0xfc, 0xba, + 0x1f, 0x5d, 0x1b, 0xe2, 0xe9, 0x55, 0xb6, 0x09, 0xeb, 0x3b, 0x07, 0x5d, 0x0a, 0x8a, 0xe4, 0xa0, + 0x2c, 0x82, 0x5a, 0x9f, 0xf3, 0x63, 0x5c, 0x0e, 0xca, 0x21, 0x68, 0xaf, 0x3e, 0x68, 0x69, 0xed, + 0x08, 0x94, 0xa7, 0xf8, 0xca, 0xde, 0x81, 0xd6, 0x10, 0x39, 0xad, 0xb1, 0x4b, 0xb0, 0x19, 0xb3, + 0x45, 0x59, 0x2a, 0x05, 0xac, 0xd9, 0xbe, 0xd6, 0xfb, 0x61, 0xab, 0x31, 0x50, 0x80, 0xce, 0x84, + 0x9f, 0x3e, 0x55, 0xca, 0xac, 0x02, 0xc5, 0x66, 0xbb, 0x3f, 0x68, 0x77, 0x1b, 0x03, 0xa5, 0x82, + 0x15, 0xde, 0x69, 0x77, 0x06, 0x2d, 0x4d, 0x59, 0x67, 0x45, 0xc8, 0xfd, 0xb0, 0xd7, 0xee, 0x2a, + 0x55, 0xba, 0xc8, 0x54, 0xdf, 0xdb, 0xef, 0xb4, 0x94, 0x0d, 0x84, 0xf6, 0x7b, 0xda, 0x40, 0x51, + 0x10, 0xfa, 0xa2, 0xdd, 0x6d, 0xf6, 0x5e, 0x28, 0x9b, 0xac, 0x04, 0xf9, 0x83, 0x2e, 0x16, 0xc3, + 0xd8, 0x3a, 0x94, 0xe8, 0xa7, 0x5e, 0xef, 0x74, 0x94, 0x0b, 0xd2, 0x41, 0xf2, 0x45, 0x44, 0xd1, + 0xb1, 0x74, 0x1f, 0xeb, 0x70, 0x09, 0xdb, 0x12, 0x27, 0x89, 0xfa, 0x32, 0xe6, 0xb3, 0xd7, 0xee, + 0x1e, 0xf4, 0x95, 0x2b, 0x48, 0x4c, 0x3f, 0x09, 0x53, 0xc3, 0x7c, 0xda, 0x5d, 0xea, 0xca, 0x9b, + 0xf8, 0xbb, 0xd9, 0xea, 0xb4, 0x06, 0x2d, 0xe5, 0x16, 0xb6, 0x4a, 0x6b, 0xed, 0x77, 0xea, 0x8d, + 0x96, 0xb2, 0x85, 0x89, 0x4e, 0xaf, 0xf1, 0x4c, 0xef, 0xed, 0x2b, 0x6f, 0xb2, 0x8b, 0xa0, 0xf4, + 0xba, 0x7a, 0xf3, 0x60, 0xbf, 0xd3, 0x6e, 0xd4, 0x07, 0x2d, 0xfd, 0x59, 0xeb, 0x0b, 0x45, 0xc5, + 0x6e, 0xdf, 0xd7, 0x5a, 0xba, 0xc8, 0xeb, 0x36, 0x53, 0xa0, 0xb2, 0x73, 0xf0, 0xe3, 0x1f, 0x7f, + 0xa1, 0x8b, 0x76, 0xbf, 0x85, 0xd5, 0x4a, 0x28, 0xf4, 0x83, 0x67, 0xca, 0xdd, 0x39, 0x50, 0xff, + 0x99, 0xf2, 0x36, 0xf6, 0x5b, 0x34, 0x10, 0xca, 0x3d, 0x24, 0xd0, 0x5a, 0x8d, 0x03, 0xad, 0xdf, + 0x7e, 0xde, 0xd2, 0x1b, 0x83, 0x96, 0xf2, 0x0e, 0x75, 0x54, 0xbb, 0xfb, 0x4c, 0xb9, 0x8f, 0x2d, + 0xc1, 0x5f, 0x7c, 0x78, 0xde, 0x65, 0x0c, 0xaa, 0x09, 0x2d, 0xc1, 0xde, 0x43, 0x92, 0x6d, 0xad, + 0x57, 0x6f, 0x36, 0xea, 0xfd, 0x81, 0xf2, 0x3e, 0x76, 0x43, 0x7f, 0xbf, 0xd3, 0x1e, 0x28, 0x0f, + 0xb0, 0xad, 0x4f, 0xeb, 0x83, 0xdd, 0x96, 0xa6, 0x3c, 0xc4, 0x91, 0x1e, 0xb4, 0xf7, 0x5a, 0xba, + 0xe8, 0xf6, 0x47, 0x58, 0xc6, 0x4e, 0xbb, 0xd3, 0x51, 0x1e, 0xd3, 0x59, 0x69, 0x5d, 0x1b, 0xb4, + 0x69, 0xac, 0x3f, 0xc2, 0x0c, 0xea, 0xfb, 0xfb, 0x9d, 0x2f, 0x94, 0x8f, 0xb1, 0x81, 0x7b, 0x07, + 0x9d, 0x41, 0x5b, 0x3f, 0xd8, 0x6f, 0xd6, 0x07, 0x2d, 0xe5, 0x13, 0x9a, 0x08, 0xbd, 0xfe, 0xa0, + 0xb9, 0xd7, 0x51, 0x3e, 0xa5, 0x3c, 0x69, 0x1a, 0x36, 0x3a, 0xbd, 0x6e, 0x4b, 0x79, 0xa2, 0xfe, + 0x1a, 0x14, 0x23, 0xeb, 0x18, 0xb3, 0x69, 0x77, 0xbb, 0x2d, 0x4d, 0x59, 0xc1, 0xa2, 0x3a, 0xad, + 0x9d, 0x81, 0x92, 0xa1, 0x83, 0xe3, 0xf6, 0xd3, 0xdd, 0x81, 0xb2, 0x8a, 0x3f, 0x7b, 0x07, 0xd8, + 0x6b, 0x59, 0x6a, 0x6e, 0x6b, 0xaf, 0xad, 0xe4, 0xf0, 0x57, 0xbd, 0x3b, 0x68, 0x2b, 0x79, 0x9a, + 0x37, 0xed, 0xee, 0xd3, 0x4e, 0x4b, 0x59, 0x43, 0xe8, 0x5e, 0x5d, 0x7b, 0xa6, 0x14, 0x78, 0xa6, + 0xcd, 0xd6, 0xe7, 0x4a, 0x91, 0xad, 0xc1, 0x6a, 0xe7, 0x91, 0x52, 0x42, 0x50, 0xb3, 0xd5, 0x3c, + 0xd8, 0x57, 0x40, 0xbd, 0x07, 0x85, 0xfa, 0xe1, 0xe1, 0x9e, 0x67, 0xd2, 0x59, 0xf5, 0xce, 0x41, + 0xa7, 0xc3, 0xd7, 0xd1, 0x76, 0x6f, 0x30, 0xe8, 0xed, 0x29, 0x19, 0x9c, 0xb9, 0x83, 0xde, 0xbe, + 0xb2, 0xaa, 0xb6, 0xa1, 0x18, 0xed, 0xc8, 0xd2, 0xe5, 0xbc, 0x22, 0xe4, 0xf6, 0xb5, 0xd6, 0x73, + 0x1e, 0xed, 0xd0, 0x6d, 0x7d, 0x8e, 0xd5, 0xc4, 0x5f, 0x98, 0x51, 0x16, 0x0b, 0xe2, 0xb7, 0xe8, + 0xe8, 0x76, 0x5e, 0xa7, 0xdd, 0x6d, 0xd5, 0x35, 0x25, 0xaf, 0x7e, 0x9c, 0x3a, 0x48, 0x16, 0xc2, + 0x0b, 0x8b, 0xaf, 0xb7, 0x45, 0xf1, 0xed, 0xa7, 0xdd, 0x9e, 0xd6, 0xe2, 0xd7, 0xfd, 0x44, 0x47, + 0xae, 0xaa, 0xef, 0x42, 0x29, 0x16, 0xbc, 0x38, 0xb1, 0x1a, 0x5a, 0xaf, 0xdf, 0xe7, 0xfd, 0xbe, + 0x82, 0x69, 0xea, 0x1b, 0x9e, 0xce, 0xa8, 0x7d, 0xd8, 0x8c, 0x64, 0x3e, 0xdd, 0x84, 0x20, 0x13, + 0xe8, 0x22, 0xe4, 0x3b, 0xd6, 0x4b, 0xcb, 0x89, 0x42, 0xfa, 0x29, 0x81, 0xd0, 0xde, 0xf0, 0xcb, + 0x76, 0x7c, 0x23, 0x9b, 0x12, 0xa8, 0xe4, 0x75, 0xa5, 0x4b, 0xe1, 0x74, 0x95, 0xe4, 0xb7, 0x33, + 0x50, 0x8c, 0x77, 0x92, 0x3b, 0xb0, 0x3a, 0xe8, 0x8b, 0x83, 0xa8, 0x8b, 0x0f, 0x92, 0x37, 0x30, + 0x06, 0xd1, 0x2f, 0x6d, 0x75, 0xd0, 0x67, 0xef, 0xc1, 0x1a, 0xbf, 0xc3, 0x2a, 0x9c, 0x4a, 0x17, + 0xd3, 0xbb, 0xd3, 0x80, 0x70, 0x9a, 0xa0, 0x61, 0x1f, 0x43, 0x29, 0xae, 0xad, 0xf0, 0xdc, 0x5c, + 0x49, 0x33, 0xc4, 0x68, 0x2d, 0xa1, 0x54, 0x3b, 0x50, 0x4d, 0x67, 0xc8, 0x6e, 0x02, 0xf0, 0x2c, + 0x25, 0x57, 0xa2, 0x04, 0x61, 0xd7, 0x20, 0xba, 0x5a, 0xdb, 0xa4, 0x8a, 0xad, 0xc7, 0x57, 0x6d, + 0x9b, 0xea, 0xdf, 0xce, 0x02, 0x24, 0xba, 0x28, 0x76, 0x44, 0xec, 0x8f, 0xca, 0x8b, 0x18, 0x84, + 0xeb, 0x50, 0x72, 0x3c, 0xc3, 0x94, 0x9f, 0xc0, 0x28, 0x22, 0x80, 0x86, 0x46, 0xbe, 0x66, 0x56, + 0xe2, 0x01, 0x40, 0xec, 0x32, 0xac, 0x8d, 0x3d, 0x7f, 0x62, 0x84, 0xe2, 0xfe, 0x86, 0x48, 0xe1, + 0x96, 0xc2, 0xcf, 0xc5, 0x51, 0x23, 0x77, 0xe9, 0x0a, 0x07, 0x8e, 0x41, 0x45, 0x00, 0x3b, 0x08, + 0xc3, 0x2d, 0xc1, 0x72, 0x47, 0x8e, 0x17, 0x58, 0xa6, 0x3e, 0xe4, 0x31, 0x55, 0x15, 0x0d, 0x22, + 0xd0, 0xf6, 0x19, 0x6f, 0xad, 0x3f, 0xb1, 0x5d, 0x23, 0x14, 0xa7, 0x45, 0xd4, 0xda, 0x08, 0x82, + 0xd5, 0xfd, 0x32, 0xf0, 0x84, 0x7b, 0x8a, 0x1f, 0xb1, 0x17, 0x11, 0x40, 0xd5, 0x7d, 0x03, 0xc0, + 0x0a, 0x46, 0xc6, 0x94, 0x67, 0x5e, 0xa2, 0xcc, 0x4b, 0x02, 0xb2, 0x7d, 0xc6, 0x3a, 0x50, 0x1d, + 0x0c, 0x71, 0x0b, 0xf4, 0x9a, 0x46, 0x68, 0x34, 0x3c, 0x47, 0x38, 0x8e, 0xee, 0xcc, 0x2b, 0xed, + 0x0f, 0xd2, 0x64, 0x3c, 0x16, 0x60, 0x8e, 0xf7, 0x5a, 0x1d, 0x2e, 0x2c, 0x21, 0xfb, 0x46, 0x41, + 0x91, 0x4e, 0x34, 0x3a, 0xf5, 0x30, 0xa4, 0x2b, 0x53, 0xf1, 0x6e, 0x9f, 0x89, 0x2e, 0x7e, 0xf0, + 0x8d, 0xfe, 0x3a, 0x85, 0x3d, 0x89, 0x98, 0x5c, 0x31, 0x48, 0x71, 0xac, 0xed, 0x5d, 0xd8, 0x40, + 0xe4, 0xd8, 0xb6, 0x1c, 0x53, 0x90, 0xf0, 0x1b, 0x3f, 0xeb, 0x23, 0xcf, 0xd9, 0x41, 0x28, 0xd1, + 0xa9, 0x7f, 0x2b, 0x0f, 0x90, 0xd8, 0x79, 0xa9, 0x70, 0x84, 0x4c, 0x3a, 0x1c, 0xe1, 0x11, 0x5c, + 0x16, 0xf7, 0xc1, 0xe2, 0x33, 0x7d, 0xdb, 0xd5, 0x87, 0x46, 0x14, 0xf9, 0xc1, 0x04, 0x96, 0x1f, + 0xeb, 0xb7, 0xdd, 0x6d, 0x03, 0xb5, 0xc6, 0x0d, 0x99, 0x27, 0x3c, 0x9b, 0xa6, 0x5d, 0xc2, 0xb2, + 0x2e, 0x92, 0xb0, 0x0f, 0xce, 0xa6, 0xec, 0x03, 0xb8, 0xe4, 0x5b, 0x63, 0xdf, 0x0a, 0x8e, 0xf4, + 0x30, 0x90, 0x0b, 0xe3, 0x01, 0x96, 0x9b, 0x02, 0x39, 0x08, 0xe2, 0xb2, 0x3e, 0x80, 0x4b, 0xc2, + 0x02, 0x9c, 0xab, 0x1e, 0x7f, 0x38, 0x60, 0x93, 0x23, 0xe5, 0xda, 0x51, 0x34, 0x2d, 0x19, 0xbf, + 0xd1, 0x43, 0x32, 0x45, 0xad, 0xc4, 0x0d, 0x5d, 0x71, 0xbd, 0x9a, 0x2c, 0x58, 0x71, 0x56, 0xcb, + 0x13, 0x4c, 0x85, 0x1c, 0x8a, 0x53, 0x3a, 0x57, 0xac, 0x3e, 0xaa, 0x3e, 0xa0, 0x87, 0x72, 0xe8, + 0xba, 0xbb, 0x67, 0x5a, 0x1a, 0xe1, 0xd8, 0xfb, 0x70, 0x41, 0x6e, 0x76, 0xf4, 0xd6, 0x43, 0x99, + 0x2a, 0xa2, 0x24, 0x0d, 0xd5, 0xf8, 0xab, 0x0f, 0xef, 0x02, 0x93, 0x6a, 0x1e, 0x51, 0x57, 0x88, + 0x7a, 0x23, 0xae, 0xb6, 0x20, 0x7e, 0x1b, 0xa8, 0x8a, 0xfc, 0x18, 0x67, 0x7d, 0xd1, 0xdc, 0x43, + 0x24, 0x9d, 0xe7, 0x7c, 0x00, 0x97, 0x92, 0xd6, 0xe9, 0x46, 0xa8, 0x87, 0x47, 0x96, 0x6e, 0xb9, + 0x26, 0x5d, 0xe2, 0x2b, 0x6a, 0x9b, 0x71, 0x43, 0xeb, 0xe1, 0xe0, 0xc8, 0x42, 0x83, 0x4d, 0x72, + 0xe3, 0x6d, 0xbc, 0xda, 0x8d, 0xf7, 0x09, 0xd4, 0x52, 0x31, 0x0a, 0x72, 0x77, 0xf3, 0x4b, 0xb0, + 0x17, 0xe5, 0xc8, 0x84, 0xb8, 0xc7, 0xef, 0xc3, 0xe6, 0x91, 0x11, 0xe8, 0x29, 0x5e, 0xf2, 0x2e, + 0x16, 0xb5, 0x8d, 0x23, 0x23, 0xd8, 0x97, 0x78, 0xd4, 0xdf, 0xcd, 0x40, 0x35, 0x6d, 0xf9, 0xf2, + 0x4b, 0x50, 0xce, 0x6c, 0xe2, 0xf2, 0x70, 0xa4, 0xbc, 0x16, 0x25, 0x71, 0x2d, 0x4c, 0x8f, 0x75, + 0x9e, 0x8a, 0xd6, 0xc2, 0xf4, 0xb8, 0x41, 0x69, 0xf6, 0x0e, 0x14, 0xa6, 0xc7, 0x5c, 0x38, 0x9c, + 0x37, 0xfb, 0xd6, 0xa6, 0x3c, 0x96, 0xfc, 0x1d, 0x28, 0xcc, 0x04, 0x69, 0xee, 0x3c, 0xd2, 0x19, + 0x91, 0xaa, 0x7f, 0xb6, 0x0a, 0x15, 0xd9, 0xe7, 0xf3, 0x75, 0x42, 0x17, 0xbe, 0x51, 0xc8, 0xc9, + 0x16, 0x85, 0x85, 0xea, 0x14, 0xb8, 0x8e, 0xfd, 0xc4, 0xe3, 0x16, 0xe0, 0xc8, 0x08, 0xea, 0xb3, + 0xd0, 0x6b, 0x78, 0xfc, 0xb8, 0xd4, 0x73, 0xa2, 0x80, 0x76, 0xbe, 0x32, 0x50, 0x26, 0x88, 0x58, + 0xf6, 0x0f, 0xc4, 0x7d, 0x19, 0xba, 0x21, 0x47, 0xe1, 0x4e, 0xf9, 0x85, 0xf9, 0x52, 0x89, 0x2e, + 0xc8, 0x51, 0x24, 0xd3, 0x23, 0xd8, 0x48, 0x6e, 0x27, 0x44, 0x11, 0x52, 0xf3, 0x2c, 0xeb, 0xf1, + 0xd5, 0x04, 0x71, 0x25, 0x7e, 0xdd, 0x0e, 0x74, 0xcf, 0x31, 0xa3, 0x6b, 0x50, 0x85, 0xc8, 0x89, + 0xdf, 0x73, 0x4c, 0x71, 0x49, 0x92, 0xd3, 0xb8, 0xd6, 0x49, 0x44, 0x13, 0x3b, 0xfa, 0xbb, 0xd6, + 0x89, 0xb8, 0x0e, 0xf5, 0x17, 0x19, 0xd8, 0x5c, 0xf0, 0xd1, 0xa0, 0xe4, 0x4c, 0x1e, 0x68, 0xc2, + 0x9f, 0x68, 0x63, 0x4c, 0x8c, 0x70, 0x74, 0xa4, 0x4f, 0x7d, 0x6b, 0x6c, 0x9f, 0x46, 0xaf, 0x4c, + 0x11, 0x6c, 0x9f, 0x40, 0x14, 0x35, 0x46, 0x07, 0x4b, 0xdc, 0x77, 0xce, 0x05, 0x1f, 0x3f, 0x4c, + 0xea, 0x90, 0xd3, 0x3c, 0x8a, 0x28, 0xcd, 0x9d, 0x13, 0x51, 0x7a, 0x0d, 0x4a, 0xae, 0x17, 0xea, + 0x9e, 0xab, 0x4f, 0x8f, 0xc5, 0x1b, 0x0a, 0x05, 0xd7, 0x0b, 0x7b, 0xee, 0xfe, 0x31, 0xbb, 0x07, + 0xca, 0x2c, 0xb0, 0xf4, 0xa1, 0xe3, 0x79, 0x93, 0xc8, 0x50, 0xe2, 0xb2, 0xa3, 0x3a, 0x0b, 0xac, + 0x6d, 0x04, 0xf3, 0xfa, 0xab, 0x37, 0x60, 0xad, 0x1d, 0x7b, 0x94, 0xe2, 0xe0, 0xa9, 0xac, 0x78, + 0x90, 0xc5, 0x83, 0x52, 0x83, 0x1e, 0x77, 0xd9, 0x33, 0xa6, 0xec, 0x3e, 0x64, 0x27, 0xc6, 0x54, + 0x9c, 0x61, 0xd5, 0xe2, 0x83, 0x3e, 0x8e, 0x7d, 0xb0, 0x67, 0x4c, 0xf9, 0x76, 0x83, 0x44, 0xd7, + 0x3e, 0x81, 0x62, 0x04, 0xf8, 0x46, 0x1b, 0xcb, 0xbf, 0x5b, 0x85, 0x52, 0x53, 0xf6, 0x43, 0xa3, + 0x71, 0x1d, 0xfa, 0x33, 0x17, 0xb5, 0xb4, 0xe8, 0x99, 0x8a, 0x91, 0xe1, 0x0e, 0x04, 0x28, 0x9a, + 0xd0, 0xab, 0xaf, 0x98, 0xd0, 0x37, 0x00, 0x7c, 0x72, 0xa8, 0x90, 0x4f, 0x25, 0x1b, 0x07, 0xf2, + 0xb6, 0xcd, 0xb6, 0x79, 0xba, 0x3c, 0x52, 0x27, 0xf7, 0xf5, 0x23, 0x75, 0xf2, 0x4b, 0x23, 0x75, + 0xee, 0x26, 0x9b, 0x0a, 0x4e, 0x6c, 0x2c, 0xb8, 0xc4, 0xb7, 0xb6, 0x69, 0x7c, 0x27, 0x08, 0x4b, + 0xff, 0x0e, 0x54, 0xa3, 0xd6, 0x89, 0xfc, 0x20, 0x75, 0x0d, 0x49, 0xe0, 0xb8, 0xe3, 0x7a, 0x3d, + 0x94, 0x93, 0xe9, 0x85, 0x5a, 0x7e, 0x4d, 0x08, 0xd3, 0xdf, 0xc9, 0x00, 0x13, 0x0e, 0x80, 0x9d, + 0x99, 0xe3, 0x0c, 0xac, 0x53, 0x92, 0x07, 0xf7, 0x61, 0x53, 0xf8, 0xd5, 0xa5, 0x00, 0x40, 0x71, + 0xea, 0xcb, 0x11, 0xc9, 0xa9, 0xef, 0xb2, 0x9b, 0xa2, 0xab, 0x4b, 0x6f, 0x8a, 0x2e, 0xbf, 0x81, + 0x7a, 0x0b, 0xca, 0xf2, 0x3d, 0x4b, 0xae, 0x84, 0x81, 0x91, 0x5c, 0xb1, 0xfc, 0x0f, 0xab, 0x00, + 0x89, 0x93, 0xe2, 0x17, 0x1d, 0x66, 0xb5, 0x64, 0x48, 0xb2, 0xcb, 0x86, 0xe4, 0x1e, 0x28, 0x32, + 0x9d, 0x74, 0xe1, 0xb7, 0x9a, 0x10, 0x46, 0xca, 0x8d, 0x1d, 0xc8, 0x97, 0x32, 0x29, 0xa6, 0x52, + 0x84, 0x92, 0x88, 0x80, 0x4b, 0x92, 0xbc, 0x62, 0xed, 0x15, 0xed, 0x80, 0x4b, 0x62, 0xf6, 0x19, + 0x5c, 0x8d, 0x39, 0xf5, 0x13, 0x3b, 0x3c, 0xf2, 0x66, 0xa1, 0x58, 0xa7, 0x81, 0x90, 0x4d, 0x97, + 0xa3, 0x9c, 0x5e, 0x70, 0x34, 0x5f, 0xaf, 0x01, 0xaa, 0xe7, 0xe3, 0x99, 0xe3, 0xe8, 0xa1, 0x75, + 0x1a, 0x8a, 0x97, 0x2f, 0x6a, 0x29, 0xff, 0x8e, 0x34, 0xbc, 0x5a, 0x71, 0x2c, 0x12, 0xea, 0x9f, + 0x65, 0x21, 0xff, 0xa3, 0x99, 0xe5, 0x9f, 0xb1, 0x4f, 0xa0, 0x14, 0x84, 0x93, 0x50, 0x3e, 0xe0, + 0xbd, 0xca, 0x33, 0x20, 0x3c, 0x9d, 0xcf, 0x5a, 0x13, 0xcb, 0x0d, 0xb9, 0xe3, 0x13, 0x69, 0x69, + 0xdb, 0xb9, 0x08, 0xf9, 0x20, 0xb4, 0xa6, 0x81, 0x08, 0x90, 0xe4, 0x09, 0xb6, 0x05, 0x79, 0xd7, + 0x33, 0xad, 0x20, 0x1d, 0x06, 0xd9, 0x45, 0x3d, 0x83, 0x23, 0x98, 0x0a, 0x6b, 0xf1, 0x88, 0x2f, + 0x1c, 0xb2, 0x72, 0x0c, 0x5d, 0x6c, 0xb1, 0x0c, 0xd3, 0x76, 0x0f, 0xa3, 0x0b, 0xd4, 0x71, 0x1a, + 0x37, 0x54, 0x52, 0xeb, 0x8d, 0xc3, 0xe8, 0x35, 0x03, 0x91, 0x64, 0x5b, 0x50, 0xc6, 0x9f, 0x2f, + 0x7c, 0x3b, 0xb4, 0xfa, 0x8f, 0x23, 0x99, 0x2e, 0x81, 0x50, 0x29, 0x37, 0xad, 0xd0, 0x1a, 0x85, + 0xfd, 0xaf, 0x44, 0x6c, 0x23, 0x85, 0xc0, 0x45, 0x10, 0xf6, 0x1d, 0x60, 0x43, 0x63, 0x74, 0x7c, + 0xe8, 0x53, 0x10, 0xc1, 0x57, 0x33, 0xcb, 0xb7, 0xad, 0x28, 0x96, 0xb1, 0x2c, 0x75, 0x8a, 0xb6, + 0x99, 0x90, 0xfd, 0x88, 0x53, 0xa1, 0x39, 0x31, 0x31, 0x4e, 0x9b, 0xde, 0x54, 0x84, 0x6f, 0x89, + 0x94, 0x6a, 0xc2, 0x7a, 0xaa, 0x0b, 0x17, 0xfc, 0x43, 0xfd, 0x56, 0xa7, 0xd5, 0x18, 0x70, 0xc3, + 0x52, 0x38, 0x25, 0x56, 0x65, 0xa7, 0x46, 0x56, 0xf2, 0x76, 0xe4, 0x24, 0xeb, 0x33, 0x4f, 0xbe, + 0x92, 0x96, 0xf6, 0xb4, 0xa5, 0xac, 0xa9, 0x7f, 0x77, 0x15, 0x36, 0x07, 0xbe, 0xe1, 0x06, 0x06, + 0xd7, 0x45, 0xdc, 0xd0, 0xf7, 0x1c, 0xf6, 0x1d, 0x28, 0x86, 0x23, 0x47, 0x1e, 0xda, 0x5b, 0x91, + 0x20, 0x99, 0x23, 0x7d, 0x30, 0x18, 0x71, 0xcf, 0x76, 0x21, 0xe4, 0x3f, 0xd8, 0xfb, 0x90, 0x1f, + 0x5a, 0x87, 0xb6, 0x2b, 0x64, 0xe9, 0xa5, 0x79, 0xc6, 0x6d, 0x44, 0xee, 0xae, 0x68, 0x9c, 0x8a, + 0x7d, 0x00, 0x6b, 0x23, 0x6f, 0x12, 0x6d, 0x5d, 0xc9, 0x05, 0x3d, 0xa9, 0x20, 0xc4, 0xee, 0xae, + 0x68, 0x82, 0x8e, 0x7d, 0x02, 0x45, 0xdf, 0x73, 0x1c, 0xec, 0x49, 0xb1, 0xa9, 0xd5, 0xe6, 0x79, + 0x34, 0x81, 0xdf, 0x5d, 0xd1, 0x62, 0x5a, 0xf5, 0x01, 0x14, 0x44, 0x65, 0xb1, 0x03, 0xb6, 0x5b, + 0x4f, 0xdb, 0xa2, 0x23, 0x1b, 0xbd, 0xbd, 0xbd, 0xf6, 0x80, 0xdf, 0x3e, 0xd6, 0x7a, 0x9d, 0xce, + 0x76, 0xbd, 0xf1, 0x4c, 0x59, 0xdd, 0x2e, 0xc2, 0x1a, 0xf7, 0x61, 0xaa, 0xbf, 0x9e, 0x81, 0x8d, + 0xb9, 0x06, 0xb0, 0x27, 0x90, 0x9b, 0xa0, 0x6e, 0xcc, 0xbb, 0xe7, 0xce, 0xd2, 0x56, 0x4a, 0x69, + 0xae, 0x31, 0x23, 0x87, 0xfa, 0x19, 0x54, 0xd3, 0x70, 0xc9, 0x07, 0xb1, 0x0e, 0x25, 0xad, 0x55, + 0x6f, 0xea, 0xbd, 0x2e, 0x5a, 0xfe, 0xac, 0x0a, 0x40, 0xc9, 0x17, 0x5a, 0x9b, 0xdc, 0x06, 0xbf, + 0x02, 0xca, 0x7c, 0xc7, 0xb0, 0xa7, 0x68, 0xfd, 0x4c, 0xa6, 0x8e, 0x45, 0x4a, 0xa6, 0x34, 0x64, + 0x37, 0x97, 0xf4, 0xa4, 0x20, 0xe3, 0xf1, 0x2c, 0xa3, 0x54, 0x5a, 0xfd, 0x55, 0x60, 0x8b, 0x3d, + 0xf8, 0x8b, 0xcb, 0xfe, 0x7f, 0x65, 0x20, 0xb7, 0xef, 0x18, 0x2e, 0xbb, 0x0d, 0x79, 0x7a, 0x35, + 0x47, 0x48, 0x64, 0x79, 0x7d, 0xe0, 0xb4, 0x20, 0x1c, 0x7b, 0x17, 0xb2, 0xe1, 0x28, 0xba, 0xf4, + 0x7c, 0xe5, 0x9c, 0xc9, 0xb7, 0xbb, 0xa2, 0x21, 0x15, 0xbb, 0x07, 0x59, 0xd3, 0x8c, 0x2e, 0x0a, + 0x08, 0xaf, 0x04, 0xda, 0xa4, 0x4d, 0x6b, 0x6c, 0xbb, 0xb6, 0x78, 0xe5, 0x07, 0x49, 0xd8, 0x5b, + 0x90, 0x35, 0x47, 0x4e, 0xfa, 0xd6, 0x07, 0xb7, 0x5e, 0xe3, 0x0c, 0xcd, 0x91, 0x83, 0x3a, 0x5c, + 0xe8, 0x9f, 0xe9, 0xfe, 0xcc, 0xa5, 0xc8, 0xc7, 0x40, 0xd8, 0x55, 0x65, 0xd4, 0x4b, 0x66, 0x14, + 0x3e, 0x19, 0x88, 0xdb, 0x93, 0x53, 0xdf, 0x9a, 0x1a, 0x7e, 0x6c, 0x51, 0xd9, 0xc1, 0x3e, 0x07, + 0x6c, 0xaf, 0x01, 0x3d, 0x46, 0xaa, 0xbe, 0x47, 0x4f, 0xba, 0xa0, 0x6a, 0xae, 0x46, 0xbf, 0x96, + 0xbc, 0x5b, 0x27, 0x30, 0xea, 0x5f, 0x66, 0xa1, 0x2c, 0xd5, 0x87, 0x7d, 0x04, 0x45, 0x33, 0xbd, + 0x10, 0xaf, 0x2e, 0x54, 0xfa, 0x41, 0x33, 0x5a, 0x82, 0xa6, 0x98, 0xde, 0x74, 0x6c, 0x12, 0xea, + 0x2f, 0x0d, 0xdf, 0xe6, 0x0f, 0x79, 0xad, 0xca, 0xe7, 0x17, 0x7d, 0x2b, 0x7c, 0x1e, 0x61, 0x76, + 0x57, 0xb4, 0x4a, 0x20, 0xa5, 0xc9, 0x7e, 0x10, 0x4d, 0xca, 0xa6, 0x1e, 0x44, 0xe3, 0xc0, 0xdd, + 0x15, 0x2d, 0xc2, 0x23, 0xa9, 0x75, 0x6a, 0x8d, 0x66, 0x61, 0x64, 0x3f, 0xac, 0x47, 0x0d, 0x22, + 0x20, 0xbd, 0xca, 0xc8, 0x7f, 0xb2, 0x47, 0x28, 0x3f, 0x0d, 0xc7, 0xf1, 0x48, 0xfd, 0xca, 0xcb, + 0xa7, 0x09, 0xcd, 0x18, 0xce, 0x5f, 0x81, 0x8c, 0x52, 0xec, 0x2e, 0xe4, 0xbd, 0xf0, 0xc8, 0x8a, + 0xb4, 0xf2, 0xe8, 0x71, 0x18, 0x04, 0x35, 0x1b, 0x1d, 0x9c, 0x29, 0x84, 0x56, 0x7f, 0x2f, 0x03, + 0x05, 0xd1, 0x03, 0x6c, 0x13, 0xd6, 0xfb, 0xad, 0x81, 0xfe, 0xbc, 0xae, 0xb5, 0xeb, 0xdb, 0x9d, + 0x96, 0xb8, 0xac, 0xf2, 0x54, 0xab, 0x77, 0x85, 0x9c, 0xd4, 0x5a, 0xcf, 0x7b, 0xcf, 0x5a, 0xdc, + 0xb1, 0xd7, 0x6c, 0x75, 0xbf, 0x50, 0xb2, 0xdc, 0xb9, 0xdd, 0xda, 0xaf, 0x6b, 0x28, 0x25, 0xcb, + 0x50, 0x68, 0x7d, 0xde, 0x6a, 0x1c, 0x90, 0x98, 0xac, 0x02, 0x34, 0x5b, 0xf5, 0x4e, 0xa7, 0xd7, + 0x40, 0xb1, 0xb9, 0xc6, 0x18, 0x54, 0x1b, 0x5a, 0xab, 0x3e, 0x68, 0xe9, 0xf5, 0x46, 0xa3, 0x77, + 0xd0, 0x1d, 0x28, 0x05, 0x2c, 0xb1, 0xde, 0x19, 0xb4, 0xb4, 0x18, 0x44, 0x0f, 0x76, 0x35, 0xb5, + 0xde, 0x7e, 0x0c, 0x29, 0x6d, 0x97, 0xd0, 0x96, 0xa3, 0xb1, 0x52, 0xff, 0x78, 0x13, 0xaa, 0xe9, + 0xa9, 0xc9, 0x3e, 0x85, 0xa2, 0x69, 0xa6, 0xc6, 0xf8, 0xc6, 0xb2, 0x29, 0xfc, 0xa0, 0x69, 0x46, + 0xc3, 0xcc, 0x7f, 0xb0, 0x37, 0xa3, 0x85, 0xb4, 0xba, 0xb0, 0x90, 0xa2, 0x65, 0xf4, 0x7d, 0xd8, + 0x10, 0x8f, 0xab, 0x98, 0x46, 0x68, 0x0c, 0x8d, 0xc0, 0x4a, 0xaf, 0x92, 0x06, 0x21, 0x9b, 0x02, + 0xb7, 0xbb, 0xa2, 0x55, 0x47, 0x29, 0x08, 0xfb, 0x2e, 0x54, 0x0d, 0x32, 0xd7, 0x63, 0xfe, 0x9c, + 0xac, 0x58, 0xd6, 0x11, 0x27, 0xb1, 0xaf, 0x1b, 0x32, 0x00, 0x27, 0xa2, 0xe9, 0x7b, 0xd3, 0x84, + 0x39, 0x9f, 0x3a, 0x48, 0xf3, 0xbd, 0xa9, 0xc4, 0x5b, 0x31, 0xa5, 0x34, 0xfb, 0x04, 0x2a, 0xa2, + 0xe6, 0x89, 0xcb, 0x22, 0x5e, 0xb2, 0xbc, 0xda, 0xa4, 0x28, 0xee, 0xae, 0x68, 0xe5, 0x51, 0x92, + 0x64, 0x8f, 0x51, 0x3b, 0x4c, 0xd4, 0xea, 0x82, 0x3c, 0xd7, 0xa8, 0xb6, 0x11, 0x17, 0x18, 0x71, + 0x8a, 0x7d, 0x00, 0x40, 0xf5, 0xe4, 0x3c, 0xc5, 0x54, 0x60, 0x8b, 0xef, 0x4d, 0x23, 0x96, 0x92, + 0x19, 0x25, 0xa4, 0xea, 0x71, 0x87, 0x53, 0x69, 0xb1, 0x7a, 0xe4, 0x74, 0x4a, 0xaa, 0xc7, 0x7d, + 0x55, 0x71, 0xf5, 0x38, 0x1b, 0x2c, 0x54, 0x2f, 0xe2, 0xe2, 0xd5, 0xe3, 0x4c, 0x51, 0xf5, 0x38, + 0x4f, 0x79, 0xbe, 0x7a, 0x11, 0x0b, 0x55, 0x8f, 0x73, 0x7c, 0x77, 0xc1, 0x1e, 0xa8, 0x9c, 0x6b, + 0x0f, 0xe0, 0xb0, 0xa5, 0x2d, 0x82, 0xef, 0x42, 0x35, 0x38, 0xf2, 0x4e, 0x24, 0x01, 0xb2, 0x2e, + 0x73, 0xf7, 0x8f, 0xbc, 0x13, 0x59, 0x82, 0xac, 0x07, 0x32, 0x00, 0x6b, 0xcb, 0x9b, 0x48, 0x87, + 0x5e, 0x55, 0xb9, 0xb6, 0xd4, 0xc2, 0xe7, 0xb6, 0x75, 0x82, 0xb5, 0x35, 0xa2, 0x04, 0x76, 0x4a, + 0xe2, 0xbe, 0x09, 0x84, 0x43, 0x26, 0x15, 0x98, 0x21, 0x4a, 0x82, 0xd8, 0x91, 0x13, 0xe0, 0xdc, + 0x9a, 0xb9, 0x32, 0x9b, 0x22, 0xcf, 0xad, 0x03, 0x37, 0xc5, 0x58, 0xe1, 0xa4, 0x82, 0x35, 0x59, + 0x15, 0x81, 0xf5, 0xd5, 0xcc, 0x72, 0x47, 0x96, 0x08, 0xfb, 0x4a, 0xad, 0x8a, 0xbe, 0xc0, 0x25, + 0xab, 0x22, 0x82, 0xc4, 0xf3, 0x3a, 0x66, 0x67, 0xf3, 0xf3, 0x5a, 0x62, 0xa6, 0x79, 0x1d, 0xb3, + 0xc6, 0x0b, 0x2a, 0xe6, 0xbd, 0xb0, 0xb0, 0xa0, 0x24, 0x66, 0xbe, 0xa0, 0x62, 0xee, 0xc7, 0x20, + 0x66, 0x13, 0xef, 0xdc, 0x54, 0x70, 0x18, 0xaf, 0xb5, 0xe8, 0x5d, 0x18, 0xc5, 0x29, 0x9c, 0xab, + 0xbe, 0x85, 0xf6, 0x87, 0x98, 0x0a, 0x97, 0xe4, 0xb9, 0xaa, 0x11, 0x26, 0x5e, 0x4a, 0x7e, 0x92, + 0x94, 0x0a, 0x9b, 0xda, 0xa1, 0x5f, 0x33, 0x17, 0x0b, 0xdb, 0xb7, 0x43, 0x3f, 0x29, 0x0c, 0x53, + 0xec, 0x7d, 0xa0, 0x69, 0xc8, 0x59, 0x2c, 0x59, 0x74, 0x63, 0xb7, 0x08, 0x86, 0xa2, 0x29, 0x7e, + 0xe3, 0x64, 0x11, 0x65, 0x8c, 0xcc, 0x51, 0x6d, 0x2c, 0x4f, 0x16, 0x5e, 0x44, 0xa3, 0xd9, 0xc0, + 0xc9, 0xc2, 0x89, 0x1a, 0xe6, 0x88, 0xdd, 0x07, 0xe2, 0x26, 0xfa, 0xc3, 0xd4, 0xe3, 0x63, 0xbe, + 0x37, 0xe5, 0xd4, 0x05, 0x24, 0x40, 0x5a, 0x6c, 0x81, 0xe3, 0xb9, 0x51, 0xc3, 0x8f, 0x52, 0x2d, + 0x40, 0x44, 0x2c, 0x0c, 0x46, 0x71, 0x4a, 0xfd, 0xcd, 0x35, 0x28, 0x08, 0x59, 0xcb, 0x2e, 0xc0, + 0x86, 0x10, 0xf9, 0xcd, 0xfa, 0xa0, 0xbe, 0x5d, 0xef, 0xa3, 0x92, 0xc6, 0xa0, 0xca, 0x65, 0x7e, + 0x0c, 0xcb, 0xe0, 0x3e, 0x40, 0x42, 0x3f, 0x06, 0xad, 0xe2, 0x3e, 0x20, 0x78, 0xf9, 0x23, 0x8f, + 0x59, 0xb6, 0x01, 0x65, 0xce, 0xc8, 0x01, 0x74, 0x77, 0x96, 0xb8, 0x78, 0x3a, 0x2f, 0xb1, 0xf0, + 0x73, 0xae, 0xb5, 0x84, 0x85, 0x03, 0x0a, 0x31, 0x4b, 0x74, 0x10, 0xc6, 0xa0, 0x3a, 0xd0, 0x0e, + 0xba, 0x8d, 0xa4, 0x9c, 0x12, 0xdd, 0x77, 0xe4, 0xd9, 0x3c, 0x6f, 0xb7, 0x5e, 0x28, 0x80, 0x4c, + 0x3c, 0x17, 0x4a, 0x97, 0x51, 0xcd, 0xa4, 0x4c, 0x28, 0x59, 0x61, 0x57, 0xe0, 0x42, 0x7f, 0xb7, + 0xf7, 0x42, 0xe7, 0x4c, 0x71, 0x13, 0xd6, 0xd9, 0x45, 0x50, 0x24, 0x04, 0xcf, 0xbe, 0x8a, 0x45, + 0x12, 0x34, 0x22, 0xec, 0x2b, 0x1b, 0x74, 0x94, 0x8c, 0xb0, 0x01, 0xdf, 0x77, 0x15, 0x6c, 0x0a, + 0x67, 0xed, 0x75, 0x0e, 0xf6, 0xba, 0x7d, 0x65, 0x13, 0x2b, 0x41, 0x10, 0x5e, 0x73, 0x16, 0x67, + 0x93, 0xec, 0xd6, 0x17, 0x68, 0x03, 0x47, 0xd8, 0x8b, 0xba, 0xd6, 0x6d, 0x77, 0x9f, 0xf6, 0x95, + 0x8b, 0x71, 0xce, 0x2d, 0x4d, 0xeb, 0x69, 0x7d, 0xe5, 0x52, 0x0c, 0xe8, 0x0f, 0xea, 0x83, 0x83, + 0xbe, 0x72, 0x39, 0xae, 0xe5, 0xbe, 0xd6, 0x6b, 0xb4, 0xfa, 0xfd, 0x4e, 0xbb, 0x3f, 0x50, 0xae, + 0xb0, 0x4b, 0xb0, 0x99, 0xd4, 0x28, 0x22, 0xae, 0x49, 0x15, 0xd5, 0x9e, 0xb6, 0x06, 0xca, 0xd5, + 0xb8, 0x1a, 0x8d, 0x5e, 0xa7, 0x53, 0xa7, 0x43, 0xd0, 0x6b, 0x48, 0x44, 0xa7, 0xc1, 0xa2, 0x35, + 0xd7, 0xb1, 0x5e, 0x07, 0x5d, 0x19, 0x74, 0x43, 0x9a, 0x1a, 0xfd, 0xd6, 0x8f, 0x0e, 0x5a, 0xdd, + 0x46, 0x4b, 0x79, 0x23, 0x99, 0x1a, 0x31, 0xec, 0x66, 0x3c, 0x35, 0x62, 0xd0, 0xad, 0xb8, 0xcc, + 0x08, 0xd4, 0x57, 0xb6, 0x30, 0x3f, 0x51, 0x8f, 0x6e, 0xb7, 0xd5, 0x18, 0x60, 0x5b, 0xdf, 0x8c, + 0x7b, 0xf1, 0x60, 0xff, 0xa9, 0x56, 0x6f, 0xb6, 0x14, 0x15, 0x21, 0x5a, 0xab, 0x5b, 0xdf, 0x8b, + 0x46, 0xfb, 0xb6, 0x34, 0xda, 0xfb, 0xed, 0x81, 0xa6, 0xdc, 0x89, 0x47, 0x97, 0x92, 0x6f, 0xb1, + 0xeb, 0x70, 0x45, 0x9e, 0x87, 0xfa, 0x8b, 0xf6, 0x60, 0x57, 0x9c, 0xd9, 0xde, 0xe5, 0x67, 0x8f, + 0x84, 0x6c, 0x34, 0x1b, 0xfc, 0x70, 0x9a, 0x78, 0x31, 0x75, 0x6f, 0xbb, 0x42, 0x6f, 0x75, 0x0b, + 0x05, 0x44, 0xfd, 0x21, 0x30, 0xf9, 0xd9, 0x5a, 0x11, 0x3d, 0xcb, 0x20, 0x37, 0xf6, 0xbd, 0x49, + 0xf4, 0x8e, 0x05, 0xfe, 0x46, 0x8b, 0x7a, 0x3a, 0x1b, 0xd2, 0x99, 0x68, 0x72, 0x4f, 0x5d, 0x06, + 0xa9, 0xff, 0x28, 0x03, 0xd5, 0xb4, 0xf2, 0x41, 0x8e, 0xd3, 0xb1, 0xee, 0x7a, 0x21, 0x7f, 0x18, + 0x2c, 0x88, 0x5f, 0x93, 0x1d, 0x77, 0xbd, 0x90, 0x5e, 0x06, 0x23, 0x03, 0x3f, 0xd6, 0x25, 0x78, + 0xae, 0x71, 0x9a, 0xb5, 0xe1, 0x42, 0xea, 0xe5, 0xdf, 0xd4, 0xb3, 0x6c, 0xb5, 0xf8, 0xc5, 0xce, + 0xb9, 0xfa, 0x6b, 0x2c, 0x58, 0x6c, 0x93, 0x78, 0x6d, 0x20, 0x97, 0xbc, 0x36, 0xb0, 0x0b, 0xeb, + 0x29, 0x5d, 0x87, 0xfc, 0x32, 0xe3, 0x74, 0x4d, 0x8b, 0xf6, 0xf8, 0xf5, 0xd5, 0x54, 0xff, 0x61, + 0x06, 0x2a, 0xb2, 0xe6, 0xf3, 0xad, 0x73, 0xa2, 0xf0, 0x12, 0xf1, 0x5b, 0xb7, 0xcd, 0xe8, 0x41, + 0xb0, 0x08, 0xd4, 0xa6, 0x6f, 0x14, 0x70, 0x1f, 0xf4, 0xce, 0x71, 0x3f, 0x6e, 0x8e, 0x0c, 0x62, + 0x37, 0x01, 0xe8, 0x9e, 0xf2, 0xce, 0x33, 0x24, 0x10, 0x77, 0xfb, 0x12, 0x88, 0x7a, 0x0b, 0x4a, + 0x3b, 0xc7, 0x51, 0xb4, 0x8d, 0xfc, 0x3c, 0x5e, 0x89, 0x3f, 0x6e, 0xa0, 0xfe, 0x61, 0x06, 0xaa, + 0xc9, 0x53, 0x42, 0x74, 0x32, 0xcd, 0x5f, 0x8c, 0xe6, 0xd3, 0x61, 0xd5, 0x1c, 0x26, 0x9f, 0x2f, + 0x58, 0x95, 0x3f, 0x5f, 0x70, 0x5b, 0x64, 0x96, 0x95, 0x45, 0x7e, 0x5c, 0x96, 0x78, 0x3a, 0xe1, + 0x31, 0x54, 0xf0, 0xbf, 0x66, 0x8d, 0x2d, 0xdf, 0xb7, 0xcc, 0xf4, 0xfd, 0x83, 0x84, 0x38, 0x45, + 0x44, 0x36, 0x9e, 0x35, 0x16, 0xaa, 0xe6, 0xd2, 0xd7, 0x8e, 0xe8, 0x15, 0xae, 0xff, 0x91, 0x85, + 0xb2, 0xa4, 0x47, 0x7e, 0xad, 0xe9, 0x77, 0x03, 0x4a, 0xc9, 0xdb, 0x3b, 0xe2, 0xbe, 0x7a, 0x0c, + 0x48, 0x8d, 0x55, 0x76, 0x6e, 0xac, 0x6a, 0x50, 0x10, 0x41, 0xba, 0xc2, 0x29, 0x1c, 0x25, 0xd3, + 0xee, 0xd7, 0xfc, 0x6b, 0xce, 0x49, 0x3e, 0x84, 0x8a, 0xe4, 0x3b, 0x0d, 0xc4, 0x9d, 0xee, 0x79, + 0xfa, 0x72, 0xe2, 0x47, 0x0d, 0xd8, 0x25, 0x58, 0x1b, 0x1f, 0xeb, 0xe6, 0x90, 0x5f, 0xe4, 0x2d, + 0x69, 0xf9, 0xf1, 0x71, 0x73, 0x48, 0xa7, 0x48, 0xe3, 0x58, 0x75, 0xe2, 0x1e, 0xad, 0xe2, 0x38, + 0x52, 0x90, 0xee, 0x41, 0x61, 0x7c, 0x2c, 0x5f, 0xc8, 0x5d, 0xe8, 0xf2, 0xb5, 0xf1, 0x31, 0xdd, + 0xe0, 0x7d, 0x08, 0x17, 0xc5, 0xfe, 0x6d, 0x04, 0x3a, 0x7f, 0x1a, 0x84, 0xde, 0x64, 0xe2, 0x8f, + 0xe5, 0x6d, 0x72, 0x5c, 0x3d, 0xe8, 0x13, 0x06, 0x67, 0x9c, 0x0a, 0x15, 0x69, 0x02, 0xf2, 0xc7, + 0xab, 0x4a, 0x5a, 0x0a, 0xc6, 0x9e, 0x40, 0x65, 0x7c, 0xcc, 0x07, 0x74, 0xe0, 0xed, 0x59, 0xe2, + 0x9a, 0xc1, 0xc5, 0xf9, 0xa1, 0xa4, 0xd0, 0x81, 0x14, 0x25, 0xbb, 0x0c, 0x6b, 0x9a, 0x71, 0xd2, + 0xff, 0x51, 0x87, 0x94, 0xc8, 0x92, 0x26, 0x52, 0x3f, 0xcc, 0x15, 0xab, 0xca, 0x86, 0xfa, 0xcf, + 0x33, 0x50, 0x4d, 0x6c, 0x00, 0x5c, 0x84, 0xec, 0xbe, 0xfc, 0xd4, 0x7b, 0x6d, 0xde, 0x4c, 0x40, + 0x92, 0x07, 0x83, 0xb3, 0x29, 0x7f, 0x10, 0x75, 0xd9, 0x83, 0x63, 0xcb, 0x9c, 0xd9, 0xd9, 0xa5, + 0x8f, 0x4c, 0x3f, 0x85, 0xec, 0xe0, 0x6c, 0xca, 0xfd, 0x4d, 0xb8, 0x25, 0x72, 0xdb, 0x94, 0x6f, + 0x86, 0x14, 0x9b, 0xf2, 0xac, 0xf5, 0x05, 0x7f, 0x5f, 0x63, 0x5f, 0x6b, 0xef, 0xd5, 0xb5, 0x2f, + 0x28, 0xec, 0x88, 0x94, 0x86, 0x9d, 0x9e, 0xd6, 0x6a, 0x3f, 0xed, 0x12, 0x20, 0x47, 0xde, 0xa8, + 0xa4, 0x8a, 0x75, 0xd3, 0xdc, 0x39, 0x96, 0xdf, 0x6a, 0xca, 0xa4, 0xde, 0x6a, 0x4a, 0x5f, 0xc9, + 0x5f, 0x9d, 0xbf, 0x92, 0xcf, 0xe2, 0x55, 0x18, 0x2f, 0x69, 0xf6, 0x36, 0xe4, 0xc6, 0xc7, 0xd6, + 0x59, 0xda, 0xd0, 0x4b, 0x2f, 0x20, 0x22, 0x50, 0x7f, 0x96, 0x01, 0x96, 0xaa, 0x08, 0xb7, 0x3d, + 0xbe, 0x6d, 0x5d, 0x3e, 0x85, 0x9a, 0x08, 0xa8, 0xe3, 0x54, 0x92, 0xf7, 0x5c, 0x74, 0xe9, 0x25, + 0x2f, 0x09, 0x34, 0x4d, 0xde, 0x44, 0x63, 0x0f, 0x81, 0x3f, 0xdf, 0x48, 0x91, 0x26, 0xb9, 0x73, + 0xec, 0x44, 0x2d, 0xa1, 0x49, 0xde, 0x6b, 0x94, 0xdf, 0xa1, 0xe4, 0x8e, 0xf7, 0x8d, 0x64, 0xd4, + 0x68, 0xcd, 0xab, 0xbf, 0x93, 0x81, 0x0b, 0xe9, 0x09, 0xf1, 0xf3, 0xb5, 0x32, 0xfd, 0xe8, 0x66, + 0x76, 0xfe, 0xd1, 0xcd, 0x65, 0xf3, 0x29, 0xb7, 0x74, 0x3e, 0xfd, 0x46, 0x06, 0x2e, 0x4a, 0xbd, + 0x9f, 0x58, 0x8b, 0x7f, 0x45, 0x35, 0x93, 0xde, 0xde, 0xcc, 0xa5, 0xde, 0xde, 0x54, 0xff, 0x24, + 0x03, 0x97, 0xe7, 0x6a, 0xa2, 0x59, 0x7f, 0xa5, 0x75, 0x49, 0xbf, 0xd1, 0x49, 0xce, 0x7f, 0x1e, + 0x6d, 0xcb, 0xef, 0x72, 0xb3, 0xf4, 0xa3, 0x9b, 0x74, 0x2c, 0xf9, 0x86, 0x78, 0xaa, 0x48, 0x0f, + 0xce, 0xdc, 0x91, 0x18, 0xec, 0x12, 0x41, 0xfa, 0x67, 0xee, 0x48, 0xfd, 0xe3, 0x0c, 0x5c, 0x9d, + 0x6b, 0x43, 0x7d, 0x16, 0x7a, 0xe2, 0x4c, 0xf7, 0xaf, 0xa8, 0x19, 0xb7, 0xa0, 0x4c, 0x27, 0xde, + 0xe2, 0xa0, 0x98, 0x77, 0x2b, 0x18, 0x49, 0xb9, 0x0a, 0x64, 0x4d, 0xe3, 0x4c, 0x5c, 0x3f, 0xc7, + 0x9f, 0xb8, 0x60, 0x8f, 0xbc, 0x99, 0x2f, 0xae, 0x9b, 0xd3, 0x6f, 0xf5, 0x23, 0xd8, 0x4c, 0xaa, + 0xde, 0x10, 0x4f, 0xa5, 0xde, 0x82, 0xb2, 0x6b, 0x9d, 0xe8, 0xd1, 0x43, 0xaa, 0x22, 0x6c, 0xca, + 0xb5, 0x4e, 0x04, 0x81, 0xba, 0x23, 0xcb, 0xc2, 0xf8, 0xab, 0x0a, 0x8e, 0x99, 0x8a, 0xbf, 0xf1, + 0x1c, 0x33, 0x42, 0x61, 0x6e, 0x52, 0x2b, 0x0b, 0xae, 0x75, 0x42, 0xf3, 0xf0, 0x44, 0xe4, 0x53, + 0x37, 0x4d, 0x11, 0x83, 0xb0, 0xec, 0x65, 0xb3, 0xab, 0x50, 0x9c, 0xfa, 0xa9, 0x6e, 0x2a, 0x4c, + 0x7d, 0x5e, 0xec, 0x1d, 0x11, 0x94, 0x75, 0x5e, 0xbc, 0x02, 0x0f, 0xd3, 0x12, 0x5f, 0x5d, 0xc9, + 0x25, 0x5f, 0x5d, 0xf9, 0x58, 0x88, 0x41, 0xb2, 0xfb, 0x78, 0xc9, 0x0a, 0x64, 0x6d, 0xf3, 0x94, + 0x0a, 0x5e, 0xd7, 0xf0, 0x27, 0x69, 0x72, 0xd6, 0x57, 0x22, 0x2e, 0x0c, 0x7f, 0xaa, 0xdb, 0x50, + 0xd6, 0x52, 0x46, 0x6e, 0x45, 0xf2, 0x17, 0x05, 0xe9, 0xc7, 0x9f, 0x92, 0x0e, 0xd2, 0xca, 0x89, + 0xbb, 0x28, 0x50, 0x03, 0x21, 0xf8, 0x9e, 0x1b, 0xfe, 0xe8, 0xc8, 0xf0, 0x3b, 0x96, 0x7b, 0x18, + 0x1e, 0x61, 0x97, 0x73, 0x37, 0xae, 0xdc, 0x85, 0xc0, 0x41, 0xd1, 0x74, 0xc0, 0x5e, 0x74, 0x88, + 0x3c, 0xfa, 0x9e, 0x83, 0x6b, 0x9d, 0x08, 0xfe, 0x37, 0x00, 0xb0, 0xff, 0x05, 0x9a, 0x1f, 0x2a, + 0x96, 0x3c, 0xc7, 0xe4, 0x68, 0x75, 0x53, 0xb4, 0x57, 0x5c, 0xfc, 0x69, 0x5a, 0x63, 0xd5, 0x11, + 0x23, 0xcf, 0x1b, 0x24, 0x3a, 0xe1, 0x5b, 0x0d, 0x23, 0x7b, 0x13, 0x2a, 0x91, 0x47, 0x82, 0xde, + 0x1b, 0xe3, 0xc5, 0x97, 0x23, 0x58, 0x77, 0x36, 0x51, 0x7f, 0x37, 0x0b, 0x95, 0x3a, 0x8f, 0xd0, + 0x99, 0x9e, 0xf5, 0xa6, 0x21, 0xfb, 0x55, 0xb8, 0x14, 0x1c, 0xdb, 0x53, 0xf1, 0x01, 0x06, 0x0a, + 0x8c, 0xa1, 0x28, 0x6b, 0xd1, 0x89, 0xf7, 0xa5, 0x4e, 0x14, 0x2c, 0x0f, 0xfa, 0xc7, 0xf6, 0x94, + 0x07, 0xf7, 0xb7, 0xcd, 0x53, 0x8a, 0xa4, 0xe7, 0xa7, 0xfd, 0x2c, 0x58, 0x40, 0xd0, 0x2d, 0x7a, + 0xcc, 0x7e, 0x7a, 0x2c, 0xb2, 0x15, 0xe1, 0x0f, 0x08, 0xdc, 0x3f, 0xe6, 0x34, 0xf7, 0x61, 0x93, + 0xdf, 0xe7, 0x59, 0xdc, 0x80, 0x37, 0x38, 0x22, 0x99, 0xdf, 0x7d, 0xd8, 0xa4, 0xfc, 0xc4, 0xc3, + 0x98, 0xfa, 0xc8, 0x9b, 0x9e, 0x89, 0xc3, 0xc4, 0xb7, 0xcf, 0xa9, 0x6a, 0x9b, 0x93, 0x22, 0x48, + 0x3c, 0x88, 0x13, 0xa4, 0xa1, 0xd7, 0x5a, 0x70, 0xe5, 0x9c, 0x36, 0xbd, 0x2e, 0x60, 0xa1, 0x28, + 0x05, 0x2c, 0x5c, 0xdb, 0x86, 0x8b, 0xcb, 0xca, 0xfb, 0x26, 0x79, 0xa8, 0x7f, 0xb0, 0x0e, 0x90, + 0xcc, 0xd8, 0x94, 0x3a, 0x9a, 0x99, 0x53, 0x47, 0xbf, 0x51, 0x70, 0xce, 0x47, 0x50, 0xc5, 0xae, + 0xd2, 0x13, 0x8e, 0xec, 0x52, 0x8e, 0x0a, 0x52, 0x0d, 0x92, 0x8b, 0x92, 0x8b, 0x41, 0x0e, 0xb9, + 0xa5, 0x41, 0x0e, 0x1f, 0x42, 0x81, 0x1f, 0xb4, 0x05, 0xe2, 0x6e, 0xee, 0x95, 0xf9, 0xd5, 0xf7, + 0x40, 0x5c, 0x14, 0x88, 0xe8, 0x58, 0x0b, 0xaa, 0x28, 0xfa, 0x7d, 0x3b, 0x3c, 0x9a, 0xc8, 0x37, + 0x75, 0x6f, 0x2e, 0x72, 0x46, 0x64, 0xfc, 0x39, 0x4d, 0x43, 0x4e, 0x4a, 0xda, 0x6b, 0x38, 0x11, + 0xde, 0x5f, 0xd2, 0x5e, 0x0b, 0xb2, 0xf6, 0x3a, 0x98, 0x70, 0x9f, 0x2f, 0x6a, 0xaf, 0xef, 0xc3, + 0x05, 0x71, 0x79, 0x09, 0x19, 0xb0, 0x3b, 0x89, 0x9e, 0xc7, 0x61, 0x8a, 0x77, 0xa2, 0x06, 0x13, + 0xb2, 0xed, 0x90, 0xfc, 0x73, 0xb8, 0x38, 0x3a, 0x32, 0xdc, 0x43, 0x4b, 0x0f, 0x87, 0x8e, 0x4e, + 0x8f, 0xf9, 0xeb, 0x13, 0x63, 0x2a, 0x94, 0xea, 0xb7, 0x17, 0x2a, 0xdb, 0x20, 0xe2, 0xc1, 0xd0, + 0xa1, 0x40, 0xb2, 0x38, 0x14, 0x66, 0x73, 0x34, 0x0f, 0x9f, 0x3b, 0x91, 0x86, 0x85, 0x13, 0xe9, + 0x79, 0x35, 0xbb, 0xbc, 0x44, 0xcd, 0x4e, 0x94, 0xe5, 0x8a, 0xac, 0x2c, 0xb3, 0xf7, 0xa0, 0x20, + 0x6e, 0x7c, 0x0a, 0xbf, 0x2f, 0x5b, 0x5c, 0x1d, 0x5a, 0x44, 0x82, 0x25, 0x45, 0xf1, 0x11, 0x74, + 0x81, 0xbf, 0xca, 0x4b, 0x92, 0x61, 0x6c, 0x5b, 0x38, 0x3d, 0xe3, 0xa0, 0x37, 0xe1, 0xe3, 0xbd, + 0x26, 0x65, 0x1c, 0xe3, 0x84, 0x5d, 0x3e, 0xc7, 0x71, 0xed, 0x9f, 0xad, 0xc1, 0x9a, 0x88, 0xaf, + 0xbe, 0x0f, 0x39, 0xd3, 0xf7, 0xa6, 0x71, 0xc0, 0xf2, 0x12, 0xad, 0x9d, 0xbe, 0xdf, 0x86, 0x0a, + 0xfe, 0x03, 0x58, 0x33, 0x4c, 0x53, 0x1f, 0x1f, 0xa7, 0xcf, 0xa3, 0xe7, 0x14, 0xe8, 0xdd, 0x15, + 0x2d, 0x6f, 0x90, 0x26, 0xfd, 0x29, 0x94, 0x90, 0x3e, 0x09, 0x23, 0x2d, 0x2f, 0x9a, 0x05, 0x91, + 0xaa, 0xbb, 0xbb, 0xa2, 0x15, 0x8d, 0x48, 0xed, 0xfd, 0x5e, 0xda, 0xb3, 0x9f, 0x5b, 0x68, 0xe0, + 0x9c, 0x9e, 0x36, 0xe7, 0xe3, 0xff, 0x65, 0xe0, 0xae, 0xde, 0x78, 0xc7, 0xce, 0xcb, 0x47, 0x9f, + 0x0b, 0xfb, 0xfb, 0xee, 0x8a, 0xc6, 0xf7, 0xad, 0x68, 0xbf, 0xff, 0x38, 0xf2, 0xba, 0xc7, 0xdf, + 0xb9, 0x59, 0xd2, 0x33, 0x28, 0x06, 0x63, 0xd7, 0x3b, 0xc9, 0x44, 0x64, 0x33, 0xcd, 0x28, 0x9a, + 0xb0, 0xb0, 0xc0, 0x16, 0xef, 0xea, 0xc4, 0x16, 0x6f, 0xf1, 0x4f, 0xa0, 0xcc, 0x9d, 0xb0, 0x9c, + 0xaf, 0xb8, 0xd0, 0xb5, 0xc9, 0xa6, 0x4c, 0xc7, 0x7a, 0xc9, 0x16, 0xdd, 0x88, 0xda, 0xe9, 0x5b, + 0xf2, 0xc9, 0xc9, 0x8d, 0xa5, 0x1d, 0xa5, 0xc5, 0x87, 0x28, 0xbc, 0xb1, 0x1a, 0xe7, 0x61, 0x1d, + 0xb8, 0x28, 0x8e, 0x18, 0xf8, 0x06, 0x1c, 0xed, 0x99, 0xb0, 0x30, 0x5e, 0xa9, 0x1d, 0x7a, 0x77, + 0x45, 0x63, 0xc6, 0xe2, 0xbe, 0xdd, 0x80, 0xcd, 0xa8, 0x4a, 0xfc, 0xae, 0x6d, 0x12, 0x08, 0x25, + 0x37, 0x29, 0xd9, 0x77, 0x77, 0x57, 0xb4, 0x0d, 0x23, 0x0d, 0x62, 0x6d, 0xb8, 0x10, 0x65, 0x42, + 0xae, 0x76, 0xd1, 0x33, 0x95, 0x85, 0x51, 0x94, 0xf7, 0xea, 0xdd, 0x15, 0x6d, 0xd3, 0x58, 0xd8, + 0xc0, 0xf7, 0xa2, 0xfa, 0xc8, 0xca, 0x21, 0x5f, 0x89, 0xb7, 0x96, 0x76, 0x53, 0xa2, 0xa9, 0xc6, + 0x35, 0x4b, 0x40, 0x49, 0x1c, 0xc3, 0x35, 0x0d, 0x2e, 0x2f, 0x97, 0x30, 0xf2, 0x36, 0x93, 0xe3, + 0xdb, 0x8c, 0x9a, 0x7e, 0x42, 0x2d, 0xfd, 0x20, 0x87, 0xb4, 0xe9, 0xfc, 0x00, 0xd6, 0x53, 0x22, + 0x96, 0x95, 0xa1, 0x10, 0x3d, 0xd8, 0x4e, 0x77, 0x2a, 0x1a, 0xbd, 0xfd, 0x2f, 0x94, 0x0c, 0x82, + 0xdb, 0xdd, 0xfe, 0xa0, 0xde, 0x15, 0x51, 0x2a, 0xed, 0xae, 0x88, 0x52, 0x51, 0xff, 0x24, 0x0b, + 0xa5, 0xf8, 0x94, 0xed, 0xdb, 0x7b, 0xc3, 0x62, 0x37, 0x53, 0x56, 0x76, 0x33, 0xcd, 0x99, 0x7a, + 0xfc, 0xdb, 0x0a, 0xfc, 0x69, 0xbd, 0x8d, 0xb4, 0x41, 0x15, 0x2c, 0xde, 0xfd, 0xce, 0x7f, 0xcd, + 0xbb, 0xdf, 0x72, 0x24, 0xf9, 0x5a, 0x3a, 0x92, 0x7c, 0xee, 0xd1, 0xfe, 0x02, 0x3d, 0xa7, 0x2d, + 0x3f, 0xda, 0x4f, 0x5f, 0xd6, 0x7c, 0x6e, 0x5b, 0x27, 0x22, 0xf4, 0x5a, 0xa4, 0xd2, 0x3b, 0x34, + 0xbc, 0x66, 0x87, 0xfe, 0x3a, 0xd2, 0xfe, 0x11, 0x5c, 0x1c, 0x1f, 0xc7, 0x8f, 0x78, 0x27, 0xce, + 0x95, 0x0a, 0x55, 0x69, 0x29, 0x8e, 0xbd, 0x1d, 0x7f, 0x0a, 0x6c, 0x5d, 0x76, 0x03, 0xc5, 0xa3, + 0x15, 0x7f, 0x1b, 0xec, 0x6f, 0x66, 0x00, 0x92, 0xf3, 0xa7, 0x9f, 0xdb, 0x95, 0x2b, 0x79, 0xcb, + 0xb2, 0xaf, 0xf0, 0x96, 0xbd, 0xee, 0xbd, 0xb5, 0xaf, 0xa0, 0x14, 0x9f, 0x38, 0x7e, 0xfb, 0x89, + 0xf5, 0x8d, 0x8a, 0xfc, 0xb5, 0xc8, 0xad, 0x1d, 0x1f, 0xd9, 0xfd, 0xbc, 0x7d, 0x91, 0x2a, 0x3e, + 0xfb, 0x9a, 0xe2, 0x4f, 0xb9, 0x6f, 0x39, 0x2e, 0xfc, 0x17, 0xbc, 0x9a, 0xe4, 0x89, 0x9e, 0x4b, + 0x4d, 0x74, 0x75, 0x26, 0x1c, 0xe4, 0x3f, 0x7f, 0xd1, 0xdf, 0xa8, 0xc1, 0xff, 0x3d, 0x13, 0x79, + 0x71, 0xe3, 0x77, 0xd7, 0xcf, 0x55, 0x7a, 0x97, 0x3b, 0xa2, 0xbf, 0x49, 0x71, 0xaf, 0xf4, 0x51, + 0xe5, 0x5e, 0xe5, 0xa3, 0x7a, 0x1b, 0xf2, 0x7c, 0xbb, 0xcb, 0x9f, 0xe7, 0x9f, 0xe2, 0xf8, 0xd7, + 0x7e, 0x1d, 0x45, 0x55, 0x85, 0x92, 0xcf, 0xdb, 0x7b, 0x31, 0xca, 0x37, 0xfa, 0xb2, 0x0b, 0xdd, + 0x74, 0xf9, 0xff, 0xb8, 0x44, 0xfd, 0xb6, 0x5d, 0xf2, 0x6a, 0xb7, 0x85, 0xfa, 0xbf, 0x33, 0xb0, + 0x9e, 0x8a, 0x20, 0xf8, 0x16, 0x45, 0x2c, 0x95, 0xcb, 0xd9, 0xff, 0x8b, 0xe4, 0x72, 0x2a, 0x28, + 0xb7, 0x98, 0x0e, 0xca, 0x45, 0x71, 0x57, 0x49, 0x99, 0x30, 0xcb, 0x8c, 0x9d, 0xcc, 0x52, 0x63, + 0xe7, 0x66, 0xfc, 0x4d, 0xc7, 0x76, 0x93, 0xc7, 0xc0, 0xae, 0x6b, 0x12, 0x84, 0x7d, 0x06, 0x57, + 0x85, 0x13, 0x81, 0xf7, 0x8f, 0x37, 0xd6, 0xe3, 0x2f, 0x3e, 0x0a, 0xa3, 0xfc, 0x32, 0x27, 0xe0, + 0xdf, 0xb6, 0x19, 0xd7, 0x23, 0xac, 0xda, 0x86, 0xf5, 0x54, 0x68, 0x86, 0xf4, 0x85, 0xd9, 0x8c, + 0xfc, 0x85, 0x59, 0xb6, 0x05, 0xf9, 0x93, 0x23, 0xcb, 0xb7, 0x96, 0xbc, 0xa9, 0xcc, 0x11, 0xea, + 0x77, 0xa1, 0x22, 0x87, 0x89, 0xb1, 0xf7, 0x20, 0x6f, 0x87, 0xd6, 0x24, 0x72, 0x8f, 0x5c, 0x5e, + 0x8c, 0x24, 0x6b, 0x87, 0xd6, 0x44, 0xe3, 0x44, 0xea, 0xef, 0x65, 0x40, 0x99, 0xc7, 0x49, 0x9f, + 0xc1, 0xcd, 0x9c, 0xf3, 0x19, 0xdc, 0xd5, 0x54, 0x25, 0x97, 0x7d, 0xc9, 0x36, 0x7e, 0xd7, 0x35, + 0x77, 0xce, 0xbb, 0xae, 0xec, 0x2e, 0x14, 0x7d, 0x8b, 0xbe, 0x31, 0x6a, 0x2e, 0xb9, 0x01, 0x12, + 0xe3, 0xd4, 0xdf, 0xca, 0x40, 0x41, 0xc4, 0xb4, 0x2d, 0xf5, 0x57, 0xbd, 0x03, 0x05, 0xfe, 0xbd, + 0xd1, 0xe8, 0x45, 0xb2, 0x85, 0xc0, 0xf1, 0x08, 0xcf, 0x6e, 0xf2, 0x48, 0xbf, 0xb4, 0xff, 0x6a, + 0xdf, 0x31, 0x5c, 0x8d, 0xe0, 0xe2, 0x93, 0x55, 0xc6, 0x44, 0x5c, 0x50, 0xe7, 0xcf, 0x53, 0x01, + 0x81, 0xe8, 0x2e, 0xba, 0xfa, 0x3d, 0x28, 0x88, 0x98, 0xb9, 0xa5, 0x55, 0x79, 0xdd, 0xb7, 0x26, + 0xb7, 0x00, 0x92, 0x20, 0xba, 0x65, 0x39, 0xa8, 0xf7, 0xa1, 0x18, 0xc5, 0xcd, 0xe1, 0xfc, 0x4b, + 0x8a, 0x16, 0x57, 0x8b, 0xe4, 0xca, 0x38, 0xe2, 0x3b, 0x05, 0x1d, 0x6f, 0x74, 0x4c, 0xce, 0xf2, + 0x87, 0x40, 0xf7, 0xac, 0x06, 0x0b, 0xef, 0x78, 0xa5, 0x3f, 0x54, 0x11, 0x13, 0xb1, 0xfb, 0x10, + 0xcb, 0xcb, 0xd7, 0xb9, 0x16, 0xd4, 0x7a, 0x74, 0x23, 0x8f, 0x66, 0xd9, 0x63, 0xe1, 0x4d, 0xed, + 0xd0, 0xa3, 0x8e, 0x19, 0xf9, 0x73, 0x25, 0xa9, 0x3a, 0x69, 0x12, 0x99, 0x5a, 0x85, 0x8a, 0x1c, + 0xec, 0xa3, 0xd6, 0x61, 0x73, 0xcf, 0x0a, 0x0d, 0x94, 0x3f, 0xd1, 0xeb, 0x46, 0x7c, 0xfe, 0xe2, + 0x8f, 0xf4, 0xfc, 0x9d, 0xa7, 0xd3, 0x38, 0x91, 0xfa, 0x27, 0x39, 0x50, 0xe6, 0x71, 0xaf, 0xba, + 0x9d, 0x78, 0x0b, 0xca, 0x1e, 0xcd, 0x8b, 0xd4, 0x47, 0xc9, 0x38, 0x48, 0x8a, 0xf0, 0x4f, 0x7d, + 0x99, 0xa6, 0x68, 0x07, 0xbb, 0xfc, 0xdb, 0x34, 0x57, 0xf8, 0x55, 0x34, 0xc7, 0x1b, 0xd1, 0xb4, + 0xae, 0xd0, 0xcd, 0xb3, 0x8e, 0x37, 0xa2, 0x4b, 0x8f, 0xc2, 0x3b, 0xc1, 0x23, 0x50, 0x2b, 0x5a, + 0x51, 0xb8, 0x24, 0xe8, 0xfc, 0x4e, 0xc4, 0xfd, 0x87, 0x81, 0xb8, 0x46, 0x5a, 0xe4, 0x80, 0x41, + 0x10, 0xbd, 0x86, 0x3f, 0x12, 0x5f, 0xd0, 0xca, 0xd2, 0x6b, 0xf8, 0x0d, 0x97, 0xee, 0x3c, 0xd2, + 0x07, 0xdf, 0x46, 0xe2, 0x83, 0x7c, 0xe2, 0x7b, 0x04, 0x88, 0xba, 0xcd, 0xbf, 0x31, 0xe6, 0x5b, + 0x41, 0xc0, 0x9f, 0xfe, 0x2b, 0x89, 0x47, 0x1d, 0x05, 0x30, 0x7e, 0x3a, 0x55, 0x7c, 0xe1, 0x0d, + 0x49, 0x40, 0x3c, 0x40, 0xc8, 0xbf, 0xef, 0x86, 0x04, 0x57, 0xa1, 0xf8, 0x13, 0xcf, 0xb5, 0xc8, + 0xcb, 0x51, 0xa6, 0x5a, 0x15, 0x30, 0xbd, 0x67, 0x4c, 0x71, 0x23, 0x70, 0xe8, 0xc6, 0x32, 0xbf, + 0xed, 0xc7, 0x13, 0xea, 0xbf, 0xcd, 0xc0, 0xc5, 0xf9, 0xbe, 0xa6, 0x69, 0x54, 0x81, 0x62, 0xa3, + 0xd7, 0xd1, 0xbb, 0xf5, 0xbd, 0x96, 0xb2, 0xc2, 0x36, 0xa0, 0xdc, 0xdb, 0xfe, 0x61, 0xab, 0x31, + 0xe0, 0x80, 0x0c, 0xbd, 0x08, 0xd0, 0xd7, 0x77, 0xdb, 0xcd, 0x66, 0xab, 0xcb, 0x2d, 0x8a, 0xde, + 0xf6, 0x0f, 0xf5, 0x4e, 0xaf, 0xc1, 0x3f, 0x13, 0x15, 0x45, 0x3c, 0xf4, 0x95, 0x1c, 0xc5, 0x43, + 0x50, 0x18, 0x3c, 0x26, 0xf3, 0x3c, 0xca, 0xfb, 0x45, 0x5f, 0x6f, 0x74, 0x07, 0xca, 0x1a, 0xa6, + 0xba, 0x07, 0x9d, 0x0e, 0xa5, 0x28, 0x9c, 0xb3, 0xd1, 0xdb, 0xdb, 0xd7, 0x5a, 0xfd, 0xbe, 0xde, + 0x6f, 0xff, 0xb8, 0xa5, 0x14, 0xa9, 0x64, 0xad, 0xfd, 0xb4, 0xdd, 0xe5, 0x80, 0x12, 0x2b, 0x40, + 0x76, 0xaf, 0xdd, 0xe5, 0x2f, 0x21, 0xec, 0xd5, 0x3f, 0x57, 0xca, 0xf8, 0xa3, 0x7f, 0xb0, 0xa7, + 0x54, 0x58, 0x09, 0xf2, 0x9d, 0xd6, 0xf3, 0x56, 0x47, 0x59, 0x57, 0xff, 0x73, 0x36, 0xd2, 0x88, + 0x29, 0xce, 0xe9, 0xeb, 0x68, 0x81, 0xcb, 0xce, 0x17, 0xe3, 0x4e, 0xcb, 0x4a, 0x9d, 0xf6, 0x75, + 0x3e, 0xf0, 0x7b, 0x1b, 0xd6, 0xe3, 0xe0, 0x00, 0xe9, 0x05, 0xfb, 0x4a, 0x04, 0x5c, 0x72, 0x7c, + 0xb1, 0xb6, 0xe4, 0xf8, 0x62, 0x6a, 0x87, 0x68, 0x65, 0xa3, 0xcc, 0xe5, 0x33, 0xa9, 0x84, 0x10, + 0xfe, 0x69, 0xed, 0xeb, 0x40, 0x09, 0x7d, 0xe6, 0xda, 0xd1, 0xe7, 0x1d, 0x8b, 0x08, 0x38, 0x70, + 0xed, 0x70, 0x3e, 0x38, 0xa1, 0xb4, 0x10, 0x9c, 0x20, 0x6f, 0xce, 0x90, 0xde, 0x9c, 0xd3, 0xdf, + 0x3d, 0xe6, 0xdf, 0x75, 0x94, 0xbe, 0x7b, 0xfc, 0x1e, 0xb0, 0xd1, 0xcc, 0xa7, 0x97, 0xd5, 0x24, + 0xb2, 0x0a, 0x91, 0x29, 0x02, 0x13, 0xef, 0x8a, 0xec, 0x6d, 0xd8, 0x98, 0xa3, 0x26, 0x5b, 0xba, + 0xa4, 0x55, 0xd3, 0xa4, 0xec, 0x01, 0x5c, 0x10, 0x73, 0x3b, 0xd5, 0xb7, 0xe2, 0x0a, 0x29, 0x47, + 0xd5, 0x93, 0x1e, 0x56, 0x7f, 0x09, 0x8a, 0x51, 0x48, 0xdb, 0xab, 0x95, 0xdd, 0x25, 0xe3, 0xaa, + 0xfe, 0xd3, 0x55, 0x28, 0xc5, 0x01, 0x6e, 0x5f, 0x6b, 0x76, 0xd0, 0xa7, 0x3a, 0x82, 0x63, 0x59, + 0xc4, 0x14, 0x11, 0x10, 0x8d, 0x94, 0xb8, 0x7f, 0x35, 0xf3, 0xed, 0x48, 0x63, 0xe3, 0x90, 0x03, + 0xdf, 0xa6, 0x87, 0x4c, 0x6c, 0x57, 0xba, 0xec, 0x59, 0xd2, 0x8a, 0x08, 0xa0, 0x85, 0x76, 0x15, + 0xe8, 0x37, 0x71, 0x46, 0x9f, 0x82, 0xb6, 0xdd, 0x63, 0xe4, 0x3b, 0xe7, 0x53, 0xd0, 0xf4, 0xa1, + 0x11, 0x1e, 0x5d, 0xc3, 0x63, 0x0a, 0xa2, 0x4f, 0xeb, 0x5d, 0x87, 0xd2, 0x2c, 0xfe, 0x36, 0xa3, + 0x98, 0x11, 0xb3, 0xe8, 0xcb, 0x8c, 0xe9, 0x51, 0x2d, 0xcd, 0x8f, 0xea, 0xfc, 0x9c, 0x86, 0x85, + 0x39, 0xad, 0x86, 0x50, 0x10, 0x41, 0x7e, 0xaf, 0xee, 0xf0, 0x57, 0x76, 0x95, 0x02, 0x59, 0xc3, + 0x89, 0x6e, 0x98, 0xe2, 0xcf, 0xb9, 0x8a, 0xe5, 0xe6, 0x2a, 0xa6, 0xfe, 0xfd, 0x55, 0x80, 0x24, + 0x58, 0x90, 0xbd, 0x3f, 0x17, 0x98, 0x9c, 0x59, 0xd8, 0xf6, 0xe7, 0xe2, 0x91, 0xe7, 0x5e, 0xf6, + 0x59, 0xfd, 0x1a, 0x2f, 0xfb, 0x3c, 0x82, 0xf5, 0xc0, 0x1f, 0xbd, 0xd6, 0xe1, 0x5e, 0x0e, 0xfc, + 0x51, 0xec, 0x6f, 0x7f, 0x08, 0x98, 0xa4, 0xb7, 0x06, 0x13, 0x43, 0x75, 0x41, 0x6b, 0x29, 0x05, + 0xfe, 0xa8, 0x37, 0xfc, 0xb2, 0xc9, 0x2f, 0xbd, 0x99, 0x41, 0xa8, 0x2f, 0x93, 0x12, 0x1b, 0x66, + 0x10, 0x36, 0x65, 0x41, 0x71, 0x07, 0xaa, 0x48, 0xbb, 0x20, 0x2c, 0x2a, 0x66, 0x90, 0x1c, 0xb0, + 0xa8, 0xbf, 0x19, 0x1d, 0x49, 0xcf, 0xf9, 0x72, 0xd9, 0x27, 0xc2, 0x10, 0x97, 0x94, 0x88, 0xda, + 0x32, 0xd7, 0x2f, 0x7f, 0x87, 0x28, 0x26, 0x5d, 0xfc, 0x22, 0xdf, 0xea, 0xd7, 0xfd, 0x22, 0xdf, + 0x16, 0x40, 0xf2, 0xda, 0x23, 0xae, 0xc0, 0xf8, 0xb2, 0x4e, 0x89, 0x5f, 0xc3, 0xb9, 0xff, 0x26, + 0x54, 0xe4, 0xef, 0xe2, 0xd2, 0x25, 0x1c, 0xcf, 0xb5, 0xf8, 0x57, 0x4f, 0x3a, 0x3f, 0xf9, 0x48, + 0xc9, 0xdc, 0x57, 0xa1, 0x2c, 0x7d, 0x73, 0x08, 0x29, 0x76, 0x8d, 0xe0, 0x48, 0x7c, 0x01, 0xc3, + 0x70, 0x0f, 0x2d, 0x25, 0x73, 0xff, 0x2e, 0x2a, 0xdd, 0xf2, 0x17, 0x7f, 0x00, 0xd6, 0xba, 0x9e, + 0x3f, 0x31, 0x1c, 0x41, 0x67, 0xcd, 0x02, 0xa4, 0x7b, 0x08, 0x97, 0x96, 0x7e, 0xbf, 0x88, 0x6e, + 0x72, 0xd9, 0x93, 0xa9, 0x63, 0xf1, 0xcb, 0x48, 0xbb, 0x67, 0x43, 0xdf, 0x36, 0x95, 0xcc, 0xfd, + 0x27, 0x73, 0xdf, 0xb7, 0x38, 0xe8, 0x6e, 0xf7, 0x0e, 0xba, 0xcd, 0x56, 0x93, 0x5f, 0x13, 0x6a, + 0x77, 0x1b, 0x9d, 0x83, 0x7e, 0xfb, 0xb9, 0xd8, 0x0b, 0x5b, 0x9f, 0x47, 0xc9, 0xd5, 0xfb, 0x4f, + 0xa2, 0x57, 0x15, 0xa2, 0x5a, 0x77, 0x7a, 0xf5, 0x26, 0xdf, 0x43, 0xe3, 0xd7, 0x7d, 0x06, 0xdb, + 0xfc, 0xbb, 0x18, 0x5a, 0xab, 0x7f, 0xd0, 0x19, 0x88, 0x97, 0x84, 0xee, 0xff, 0x00, 0x6a, 0xe7, + 0xdd, 0xe7, 0xc1, 0xb6, 0x34, 0x76, 0xeb, 0x74, 0x67, 0x0a, 0xf7, 0xcc, 0x9e, 0xce, 0x53, 0x19, + 0x7e, 0xe5, 0xac, 0xd3, 0xa2, 0xa0, 0xd7, 0xfb, 0x3f, 0xcd, 0x48, 0xfa, 0x63, 0x74, 0x27, 0x23, + 0x06, 0x88, 0x0e, 0x96, 0x41, 0x9a, 0x65, 0x98, 0x4a, 0x86, 0x5d, 0x06, 0x96, 0x02, 0x75, 0xbc, + 0x91, 0xe1, 0x28, 0xab, 0x14, 0xde, 0x1a, 0xc1, 0xe9, 0x36, 0x9e, 0x92, 0x65, 0x6f, 0xc0, 0xd5, + 0x18, 0xd6, 0xf1, 0x4e, 0xf6, 0x7d, 0xdb, 0xf3, 0xed, 0xf0, 0x8c, 0xa3, 0x73, 0xf7, 0xff, 0x7f, + 0x71, 0x38, 0x9b, 0x9a, 0x55, 0x58, 0x40, 0xdd, 0x34, 0x13, 0x18, 0x09, 0x32, 0x65, 0x85, 0x5d, + 0x81, 0x0b, 0x24, 0xc5, 0xe7, 0x10, 0x19, 0x76, 0x1d, 0xae, 0x44, 0x46, 0xee, 0x3c, 0x72, 0x15, + 0x91, 0x9a, 0x45, 0xa1, 0x91, 0x0b, 0xc8, 0xec, 0xf6, 0xf7, 0xff, 0xf4, 0x67, 0x37, 0x33, 0xff, + 0xea, 0x67, 0x37, 0x33, 0xff, 0xe5, 0x67, 0x37, 0x57, 0x7e, 0xef, 0xbf, 0xde, 0xcc, 0xfc, 0xf8, + 0xfd, 0x43, 0x3b, 0x3c, 0x9a, 0x0d, 0x1f, 0x8c, 0xbc, 0xc9, 0xc3, 0x89, 0x11, 0xfa, 0xf6, 0x29, + 0xdf, 0x4e, 0xa2, 0x84, 0x6b, 0x3d, 0x9c, 0x1e, 0x1f, 0x3e, 0x9c, 0x0e, 0x1f, 0xe2, 0xc4, 0x1e, + 0xae, 0x4d, 0x7d, 0x2f, 0xf4, 0x1e, 0xff, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x1a, 0xbb, + 0x69, 0xdb, 0x88, 0x00, 0x00, } func (m *Type) Marshal() (dAtA []byte, err error) { @@ -19358,6 +19376,26 @@ func (m *Node) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0xca } + if len(m.DirectView) > 0 { + i -= len(m.DirectView) + copy(dAtA[i:], m.DirectView) + i = encodeVarintPlan(dAtA, i, uint64(len(m.DirectView))) + i-- + dAtA[i] = 0x4 + i-- + dAtA[i] = 0xc2 + } + if len(m.OriginViews) > 0 { + for iNdEx := len(m.OriginViews) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.OriginViews[iNdEx]) + copy(dAtA[i:], m.OriginViews[iNdEx]) + i = encodeVarintPlan(dAtA, i, uint64(len(m.OriginViews[iNdEx]))) + i-- + dAtA[i] = 0x4 + i-- + dAtA[i] = 0xba + } + } if m.SpillMem != 0 { i = encodeVarintPlan(dAtA, i, uint64(m.SpillMem)) i-- @@ -28784,6 +28822,16 @@ func (m *Node) ProtoSize() (n int) { if m.SpillMem != 0 { n += 2 + sovPlan(uint64(m.SpillMem)) } + if len(m.OriginViews) > 0 { + for _, s := range m.OriginViews { + l = len(s) + n += 2 + l + sovPlan(uint64(l)) + } + } + l = len(m.DirectView) + if l > 0 { + n += 2 + l + sovPlan(uint64(l)) + } if m.RankOption != nil { l = m.RankOption.ProtoSize() n += 2 + l + sovPlan(uint64(l)) @@ -46067,6 +46115,70 @@ func (m *Node) Unmarshal(dAtA []byte) error { break } } + case 71: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OriginViews", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlan + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPlan + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPlan + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OriginViews = append(m.OriginViews, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 72: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DirectView", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlan + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPlan + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPlan + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DirectView = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 89: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field RankOption", wireType) diff --git a/pkg/sql/parsers/tree/revoke.go b/pkg/sql/parsers/tree/revoke.go index 48aab9cc76878..67614062ca8e1 100644 --- a/pkg/sql/parsers/tree/revoke.go +++ b/pkg/sql/parsers/tree/revoke.go @@ -219,6 +219,8 @@ func (node *ObjectType) String() string { return "function" case OBJECT_TYPE_PROCEDURE: return "procedure" + case OBJECT_TYPE_VIEW: + return "view" case OBJECT_TYPE_ACCOUNT: return "account" case OBJECT_TYPE_DATABASE: diff --git a/pkg/sql/plan/bind_context.go b/pkg/sql/plan/bind_context.go index cbf1c773613f8..1e7c5def79fe0 100644 --- a/pkg/sql/plan/bind_context.go +++ b/pkg/sql/plan/bind_context.go @@ -56,6 +56,10 @@ func NewBindContext(builder *QueryBuilder, parent *BindContext) *BindContext { } bc.snapshot = parent.snapshot bc.remapOption = parent.remapOption + if len(parent.viewChain) > 0 { + bc.viewChain = append([]string{}, parent.viewChain...) + } + bc.directView = parent.directView } return bc diff --git a/pkg/sql/plan/build_ddl.go b/pkg/sql/plan/build_ddl.go index 89ec383f6f6ee..bb17dd1914edd 100644 --- a/pkg/sql/plan/build_ddl.go +++ b/pkg/sql/plan/build_ddl.go @@ -76,6 +76,7 @@ func genDynamicTableDef(ctx CompilerContext, stmt *tree.Select) (*plan.TableDef, viewData, err := json.Marshal(ViewData{ Stmt: ctx.GetRootSql(), DefaultDatabase: ctx.DefaultDatabase(), + SecurityType: getViewSecurityTypeFromContext(ctx), }) if err != nil { return nil, err @@ -100,6 +101,22 @@ func genDynamicTableDef(ctx CompilerContext, stmt *tree.Select) (*plan.TableDef, return &tableDef, nil } +func getViewSecurityTypeFromContext(ctx CompilerContext) string { + securityType := "" + val, err := ctx.ResolveVariable("view_security_type", true, false) + if err == nil { + if s, ok := val.(string); ok { + securityType = s + } + } + securityType = strings.TrimSpace(strings.ToUpper(securityType)) + if securityType == "INVOKER" { + return "INVOKER" + } + // Default to DEFINER to match SQL SECURITY behavior. + return "DEFINER" +} + func genViewTableDef(ctx CompilerContext, stmt *tree.Select) (*plan.TableDef, error) { var tableDef plan.TableDef @@ -151,6 +168,7 @@ func genViewTableDef(ctx CompilerContext, stmt *tree.Select) (*plan.TableDef, er viewData, err := json.Marshal(ViewData{ Stmt: viewSql, DefaultDatabase: ctx.DefaultDatabase(), + SecurityType: getViewSecurityTypeFromContext(ctx), }) if err != nil { return nil, err diff --git a/pkg/sql/plan/build_ddl_test.go b/pkg/sql/plan/build_ddl_test.go index f1b3065040095..559407685ca33 100644 --- a/pkg/sql/plan/build_ddl_test.go +++ b/pkg/sql/plan/build_ddl_test.go @@ -52,8 +52,9 @@ func TestBuildAlterView(t *testing.T) { store := make(map[string]arg) vData, err := json.Marshal(ViewData{ - "create view v as select a from a", - "db", + Stmt: "create view v as select a from a", + DefaultDatabase: "db", + SecurityType: "DEFINER", }) assert.NoError(t, err) @@ -66,8 +67,9 @@ func TestBuildAlterView(t *testing.T) { } vxData, err := json.Marshal(ViewData{ - "create view vx as select a from v", - "db", + Stmt: "create view vx as select a from v", + DefaultDatabase: "db", + SecurityType: "DEFINER", }) assert.NoError(t, err) store["db.vx"] = arg{&plan.ObjectRef{}, diff --git a/pkg/sql/plan/deepcopy.go b/pkg/sql/plan/deepcopy.go index 0c00c9b997603..4fe91999e6097 100644 --- a/pkg/sql/plan/deepcopy.go +++ b/pkg/sql/plan/deepcopy.go @@ -247,6 +247,8 @@ func DeepCopyNode(node *plan.Node) *plan.Node { UpdateCtxList: DeepCopyUpdateCtxList(node.UpdateCtxList), DedupJoinCtx: DeepCopyDedupJoinCtx(node.DedupJoinCtx), IndexReaderParam: DeepCopyIndexReaderParam(node.IndexReaderParam), + OriginViews: slices.Clone(node.OriginViews), + DirectView: node.DirectView, RankOption: DeepCopyRankOption(node.RankOption), } newNode.Uuid = append(newNode.Uuid, node.Uuid...) diff --git a/pkg/sql/plan/mock.go b/pkg/sql/plan/mock.go index 36384838327d4..8b8468b5f2146 100644 --- a/pkg/sql/plan/mock.go +++ b/pkg/sql/plan/mock.go @@ -1129,6 +1129,7 @@ func NewMockCompilerContext(isDml bool) *MockCompilerContext { viewData, _ := json.Marshal(ViewData{ Stmt: table.viewCfg.sql, DefaultDatabase: table.viewCfg.db, + SecurityType: "DEFINER", }) tableDef.ViewSql = &plan.ViewDef{ View: string(viewData), diff --git a/pkg/sql/plan/query_builder.go b/pkg/sql/plan/query_builder.go index bab33c5202d19..61951a691b7a3 100644 --- a/pkg/sql/plan/query_builder.go +++ b/pkg/sql/plan/query_builder.go @@ -4352,6 +4352,14 @@ func (builder *QueryBuilder) appendStep(nodeID int32) int32 { func (builder *QueryBuilder) appendNode(node *plan.Node, ctx *BindContext) int32 { nodeID := int32(len(builder.qry.Nodes)) + if ctx != nil && len(ctx.viewChain) > 0 { + if len(node.OriginViews) == 0 { + node.OriginViews = append([]string{}, ctx.viewChain...) + } + if node.DirectView == "" { + node.DirectView = ctx.directView + } + } node.NodeId = nodeID builder.qry.Nodes = append(builder.qry.Nodes, node) builder.ctxByNode = append(builder.ctxByNode, ctx) @@ -4556,6 +4564,21 @@ func (builder *QueryBuilder) bindView( defaultDatabase = obj.SubscriptionName } viewCtx.defaultDatabase = defaultDatabase + viewKey := schema + "#" + table + viewKeyWithSnapshot := viewKey + if IsSnapshotValid(snapshot) { + viewKeyWithSnapshot = FormatViewKeyWithSnapshot(viewKey, snapshot) + } + if ctx != nil && ctx.directView != "" { + viewCtx.directView = ctx.directView + } else { + viewCtx.directView = viewKeyWithSnapshot + } + if ctx != nil && len(ctx.viewChain) > 0 { + viewCtx.viewChain = append(append([]string{}, ctx.viewChain...), viewKey) + } else { + viewCtx.viewChain = []string{viewKey} + } if viewCtx.viewInBinding(schema, table, viewStmt) { return 0, moerr.NewParseErrorf(builder.GetContext(), "view %s reference itself", table) diff --git a/pkg/sql/plan/query_builder_test.go b/pkg/sql/plan/query_builder_test.go index 67de02fed2288..80ac2224a806a 100644 --- a/pkg/sql/plan/query_builder_test.go +++ b/pkg/sql/plan/query_builder_test.go @@ -57,8 +57,9 @@ func TestBuildTable_AlterView(t *testing.T) { }} vData, err := json.Marshal(ViewData{ - "create view v as select a from a", - "db", + Stmt: "create view v as select a from a", + DefaultDatabase: "db", + SecurityType: "DEFINER", }) assert.NoError(t, err) diff --git a/pkg/sql/plan/types.go b/pkg/sql/plan/types.go index 04e3573273396..7b0e50c084f35 100644 --- a/pkg/sql/plan/types.go +++ b/pkg/sql/plan/types.go @@ -75,6 +75,16 @@ type Snapshot = plan.Snapshot type SnapshotTenant = plan.SnapshotTenant type ExternAttr = plan.ExternAttr +const ViewSnapshotKeySuffix = "@ts=" + +// FormatViewKeyWithSnapshot appends snapshot information to a view key for privilege checks. +func FormatViewKeyWithSnapshot(viewKey string, snapshot *Snapshot) string { + if !IsSnapshotValid(snapshot) || snapshot.TS == nil { + return viewKey + } + return fmt.Sprintf("%s%s%d", viewKey, ViewSnapshotKeySuffix, snapshot.TS.PhysicalTime) +} + type CompilerContext interface { // Default database/schema in context DefaultDatabase() string @@ -161,6 +171,7 @@ type BaseOptimizer struct { type ViewData struct { Stmt string DefaultDatabase string + SecurityType string `json:"security_type,omitempty"` } type QueryBuilder struct { @@ -335,6 +346,10 @@ type BindContext struct { views []string //view in binding or already bound boundViews map[[2]string]*tree.CreateView + // viewChain tracks view lineage for the current bind context. + viewChain []string + // directView tracks the outermost view referenced by the user. + directView string // lower is sys var lower_case_table_names lower int64 diff --git a/proto/plan.proto b/proto/plan.proto index 00eb4b48d86f7..3c49326f736ab 100644 --- a/proto/plan.proto +++ b/proto/plan.proto @@ -916,6 +916,8 @@ message Node { // compile time performance setting int64 spill_mem = 70; + repeated string origin_views = 71; + string direct_view = 72; } message SnapshotExtraInfo { diff --git a/test/distributed/cases/zz_accesscontrol/grant_privs_role.result b/test/distributed/cases/zz_accesscontrol/grant_privs_role.result index ad6bd4b8c582e..6703fb43b1dbb 100644 --- a/test/distributed/cases/zz_accesscontrol/grant_privs_role.result +++ b/test/distributed/cases/zz_accesscontrol/grant_privs_role.result @@ -42,7 +42,7 @@ table ownership table *.* 0 grant select,insert,update on testdb.* to test_role; SQL parser error: You have an error in your SQL syntax; check the manual that corresponds to your MatrixOne server version for the right syntax to use. syntax error at line 1 column 36 near " testdb.* to test_role;"; grant select,insert,update on account * to 'test_role'; -internal error: the privilege "select" can only be granted to the object type "table" +internal error: the privilege "select" can only be granted to the object type "table" or "view" grant show tables,create,drop,alter on testdb.* to 'test_role'; SQL parser error: You have an error in your SQL syntax; check the manual that corresponds to your MatrixOne server version for the right syntax to use. syntax error at line 1 column 30 near ",alter on testdb.* to 'test_role';"; grant show tables,create,drop,alter on table testdb.* to 'test_role'; @@ -54,7 +54,7 @@ SQL parser error: You have an error in your SQL syntax; check the manual that co grant select,insert,update on table testdb.* to 'trole'; internal error: there is no role trole grant select,insert,create database on account * to test_role; -internal error: the privilege "select" can only be granted to the object type "table" +internal error: the privilege "select" can only be granted to the object type "table" or "view" grant select,insert,create database on account *.* to testuser; internal error: there is no role testuser grant role_not_exists to dump; @@ -331,7 +331,7 @@ r5 database create table *.* grant create table on database *.* to r1,r2,r15,r4,r5; internal error: there is no role r15 grant select on database *.* to r1,r2,r3,r4,r5; -internal error: the privilege "select" can only be granted to the object type "table" +internal error: the privilege "select" can only be granted to the object type "table" or "view" create user user1 identified by '12345678',user2 identified by '12345678',user3 identified by '12345678',user4 identified by '12345678',user5 identified by '12345678'; grant r1,r2,r3,r4,r5 to user1,user2,user3,user4,user5; select count(*) from mo_catalog.mo_user_grant,mo_catalog.mo_user,mo_catalog.mo_role_privs where mo_user_grant.user_id=mo_user.user_id and mo_role_privs.role_id=mo_user_grant.role_id and role_name in ('r1','r2','r3','r4','r5'); diff --git a/test/distributed/cases/zz_accesscontrol/grant_view.result b/test/distributed/cases/zz_accesscontrol/grant_view.result new file mode 100644 index 0000000000000..d7c8b72323898 --- /dev/null +++ b/test/distributed/cases/zz_accesscontrol/grant_view.result @@ -0,0 +1,70 @@ +set global enable_privilege_cache = off; +drop user if exists user_v1, user_no_db, user_invoker; +drop role if exists role_v1, role_no_db, role_invoker; +drop database if exists db_v1; +create role role_v1; +create user user_v1 identified by '111' default role role_v1; +grant role_v1 to user_v1; +create database db_v1; +use db_v1; +create table t1 (a int, b varchar(20)); +insert into t1 values (1, 'base'); +create view v1 as select * from t1; +create view v_on_v as select * from v1; +grant select on view db_v1.v1 to role_v1; +grant connect on account * to role_v1; +select current_role(); +➤ current_role()[12,-1,0] 𝄀 +role_v1 +use db_v1; +select * from v1; +➤ a[4,32,0] ¦ b[12,-1,0] 𝄀 +1 ¦ base +create role role_no_db; +create user user_no_db identified by '111' default role role_no_db; +grant role_no_db to user_no_db; +grant select on view db_v1.v1 to role_no_db; +use db_v1; +internal error: do not have privilege to execute the statement +select * from db_v1.v1; +➤ a[4,32,0] ¦ b[12,-1,0] 𝄀 +1 ¦ base +grant select on view db_v1.v_on_v to role_v1; +use db_v1; +select * from v_on_v; +➤ a[4,32,0] ¦ b[12,-1,0] 𝄀 +1 ¦ base +use db_v1; +set view_security_type = 'INVOKER'; +create view v_invoker as select * from t1; +set view_security_type = 'DEFINER'; +create role role_invoker; +create user user_invoker identified by '111' default role role_invoker; +grant role_invoker to user_invoker; +grant connect on account * to role_invoker; +grant select on view db_v1.v_invoker to role_invoker; +use db_v1; +select * from v_invoker; +internal error: do not have privilege to execute the statement +grant select on table db_v1.t1 to role_invoker; +use db_v1; +select * from v_invoker; +➤ a[4,32,0] ¦ b[12,-1,0] 𝄀 +1 ¦ base +grant all on view db_v1.v1 to role_v1; +show grants for role_v1; +➤ Grants for role_v1@localhost[12,-1,0] +revoke all on view db_v1.v1 from role_v1; +grant select on view db_v1.v1 to role_v1; +revoke select on view db_v1.v1 from role_v1; +use db_v1; +select * from v1; +internal error: do not have privilege to execute the statement +drop user user_v1; +drop user user_no_db; +drop user user_invoker; +drop role role_v1; +drop role role_no_db; +drop role role_invoker; +drop database db_v1; +set global enable_privilege_cache = on; diff --git a/test/distributed/cases/zz_accesscontrol/grant_view.sql b/test/distributed/cases/zz_accesscontrol/grant_view.sql new file mode 100644 index 0000000000000..a93b6279800dc --- /dev/null +++ b/test/distributed/cases/zz_accesscontrol/grant_view.sql @@ -0,0 +1,120 @@ +set global enable_privilege_cache = off; + +-- cleanup +drop user if exists user_v1, user_no_db, user_invoker; +drop role if exists role_v1, role_no_db, role_invoker; +drop database if exists db_v1; + +-- setup +create role role_v1; +create user user_v1 identified by '111' default role role_v1; +grant role_v1 to user_v1; + +create database db_v1; +use db_v1; +create table t1 (a int, b varchar(20)); +insert into t1 values (1, 'base'); +create view v1 as select * from t1; +create view v_on_v as select * from v1; + +-- ========================================================== +-- Test 1: Basic View SELECT (DEFINER security) +-- ========================================================== +-- grant only view privilege, NO physical table privilege +grant select on view db_v1.v1 to role_v1; +-- grant connect privilege on account level for 'USE' +grant connect on account * to role_v1; + +-- @session:id=1&user=user_v1&password=111 +-- verify role is active +select current_role(); +use db_v1; +-- this should succeed now with the new short-circuit logic +select * from v1; +-- @session + +-- ========================================================== +-- Test 2: Full path SELECT without USE database permission +-- ========================================================== +create role role_no_db; +create user user_no_db identified by '111' default role role_no_db; +grant role_no_db to user_no_db; +grant select on view db_v1.v1 to role_no_db; +-- DO NOT grant connect/database privilege to user_no_db + +-- @session:id=2&user=user_no_db&password=111 +-- USE should fail (no database permission) +use db_v1; +-- Full path SELECT should succeed +select * from db_v1.v1; +-- @session + +-- ========================================================== +-- Test 3: View on View (Lineage) +-- ========================================================== +grant select on view db_v1.v_on_v to role_v1; + +-- @session:id=1&user=user_v1&password=111 +use db_v1; +select * from v_on_v; +-- @session + +-- ========================================================== +-- Test 4: INVOKER security type +-- ========================================================== +use db_v1; +set view_security_type = 'INVOKER'; +create view v_invoker as select * from t1; +set view_security_type = 'DEFINER'; + +create role role_invoker; +create user user_invoker identified by '111' default role role_invoker; +grant role_invoker to user_invoker; +grant connect on account * to role_invoker; +grant select on view db_v1.v_invoker to role_invoker; + +-- @session:id=3&user=user_invoker&password=111 +use db_v1; +-- This should FAIL because user has no privilege on t1 +select * from v_invoker; +-- @session + +-- Now grant privilege on t1 +grant select on table db_v1.t1 to role_invoker; + +-- @session:id=3&user=user_invoker&password=111 +use db_v1; +-- This should SUCCEED now +select * from v_invoker; +-- @session + +-- ========================================================== +-- Test 5: Other privilege types (INSERT/UPDATE/ALL) +-- ========================================================== +grant all on view db_v1.v1 to role_v1; +show grants for role_v1; + +-- ========================================================== +-- Test 6: Revoke and cleanup +-- ========================================================== +-- First revoke 'all' to be sure +revoke all on view db_v1.v1 from role_v1; +-- Now grant and revoke select +grant select on view db_v1.v1 to role_v1; +revoke select on view db_v1.v1 from role_v1; + +-- @session:id=1&user=user_v1&password=111 +use db_v1; +-- Should fail +select * from v1; +-- @session + +-- cleanup +drop user user_v1; +drop user user_no_db; +drop user user_invoker; +drop role role_v1; +drop role role_no_db; +drop role role_invoker; +drop database db_v1; +set global enable_privilege_cache = on; diff --git a/test/distributed/cases/zz_accesscontrol/grant_view_complex.result b/test/distributed/cases/zz_accesscontrol/grant_view_complex.result new file mode 100644 index 0000000000000..09f3d11913d37 --- /dev/null +++ b/test/distributed/cases/zz_accesscontrol/grant_view_complex.result @@ -0,0 +1,54 @@ +set global enable_privilege_cache = off; +drop user if exists user_complex; +drop role if exists role_level1, role_level2, role_level3; +drop database if exists db_complex; +create role role_level1; +create role role_level2; +create role role_level3; +create user user_complex identified by '111' default role role_level3; +create database db_complex; +use db_complex; +create table t1 (a int, b varchar(20)); +insert into t1 values (1, 'base'); +create view v1 as select * from t1; +create view v2 as select a from t1 where a > 0; +create view v3 as select * from v1; -- view on view +grant select on view db_complex.v1 to role_level1; +grant role_level1 to role_level2; +grant role_level2 to role_level3; +grant role_level3 to user_complex; +grant connect on account * to role_level1; +select obj_type, privilege_name from mo_catalog.mo_role_privs where role_name = 'role_level1'; +➤ obj_type[12,-1,0] ¦ privilege_name[12,-1,0] 𝄀 +view ¦ select 𝄀 +account ¦ connect +select current_role(); +➤ current_role()[12,-1,0] 𝄀 +role_level3 +select * from db_complex.v1; +➤ a[4,32,0] ¦ b[12,-1,0] 𝄀 +1 ¦ base +grant select on view db_complex.* to role_level1; +select * from db_complex.v2; +➤ a[4,32,0] 𝄀 +1 +select * from db_complex.v3; +➤ a[4,32,0] ¦ b[12,-1,0] 𝄀 +1 ¦ base +grant select, update, insert on view db_complex.v2 to role_level2; +select * from db_complex.v2; +➤ a[4,32,0] 𝄀 +1 +revoke update on view db_complex.v2 from role_level2; +select * from db_complex.v2; +➤ a[4,32,0] 𝄀 +1 +grant all on view db_complex.v3 to role_level1; +grant ownership on view db_complex.v3 to role_level2; +select * from db_complex.v3; +➤ a[4,32,0] ¦ b[12,-1,0] 𝄀 +1 ¦ base +drop user user_complex; +drop role role_level1, role_level2, role_level3; +drop database db_complex; +set global enable_privilege_cache = on; diff --git a/test/distributed/cases/zz_accesscontrol/grant_view_complex.sql b/test/distributed/cases/zz_accesscontrol/grant_view_complex.sql new file mode 100644 index 0000000000000..eafaa7b2fe4ab --- /dev/null +++ b/test/distributed/cases/zz_accesscontrol/grant_view_complex.sql @@ -0,0 +1,84 @@ +set global enable_privilege_cache = off; + +-- cleanup +drop user if exists user_complex; +drop role if exists role_level1, role_level2, role_level3; +drop database if exists db_complex; + +-- setup +create role role_level1; +create role role_level2; +create role role_level3; +create user user_complex identified by '111' default role role_level3; + +create database db_complex; +use db_complex; +create table t1 (a int, b varchar(20)); +insert into t1 values (1, 'base'); +create view v1 as select * from t1; +create view v2 as select a from t1 where a > 0; +create view v3 as select * from v1; -- view on view + +-- ========================================================== +-- Scenario 1: Multi-level Role Inheritance +-- ========================================================== +grant select on view db_complex.v1 to role_level1; +grant role_level1 to role_level2; +grant role_level2 to role_level3; +grant role_level3 to user_complex; +grant connect on account * to role_level1; + +-- verify storage +select obj_type, privilege_name from mo_catalog.mo_role_privs where role_name = 'role_level1'; + +-- @session:id=1&user=user_complex&password=111 +-- check current role +select current_role(); +-- Should succeed due to inheritance +select * from db_complex.v1; +-- @session + +-- ========================================================== +-- Scenario 2: Database level wildcard for Views +-- ========================================================== +grant select on view db_complex.* to role_level1; + +-- @session:id=1&user=user_complex&password=111 +-- Should succeed for all views in db_complex +select * from db_complex.v2; +select * from db_complex.v3; +-- @session + +-- ========================================================== +-- Scenario 3: Multiple privileges and partial revoke +-- ========================================================== +grant select, update, insert on view db_complex.v2 to role_level2; + +-- @session:id=1&user=user_complex&password=111 +-- show grants; +select * from db_complex.v2; +-- @session + +-- Revoke only one privilege +revoke update on view db_complex.v2 from role_level2; + +-- @session:id=1&user=user_complex&password=111 +-- select should still succeed +select * from db_complex.v2; +-- @session + +-- ========================================================== +-- Scenario 4: GRANT ALL and OWNERSHIP on View +-- ========================================================== +grant all on view db_complex.v3 to role_level1; +grant ownership on view db_complex.v3 to role_level2; + +-- @session:id=1&user=user_complex&password=111 +select * from db_complex.v3; +-- @session + +-- cleanup +drop user user_complex; +drop role role_level1, role_level2, role_level3; +drop database db_complex; +set global enable_privilege_cache = on; diff --git a/test/distributed/cases/zz_accesscontrol/grant_view_nested_security.result b/test/distributed/cases/zz_accesscontrol/grant_view_nested_security.result new file mode 100644 index 0000000000000..763e0a0628c89 --- /dev/null +++ b/test/distributed/cases/zz_accesscontrol/grant_view_nested_security.result @@ -0,0 +1,75 @@ +set global enable_privilege_cache = off; +drop user if exists user_def_a, user_def_b, user_def_c, user_query; +drop role if exists role_def_a, role_def_b, role_def_c, role_query; +drop database if exists db_nested; +create role role_def_a; +create role role_def_b; +create role role_def_c; +create role role_query; +create user user_def_a identified by '111' default role role_def_a; +create user user_def_b identified by '111' default role role_def_b; +create user user_def_c identified by '111' default role role_def_c; +create user user_query identified by '111' default role role_query; +grant role_def_a to user_def_a; +grant role_def_b to user_def_b; +grant role_def_c to user_def_c; +grant role_query to user_query; +create database db_nested; +use db_nested; +create table t_base(id int); +insert into t_base values (1), (2); +grant connect on account * to role_def_a; +grant connect on account * to role_def_b; +grant connect on account * to role_def_c; +grant connect on account * to role_query; +grant create view on database db_nested to role_def_a; +grant create view on database db_nested to role_def_b; +grant create view on database db_nested to role_def_c; +grant select on table db_nested.t_base to role_def_a; +use db_nested; +set view_security_type = 'DEFINER'; +create view v1 as select * from t_base; +grant select on view db_nested.v1 to role_def_b; +use db_nested; +set view_security_type = 'DEFINER'; +create view v2 as select * from v1; +grant select on view db_nested.v2 to role_def_c; +use db_nested; +set view_security_type = 'DEFINER'; +create view v3 as select * from v2; +grant select on view db_nested.v2 to role_query; +grant select on view db_nested.v3 to role_query; +revoke select on table db_nested.t_base from role_def_a; +grant select on table db_nested.t_base to role_def_b; +use db_nested; +select * from v2; +internal error: do not have privilege to execute the statement +revoke select on table db_nested.t_base from role_def_b; +grant select on table db_nested.t_base to role_def_a; +use db_nested; +select * from v2; +➤ id[4,32,0] 𝄀 +1 𝄀 +2 +revoke select on table db_nested.t_base from role_def_a; +grant select on table db_nested.t_base to role_def_c; +use db_nested; +select * from v3; +internal error: do not have privilege to execute the statement +revoke select on table db_nested.t_base from role_def_c; +grant select on table db_nested.t_base to role_def_a; +use db_nested; +select * from v3; +➤ id[4,32,0] 𝄀 +1 𝄀 +2 +drop user user_def_a; +drop user user_def_b; +drop user user_def_c; +drop user user_query; +drop role role_def_a; +drop role role_def_b; +drop role role_def_c; +drop role role_query; +drop database db_nested; +set global enable_privilege_cache = on; diff --git a/test/distributed/cases/zz_accesscontrol/grant_view_nested_security.sql b/test/distributed/cases/zz_accesscontrol/grant_view_nested_security.sql new file mode 100644 index 0000000000000..1d3e7598b1c5c --- /dev/null +++ b/test/distributed/cases/zz_accesscontrol/grant_view_nested_security.sql @@ -0,0 +1,122 @@ +set global enable_privilege_cache = off; + +-- cleanup +drop user if exists user_def_a, user_def_b, user_def_c, user_query; +drop role if exists role_def_a, role_def_b, role_def_c, role_query; +drop database if exists db_nested; + +-- setup +create role role_def_a; +create role role_def_b; +create role role_def_c; +create role role_query; + +create user user_def_a identified by '111' default role role_def_a; +create user user_def_b identified by '111' default role role_def_b; +create user user_def_c identified by '111' default role role_def_c; +create user user_query identified by '111' default role role_query; + +grant role_def_a to user_def_a; +grant role_def_b to user_def_b; +grant role_def_c to user_def_c; +grant role_query to user_query; + +create database db_nested; +use db_nested; +create table t_base(id int); +insert into t_base values (1), (2); + +grant connect on account * to role_def_a; +grant connect on account * to role_def_b; +grant connect on account * to role_def_c; +grant connect on account * to role_query; + +grant create view on database db_nested to role_def_a; +grant create view on database db_nested to role_def_b; +grant create view on database db_nested to role_def_c; + +-- allow user_def_a to create v1 +grant select on table db_nested.t_base to role_def_a; + +-- @session:id=1&user=user_def_a&password=111 +use db_nested; +set view_security_type = 'DEFINER'; +create view v1 as select * from t_base; +-- @session + +-- allow user_def_b to create v2 +grant select on view db_nested.v1 to role_def_b; + +-- @session:id=2&user=user_def_b&password=111 +use db_nested; +set view_security_type = 'DEFINER'; +create view v2 as select * from v1; +-- @session + +-- allow user_def_c to create v3 +grant select on view db_nested.v2 to role_def_c; + +-- @session:id=3&user=user_def_c&password=111 +use db_nested; +set view_security_type = 'DEFINER'; +create view v3 as select * from v2; +-- @session + +grant select on view db_nested.v2 to role_query; +grant select on view db_nested.v3 to role_query; + +-- ========================================================== +-- Case 1: Root definer has table privilege, intermediate definer does not +-- ========================================================== +revoke select on table db_nested.t_base from role_def_a; +grant select on table db_nested.t_base to role_def_b; + +-- @session:id=4&user=user_query&password=111 +use db_nested; +select * from v2; +-- @session + +-- ========================================================== +-- Case 2: Root definer lacks table privilege, intermediate definer has it +-- ========================================================== +revoke select on table db_nested.t_base from role_def_b; +grant select on table db_nested.t_base to role_def_a; + +-- @session:id=5&user=user_query&password=111 +use db_nested; +select * from v2; +-- @session + +-- ========================================================== +-- Case 3: Three-level chain with only root definer holding table privilege +-- ========================================================== +revoke select on table db_nested.t_base from role_def_a; +grant select on table db_nested.t_base to role_def_c; + +-- @session:id=6&user=user_query&password=111 +use db_nested; +select * from v3; +-- @session + +-- ========================================================== +-- Case 4: Three-level chain with only bottom definer holding table privilege +-- ========================================================== +revoke select on table db_nested.t_base from role_def_c; +grant select on table db_nested.t_base to role_def_a; + +-- @session:id=7&user=user_query&password=111 +use db_nested; +select * from v3; +-- @session + +-- cleanup +drop user user_def_a; +drop user user_def_b; +drop user user_def_c; +drop user user_query; +drop role role_def_a; +drop role role_def_b; +drop role role_def_c; +drop role role_query; +drop database db_nested; +set global enable_privilege_cache = on; diff --git a/test/distributed/cases/zz_accesscontrol/grant_view_non_sys.result b/test/distributed/cases/zz_accesscontrol/grant_view_non_sys.result new file mode 100644 index 0000000000000..de94da8475b93 --- /dev/null +++ b/test/distributed/cases/zz_accesscontrol/grant_view_non_sys.result @@ -0,0 +1,24 @@ +set global enable_privilege_cache = off; +drop account if exists acc_v1; +create account acc_v1 admin_name = 'admin' identified by '111'; +create role role_v1; +create user user_v1 identified by '111' default role role_v1; +grant role_v1 to user_v1; +create database db_v1; +use db_v1; +create table t1 (a int); +insert into t1 values (1); +create view v1 as select * from t1; +grant connect on account * to role_v1; +grant select on view db_v1.v1 to role_v1; +use db_v1; +select * from v1; +➤ a[4,32,0] 𝄀 +1 +revoke select on view db_v1.v1 from role_v1; +use db_v1; +select * from v1; +internal error: do not have privilege to execute the statement +drop database db_v1; +drop account acc_v1; +set global enable_privilege_cache = on; diff --git a/test/distributed/cases/zz_accesscontrol/grant_view_non_sys.sql b/test/distributed/cases/zz_accesscontrol/grant_view_non_sys.sql new file mode 100644 index 0000000000000..40e09bb4450ed --- /dev/null +++ b/test/distributed/cases/zz_accesscontrol/grant_view_non_sys.sql @@ -0,0 +1,48 @@ +set global enable_privilege_cache = off; + +-- cleanup +drop account if exists acc_v1; + +-- setup: create tenant +create account acc_v1 admin_name = 'admin' identified by '111'; + +-- @session:id=1&user=acc_v1:admin&password=111 +create role role_v1; +create user user_v1 identified by '111' default role role_v1; +grant role_v1 to user_v1; + +create database db_v1; +use db_v1; +create table t1 (a int); +insert into t1 values (1); +create view v1 as select * from t1; + +-- grant permissions +grant connect on account * to role_v1; +grant select on view db_v1.v1 to role_v1; + +-- @session:id=2&user=acc_v1:user_v1&password=111 +use db_v1; +-- verify select succeeds +select * from v1; +-- @session + +-- back to tenant admin +-- @session:id=1&user=acc_v1:admin&password=111 +revoke select on view db_v1.v1 from role_v1; +-- @session + +-- verify revoked in NEW session to avoid session-level cache issues +-- @session:id=3&user=acc_v1:user_v1&password=111 +use db_v1; +-- should fail +select * from v1; +-- @session + +-- cleanup +-- @session:id=1&user=acc_v1:admin&password=111 +drop database db_v1; +-- @session + +drop account acc_v1; +set global enable_privilege_cache = on; \ No newline at end of file diff --git a/test/distributed/cases/zz_accesscontrol/revoke_privs_role.result b/test/distributed/cases/zz_accesscontrol/revoke_privs_role.result index 74da045ff4f45..3d6d12b843186 100644 --- a/test/distributed/cases/zz_accesscontrol/revoke_privs_role.result +++ b/test/distributed/cases/zz_accesscontrol/revoke_privs_role.result @@ -49,9 +49,9 @@ internal error: do not have privilege to execute the statement drop table revoke_db_01.revoke_table_1; internal error: do not have privilege to execute the statement revoke create table,select,insert on database * from revoke_role_2,revoke_role_3; -internal error: the privilege "select" can only be granted to the object type "table" +internal error: the privilege "select" can only be granted to the object type "table" or "view" revoke if exists create table,select,insert on database * from revoke_role_2,revoke_role_3; -internal error: the privilege "select" can only be granted to the object type "table" +internal error: the privilege "select" can only be granted to the object type "table" or "view" revoke all on account * from revoke_role_2,revoke_role_3; revoke if exists all on account * from revoke_role_2,revoke_role_3; grant all on table *.* to revoke_role_4,revoke_role_5 with grant option;