@mikro-orm/better-sqlite 5.8.3-dev.3 → 6.0.0-dev.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  import { AbstractSqlConnection, type Knex } from '@mikro-orm/knex';
2
2
  export declare class BetterSqliteConnection extends AbstractSqlConnection {
3
+ createKnex(): void;
3
4
  connect(): Promise<void>;
4
5
  getDefaultClientUrl(): string;
5
6
  getClientUrl(): string;
@@ -6,10 +6,14 @@ const path_1 = require("path");
6
6
  const knex_1 = require("@mikro-orm/knex");
7
7
  const core_1 = require("@mikro-orm/core");
8
8
  class BetterSqliteConnection extends knex_1.AbstractSqlConnection {
9
- async connect() {
10
- await (0, fs_extra_1.ensureDir)((0, path_1.dirname)(this.config.get('dbName')));
9
+ createKnex() {
11
10
  this.getPatchedDialect();
12
11
  this.client = this.createKnexClient('better-sqlite3');
12
+ this.connected = true;
13
+ }
14
+ async connect() {
15
+ this.createKnex();
16
+ await (0, fs_extra_1.ensureDir)((0, path_1.dirname)(this.config.get('dbName')));
13
17
  await this.client.raw('pragma foreign_keys = on');
14
18
  }
15
19
  getDefaultClientUrl() {
@@ -107,8 +111,8 @@ class BetterSqliteConnection extends knex_1.AbstractSqlConnection {
107
111
  // no need for temp tables if we just add a column
108
112
  if (addColumnQuery) {
109
113
  const onUpdate = foreignInfo.onUpdate ? ` on update ${foreignInfo.onUpdate}` : '';
110
- const onDelete = foreignInfo.onDelete ? ` on delete ${foreignInfo.onDelete}` : '';
111
- addColumnQuery.sql += ` constraint ${keyName} references ${inTable} (${references})${onUpdate}${onDelete}`;
114
+ const deleteRule = foreignInfo.deleteRule ? ` on delete ${foreignInfo.deleteRule}` : '';
115
+ addColumnQuery.sql += ` constraint ${keyName} references ${inTable} (${references})${onUpdate}${deleteRule}`;
112
116
  return;
113
117
  }
114
118
  // eslint-disable-next-line @typescript-eslint/no-this-alias
@@ -1,4 +1,4 @@
1
- import { MikroORM, type Options, type Configuration, type IDatabaseDriver } from '@mikro-orm/core';
1
+ import { MikroORM, type Options, type IDatabaseDriver } from '@mikro-orm/core';
2
2
  import { BetterSqliteDriver } from './BetterSqliteDriver';
3
3
  /**
4
4
  * @inheritDoc
@@ -8,7 +8,11 @@ export declare class BetterSqliteMikroORM extends MikroORM<BetterSqliteDriver> {
8
8
  /**
9
9
  * @inheritDoc
10
10
  */
11
- static init<D extends IDatabaseDriver = BetterSqliteDriver>(options?: Options<D> | Configuration<D>, connect?: boolean): Promise<MikroORM<D>>;
11
+ static init<D extends IDatabaseDriver = BetterSqliteDriver>(options?: Options<D>): Promise<MikroORM<D>>;
12
+ /**
13
+ * @inheritDoc
14
+ */
15
+ static initSync<D extends IDatabaseDriver = BetterSqliteDriver>(options: Options<D>): MikroORM<D>;
12
16
  }
13
17
  export type BetterSqliteOptions = Options<BetterSqliteDriver>;
14
18
  export declare function defineBetterSqliteConfig(options: BetterSqliteOptions): Options<BetterSqliteDriver>;
@@ -7,15 +7,21 @@ const BetterSqliteDriver_1 = require("./BetterSqliteDriver");
7
7
  * @inheritDoc
8
8
  */
9
9
  class BetterSqliteMikroORM extends core_1.MikroORM {
10
+ static DRIVER = BetterSqliteDriver_1.BetterSqliteDriver;
10
11
  /**
11
12
  * @inheritDoc
12
13
  */
13
- static async init(options, connect = true) {
14
- return super.init(options, connect);
14
+ static async init(options) {
15
+ return super.init(options);
16
+ }
17
+ /**
18
+ * @inheritDoc
19
+ */
20
+ static initSync(options) {
21
+ return super.initSync(options);
15
22
  }
16
23
  }
17
24
  exports.BetterSqliteMikroORM = BetterSqliteMikroORM;
18
- BetterSqliteMikroORM.DRIVER = BetterSqliteDriver_1.BetterSqliteDriver;
19
25
  /* istanbul ignore next */
20
26
  function defineBetterSqliteConfig(options) {
21
27
  return (0, core_1.defineConfig)({ driver: BetterSqliteDriver_1.BetterSqliteDriver, ...options });
@@ -8,11 +8,8 @@ const knex_1 = require("@mikro-orm/knex");
8
8
  const BetterSqliteSchemaHelper_1 = require("./BetterSqliteSchemaHelper");
9
9
  const BetterSqliteExceptionConverter_1 = require("./BetterSqliteExceptionConverter");
10
10
  class BetterSqlitePlatform extends knex_1.AbstractSqlPlatform {
11
- constructor() {
12
- super(...arguments);
13
- this.schemaHelper = new BetterSqliteSchemaHelper_1.BetterSqliteSchemaHelper(this);
14
- this.exceptionConverter = new BetterSqliteExceptionConverter_1.BetterSqliteExceptionConverter();
15
- }
11
+ schemaHelper = new BetterSqliteSchemaHelper_1.BetterSqliteSchemaHelper(this);
12
+ exceptionConverter = new BetterSqliteExceptionConverter_1.BetterSqliteExceptionConverter();
16
13
  usesDefaultKeyword() {
17
14
  return false;
18
15
  }
@@ -68,7 +65,7 @@ class BetterSqlitePlatform extends knex_1.AbstractSqlPlatform {
68
65
  return value;
69
66
  }
70
67
  quoteVersionValue(value, prop) {
71
- if (prop.type.toLowerCase() === 'date') {
68
+ if (prop.runtimeType === 'Date') {
72
69
  return (0, sqlstring_sqlite_1.escape)(value, true, this.timezone).replace(/^'|\.\d{3}'$/g, '');
73
70
  }
74
71
  return value;
@@ -1,15 +1,15 @@
1
1
  import type { Connection, Dictionary } from '@mikro-orm/core';
2
- import { SchemaHelper, type AbstractSqlConnection, type Index, type Check } from '@mikro-orm/knex';
2
+ import { SchemaHelper, type AbstractSqlConnection, type IndexDef, type CheckDef } from '@mikro-orm/knex';
3
3
  export declare class BetterSqliteSchemaHelper extends SchemaHelper {
4
4
  disableForeignKeysSQL(): string;
5
5
  enableForeignKeysSQL(): string;
6
6
  supportsSchemaConstraints(): boolean;
7
7
  getListTablesSQL(): string;
8
8
  getColumns(connection: AbstractSqlConnection, tableName: string, schemaName?: string): Promise<any[]>;
9
- getEnumDefinitions(connection: AbstractSqlConnection, checks: Check[], tableName: string, schemaName: string): Promise<Dictionary<string[]>>;
10
- getPrimaryKeys(connection: AbstractSqlConnection, indexes: Index[] | undefined, tableName: string, schemaName?: string): Promise<string[]>;
11
- getIndexes(connection: AbstractSqlConnection, tableName: string, schemaName?: string): Promise<Index[]>;
12
- getChecks(connection: AbstractSqlConnection, tableName: string, schemaName?: string): Promise<Check[]>;
9
+ getEnumDefinitions(connection: AbstractSqlConnection, checks: CheckDef[], tableName: string, schemaName: string): Promise<Dictionary<string[]>>;
10
+ getPrimaryKeys(connection: AbstractSqlConnection, indexes: IndexDef[] | undefined, tableName: string, schemaName?: string): Promise<string[]>;
11
+ getIndexes(connection: AbstractSqlConnection, tableName: string, schemaName?: string): Promise<IndexDef[]>;
12
+ getChecks(connection: AbstractSqlConnection, tableName: string, schemaName?: string): Promise<CheckDef[]>;
13
13
  getForeignKeysSQL(tableName: string): string;
14
14
  mapForeignKeys(fks: any[], tableName: string): Dictionary;
15
15
  databaseExists(connection: Connection, name: string): Promise<boolean>;
@@ -67,6 +67,7 @@ class BetterSqliteSchemaHelper extends knex_1.SchemaHelper {
67
67
  columnNames: [col.name],
68
68
  keyName: 'primary',
69
69
  unique: true,
70
+ constraint: true,
70
71
  primary: true,
71
72
  });
72
73
  }
@@ -76,6 +77,7 @@ class BetterSqliteSchemaHelper extends knex_1.SchemaHelper {
76
77
  columnNames: [row.name],
77
78
  keyName: index.name,
78
79
  unique: !!index.unique,
80
+ constraint: !!index.unique,
79
81
  primary: false,
80
82
  })));
81
83
  }
package/index.mjs CHANGED
@@ -1,33 +1,213 @@
1
1
  import mod from "./index.js";
2
2
 
3
3
  export default mod;
4
+ export const ALIAS_REPLACEMENT = mod.ALIAS_REPLACEMENT;
5
+ export const ALIAS_REPLACEMENT_RE = mod.ALIAS_REPLACEMENT_RE;
6
+ export const ARRAY_OPERATORS = mod.ARRAY_OPERATORS;
7
+ export const AbstractNamingStrategy = mod.AbstractNamingStrategy;
8
+ export const AbstractSchemaGenerator = mod.AbstractSchemaGenerator;
4
9
  export const AbstractSqlConnection = mod.AbstractSqlConnection;
5
10
  export const AbstractSqlDriver = mod.AbstractSqlDriver;
6
11
  export const AbstractSqlPlatform = mod.AbstractSqlPlatform;
12
+ export const AfterCreate = mod.AfterCreate;
13
+ export const AfterDelete = mod.AfterDelete;
14
+ export const AfterUpdate = mod.AfterUpdate;
15
+ export const AfterUpsert = mod.AfterUpsert;
16
+ export const ArrayCollection = mod.ArrayCollection;
7
17
  export const ArrayCriteriaNode = mod.ArrayCriteriaNode;
18
+ export const ArrayType = mod.ArrayType;
19
+ export const BaseEntity = mod.BaseEntity;
20
+ export const BeforeCreate = mod.BeforeCreate;
21
+ export const BeforeDelete = mod.BeforeDelete;
22
+ export const BeforeUpdate = mod.BeforeUpdate;
23
+ export const BeforeUpsert = mod.BeforeUpsert;
8
24
  export const BetterSqliteConnection = mod.BetterSqliteConnection;
9
25
  export const BetterSqliteDriver = mod.BetterSqliteDriver;
10
26
  export const BetterSqliteExceptionConverter = mod.BetterSqliteExceptionConverter;
11
27
  export const BetterSqlitePlatform = mod.BetterSqlitePlatform;
12
28
  export const BetterSqliteSchemaHelper = mod.BetterSqliteSchemaHelper;
29
+ export const BigIntType = mod.BigIntType;
30
+ export const BlobType = mod.BlobType;
31
+ export const BooleanType = mod.BooleanType;
32
+ export const Cascade = mod.Cascade;
33
+ export const ChangeSet = mod.ChangeSet;
34
+ export const ChangeSetComputer = mod.ChangeSetComputer;
35
+ export const ChangeSetPersister = mod.ChangeSetPersister;
36
+ export const ChangeSetType = mod.ChangeSetType;
37
+ export const Check = mod.Check;
38
+ export const CheckConstraintViolationException = mod.CheckConstraintViolationException;
39
+ export const Collection = mod.Collection;
40
+ export const CommitOrderCalculator = mod.CommitOrderCalculator;
41
+ export const Configuration = mod.Configuration;
42
+ export const ConfigurationLoader = mod.ConfigurationLoader;
43
+ export const Connection = mod.Connection;
44
+ export const ConnectionException = mod.ConnectionException;
45
+ export const ConstraintViolationException = mod.ConstraintViolationException;
46
+ export const CreateRequestContext = mod.CreateRequestContext;
13
47
  export const CriteriaNode = mod.CriteriaNode;
14
48
  export const CriteriaNodeFactory = mod.CriteriaNodeFactory;
49
+ export const Cursor = mod.Cursor;
50
+ export const DatabaseDriver = mod.DatabaseDriver;
51
+ export const DatabaseObjectExistsException = mod.DatabaseObjectExistsException;
52
+ export const DatabaseObjectNotFoundException = mod.DatabaseObjectNotFoundException;
15
53
  export const DatabaseSchema = mod.DatabaseSchema;
16
54
  export const DatabaseTable = mod.DatabaseTable;
55
+ export const DateTimeType = mod.DateTimeType;
56
+ export const DateType = mod.DateType;
57
+ export const DeadlockException = mod.DeadlockException;
58
+ export const DecimalType = mod.DecimalType;
59
+ export const DefaultLogger = mod.DefaultLogger;
60
+ export const DoubleType = mod.DoubleType;
61
+ export const DriverException = mod.DriverException;
62
+ export const EagerProps = mod.EagerProps;
63
+ export const Embeddable = mod.Embeddable;
64
+ export const Embedded = mod.Embedded;
65
+ export const EnsureRequestContext = mod.EnsureRequestContext;
66
+ export const Entity = mod.Entity;
67
+ export const EntityAssigner = mod.EntityAssigner;
68
+ export const EntityCaseNamingStrategy = mod.EntityCaseNamingStrategy;
69
+ export const EntityComparator = mod.EntityComparator;
70
+ export const EntityFactory = mod.EntityFactory;
71
+ export const EntityHelper = mod.EntityHelper;
72
+ export const EntityIdentifier = mod.EntityIdentifier;
73
+ export const EntityLoader = mod.EntityLoader;
17
74
  export const EntityManager = mod.EntityManager;
75
+ export const EntityManagerType = mod.EntityManagerType;
76
+ export const EntityMetadata = mod.EntityMetadata;
18
77
  export const EntityRepository = mod.EntityRepository;
78
+ export const EntityRepositoryType = mod.EntityRepositoryType;
79
+ export const EntitySchema = mod.EntitySchema;
80
+ export const EntitySerializer = mod.EntitySerializer;
81
+ export const EntityTransformer = mod.EntityTransformer;
82
+ export const EntityValidator = mod.EntityValidator;
83
+ export const Enum = mod.Enum;
84
+ export const EnumArrayType = mod.EnumArrayType;
85
+ export const EnumType = mod.EnumType;
86
+ export const EventManager = mod.EventManager;
87
+ export const EventType = mod.EventType;
88
+ export const EventTypeMap = mod.EventTypeMap;
89
+ export const ExceptionConverter = mod.ExceptionConverter;
90
+ export const FileCacheAdapter = mod.FileCacheAdapter;
91
+ export const Filter = mod.Filter;
92
+ export const FloatType = mod.FloatType;
93
+ export const FlushMode = mod.FlushMode;
94
+ export const ForeignKeyConstraintViolationException = mod.ForeignKeyConstraintViolationException;
95
+ export const Formula = mod.Formula;
96
+ export const GeneratedCacheAdapter = mod.GeneratedCacheAdapter;
97
+ export const GroupOperator = mod.GroupOperator;
98
+ export const HiddenProps = mod.HiddenProps;
99
+ export const Hydrator = mod.Hydrator;
100
+ export const IdentityMap = mod.IdentityMap;
101
+ export const Index = mod.Index;
102
+ export const IntegerType = mod.IntegerType;
103
+ export const InvalidFieldNameException = mod.InvalidFieldNameException;
104
+ export const IsolationLevel = mod.IsolationLevel;
105
+ export const JsonProperty = mod.JsonProperty;
106
+ export const JsonType = mod.JsonType;
19
107
  export const Knex = mod.Knex;
108
+ export const LoadStrategy = mod.LoadStrategy;
109
+ export const LockMode = mod.LockMode;
110
+ export const LockWaitTimeoutException = mod.LockWaitTimeoutException;
111
+ export const ManyToMany = mod.ManyToMany;
112
+ export const ManyToOne = mod.ManyToOne;
113
+ export const MediumIntType = mod.MediumIntType;
114
+ export const MemoryCacheAdapter = mod.MemoryCacheAdapter;
115
+ export const MetadataDiscovery = mod.MetadataDiscovery;
116
+ export const MetadataError = mod.MetadataError;
117
+ export const MetadataProvider = mod.MetadataProvider;
118
+ export const MetadataStorage = mod.MetadataStorage;
119
+ export const MetadataValidator = mod.MetadataValidator;
20
120
  export const MikroORM = mod.MikroORM;
121
+ export const MongoNamingStrategy = mod.MongoNamingStrategy;
21
122
  export const MonkeyPatchable = mod.MonkeyPatchable;
123
+ export const NodeState = mod.NodeState;
124
+ export const NonUniqueFieldNameException = mod.NonUniqueFieldNameException;
125
+ export const NotFoundError = mod.NotFoundError;
126
+ export const NotNullConstraintViolationException = mod.NotNullConstraintViolationException;
127
+ export const NullCacheAdapter = mod.NullCacheAdapter;
128
+ export const NullHighlighter = mod.NullHighlighter;
129
+ export const ObjectBindingPattern = mod.ObjectBindingPattern;
22
130
  export const ObjectCriteriaNode = mod.ObjectCriteriaNode;
131
+ export const ObjectHydrator = mod.ObjectHydrator;
132
+ export const OnInit = mod.OnInit;
133
+ export const OnLoad = mod.OnLoad;
134
+ export const OneToMany = mod.OneToMany;
135
+ export const OneToOne = mod.OneToOne;
136
+ export const OptimisticLockError = mod.OptimisticLockError;
137
+ export const OptionalProps = mod.OptionalProps;
138
+ export const PlainObject = mod.PlainObject;
139
+ export const Platform = mod.Platform;
140
+ export const PopulateHint = mod.PopulateHint;
141
+ export const PrimaryKey = mod.PrimaryKey;
142
+ export const PrimaryKeyProp = mod.PrimaryKeyProp;
143
+ export const Property = mod.Property;
23
144
  export const QueryBuilder = mod.QueryBuilder;
24
145
  export const QueryBuilderHelper = mod.QueryBuilderHelper;
146
+ export const QueryFlag = mod.QueryFlag;
147
+ export const QueryHelper = mod.QueryHelper;
148
+ export const QueryOperator = mod.QueryOperator;
149
+ export const QueryOrder = mod.QueryOrder;
150
+ export const QueryOrderNumeric = mod.QueryOrderNumeric;
25
151
  export const QueryType = mod.QueryType;
152
+ export const RawQueryFragment = mod.RawQueryFragment;
153
+ export const ReadOnlyException = mod.ReadOnlyException;
154
+ export const Ref = mod.Ref;
155
+ export const Reference = mod.Reference;
156
+ export const ReferenceKind = mod.ReferenceKind;
157
+ export const ReflectMetadataProvider = mod.ReflectMetadataProvider;
158
+ export const RequestContext = mod.RequestContext;
159
+ export const SCALAR_TYPES = mod.SCALAR_TYPES;
26
160
  export const ScalarCriteriaNode = mod.ScalarCriteriaNode;
161
+ export const ScalarReference = mod.ScalarReference;
27
162
  export const SchemaComparator = mod.SchemaComparator;
28
163
  export const SchemaGenerator = mod.SchemaGenerator;
29
164
  export const SchemaHelper = mod.SchemaHelper;
165
+ export const SerializationContext = mod.SerializationContext;
166
+ export const SerializedPrimaryKey = mod.SerializedPrimaryKey;
167
+ export const ServerException = mod.ServerException;
168
+ export const SimpleLogger = mod.SimpleLogger;
169
+ export const SmallIntType = mod.SmallIntType;
30
170
  export const SqlEntityManager = mod.SqlEntityManager;
31
171
  export const SqlEntityRepository = mod.SqlEntityRepository;
172
+ export const SqlSchemaGenerator = mod.SqlSchemaGenerator;
173
+ export const StringType = mod.StringType;
174
+ export const SyntaxErrorException = mod.SyntaxErrorException;
175
+ export const TableExistsException = mod.TableExistsException;
176
+ export const TableNotFoundException = mod.TableNotFoundException;
177
+ export const TextType = mod.TextType;
178
+ export const TimeType = mod.TimeType;
179
+ export const TinyIntType = mod.TinyIntType;
180
+ export const TransactionContext = mod.TransactionContext;
181
+ export const TransactionEventBroadcaster = mod.TransactionEventBroadcaster;
182
+ export const Type = mod.Type;
183
+ export const Uint8ArrayType = mod.Uint8ArrayType;
184
+ export const UnderscoreNamingStrategy = mod.UnderscoreNamingStrategy;
185
+ export const Unique = mod.Unique;
186
+ export const UniqueConstraintViolationException = mod.UniqueConstraintViolationException;
187
+ export const UnitOfWork = mod.UnitOfWork;
188
+ export const UnknownType = mod.UnknownType;
189
+ export const Utils = mod.Utils;
190
+ export const UuidType = mod.UuidType;
191
+ export const ValidationError = mod.ValidationError;
192
+ export const WrappedEntity = mod.WrappedEntity;
193
+ export const assign = mod.assign;
194
+ export const colors = mod.colors;
195
+ export const compareArrays = mod.compareArrays;
196
+ export const compareBooleans = mod.compareBooleans;
197
+ export const compareBuffers = mod.compareBuffers;
198
+ export const compareObjects = mod.compareObjects;
32
199
  export const defineConfig = mod.defineConfig;
200
+ export const equals = mod.equals;
201
+ export const getOnConflictFields = mod.getOnConflictFields;
202
+ export const getOnConflictReturningFields = mod.getOnConflictReturningFields;
203
+ export const helper = mod.helper;
33
204
  export const knex = mod.knex;
205
+ export const parseJsonSafe = mod.parseJsonSafe;
206
+ export const raw = mod.raw;
207
+ export const ref = mod.ref;
208
+ export const rel = mod.rel;
209
+ export const serialize = mod.serialize;
210
+ export const sql = mod.sql;
211
+ export const t = mod.t;
212
+ export const types = mod.types;
213
+ export const wrap = mod.wrap;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikro-orm/better-sqlite",
3
- "version": "5.8.3-dev.3",
3
+ "version": "6.0.0-dev.100",
4
4
  "description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
5
5
  "main": "index.js",
6
6
  "module": "index.mjs",
@@ -46,41 +46,27 @@
46
46
  },
47
47
  "homepage": "https://mikro-orm.io",
48
48
  "engines": {
49
- "node": ">= 14.0.0"
49
+ "node": ">= 18.12.0"
50
50
  },
51
51
  "scripts": {
52
52
  "build": "yarn clean && yarn compile && yarn copy && yarn run -T gen-esm-wrapper index.js index.mjs",
53
- "clean": "rimraf ./dist",
54
- "compile": "tsc -p tsconfig.build.json",
53
+ "clean": "yarn run -T rimraf ./dist",
54
+ "compile": "yarn run -T tsc -p tsconfig.build.json",
55
55
  "copy": "node ../../scripts/copy.mjs"
56
56
  },
57
57
  "publishConfig": {
58
58
  "access": "public"
59
59
  },
60
60
  "dependencies": {
61
- "@mikro-orm/knex": "~5.8.3-dev.3",
61
+ "@mikro-orm/knex": "~6.0.0-dev.100",
62
62
  "better-sqlite3": "8.6.0",
63
63
  "fs-extra": "11.1.1",
64
64
  "sqlstring-sqlite": "0.1.1"
65
65
  },
66
66
  "devDependencies": {
67
- "@mikro-orm/core": "^5.8.2"
67
+ "@mikro-orm/core": "^5.8.1"
68
68
  },
69
69
  "peerDependencies": {
70
- "@mikro-orm/core": "~5.8.3-dev.3",
71
- "@mikro-orm/entity-generator": "~5.8.3-dev.3",
72
- "@mikro-orm/migrations": "~5.8.3-dev.3",
73
- "@mikro-orm/seeder": "~5.8.3-dev.3"
74
- },
75
- "peerDependenciesMeta": {
76
- "@mikro-orm/entity-generator": {
77
- "optional": true
78
- },
79
- "@mikro-orm/migrations": {
80
- "optional": true
81
- },
82
- "@mikro-orm/seeder": {
83
- "optional": true
84
- }
70
+ "@mikro-orm/core": "~6.0.0-dev.100"
85
71
  }
86
72
  }