o
    iM                     @  s  d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 g dZ
G dd deeZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eZG d'd( d(eZG d)d* d*eZG d+d, d,eZG d-d. d.eZG d/d0 d0eZ G d1d2 d2eZ!G d3d4 d4eZ"G d5d6 d6eZ#G d7d8 d8eZ$G d9d: d:eZ%G d;d< d<eZ&G d=d> d>eZ'G d?d@ d@eZ(G dAdB dBeZ)G dCdD dDeZ*G dEdF dFeZ+G dGdH dHeZ,G dIdJ dJeZ-G dKdL dLeZ.G dMdN dNeZ/G dOdP dPeZ0G dQdR dReZ1G dSdT dTeZ2G dUdV dVeZ3G dWdX dXeZ4G dYdZ dZeZ5G d[d\ d\eZ6G d]d^ d^eZ7G d_d` d`eZ8G dadb dbeZ9G dcdd ddeZ:G dedf dfeZ;G dgdh dheZ<G didj djeZ=G dkdl dleZ>erd dml?m@Z@ ne	dne>jAedodpdq\Z@ZBG drds dse@ZCdS )t    )annotationsN)Enum)TYPE_CHECKING)min_versionoptional_import),StrEnumNumpyPadModeGridSampleMode
SplineModeInterpolateModeUpsampleModeDownsampleMode	BlendModePytorchPadModeNdimageModeGridSamplePadModeAverageMetricReductionLossReductionDiceCEReductionWeightChannelMatchingSkipModeMethod	TraceKeysTraceStatusKeys
CommonKeysGanKeysPostFixForwardModeTransformBackendsCompInitModeBoxModeNameGridPatchSortFastMRIKeys	SpaceKeysMetaKeys
ColorOrderEngineStatsKeysDataStatsKeysImageStatsKeysLabelStatsKeysHoVerNetModeHoVerNetBranchLazyAttrBundlePropertyBundlePropertyConfigAlgoKeys
IgniteInfoc                   @  s    e Zd ZdZdd Zdd ZdS )r   a  
    Enum subclass that converts its value to a string.

    .. code-block:: python

        from monai.utils import StrEnum

        class Example(StrEnum):
            MODE_A = "A"
            MODE_B = "B"

        assert (list(Example) == ["A", "B"])
        assert Example.MODE_A == "A"
        assert str(Example.MODE_A) == "A"
        assert monai.utils.look_up_option("A", Example) == "A"
    c                 C     | j S Nvalueself r9   S/home/dell461/cl/sdc2/last_ska_mid/HISourceFinder-master-l/src/monai/utils/enums.py__str__V      zStrEnum.__str__c                 C  r3   r4   r5   r7   r9   r9   r:   __repr__Y   r<   zStrEnum.__repr__N)__name__
__module____qualname____doc__r;   r=   r9   r9   r9   r:   r   D   s    r   c                   @  <   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdS )r   zQ
    See also: https://numpy.org/doc/1.18/reference/generated/numpy.pad.html
    constantedgelinear_rampmaximummeanmedianminimumreflect	symmetricwrapemptyN)r>   r?   r@   rA   CONSTANTZEDGEZLINEAR_RAMPZMAXIMUMMEANZMEDIANZMINIMUMREFLECT	SYMMETRICWRAPZEMPTYr9   r9   r9   r:   r   ]       r   c                   @  0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )r   z
    The available options determine how the input array is extended beyond its boundaries when interpolating.
    See also: https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.map_coordinates.html
    rJ   zgrid-mirrorrC   zgrid-constantnearestmirrorz	grid-wraprL   N)r>   r?   r@   rA   rP   ZGRID_MIRRORrN   ZGRID_CONSTANTNEARESTZMIRRORZ	GRID_WRAPrR   r9   r9   r9   r:   r   o       r   c                   @     e Zd ZdZdZdZdZdS )r	   a  
    See also: https://pytorch.org/docs/stable/generated/torch.nn.functional.grid_sample.html

    interpolation mode of `torch.nn.functional.grid_sample`

    Note:
        (documentation from `torch.nn.functional.grid_sample`)
        `mode='bicubic'` supports only 4-D input.
        When `mode='bilinear'` and the input is 5-D, the interpolation mode used internally will actually be trilinear.
        However, when the input is 4-D, the interpolation mode will legitimately be bilinear.
    rU   bilinearbicubicN)r>   r?   r@   rA   rW   BILINEARBICUBICr9   r9   r9   r:   r	      s
    r	   c                   @  (   e Zd ZdZdZdZdZdZdZdZ	dS )	r
   z
    Order of spline interpolation.

    See also: https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.map_coordinates.html
    r                  N)
r>   r?   r@   rA   ZEROZONEZTWOZTHREEZFOURZFIVEr9   r9   r9   r:   r
      s    r
   c                   @  ,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
r   zb
    See also: https://pytorch.org/docs/stable/generated/torch.nn.functional.interpolate.html
    rU   znearest-exactlinearrZ   r[   	trilinearareaN)r>   r?   r@   rA   rW   ZNEAREST_EXACTZLINEARr\   r]   Z	TRILINEARZAREAr9   r9   r9   r:   r          r   c                   @      e Zd ZdZdZdZdZdZdS )r   >
    See also: :py:class:`monai.networks.blocks.UpSample`
    deconvZdeconvgroupZnontrainablepixelshuffleN)r>   r?   r@   rA   ZDECONVZDECONVGROUPZNONTRAINABLEZPIXELSHUFFLEr9   r9   r9   r:   r          r   c                   @  $   e Zd ZdZdZdZdZdZdZdS )r   rk   convZ	convgroupZpixelunshuffleZmaxpoolZavgpoolN)	r>   r?   r@   rA   ZCONVZ	CONVGROUPZPIXELUNSHUFFLEZMAXPOOLZAVGPOOLr9   r9   r9   r:   r      s    r   c                   @     e Zd ZdZdZdZdS )r   zG
    See also: :py:class:`monai.data.utils.compute_importance_map`
    rC   gaussianN)r>   r?   r@   rA   rN   ZGAUSSIANr9   r9   r9   r:   r          r   c                   @  rj   )r   zZ
    See also: https://pytorch.org/docs/stable/generated/torch.nn.functional.pad.html
    rC   rJ   	replicatecircularN)r>   r?   r@   rA   rN   rP   Z	REPLICATEZCIRCULARr9   r9   r9   r:   r      rn   r   c                   @  rY   )r   zb
    See also: https://pytorch.org/docs/stable/generated/torch.nn.functional.grid_sample.html
    zerosborder
reflectionN)r>   r?   r@   rA   ZZEROSZBORDERZ
REFLECTIONr9   r9   r9   r:   r      
    r   c                   @  rj   )r   z
    See also: :py:class:`monai.metrics.rocauc.compute_roc_auc` or
    :py:class:`monai.metrics.average_precision.compute_average_precision`
    ZmacroweightedmicrononeN)r>   r?   r@   rA   ZMACROZWEIGHTEDZMICRONONEr9   r9   r9   r:   r          r   c                   @  re   )
r   zF
    See also: :py:func:`monai.metrics.utils.do_metric_reduction`
    r|   rG   sumZ
mean_batchZ	sum_batchZmean_channelZsum_channelN)r>   r?   r@   rA   r}   rO   SUMZ
MEAN_BATCHZ	SUM_BATCHZMEAN_CHANNELZSUM_CHANNELr9   r9   r9   r:   r      ri   r   c                   @  rY   )r   z
    See also:
        - :py:class:`monai.losses.dice.DiceLoss`
        - :py:class:`monai.losses.dice.GeneralizedDiceLoss`
        - :py:class:`monai.losses.focal_loss.FocalLoss`
        - :py:class:`monai.losses.tversky.TverskyLoss`
    r|   rG   r   N)r>   r?   r@   rA   r}   rO   r   r9   r9   r9   r:   r      
    r   c                   @  rq   )r   zF
    See also:
        - :py:class:`monai.losses.dice.DiceCELoss`
    rG   r   N)r>   r?   r@   rA   rO   r   r9   r9   r9   r:   r         r   c                   @  rY   )r   zE
    See also: :py:class:`monai.losses.dice.GeneralizedDiceLoss`
    squaresimpleuniformN)r>   r?   r@   rA   SQUARESIMPLEZUNIFORMr9   r9   r9   r:   r     ry   r   c                   @  rq   )r   z@
    See also: :py:class:`monai.networks.nets.HighResBlock`
    padZprojectN)r>   r?   r@   rA   ZPADZPROJECTr9   r9   r9   r:   r     rs   r   c                   @  rY   )r   zD
    See also: :py:class:`monai.networks.layers.SkipConnection`
    cataddmulN)r>   r?   r@   rA   ZCATADDMULr9   r9   r9   r:   r   (  ry   r   c                   @  rq   )r   zI
    See also: :py:class:`monai.transforms.croppad.array.SpatialPad`
    rK   endN)r>   r?   r@   rA   rQ   ENDr9   r9   r9   r:   r   2  rs   r   c                   @  rq   )r   zL
    See also: :py:class:`monai.transforms.engines.evaluator.Evaluator`
    trainevalN)r>   r?   r@   rA   ZTRAINEVALr9   r9   r9   r:   r   ;  rs   r   c                   @  s   e Zd ZU dZdZded< dZded< dZded< d	Zded
< dZ	ded< dZ
ded< dZded< dZded< dZded< dZded< dS )r   z2Extra metadata keys used for traceable transforms.classstr
CLASS_NAMEidIDZ	orig_size	ORIG_SIZEZ
extra_info
EXTRA_INFOZdo_transformsDO_TRANSFORMZ_transforms
KEY_SUFFIXr|   r}   tracingTRACINGZstatusesSTATUSESlazyLAZYN)r>   r?   r@   rA   r   __annotations__r   r   r   r   r   r}   r   r   r   r9   r9   r9   r:   r   D  s   
 r   c                   @     e Zd ZdZdZdS )r   z4Enumerable status keys for the TraceKeys.STATUS flagZpending_during_applyN)r>   r?   r@   rA   ZPENDING_DURING_APPLYr9   r9   r9   r:   r   S  s    r   c                   @  ro   )r   a  
    A set of common keys for dictionary based supervised training process.
    `IMAGE` is the input image data.
    `LABEL` is the training or evaluation label of segmentation or classification task.
    `PRED` is the prediction data of model output.
    `LOSS` is the loss value of current iteration.
    `METADATA` is some useful information during training or evaluation, like loss value, etc.

    imagelabelpredlossmetadataN)	r>   r?   r@   rA   IMAGELABELZPREDZLOSSMETADATAr9   r9   r9   r:   r   Y  s    
r   c                   @  ro   )r   zD
    A set of common keys for generative adversarial networks.

    realsfakesZlatentsZg_lossZd_lossN)	r>   r?   r@   rA   REALSFAKESZLATENTSZGLOSSZDLOSSr9   r9   r9   r:   r   k  s    r   c                   @  sN   e Zd ZdZedddZeddddZeddddZeddddZd	S )r   zPost-fixes.prefix
str | Nonesuffixr   returnc                 C  s   | d u r|S |  d| S )N_r9   )r   r   r9   r9   r:   _get_str{  s   zPostFix._get_strNkeyc                 C     t | dS )NZ	meta_dictr   r   r   r9   r9   r:   meta     zPostFix.metac                 C  r   )NZorig_meta_dictr   r   r9   r9   r:   	orig_meta  r   zPostFix.orig_metac                 C  s   t | tjdd  S )Nr_   )r   r   r   r   r   r9   r9   r:   
transforms  s   zPostFix.transforms)r   r   r   r   r   r   r4   )r   r   r   r   )	r>   r?   r@   rA   staticmethodr   r   r   r   r9   r9   r9   r:   r   x  s    r   c                   @  rY   )r    a  
    Transform backends. Most of `monai.transforms` components first converts the input data into ``torch.Tensor`` or
    ``monai.data.MetaTensor``. Internally, some transforms are made by converting the data into ``numpy.array`` or
    ``cupy.array`` and use the underlying transform backend API to achieve the actual output array and
    converting back to ``Tensor``/``MetaTensor``. Transforms with more than one backend indicate the that they may
    convert the input data types to accommodate the underlying API.
    torchnumpycupyN)r>   r?   r@   rA   ZTORCHZNUMPYZCUPYr9   r9   r9   r:   r      r   r    c                   @  rY   )r!   z~
    Mode names for instantiating a class or calling a callable.

    See also: :py:func:`monai.utils.module.instantiate`
    defaultcallabledebugN)r>   r?   r@   rA   DEFAULTCALLABLEDEBUGr9   r9   r9   r:   r!     s
    r!   c                   @  rj   )JITMetadataKeysz
    Keys stored in the metadata file for saved Torchscript models. Some of these are generated by the routines
    and others are optionally provided by users.
    name	timestampversiondescriptionN)r>   r?   r@   rA   NAME	TIMESTAMPVERSIONDESCRIPTIONr9   r9   r9   r:   r     r~   r   c                   @  s4   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )r"   z
    Box mode names.
    ZxyxyZxyzxyzZxxyyZxxyyzzZxyxyzzZxywhZxyzwhdZccwhZcccwhdN)r>   r?   r@   rA   ZXYXYZXYZXYZZXXYYZXXYYZZZXYXYZZZXYWHZXYZWHDZCCWHZCCCWHDr9   r9   r9   r:   r"     s    r"   c                   @  rj   )ProbMapKeyszN
    The keys to be used for generating the probability maps from patches
    Zmask_location	mask_sizeZnum_patchesr   N)r>   r?   r@   rA   LOCATIONSIZECOUNTr   r9   r9   r9   r:   r     rn   r   c                   @  s@   e Zd ZdZdZdZdZedd Zedd Z	ed	d
 Z
dS )r#   zE
    The sorting method for the generated patches in `GridPatch`
    randomminmaxc                 C  s   | d   S Nr   r   xr9   r9   r:   min_fn  r   zGridPatchSort.min_fnc                 C  s   | d    S r   r   r   r9   r9   r:   max_fn  s   zGridPatchSort.max_fnc                 C  sL   | t jkrtjS | t jkrt jS | t jkrt jS td|  ddd t D )Nz0sort_fn should be one of the following values, "z" was given:c                 S  s   g | ]}|j qS r9   r5   ).0er9   r9   r:   
<listcomp>  s    z-GridPatchSort.get_sort_fn.<locals>.<listcomp>)r#   RANDOMr   MINr   MAXr   
ValueError)Zsort_fnr9   r9   r:   get_sort_fn  s   



zGridPatchSort.get_sort_fnN)r>   r?   r@   rA   r   r   r   r   r   r   r   r9   r9   r9   r:   r#     s    

r#   c                   @  rY   )	PatchKeyszV
    The keys to be used for metadata of patches extracted from any kind of image
    locationsizecountN)r>   r?   r@   rA   r   r   r   r9   r9   r9   r:   r     ry   r   c                   @  s*   e Zd ZdZejZejZejZdZdZ	dS )WSIPatchKeyszW
    The keys to be used for metadata of patches extracted from whole slide images
    levelpathN)
r>   r?   r@   rA   r   r   r   r   ZLEVELPATHr9   r9   r9   r:   r     s    r   c                   @  rT   )r$   zJ
    The keys to be used for extracting data from the fastMRI dataset
    ZkspacemaskfilenameZreconstruction_rssZacquisitionr   normZ
patient_idN)r>   r?   r@   rA   ZKSPACEMASKZFILENAMEZRECONZACQUISITIONr   ZNORMZPIDr9   r9   r9   r:   r$     s    r$   c                   @  rq   )r%   z
    The coordinate system keys, for example, Nifti1 uses Right-Anterior-Superior or "RAS",
    DICOM (0020,0032) uses Left-Posterior-Superior or "LPS". This type does not distinguish spatial 1/2/3D.
    RASLPSN)r>   r?   r@   rA   r   r   r9   r9   r9   r:   r%     r   r%   c                   @  r^   )	r&   z'
    Typical keys for MetaObj.meta
    affineZoriginal_affineZspatial_shapespaceZoriginal_channel_dimZsaved_toN)
r>   r?   r@   rA   AFFINEZORIGINAL_AFFINEZSPATIAL_SHAPESPACEZORIGINAL_CHANNEL_DIMZSAVED_TOr9   r9   r9   r:   r&     s    r&   c                   @  rq   )r'   z5
    Enums for color order. Expand as necessary.
    RGBBGRN)r>   r?   r@   rA   r   r   r9   r9   r9   r:   r'   )  rs   r'   c                   @  re   )
r(   zL
    Default keys for the statistics of trainer and evaluator engines.

    rankZcurrent_iterationZcurrent_epochZtotal_epochsZtotal_iterationsZbest_validation_epochZbest_validation_metricN)r>   r?   r@   rA   RANKZCURRENT_ITERATIONZCURRENT_EPOCHZTOTAL_EPOCHSZTOTAL_ITERATIONSZBEST_VALIDATION_EPOCHZBEST_VALIDATION_METRICr9   r9   r9   r:   r(   2      r(   c                   @  rT   )r)   zA
    Defaults keys for dataset statistical analysis modules

    Zstats_summaryZstats_by_casesZimage_filepathZlabel_filepathZimage_statsZimage_foreground_statsZlabel_statsZimage_histogramN)r>   r?   r@   rA   ZSUMMARYZBY_CASEZBY_CASE_IMAGE_PATHZBY_CASE_LABEL_PATHZIMAGE_STATSZFG_IMAGE_STATSZLABEL_STATSZIMAGE_HISTOGRAMr9   r9   r9   r:   r)   A  rX   r)   c                   @  re   )
r*   zG
    Defaults keys for dataset statistical analysis image modules

    shapechannelsZcropped_shapespacingZsizemmZ	intensity	histogramN)r>   r?   r@   rA   SHAPEZCHANNELSZCROPPED_SHAPESPACINGZSIZEMMZ	INTENSITYZ	HISTOGRAMr9   r9   r9   r:   r*   Q  r   r*   c                   @  r^   )	r+   zG
    Defaults keys for dataset statistical analysis label modules

    labelsZforeground_percentageZimage_intensityr   r   ZncomponentsN)
r>   r?   r@   rA   Z	LABEL_UIDZ	PIXEL_PCTZIMAGE_INTSTr   ZLABEL_SHAPEZLABEL_NCOMPr9   r9   r9   r:   r+   `  s    r+   c                   @  rq   )r,   z
    Modes for HoVerNet model:
    `FAST`: a faster implementation (than original)
    `ORIGINAL`: the original implementation
    FASTORIGINALN)r>   r?   r@   rA   r  r  r9   r9   r9   r:   r,   n      r,   c                   @  rY   )r-   a  
    Three branches of HoVerNet model, which results in three outputs:
    `HV` is horizontal and vertical gradient map of each nucleus (regression),
    `NP` is the pixel prediction of all nuclei (segmentation), and
    `NC` is the type of each nucleus (classification).
    Zhorizontal_verticalZnucleus_predictionZtype_predictionN)r>   r?   r@   rA   ZHVZNPZNCr9   r9   r9   r:   r-   y  s
    r-   c                   @  re   )
r.   aG  
    MetaTensor with pending operations requires some key attributes tracked especially when the primary array
    is not up-to-date due to lazy evaluation.
    This class specifies the set of key attributes to be tracked for each MetaTensor.
    See also: :py:func:`monai.transforms.lazy.utils.resample` for more details.
    Z
lazy_shapeZlazy_affineZlazy_padding_modeZlazy_interpolation_modeZ
lazy_dtypeZlazy_align_cornersZlazy_resample_modeN)r>   r?   r@   rA   r  r   ZPADDING_MODEZINTERP_MODEDTYPEZALIGN_CORNERSZRESAMPLE_MODEr9   r9   r9   r:   r.     s    r.   c                   @  rq   )r/   z
    Bundle property fields:
    `DESC` is the description of the property.
    `REQUIRED` is flag to indicate whether the property is required or optional.
    r   requiredN)r>   r?   r@   rA   ZDESCZREQUIREDr9   r9   r9   r:   r/     r  r/   c                   @  rq   )r0   aU  
    additional bundle property fields for config based bundle workflow:
    `ID` is the config item ID of the property.
    `REF_ID` is the ID of config item which is supposed to refer to this property.
    For properties that do not have `REF_ID`, `None` should be set.
    this field is only useful to check the optional property ID.
    r   Zrefer_idN)r>   r?   r@   rA   r   ZREF_IDr9   r9   r9   r:   r0     s    r0   c                   @  rj   )r1   aF  
    Default keys for templated Auto3DSeg Algo.
    `ID` is the identifier of the algorithm. The string has the format of <name>_<idx>_<other>.
    `ALGO` is the Auto3DSeg Algo instance.
    `IS_TRAINED` is the status that shows if the Algo has been trained.
    `SCORE` is the score the Algo has achieved after training.
    
identifierZalgo_instanceZ
is_trainedZbest_metricN)r>   r?   r@   rA   r   ZALGOZ
IS_TRAINEDZSCOREr9   r9   r9   r:   r1     s    r1   c                   @  re   )
AdversarialKeysaI  
    Keys used by the AdversarialTrainer.
    `REALS` are real images from the batch.
    `FAKES` are fake images generated by the generator. Are the same as PRED.
    `REAL_LOGITS` are logits of the discriminator for the real images.
    `FAKE_LOGIT` are logits of the discriminator for the fake images.
    `RECONSTRUCTION_LOSS` is the loss value computed by the reconstruction loss function.
    `GENERATOR_LOSS` is the loss value computed by the generator loss function. It is the
                discriminator loss for the fake images. That is backpropagated through the generator only.
    `DISCRIMINATOR_LOSS` is the loss value computed by the discriminator loss function. It is the
                discriminator loss for the real images and the fake images. That is backpropagated through the
                discriminator only.
    r   Zreal_logitsr   Zfake_logitsZreconstruction_lossZgenerator_lossZdiscriminator_lossN)r>   r?   r@   rA   r   ZREAL_LOGITSr   ZFAKE_LOGITSZRECONSTRUCTION_LOSSZGENERATOR_LOSSZDISCRIMINATOR_LOSSr9   r9   r9   r:   r
    s    r
  c                   @  rq   )OrderingTypeZraster_scanZs_curver   N)r>   r?   r@   ZRASTER_SCANZS_CURVEr   r9   r9   r9   r:   r        r  c                   @  rq   )OrderingTransformationsZ	rotate_90	transposerJ   N)r>   r?   r@   Z	ROTATE_90Z	TRANSPOSErP   r9   r9   r9   r:   r    r  r  c                   @  r   )r2   z<
    Config information of the PyTorch ignite package.

    z0.4.11N)r>   r?   r@   rA   OPT_IMPORT_VERSIONr9   r9   r9   r:   r2     s    r2   )	EventEnumzignite.enginer  base)as_typec                   @  rB   )AdversarialIterationEventszG
    Keys used to define events as used in the AdversarialTrainer.
    Zreconstruction_loss_completedZgenerator_forward_completedZ)generator_discriminator_forward_completedZgenerator_loss_completedZgenerator_backward_completedZgenerator_model_completedZ%discriminator_reals_forward_completedZ%discriminator_fakes_forward_completedZdiscriminator_loss_completedZ discriminator_backward_completedZdiscriminator_model_completedN)r>   r?   r@   rA   ZRECONSTRUCTION_LOSS_COMPLETEDZGENERATOR_FORWARD_COMPLETEDZ)GENERATOR_DISCRIMINATOR_FORWARD_COMPLETEDZGENERATOR_LOSS_COMPLETEDZGENERATOR_BACKWARD_COMPLETEDZGENERATOR_MODEL_COMPLETEDZ%DISCRIMINATOR_REALS_FORWARD_COMPLETEDZ%DISCRIMINATOR_FAKES_FORWARD_COMPLETEDZDISCRIMINATOR_LOSS_COMPLETEDZ DISCRIMINATOR_BACKWARD_COMPLETEDZDISCRIMINATOR_MODEL_COMPLETEDr9   r9   r9   r:   r    rS   r  )D
__future__r   r   enumr   typingr   monai.utils.moduler   r   __all__r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r   r"   r   r#   r   r   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r
  r  r  r2   Zignite.enginer  r  r   r  r9   r9   r9   r:   <module>   s~   0	


	
		 

		
