Commit graph

17 commits

Author SHA1 Message Date
joerg
3eac274309 Use unified asm syntax. Build with -O0 on ARM when using clang, to much
optimisation potential.
2015-03-31 15:43:34 +00:00
obache
9004d433e4 Update jamvm to 1.5.4.
Based on PR pkg/45604 by Nikolai Lifanov.

JamVM 1.5.4 released on 1st January 2010
========================================

A summary of changes since 1.5.3:

- GC changes:

  - Mark phase rewritten to use an explicit fixed-size mark stack,
    with a moving heap scan pointer.  The previous recursive marking
    could lead to stack overflow when marking complex, deeply-linked
    structures.  If the explicit mark stack overflows, a slower,
    fallback mechanism is used of scanning the heap.  The new mark
    phase is upto 50% faster than the old recursive marking.

  - bug fix for unallocated blocks within the heap of >= 1 GB.

- JNI changes:

  - Updated to JNI version 1.6.  This adds the function
    GetObjectRefType().

  - Fully implemented JNI weak global references (NewWeakGlobalRef
    and DeleteWeakGloablRef).  Note, these are different to Java
    Soft/Weak/Phantom References which have been supported since
    JamVM 1.4.0.

  - verbose:jni now shows details of the opening of native libraries.
    If a library fails to open a diagnostic message is shown (if
    available).  This is intended to help debug common library
    problems.

  - bug fix for ToReflected[Method|Field] and GetSuperClass.  A
    local reference must be created for the return value.

- Platform changes:

  - Interpreter inlining (aka code-copying JIT) now enabled by
    default on ARM systems.  Testing on Cortex-A8 indicates
    82% speed improvement on integer benchmarks, and 55% on
    floating-point.

  - If cross-compiling, and interpreter inlining is enabled, runtime
    relocation checks will be enabled (relocation information is
    normally generated at compile time; as this can't be done
    when cross-compiling it must be done at runtime, but it
    increases the size of the executable by ~30%).

  - Initial port to Sparc/FreeBSD.  My thanks to Per Ola Ingvarsson
    for architecture dependent definitions.  Interpreter inlining
    (aka code-copying JIT) is currently not supported due to missing
    code for flushing the instruction/data caches, and branch
    generation. It also requires libffi, which is enabled by default.

  - Changes to x86 and x86_64 across all platforms to zero/sign
    extend return values from native methods whose size is less
    than an int (i.e. boolean, byte, char and short).  This is
    necessary due to changes in code produced by gcc >= 4.3.

  - Rare race-condition in thin-locking code on x86 and x86_64
    architectures, leading to deadlock.  On modern x86 CPUs, an
    extra memory barrier is required.  Seen intermittently while
    running a thread intensive benchmark using at least 4 cores.

  - Extensive changes to support 64-bit Big Endian systems.  These
    were previously supported, but support was completely broken
    with the introduction of the new object layout in JamVM 1.5.2.

- Miscellaneous fixes:

  - Interpreter inlining bug fix: reference to memory after it
    had been freed

  - java.lang.reflect.VMField getAnnotation() implemented.  This
    has been missing since the reflection rework in JamVM 1.5.2.

  - ThreadMXBean: fixes for getThreadInfoForId (VMThreadMXBeanImpl).

    - Did not correctly report lock or lock owner, when the thread was
      blocked on an object which was thin-locked by another thread

    - It was using a constructor which has since been removed

  - Fixes for NULL handling in findClassFromSignature() and
    utf8CharLen()

  - Fixed memory leak in bytecode rewriting.  Due to missing
    parantheses, old bytecode stream was not being freed (for
    example, this leaks 47K when running "Hello, World")

  - Bug-fix for theoretical race-condition in thread deletion when
    notifying joining threads after thread ID has been reused.


JamVM 1.5.3 released on 14th April 2009
=======================================

JamVM 1.5.3 is primarily a bug-fix release.  It fixes issues seen
while running Eclipse 3.4.2 and JRuby 1.2.0RC2, and adds some minor
features.  A summary of the changes:

- Zip/Jar support in the boot classloader has been rewritten to
  no longer require the Zip/Jar files to be mmap-ed read/write.
  This increases shareability between multiple VM instances, and
  improves memory-usage on embedded systems.

- JNI invocation API:
  - set thread-self to NULL when thread detaches (if the thread tries
    to re-attach, it appears to still be attached)

  - init args_count in dummy stack frame (fix problem if the thread
    detaches and then re-attaches)

- Do not create a library unloader for libraries loaded by the bootstrap
  loader if they have an JNI_OnUnload method (the bootstrap loader is
  never unloaded, and so they will never be called).  Fixes a SEGV with
  JRuby.

- Fix to annotation handling.  When the annotation value is an array,
  the native annotation parser constructs an Object array.  However,
  the method return value is the specific type.  This leads to an
  AnnotationTypeMismatchException.  The fix coerces the Object
  array to the correct type.

- Simple implementation of java.lang.management.VMManagementFactory
  (returns no memory pool, memory manager or GC names).  Sufficient
  to run JRuby.

- Implemented package support in the bootstrap class loader.  Package
  information is obtained from the manifest file if it exists.  However,
  GNU Classpath's glibj.zip's manifest has no package information.
  The class library is therefore recognised by the presence of
  java/lang/Object.class, and appropriate package information is
  constructed.

- Fix broken implementation of VMClass.getSimpleName() (use the
  implementation from gcj)

- Default Java stack size increased to 256K from 64K

- Fix to bootstrap loader getResources() when the bootclasspath
  entry is relative (prepend the current working directory)

- Fix minor memory leak in bootstrap loader getResources()

- Add --enable-tls option to configure, enabling thread-local-storage
  (__thread) to be disabled


JamVM 1.5.2 released on 1st February 2009
=========================================

A summary of changes since 1.5.1:

- Interpreter inlining changes

  - Basic-blocks are now inlined across block boundaries removing
    the need for dispatching between blocks in the case of
    fall-through control flow

  - Control-flow within inlined sequences now patched with real jumps,
    removing the need for computed jumps

  - Control flow between non-shared sequences now patched, replacing
    dispatch with real jumps

  - Simple basic-block profiling is now implemented.  This considerably
    reduces the size of the code-cache, without reducing performance

- Reworked Object layout

  - Previously, on 64-bit machines the object layout was wasteful, with
    padding on fields less than 64-bits (to preserve 64-bit alignment).
    The new object layout on average reduces heap usage by approx
    10 - 15%

  - On 32-bit machines, 64-bit fields are now 64-bit aligned (without
    introducing extra padding if possible)

- Various alignment fixes

  - 64-bit alignment of operand stack
  - 64-bit alignment of static variable data

- Reflection support

  - Reworking required for new object layout

  - Reworked to use VMConstructor, VMMethod, etc.

  - Reworked to improve field access and method invocation performance
    (this offsets the extra costs of the VM interface, and improves
    performance over 1.5.1).

  - Access permission checks take precedence over other errors

  - Class/method signatures : do not convert slash to dots

- JNI fixes/improvements

  - Class references returned by JNI now use local references

  - Throw InstantiationException not InstantiationError when allocating
    objects and the class is an interface or abstract

  - Reworked JNI global references

    - Fix memory leak when expanding list

    - Improve performance (optimise case where references are
      created/deleted in a stack-like manner)

- OpenSolaris/Solaris/x86 port

- GC fixes

  - Fix race-condition in registering references with the GC

  - Separate "Async GC" thread is now disabled by default.  It didn't
    improve performance, and could increase power-consumption on
    embedded systems

- Exception handling

  - Fix method-skipping when filling in stack trace (methods could
    be incorrectly excluded from the trace when a class subclassed
    Throwable)

  - Uncaught exceptions in the "main" thread will now use the thread's
    uncaughtExceptionHandler

- Various compatibility command line options recognised (and
  ignored).  These include -XX:PermSize and XX:MaxPermSize
  required to build OpenJDK.

- sun.misc.Unsafe

  - Object methods (compareAndSwapObject, etc.) fixed on 64-bit
    machines

  - Implemented support for thread park and unpark (removing previous
    highly inefficient "empty" implementation)

- Use thread-local storage (__thread), if available, instead of
  pthread keys

- Various minor race-conditions seen while running Dacapo benchmarks

- Strict-aliasing fixes when compiled with GCC 4.3, interpreter
  stack-caching is enabled, and interpreter inlining is on

- A large amount of code-tidying throughout the VM

- Minimum heap size increased to 16MB

- Various compiler warnings.
2014-02-08 09:41:29 +00:00
joerg
d367b376c6 Don't use -fno-reorder-blocks. 2013-10-28 23:47:18 +00:00
joerg
a368866e47 Fix assembler syntax. 2013-02-26 11:08:41 +00:00
dholland
00e1ab533d Recognize i486-netbsd as well as i386-netbsd. 2012-12-21 04:06:45 +00:00
asau
88feb4ac62 Drop superfluous PKG_DESTDIR_SUPPORT, "user-destdir" is default these days. 2012-10-02 20:11:34 +00:00
obache
c38c120ee5 recursive bump from libffi shlib major bump
(additionaly, reset PKGREVISION of qt4-* sub packages from base qt4 update)
2012-09-15 10:03:29 +00:00
jmmv
3b922a2b77 Transfer ownership to pkgsrc-users. pancake's address is not valid any
more and he has agreed in private mail to drop maintainership.
2010-07-06 10:17:11 +00:00
joerg
62d1ba2bac Remove @dirrm entries from PLISTs 2009-06-14 18:03:28 +00:00
dholland
17098f44fb Update to 1.5.1 and make it build on amd64. Add destdir support.
JamVM 1.5.1 released on 10th March 2008
=======================================

A summary of changes since 1.5.0:

- Implemented a new internal VM symbol framework.  This ensures that
  all class, method, field names, etc. are unique thus removing the
  need to use strcmp for comparison.

- Implemented a new internal VM exception mechanism for frequent
  exceptions thrown within the VM.

- Hand-coded support for AMD64 ABI.  Previously AMD64 required libffi
  but this is not individually packaged on some Linux distributions.
  On a random set of signatures the hand-coded assembler is 4.6 times
  faster (and jBYTEmark FP Index is 30% faster).

- Ported to Darwin/ARM (i.e. the iPhone).  Built using unofficial
  toolchain and tested on jailbroken iPhone (1.1.3 firmware)

- Class initialisation/first active use fixes

  - initialise if first active use is object allocation via reflection
    (newInstance)

  - initialise if first active use is object allocation via JNI
    (AllocObject/NewObject)

  - The wait in step 2 of the initialisation sequence must be
    non-interruptible (not specified in the JVM or Java spec).

  - If allocation of the ExceptionInInitializerError fails,
    OutOfMemoryError should be thrown not the original exception

  - Don't resolve if initialiser throws ExceptionInInitializerError
    (subsequent resolution will not see the class is erroneous)

- JNI_OnLoad fixes

  - initialise JNI local refs before calling

  - if JNI_FindClass is called from JNI_OnLoad, ensure correct class
    loader context is used.

- JNI_OnUnload fixes

  - initialise JNI local refs before calling

  - If a library defines JNI_OnUnload, and the class loader which
    loaded it is GCed JNI_OnUnload is called and the library is
    unloaded.  Previously this was done within the GC.  If OnUnload
    allocated objects it could corrupt the heap.  Dummy unloader
    objects are now created, and JNI_OnUnload is called from the
    finalize method by the finalizer thread.

- Fix variable argument passing of floats When calling Java methods from
  native code

- Rework VM initialisation/start-up sequence

- Fix for JNI_ThrowNew and exceptions loaded by non-bootstrap classloader

- Fix for JNI_GetMethodID and object/class initialiser methods
  (do not search class hierarchy)

- During resolution throw IllegalAccessError and not IllegalAccessException

- handle loadClass returning null without throwing exception

- Fix for running Jar files where the main class is package-protected

- Interpeter inlining changes

  - Do not inline class initialisers (<clinit>).  No performance
    improvement as they are only ran once.  Reduces memory usage

  - Fix for class unloading when inlining disabled (-Xnoinlining)

- Bump java.specification.version to 1.5

- Improve error messages if VM aborts during initialisation

- During configure, do not disable zip/jar file support if zlib library
  or header can't be found (now aborts).  Users never saw the warning
  and they ended up with a build which "didn't work".

- Various compiler warnings.


JamVM 1.5.0 released on 28th October 2007
=========================================

A summary of changes since 1.4.5:

- Substantially modified the interpreter to implement inline-threading
  (also known as super-instructions or code-copying).  This copies
  code sequences together to produce native code that executes without
  the normal interpreter dispatch overhead (similar to a simple JIT).

  - Supported on i386, AMD64, PowerPC and ARM, with or without stack-
    caching.  It is enabled by default on i386, AMD64 and PowerPC.

  - Performance improvement upto 300% on Pentium 4 (NetBurst), and upto
    200% on Athlon 64.  Less on Core 2 Duo (upto 70% faster as it has
    indirect branch prediction), and PowerPC which was already very
    optimised (upto 30% faster).

  - Tested on gcc 3.4 (i386, AMD64, PowerPC), 4.0 (i386), 4.1
    (i386, AMD64, PowerPC, ARM), 4.2 (i386, AMD64)

  - Several new command line options to control inlining:

      -Xreplication : determines whether duplicate code sequences
       are replicated or shared.  Can be set to 'none' (no replication),
       'always' (all sequences are copies) or a threshold value (e.g.
       10, when sharing of a sequence reaches the threshold the sequence
       is replicated).

      -Xcodemem : the maximum amount of memory for super-instructions.
       Once the maximum is reached no new super-instructions are generated
       but existing super-instructions are reused (class unloading will
       also free unused sequences).  Can be set to a value or 'unlimited'.
       This option can be used to limit code memory on systems with little
       RAM (i.e. embedded).

      -Xshowreloc : debugging option, which shows which opcodes were
       determined to be relocatable, and for opcodes which aren't why
       they aren't relocatable.  When using stack-caching there are
       three versions of each opcode (for 3 stack-cache levels).

      -Xnoinlining : turns off inlining (equivalent to setting codemem
       to zero).

  - Opcode relocatability is determined by default at build time, but
    this doesn't work when cross-compiling (so inlining is disabled).
    Relocatability can be determined at runtime using configure option
    --enable-runtime-reloc-checks, but this increases executable size
    by approx 30%.

- Command line options -version and -showversion now shows build
  information.  This includes the execution engine (e.g. inline-
  threaded interpreter with stack-caching), the gcc version which
  was used to compile JamVM (useful for debugging) and the "built in"
  boot library path and classpath.

- Ported to ARM systems using EABI.  This is a full port, with hand-
  coded assembler to handle the construction of a call-frame for calling
  JNI native methods.

- Refactored GC to remove all possible calls which may deadlock
  with threads suspended in "unsafe" operations.  This includes
  use of malloc/realloc/free and pthreads operations.

- In allocClass() check if gcMalloc() returns NULL (i.e. OOM).

- Copy Sun's behaviour when dealing with an empty property key or no
  equals after key.

- Add java.util.concurrent.atomic.AtomicLong.VMSupportsCS8.

- In method and field access checks, put back in access check for
  class (removed previously because it caused regressions, since
  fixed in Classpath).

- Enable suspend on thread creation (parent thread created thread with
  suspension disabled).  Effects threads which immediately call a long
  running native method.

- Fixed race condition in thread creation and compaction (start function
  obtains class reference when it is not suspendable, if compaction
  occurs, the reference may be threaded, or moved).

- Fix potential deadlock in threadInterrupt under Linuxthreads.

- Protect lock operation in resetPeakThreadsCount().

- In createJavaThread(), re-enable suspension if pthread_create fails.

- Fix race-condition in thread deletion.

- Fix bug in hash table "scavenge".  This could lead to entries not being
  freed, and exhaustion of Monitors on embedded systems.

- Removed use of malloc/free in thread dump.  Removes potential deadlock
  with threads suspended in malloc/realloc/free.

- Added symbolic link from lib/rt.jar to Classpath's glibj.zip (fixes
  programs such as ecj which locates rt.jar via java.home).

- Bumped Java compatible version to 1.5.0 as Classpath is now the generics
  branch (since Classpath 0.95).
2008-09-07 06:41:44 +00:00
rillig
52f35ac87e Updated jamvm to 1.4.5.
JamVM 1.4.5 released on 4th February 2007
=========================================

A summary of changes since 1.4.4:

- Support for Java 1.5 Annotations.  This includes the following
  methods for reflection access to Annotations:

    - VMClass.getDeclaredAnnotations
    - java.lang.reflect.Field.getDeclaredAnnotations
    - java.lang.reflect.Constructor
        - getAnnotation, getDeclaredAnnotations, getParameterAnnotations
    - java.lang.reflect.Method
        - getDefaultValue, getAnnotation, getDeclaredAnnotations,
          getParameterAnnotations

- Class sun.misc.Unsafe implemented, providing VM support for
  JSR-166 (Concurrency Utilities).

- Ported to the mipsel architecture.  This is a full port, with hand-
  coded assembler to handle the construction of a call-frame for calling
  JNI native methods.  This supports the O32 ABI (for other ABIs libffi
  can be used).

- Bug fix in registering references external to the heap with the GC.
  The table should be locked for references registered after VM
  initialisation.

- Bug fix when expanding the heap and the free-list is empty.

- Fixed race-condition when rewriting OPC_NEW in the indirect-threaded
  interpreter (by default the direct-threaded interpreter is used).

- Bug fix in the GC compaction phase.  The class-loader references
  within the loaded DLL hashtable must be updated when the class-loader
  is moved during compaction.  This is a regression introduced in
  JamVM 1.4.3 (DLL unloading), seen while running Eclipse.

- Bug fix in JNI_GetStringUTFLength.  The reported length should not
  include space for a NULL terminator.

- Various compile fixes for uClibc.  Support for the JNI invocation
  API requires glibc features not implemented in uClibc.

- Command line option -fullversion implemented.


JamVM 1.4.4 released on 2nd November 2006
=========================================

A summary of changes since 1.4.3:

- Full JNI Invocation API implemented, enabling JamVM to be linked into
  another program.

    - JNI_CreateJavaVM, DestroyJavaVM, AttachCurrentThread,
    - AttachCurrentThreadAsDaemon, DetachCurrentThread
    - JNI_GetDefaultJavaVMInitArgs

- JamVM is now also built as a shared library (lib/libjvm.so).
    - The executable (bin/jamvm) is statically linked with this library
      instead of being a wrapper.  This is because the shared library
      runs slower than static linking on some architectures.  As JamVM
      is small this is not a problem.

- Improved class-loader and shared library support

    - When a class-loader (and all its classes) is unloaded all shared
      libraries loaded by the class-loader are unloaded and JNI_OnUnload
      called (if defined)

    - A shared library can no longer be opened by two class-loaders
      at once

    - A class can only resolve native methods defined in shared libraries
      opened by its defining class-loader

- Major re-working of thread/locking code to support additional Java 1.5
  functionality

    - Thread.getState() implemented
        - correct thread states and their transistions (e.g. BLOCKING,
          WAITING, TIMED_WAITING, etc.)

    - native support for the ThreadMXBean thread system management API
        - thread creation statistics (count of live, started and
          peak threads)

        - Information about a thread (ThreadInfo)
            - execution information (thread state, stack backtrace to
              a particular depth, object upon which the thread is blocked
              or waiting to be notified)

            - synchronization statistics (counts of the times the thread
              has been blocked or waited for notification)

    - Thread.interrupt() re-implemented fixing several bugs
        - if a thread was waiting on a monitor, previous implementation
          required the monitor lock to be obtained.  If a 3rd thread
          was holding this, the  interrupt could not occur to avoid
          deadlock.  New thread-code does not require lock to be obtained.

        - in rare circumstances another thread waiting on the monitor
          could be notified (when there was pending notifications,
          and then an interrupt, and subsequent threads waiting on the
          monitor).

        - a thread waiting on a thin-lock (waiting for inflation)
          could erroneously report an InterruptedException

- GC bug fix for class-unloading when only using the compactor
  (-Xcompactalways).  The compactor in some circumstances could move
  objects ontop of the object holding the native class-loader VM data
  before it was freed leading to a SEGV.

- Bug fix for abstract methods which fell through previous
  AbstractMethodError checks (using a stub method)
    - AbstractMethodError now also gives the method name

- Bug fix to not allow abstract classes to be instantiated

- Bug fix for NULL in identityHashCode (a regression in JamVM 1.4.3)

- Bug fix for NULL in JNI method GetStringUTFLength|Chars

- Bug fix for $ in native method names

- FirstNonNullClassLoader implemented

- Access-checking bug fix.  In reflection method/field access, also
  check class access in addition to method/field.

- Ensure created threads have a native stack size of at least 2MB.  This
  fixes SEGVs due to stack overflow seen on OpenBSD/Darwin
  (default 512KB).

- Property sun.boot.class.path is now also defined in addition to
  java.boot.classpath.  Certain applications look for the Sun property
  (e.g. Dacapo bloat benchmark).

- Extra bootclasspath command line options
    - bootclasspath/v overrides the default VM classes path
    - bootclasspath/c overrides the default GNU Classpath classes path

- java.endorsed.dirs support added
    - directories are scanned and any jar/zip files are added to the
      boot classpath.

- Improved thread dump (produced via ctrl-\).  Now shows thread state.

- JamVM by default now installs in its own directory (/usr/local/jamvm)


JamVM 1.4.3 released on 21st May 2006
=====================================

A summary of changes since 1.4.2:

- Heap compaction implemented.  Previously on some programs the object
  allocation pattern could lead to a highly fragmented heap (lots of
  small holes).  This caused early heap expansion, and in some cases
  an OutOfMemory exception (a result of repeated heap expansion until
  heap fully expanded).

  JamVM now includes a mark/compact collector in addition to the
  mark/sweep GC.  This is normally ran after forced finalisation, and
  before heap expansion.  It removes fragmentation by sliding the objects
  to the bottom of the heap, closing the holes.

  Two new command line options can be used to control compaction :

    -Xnocompact : don't do compaction and just use the mark/sweep
                  collector.  This is equivalent to JamVM 1.4.2 behaviour.

    -Xcompactalways : do compaction on every garbage-collection.   In
                      some cases this may lead to less collections, but
                      the compactor is slower than the sweeper.

- The interned String table is now garbage-collected (JamVM uses its
  own interned String hashtable).

- Additional Java 1.5 support
    - New methods within VMClass implemented
        - isMemberClass, isLocalClass, isAnonymousClass,
          getEnclosingClass, getEnclosingMethod,
          getEnclosingConstructor, getClassSignature.

    - Generic signature support in reflection classes (Constructor, Method
      Field).
        - getTypeParameters, getSignature, getGenericExceptionTypes,
          getGenericParameterTypes, toGenericString, getGenericType,
          getGenericReturnType

    - Uncaught exceptions will now use the thread's uncaughtExceptionHandler
      (if available).

- Fix for Non-ASCII characters in class name parameter
    - affected methods Class.ForName, ClassLoader.defineClass

- Use getcwd() instead of PWD enviroment variable for user.dir
  property.  This fixes problems seen on some applications.

- Fix in VMClass.defineClass on 64-bit machines (protection domain
  parameter assumed to be 4 bytes).

- Minor interpreter optimisation in direct-mode with handler
  prefetch (reload of handler address in aload_0/getfield pair).

- Command line options -version and -showversion now prints a "Java
  compatible" version number.  This is to work with shell scripts which
  parse the output to get the Java version.

- Set the java.home property to the JAVA_HOME environment variable if set.

- Ported to Mac OS X on Intel.

- Runtime.availableProcessors implemented (Linux, Mac OS X and BSD
  systems).

- Updated to be compatible with Classpath 0.91.
    - Merged in changes to GNU Classpath's VM reference classes and
      JamVM's classes.

- Various compiler warnings.
2007-06-05 14:08:43 +00:00
joerg
155bafb949 Add bin/jamvm-java to PLIST. Bump revision. 2006-05-21 15:43:09 +00:00
tonio
2c48e4d7f0 fix the use to == for test(1) 2006-05-16 21:33:03 +00:00
tonio
be3078f917 there is no need to include bsd.prefs.mk here, now that java-env.mk includes it 2006-05-16 21:26:46 +00:00
tonio
7e8088b519 explicitly include bsd.prefs.mk do that java-env.mk alternative stuff do work
Thanks rillig !
2006-05-16 21:22:55 +00:00
joerg
13734b52ac Fix up OS and pthread detection. 2006-05-02 08:59:30 +00:00
tonio
cff0e6a933 Import lang/jamvm from wip
JamVM is a new Java Virtual Machine which conforms to the JVM specification
version 2 (blue book). In comparison to most other VM's (free and commercial)
it is extremely small, with a stripped executable on PowerPC of only ~135K,
and Intel 100K. However, unlike other small VMs (e.g. KVM) it is designed to
support the full specification, and includes support for object finalisation,
the Java Native Interface (JNI) and the Reflection API.
2006-04-16 22:16:36 +00:00