@joystick.js/db-canary 0.0.0-canary.2298 → 0.0.0-canary.2300
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/index.js +1 -1
- package/package.json +2 -2
- package/src/server/index.js +17 -12
- package/test/test_auth_data_10_1760379666950.mdb +0 -0
- package/test/test_auth_data_10_1760379666950.mdb-lock +0 -0
- package/test/test_auth_data_10_1760380170260.mdb +0 -0
- package/test/test_auth_data_10_1760380170260.mdb-lock +0 -0
- package/test/test_auth_data_11_1760379667065.mdb +0 -0
- package/test/test_auth_data_11_1760379667065.mdb-lock +0 -0
- package/test/test_auth_data_11_1760380170370.mdb +0 -0
- package/test/test_auth_data_11_1760380170370.mdb-lock +0 -0
- package/test/test_auth_data_12_1760379667181.mdb +0 -0
- package/test/test_auth_data_12_1760379667181.mdb-lock +0 -0
- package/test/test_auth_data_12_1760380170485.mdb +0 -0
- package/test/test_auth_data_12_1760380170485.mdb-lock +0 -0
- package/test/test_auth_data_13_1760379667306.mdb +0 -0
- package/test/test_auth_data_13_1760379667306.mdb-lock +0 -0
- package/test/test_auth_data_13_1760380170603.mdb +0 -0
- package/test/test_auth_data_13_1760380170603.mdb-lock +0 -0
- package/test/test_auth_data_14_1760379667422.mdb +0 -0
- package/test/test_auth_data_14_1760379667422.mdb-lock +0 -0
- package/test/test_auth_data_14_1760380170716.mdb +0 -0
- package/test/test_auth_data_14_1760380170716.mdb-lock +0 -0
- package/test/test_auth_data_15_1760379667537.mdb +0 -0
- package/test/test_auth_data_15_1760379667537.mdb-lock +0 -0
- package/test/test_auth_data_15_1760380170829.mdb +0 -0
- package/test/test_auth_data_15_1760380170829.mdb-lock +0 -0
- package/test/test_auth_data_16_1760379667651.mdb +0 -0
- package/test/test_auth_data_16_1760379667651.mdb-lock +0 -0
- package/test/test_auth_data_16_1760380170941.mdb +0 -0
- package/test/test_auth_data_16_1760380170941.mdb-lock +0 -0
- package/test/test_auth_data_17_1760379667764.mdb +0 -0
- package/test/test_auth_data_17_1760379667764.mdb-lock +0 -0
- package/test/test_auth_data_17_1760380171059.mdb +0 -0
- package/test/test_auth_data_17_1760380171059.mdb-lock +0 -0
- package/test/test_auth_data_18_1760379667876.mdb +0 -0
- package/test/test_auth_data_18_1760379667876.mdb-lock +0 -0
- package/test/test_auth_data_18_1760380171171.mdb +0 -0
- package/test/test_auth_data_18_1760380171171.mdb-lock +0 -0
- package/test/test_auth_data_19_1760379667989.mdb +0 -0
- package/test/test_auth_data_19_1760379667989.mdb-lock +0 -0
- package/test/test_auth_data_19_1760380171284.mdb +0 -0
- package/test/test_auth_data_19_1760380171284.mdb-lock +0 -0
- package/test/test_auth_data_1_1760379661756.mdb +0 -0
- package/test/test_auth_data_1_1760379661756.mdb-lock +0 -0
- package/test/test_auth_data_1_1760380165028.mdb +0 -0
- package/test/test_auth_data_1_1760380165028.mdb-lock +0 -0
- package/test/test_auth_data_20_1760379668104.mdb +0 -0
- package/test/test_auth_data_20_1760379668104.mdb-lock +0 -0
- package/test/test_auth_data_20_1760380171396.mdb +0 -0
- package/test/test_auth_data_20_1760380171396.mdb-lock +0 -0
- package/test/test_auth_data_21_1760379668228.mdb +0 -0
- package/test/test_auth_data_21_1760379668228.mdb-lock +0 -0
- package/test/test_auth_data_21_1760380171509.mdb +0 -0
- package/test/test_auth_data_21_1760380171509.mdb-lock +0 -0
- package/test/test_auth_data_22_1760379668344.mdb +0 -0
- package/test/test_auth_data_22_1760379668344.mdb-lock +0 -0
- package/test/test_auth_data_22_1760380171623.mdb +0 -0
- package/test/test_auth_data_22_1760380171623.mdb-lock +0 -0
- package/test/test_auth_data_23_1760379668475.mdb +0 -0
- package/test/test_auth_data_23_1760379668475.mdb-lock +0 -0
- package/test/test_auth_data_23_1760380171735.mdb +0 -0
- package/test/test_auth_data_23_1760380171735.mdb-lock +0 -0
- package/test/test_auth_data_24_1760379668593.mdb +0 -0
- package/test/test_auth_data_24_1760379668593.mdb-lock +0 -0
- package/test/test_auth_data_24_1760380171848.mdb +0 -0
- package/test/test_auth_data_24_1760380171848.mdb-lock +0 -0
- package/test/test_auth_data_25_1760379668706.mdb +0 -0
- package/test/test_auth_data_25_1760379668706.mdb-lock +0 -0
- package/test/test_auth_data_25_1760380171961.mdb +0 -0
- package/test/test_auth_data_25_1760380171961.mdb-lock +0 -0
- package/test/test_auth_data_26_1760379668821.mdb +0 -0
- package/test/test_auth_data_26_1760379668821.mdb-lock +0 -0
- package/test/test_auth_data_26_1760380172073.mdb +0 -0
- package/test/test_auth_data_26_1760380172073.mdb-lock +0 -0
- package/test/test_auth_data_27_1760379668938.mdb +0 -0
- package/test/test_auth_data_27_1760379668938.mdb-lock +0 -0
- package/test/test_auth_data_27_1760380172185.mdb +0 -0
- package/test/test_auth_data_27_1760380172185.mdb-lock +0 -0
- package/test/test_auth_data_28_1760379669055.mdb +0 -0
- package/test/test_auth_data_28_1760379669055.mdb-lock +0 -0
- package/test/test_auth_data_28_1760380172299.mdb +0 -0
- package/test/test_auth_data_28_1760380172299.mdb-lock +0 -0
- package/test/test_auth_data_29_1760379669174.mdb +0 -0
- package/test/test_auth_data_29_1760379669174.mdb-lock +0 -0
- package/test/test_auth_data_29_1760380172411.mdb +0 -0
- package/test/test_auth_data_29_1760380172411.mdb-lock +0 -0
- package/test/test_auth_data_2_1760379662196.mdb +0 -0
- package/test/test_auth_data_2_1760379662196.mdb-lock +0 -0
- package/test/test_auth_data_2_1760380165455.mdb +0 -0
- package/test/test_auth_data_2_1760380165455.mdb-lock +0 -0
- package/test/test_auth_data_30_1760379669294.mdb +0 -0
- package/test/test_auth_data_30_1760379669294.mdb-lock +0 -0
- package/test/test_auth_data_30_1760380172524.mdb +0 -0
- package/test/test_auth_data_30_1760380172524.mdb-lock +0 -0
- package/test/test_auth_data_31_1760379669414.mdb +0 -0
- package/test/test_auth_data_31_1760379669414.mdb-lock +0 -0
- package/test/test_auth_data_31_1760380172636.mdb +0 -0
- package/test/test_auth_data_31_1760380172636.mdb-lock +0 -0
- package/test/test_auth_data_32_1760379669532.mdb +0 -0
- package/test/test_auth_data_32_1760379669532.mdb-lock +0 -0
- package/test/test_auth_data_32_1760380172747.mdb +0 -0
- package/test/test_auth_data_32_1760380172747.mdb-lock +0 -0
- package/test/test_auth_data_33_1760379669647.mdb +0 -0
- package/test/test_auth_data_33_1760379669647.mdb-lock +0 -0
- package/test/test_auth_data_33_1760380172858.mdb +0 -0
- package/test/test_auth_data_33_1760380172858.mdb-lock +0 -0
- package/test/test_auth_data_34_1760379669764.mdb +0 -0
- package/test/test_auth_data_34_1760379669764.mdb-lock +0 -0
- package/test/test_auth_data_34_1760380172972.mdb +0 -0
- package/test/test_auth_data_34_1760380172972.mdb-lock +0 -0
- package/test/test_auth_data_3_1760379662548.mdb +0 -0
- package/test/test_auth_data_3_1760379662548.mdb-lock +0 -0
- package/test/test_auth_data_3_1760380165827.mdb +0 -0
- package/test/test_auth_data_3_1760380165827.mdb-lock +0 -0
- package/test/test_auth_data_4_1760379662662.mdb +0 -0
- package/test/test_auth_data_4_1760379662662.mdb-lock +0 -0
- package/test/test_auth_data_4_1760380165942.mdb +0 -0
- package/test/test_auth_data_4_1760380165942.mdb-lock +0 -0
- package/test/test_auth_data_5_1760379663211.mdb +0 -0
- package/test/test_auth_data_5_1760379663211.mdb-lock +0 -0
- package/test/test_auth_data_5_1760380166531.mdb +0 -0
- package/test/test_auth_data_5_1760380166531.mdb-lock +0 -0
- package/test/test_auth_data_6_1760379663749.mdb +0 -0
- package/test/test_auth_data_6_1760379663749.mdb-lock +0 -0
- package/test/test_auth_data_6_1760380167096.mdb +0 -0
- package/test/test_auth_data_6_1760380167096.mdb-lock +0 -0
- package/test/test_auth_data_7_1760379665141.mdb +0 -0
- package/test/test_auth_data_7_1760379665141.mdb-lock +0 -0
- package/test/test_auth_data_7_1760380168513.mdb +0 -0
- package/test/test_auth_data_7_1760380168513.mdb-lock +0 -0
- package/test/test_auth_data_8_1760379665811.mdb +0 -0
- package/test/test_auth_data_8_1760379665811.mdb-lock +0 -0
- package/test/test_auth_data_8_1760380169090.mdb +0 -0
- package/test/test_auth_data_8_1760380169090.mdb-lock +0 -0
- package/test/test_auth_data_9_1760379666834.mdb +0 -0
- package/test/test_auth_data_9_1760379666834.mdb-lock +0 -0
- package/test/test_auth_data_9_1760380170146.mdb +0 -0
- package/test/test_auth_data_9_1760380170146.mdb-lock +0 -0
package/dist/server/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import z from"net";import O from"crypto";import{decode as
|
|
1
|
+
import z from"net";import O from"crypto";import{decode as E}from"msgpackr";import I from"./lib/op_types.js";import v from"./lib/safe_json_parse.js";import{load_settings as m,get_settings as f,get_port_configuration as _}from"./lib/load_settings.js";import{send_error as p}from"./lib/send_response.js";import{start_cluster as D}from"./cluster/index.js";import w from"./lib/logger.js";import{initialize_database as N,cleanup_database as R}from"./lib/query_engine.js";import{create_message_parser as C,encode_message as b}from"./lib/tcp_protocol.js";import{create_connection_manager as q}from"./lib/connection_manager.js";import{shutdown_write_queue as A}from"./lib/write_queue.js";import{get_client_ip as B,is_rate_limited as $,initialize_auth_manager as F,reset_auth_state as P}from"./lib/auth_manager.js";import{set_storage_engine as J,verify_credentials as K,setup_initial_admin as S,initialize_user_auth_manager as j,reset_auth_state as G,get_auth_stats as x}from"./lib/user_auth_manager.js";import{initialize_api_key_manager as M}from"./lib/api_key_manager.js";import{is_development_mode as g,display_development_startup_message as U,warn_undefined_node_env as V}from"./lib/development_mode.js";import{restore_backup as H,start_backup_schedule as W,stop_backup_schedule as Y}from"./lib/backup_manager.js";import{initialize_simple_sync_manager as L,shutdown_simple_sync_manager as Q}from"./lib/simple_sync_manager.js";import{initialize_sync_receiver as X,shutdown_sync_receiver as Z}from"./lib/sync_receiver.js";import{handle_database_operation as ee,handle_admin_operation as te,handle_ping_operation as re}from"./lib/operation_dispatcher.js";import{start_http_server as se,stop_http_server as ne}from"./lib/http_server.js";import{create_recovery_token as oe,initialize_recovery_manager as k,reset_recovery_state as ae}from"./lib/recovery_manager.js";import{has_settings as ie}from"./lib/load_settings.js";const i=new Set;let a=null;const ce=()=>O.randomBytes(16).toString("hex"),_e=e=>e&&e.username&&e.password,d=e=>({ok:0,error:e}),pe=e=>({ok:1,version:"1.0.0",message:"Authentication successful",role:e?.role||"user"}),l=(e,t)=>{const r=b(t);e.write(r),e.end()},c=(e,t)=>{const r=b(t);e.write(r)},ue=async(e,t={})=>{if(!_e(t)){const r=d("Authentication requires username and password");l(e,r);return}try{const r=B(e);if($(r)){const n=d("Too many failed attempts. Please try again later.");l(e,n);return}const s=await K(t.username,t.password,r);if(s.success){i.add(e.id);const n=pe(s.user);c(e,n)}else{const n=d(s.error||"Authentication failed");l(e,n)}}catch{const s=d("Authentication failed");l(e,s)}},de=e=>({ok:1,password:e,message:"Authentication setup completed successfully. Save this password - it will not be shown again."}),h=e=>({ok:0,error:`Setup error: ${e}`}),le=async(e,t={})=>{try{if((await x()).configured){const u=h("Authentication already configured");c(e,u);return}const s=ce(),n=await S("admin",s,"admin@localhost.local");if(!n.success){const u=h(n.error);c(e,u);return}const o=de(s);c(e,o)}catch(r){const s=h(r.message);c(e,s)}},me=(e="")=>{if(!e)throw new Error("Must pass an op type for operation.");return I.includes(e)},fe=e=>v(e),ge=e=>{try{const t=E(e);return typeof t=="string"?v(t):t}catch{return null}},ft=e=>{try{return typeof e=="string"?fe(e):Buffer.isBuffer(e)?ge(e):e}catch{return null}},y=e=>g()?!0:i.has(e.id),he=async(e,t)=>{if(e?.restore_from)try{t.info("Startup restore requested",{backup_filename:e.restore_from});const r=await H(e.restore_from);t.info("Startup restore completed",{backup_filename:e.restore_from,duration_ms:r.duration_ms});const s={...e};delete s.restore_from,process.env.JOYSTICK_DB_SETTINGS=JSON.stringify(s),m(),t.info("Removed restore_from from settings after successful restore")}catch(r){t.error("Startup restore failed",{backup_filename:e.restore_from,error:r.message}),t.info("Continuing with fresh database after restore failure")}},ye=()=>{try{return m(),f()}catch{return null}},ve=async e=>{const{tcp_port:t}=_(),r=e?.data_path||`./.joystick/data/joystickdb_${t}`,s=N(r);if(F(),j(),J(s),g()){if(process.env.NODE_ENV!=="test")try{const n=await x();(!n.configured||n.user_count===0)&&(await S("admin","password","admin@localhost.local")).success&&(console.log("Development admin user created automatically"),console.log(" Username: admin"),console.log(" Password: password"))}catch(n){console.log("Development admin user creation failed:",n.message)}}else await M();k()},we=e=>{try{L(),e.info("Simple sync manager initialized")}catch(t){e.warn("Failed to initialize simple sync manager",{error:t.message})}},be=e=>{X().then(()=>{e.info("Sync receiver initialized")}).catch(t=>{e.warn("Failed to initialize sync receiver",{error:t.message})})},Se=(e,t)=>{if(e?.s3)try{W(),t.info("Backup scheduling started")}catch(r){t.warn("Failed to start backup scheduling",{error:r.message})}},xe=async(e,t)=>{try{const r=await se(e);return r&&t.info("HTTP server started",{http_port:e}),r}catch(r){return t.warn("Failed to start HTTP server",{error:r.message}),null}},ke=()=>{if(g()){const{tcp_port:e,http_port:t}=_();U(e,t)}else V()},Te=()=>q({max_connections:1e3,idle_timeout:600*1e3,request_timeout:5*1e3}),ze=async(e,t,r,s)=>{a.update_activity(e.id);try{const n=r.parse_messages(t);for(const o of n)await Oe(e,o,t.length,s)}catch(n){s.error("Message parsing failed",{client_id:e.id,error:n.message}),p(e,{message:"Invalid message format"}),e.end()}},Oe=async(e,t,r,s)=>{const n=t,o=n?.op||null;if(!o){p(e,{message:"Missing operation type"});return}if(!me(o)){p(e,{message:"Invalid operation type"});return}const T=a.create_request_timeout(e.id,o);try{await Ee(e,o,n,r)}finally{clearTimeout(T)}},Ee=async(e,t,r,s)=>{const n=r?.data||{};switch(t){case"authentication":await ue(e,n);break;case"setup":await le(e,n);break;case"insert_one":case"update_one":case"delete_one":case"delete_many":case"bulk_write":case"find_one":case"find":case"count_documents":case"create_index":case"drop_index":case"get_indexes":await ee(e,t,n,y,s,a,i);break;case"ping":re(e);break;case"admin":await te(e,n,y,a,i);break;case"reload":await Ie(e);break;default:p(e,{message:`Operation ${t} not implemented`})}},Ie=async e=>{if(!y(e)){p(e,{message:"Authentication required"});return}try{const t=De(),r=await Ne(),s=Re(t,r);c(e,s)}catch(t){const r={ok:0,error:`Reload operation failed: ${t.message}`};c(e,r)}},De=()=>{try{return f()}catch{return null}},Ne=async()=>{try{return await m(),f()}catch{return{port:1983,authentication:{}}}},Re=(e,t)=>({ok:1,status:"success",message:"Configuration reloaded successfully",changes:{port_changed:e?e.port!==t.port:!1,authentication_changed:e?e.authentication?.password_hash!==t.authentication?.password_hash:!1},timestamp:new Date().toISOString()}),Ce=(e,t)=>{t.info("Client disconnected",{socket_id:e.id}),i.delete(e.id),a.remove_connection(e.id)},qe=(e,t,r)=>{r.error("Socket error",{socket_id:e.id,error:t.message}),i.delete(e.id),a.remove_connection(e.id)},Ae=(e,t,r)=>{e.on("data",async s=>{await ze(e,s,t,r)}),e.on("end",()=>{Ce(e,r)}),e.on("error",s=>{qe(e,s,r)})},Be=(e,t)=>{if(!a.add_connection(e))return;const r=C();Ae(e,r,t)},$e=()=>async()=>{try{await ne(),Y(),await Q(),await Z(),a&&a.shutdown(),i.clear(),await A(),await new Promise(e=>setTimeout(e,100)),await R(),P(),G(),ae()}catch{}},gt=async()=>{const{create_context_logger:e}=w("server"),t=e(),r=ye();await he(r,t),await ve(r),we(t),be(t),Se(r,t),a=Te();const{http_port:s}=_();await xe(s,t),ke();const n=z.createServer((o={})=>{Be(o,t)});return n.cleanup=$e(),n},Fe=e=>{try{k();const t=oe();console.log("Emergency Recovery Token Generated"),console.log(`Visit: ${t.url}`),console.log("Token expires in 10 minutes"),e.info("Recovery token generated via CLI",{expires_at:new Date(t.expires_at).toISOString()}),process.exit(0)}catch(t){console.error("Failed to generate recovery token:",t.message),e.error("Recovery token generation failed",{error:t.message}),process.exit(1)}},Pe=()=>{const{tcp_port:e}=_();return{worker_count:process.env.WORKER_COUNT?parseInt(process.env.WORKER_COUNT):void 0,port:e,environment:process.env.NODE_ENV||"development"}},Je=(e,t)=>{const{tcp_port:r,http_port:s}=_(),n=ie();t.info("Starting JoystickDB server...",{workers:e.worker_count||"auto",tcp_port:r,http_port:s,environment:e.environment,has_settings:n,port_source:n?"JOYSTICK_DB_SETTINGS":"default"})};if(import.meta.url===`file://${process.argv[1]}`){const{create_context_logger:e}=w("main"),t=e();process.argv.includes("--generate-recovery-token")&&Fe(t);const r=Pe();Je(r,t),D(r)}export{ue as authentication,me as check_op_type,gt as create_server,ft as parse_data,le as setup};
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@joystick.js/db-canary",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.0-canary.
|
|
5
|
-
"canary_version": "0.0.0-canary.
|
|
4
|
+
"version": "0.0.0-canary.2300",
|
|
5
|
+
"canary_version": "0.0.0-canary.2299",
|
|
6
6
|
"description": "JoystickDB - A minimalist database server for the Joystick framework",
|
|
7
7
|
"main": "./dist/server/index.js",
|
|
8
8
|
"scripts": {
|
package/src/server/index.js
CHANGED
|
@@ -361,24 +361,29 @@ const initialize_server_components = async (settings) => {
|
|
|
361
361
|
initialize_user_auth_manager();
|
|
362
362
|
set_storage_engine(db);
|
|
363
363
|
|
|
364
|
-
// NOTE: Create development admin user using user_auth_manager if in development mode
|
|
365
364
|
if (is_development_mode()) {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
365
|
+
// NOTE: Development mode: Use user_auth_manager only, skip api_key_manager complexity
|
|
366
|
+
// Only auto-create admin user if none exists and we're not in test mode
|
|
367
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
368
|
+
try {
|
|
369
|
+
const auth_stats = await get_auth_stats();
|
|
370
|
+
if (!auth_stats.configured || auth_stats.user_count === 0) {
|
|
371
|
+
const admin_result = await setup_initial_admin('admin', 'password', 'admin@localhost.local');
|
|
372
|
+
if (admin_result.success) {
|
|
373
|
+
console.log('Development admin user created automatically');
|
|
374
|
+
console.log(' Username: admin');
|
|
375
|
+
console.log(' Password: password');
|
|
376
|
+
}
|
|
374
377
|
}
|
|
378
|
+
} catch (error) {
|
|
379
|
+
console.log('Development admin user creation failed:', error.message);
|
|
375
380
|
}
|
|
376
|
-
} catch (error) {
|
|
377
|
-
console.log('Development admin user creation failed:', error.message);
|
|
378
381
|
}
|
|
382
|
+
} else {
|
|
383
|
+
// NOTE: Production mode: Use api_key_manager for secure initial setup
|
|
384
|
+
await initialize_api_key_manager();
|
|
379
385
|
}
|
|
380
386
|
|
|
381
|
-
await initialize_api_key_manager();
|
|
382
387
|
initialize_recovery_manager();
|
|
383
388
|
};
|
|
384
389
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|